Simplified color picker

This commit is contained in:
Emil Ernerfeldt 2021-01-16 20:55:02 +01:00
parent ef595153c9
commit 33545501f9

View file

@ -208,7 +208,24 @@ pub enum Alpha {
BlendOrAdditive, BlendOrAdditive,
} }
fn color_text_ui(ui: &mut Ui, color: impl Into<Color32>) {
let color = color.into();
ui.horizontal(|ui| {
let [r, g, b, a] = color.to_array();
ui.label(format!(
"RGBA (premultiplied): rgba({}, {}, {}, {})",
r, g, b, a
));
if ui.button("📋").on_hover_text("Click to copy").clicked {
ui.output().copied_text = format!("rgba({}, {}, {}, {})", r, g, b, a);
}
});
}
fn color_picker_hsvag_2d(ui: &mut Ui, hsva: &mut HsvaGamma, alpha: Alpha) { fn color_picker_hsvag_2d(ui: &mut Ui, hsva: &mut HsvaGamma, alpha: Alpha) {
color_text_ui(ui, *hsva);
if alpha == Alpha::BlendOrAdditive { if alpha == Alpha::BlendOrAdditive {
// We signal additive blending by storing a negative alpha (a bit ironic). // We signal additive blending by storing a negative alpha (a bit ironic).
let a = &mut hsva.a; let a = &mut hsva.a;
@ -250,7 +267,7 @@ fn color_picker_hsvag_2d(ui: &mut Ui, hsva: &mut HsvaGamma, alpha: Alpha) {
if alpha == Alpha::Opaque { if alpha == Alpha::Opaque {
hsva.a = 1.0; hsva.a = 1.0;
show_color(ui, *hsva, current_color_size); show_color(ui, *hsva, current_color_size);
ui.label("Current color"); ui.label("Selected color");
ui.end_row(); ui.end_row();
} else { } else {
let a = &mut hsva.a; let a = &mut hsva.a;
@ -269,20 +286,15 @@ fn color_picker_hsvag_2d(ui: &mut Ui, hsva: &mut HsvaGamma, alpha: Alpha) {
} }
show_color(ui, *hsva, current_color_size); show_color(ui, *hsva, current_color_size);
ui.label("Current color"); ui.label("Selected color");
ui.end_row(); ui.end_row();
} }
ui.separator(); // TODO: fix ever-expansion
ui.end_row();
let HsvaGamma { h, s, v, a: _ } = hsva; let HsvaGamma { h, s, v, a: _ } = hsva;
color_slider_2d(ui, h, s, |h, s| HsvaGamma::new(h, s, 1.0, 1.0).into());
ui.label("Hue / Saturation");
ui.end_row();
color_slider_2d(ui, v, s, |v, s| HsvaGamma { v, s, ..opaque }.into());
ui.label("Value / Saturation");
ui.end_row();
color_slider_1d(ui, h, |h| HsvaGamma { h, ..opaque }.into()); color_slider_1d(ui, h, |h| HsvaGamma { h, ..opaque }.into());
ui.label("Hue"); ui.label("Hue");
ui.end_row(); ui.end_row();
@ -294,6 +306,10 @@ fn color_picker_hsvag_2d(ui: &mut Ui, hsva: &mut HsvaGamma, alpha: Alpha) {
color_slider_1d(ui, v, |v| HsvaGamma { v, ..opaque }.into()); color_slider_1d(ui, v, |v| HsvaGamma { v, ..opaque }.into());
ui.label("Value"); ui.label("Value");
ui.end_row(); ui.end_row();
color_slider_2d(ui, v, s, |v, s| HsvaGamma { v, s, ..opaque }.into());
ui.label("Value / Saturation");
ui.end_row();
}); });
} }
@ -366,20 +382,12 @@ struct HsvaGamma {
pub h: f32, pub h: f32,
/// saturation 0-1 /// saturation 0-1
pub s: f32, pub s: f32,
/// value 0-1, in gamma-space (perceptually even) /// value 0-1, in gamma-space (~perceptually even)
pub v: f32, pub v: f32,
/// alpha 0-1. A negative value signifies an additive color (and alpha is ignored). /// alpha 0-1. A negative value signifies an additive color (and alpha is ignored).
pub a: f32, pub a: f32,
} }
impl HsvaGamma {
pub fn new(h: f32, s: f32, v: f32, a: f32) -> Self {
Self { h, s, v, a }
}
}
// const GAMMA: f32 = 2.2;
impl From<HsvaGamma> for Rgba { impl From<HsvaGamma> for Rgba {
fn from(hsvag: HsvaGamma) -> Rgba { fn from(hsvag: HsvaGamma) -> Rgba {
Hsva::from(hsvag).into() Hsva::from(hsvag).into()