diff --git a/egui/src/widgets/color_picker.rs b/egui/src/widgets/color_picker.rs index fb19a873..4917f2ae 100644 --- a/egui/src/widgets/color_picker.rs +++ b/egui/src/widgets/color_picker.rs @@ -208,7 +208,24 @@ pub enum Alpha { BlendOrAdditive, } +fn color_text_ui(ui: &mut Ui, color: impl Into) { + 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) { + color_text_ui(ui, *hsva); + if alpha == Alpha::BlendOrAdditive { // We signal additive blending by storing a negative alpha (a bit ironic). 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 { hsva.a = 1.0; show_color(ui, *hsva, current_color_size); - ui.label("Current color"); + ui.label("Selected color"); ui.end_row(); } else { 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); - ui.label("Current color"); + ui.label("Selected color"); ui.end_row(); } + ui.separator(); // TODO: fix ever-expansion + ui.end_row(); + 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()); ui.label("Hue"); 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()); ui.label("Value"); 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, /// saturation 0-1 pub s: f32, - /// value 0-1, in gamma-space (perceptually even) + /// value 0-1, in gamma-space (~perceptually even) pub v: f32, /// alpha 0-1. A negative value signifies an additive color (and alpha is ignored). 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 for Rgba { fn from(hsvag: HsvaGamma) -> Rgba { Hsva::from(hsvag).into()