From e154c2ef4264d932cfce448bde43dabf76c7df97 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Thu, 5 Oct 2023 11:07:50 -0400 Subject: [PATCH] refactor(color-picker): optional initial color and fallback color --- src/widget/color_picker/mod.rs | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/widget/color_picker/mod.rs b/src/widget/color_picker/mod.rs index fd448784..012d3e9d 100644 --- a/src/widget/color_picker/mod.rs +++ b/src/widget/color_picker/mod.rs @@ -72,9 +72,11 @@ pub struct ColorPickerModel { #[setters(skip)] input_color: String, #[setters(skip)] - applied_color: Color, + applied_color: Option, #[setters(skip)] - initial_color: Color, + initial_color: Option, + #[setters(skip)] + fallback_color: Option, #[setters(skip)] recent_colors: Vec, active: bool, @@ -91,11 +93,11 @@ impl ColorPickerModel { pub fn new( hex: impl Into> + Clone, rgb: impl Into> + Clone, - fallback_color: Color, + fallback_color: Option, initial_color: Option, ) -> Self { - let initial = initial_color.unwrap_or(fallback_color); - let initial_srgb = palette::Srgb::from(initial); + let initial = initial_color.or(fallback_color); + let initial_srgb = palette::Srgb::from(initial.unwrap_or(Color::BLACK)); let hsv = palette::Hsv::from_color(initial_srgb); Self { segmented_model: segmented_button::Model::builder() @@ -103,10 +105,11 @@ impl ColorPickerModel { .insert(move |b| b.text(rgb.clone())) .build(), active_color: hsv, - save_next: Some(initial), + save_next: None, input_color: color_to_string(hsv, true), - applied_color: fallback_color, - initial_color: initial, + applied_color: initial, + initial_color, + fallback_color, recent_colors: Vec::new(), // TODO should all color pickers show the same recent colors? active: false, width: Length::Fixed(300.0), @@ -124,7 +127,7 @@ impl ColorPickerModel { ) -> crate::widget::Button<'a, Message, crate::Renderer> { color_button( Some(f(ColorPickerUpdate::ToggleColorPicker)), - self.applied_color, + self.applied_color.unwrap_or(Color::BLACK), ) } @@ -142,8 +145,10 @@ impl ColorPickerModel { } ColorPickerUpdate::AppliedColor => { let srgb = palette::Srgb::from_color(self.active_color); - self.recent_colors.push(self.applied_color); - self.applied_color = Color::from(srgb); + if let Some(applied_color) = self.applied_color.take() { + self.recent_colors.push(applied_color); + } + self.applied_color = Some(Color::from(srgb)); self.active = false; } ColorPickerUpdate::ActivateSegmented(e) => { @@ -167,10 +172,10 @@ impl ColorPickerModel { ColorPickerUpdate::Reset => { self.must_clear_cache.store(true, Ordering::SeqCst); - let initial_srgb = palette::Srgb::from(self.initial_color); + let initial_srgb = palette::Srgb::from(self.fallback_color.unwrap_or(Color::BLACK)); let hsv = palette::Hsv::from_color(initial_srgb); self.active_color = hsv; - self.applied_color = self.initial_color; + self.applied_color = self.fallback_color; self.copied_at = None; } ColorPickerUpdate::Cancel => { @@ -216,7 +221,7 @@ impl ColorPickerModel { /// Get the applied color of the picker #[must_use] - pub fn get_applied_color(&self) -> Color { + pub fn get_applied_color(&self) -> Option { self.applied_color }