diff options
| author | 2022-06-04 03:26:53 +0200 | |
|---|---|---|
| committer | 2022-06-04 03:26:53 +0200 | |
| commit | 835877fc636d71c1faaa4826cbfde8e09b3c82ba (patch) | |
| tree | 018b28dd724c7585932753b27eb7a0980cc99cf4 /style | |
| parent | 1388d71f0368731e7efd799ee274ede9b8d3c690 (diff) | |
| download | iced-835877fc636d71c1faaa4826cbfde8e09b3c82ba.tar.gz iced-835877fc636d71c1faaa4826cbfde8e09b3c82ba.tar.bz2 iced-835877fc636d71c1faaa4826cbfde8e09b3c82ba.zip | |
Implement theme styling for `Checkbox`
Diffstat (limited to '')
| -rw-r--r-- | style/src/checkbox.rs | 43 | ||||
| -rw-r--r-- | style/src/theme.rs | 104 | 
2 files changed, 108 insertions, 39 deletions
| diff --git a/style/src/checkbox.rs b/style/src/checkbox.rs index de52e548..ba54b0a2 100644 --- a/style/src/checkbox.rs +++ b/style/src/checkbox.rs @@ -3,7 +3,7 @@ use iced_core::{Background, Color};  /// The appearance of a checkbox.  #[derive(Debug, Clone, Copy)] -pub struct Style { +pub struct Appearance {      pub background: Background,      pub checkmark_color: Color,      pub border_radius: f32, @@ -14,44 +14,9 @@ pub struct Style {  /// A set of rules that dictate the style of a checkbox.  pub trait StyleSheet { -    fn active(&self, is_checked: bool) -> Style; +    type Style: Default + Copy; -    fn hovered(&self, is_checked: bool) -> Style; -} - -struct Default; - -impl StyleSheet for Default { -    fn active(&self, _is_checked: bool) -> Style { -        Style { -            background: Background::Color(Color::from_rgb(0.95, 0.95, 0.95)), -            checkmark_color: Color::from_rgb(0.3, 0.3, 0.3), -            border_radius: 5.0, -            border_width: 1.0, -            border_color: Color::from_rgb(0.6, 0.6, 0.6), -            text_color: None, -        } -    } - -    fn hovered(&self, is_checked: bool) -> Style { -        Style { -            background: Background::Color(Color::from_rgb(0.90, 0.90, 0.90)), -            ..self.active(is_checked) -        } -    } -} - -impl<'a> std::default::Default for Box<dyn StyleSheet + 'a> { -    fn default() -> Self { -        Box::new(Default) -    } -} +    fn active(&self, style: Self::Style, is_checked: bool) -> Appearance; -impl<'a, T> From<T> for Box<dyn StyleSheet + 'a> -where -    T: StyleSheet + 'a, -{ -    fn from(style_sheet: T) -> Self { -        Box::new(style_sheet) -    } +    fn hovered(&self, style: Self::Style, is_checked: bool) -> Appearance;  } diff --git a/style/src/theme.rs b/style/src/theme.rs index 305c5cc2..b0846c0e 100644 --- a/style/src/theme.rs +++ b/style/src/theme.rs @@ -4,6 +4,7 @@ pub use self::palette::Palette;  use crate::application;  use crate::button; +use crate::checkbox;  use crate::pane_grid;  use crate::progress_bar;  use crate::radio; @@ -122,6 +123,109 @@ impl button::StyleSheet for Theme {  }  /* + * Checkbox + */ + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Checkbox { +    Primary, +    Secondary, +    Success, +    Danger, +} + +impl Default for Checkbox { +    fn default() -> Self { +        Self::Primary +    } +} + +impl checkbox::StyleSheet for Theme { +    type Style = Checkbox; + +    fn active( +        &self, +        style: Self::Style, +        is_checked: bool, +    ) -> checkbox::Appearance { +        let palette = self.extended_palette(); + +        match style { +            Checkbox::Primary => checkbox_appearance( +                palette.background.weak, +                palette.primary.strong, +                is_checked, +            ), +            Checkbox::Secondary => checkbox_appearance( +                palette.background.weak, +                palette.background.base, +                is_checked, +            ), +            Checkbox::Success => checkbox_appearance( +                palette.background.weak, +                palette.success.base, +                is_checked, +            ), +            Checkbox::Danger => checkbox_appearance( +                palette.background.weak, +                palette.danger.base, +                is_checked, +            ), +        } +    } + +    fn hovered( +        &self, +        style: Self::Style, +        is_checked: bool, +    ) -> checkbox::Appearance { +        let palette = self.extended_palette(); + +        match style { +            Checkbox::Primary => checkbox_appearance( +                palette.background.strong, +                palette.primary.strong, +                is_checked, +            ), +            Checkbox::Secondary => checkbox_appearance( +                palette.background.strong, +                palette.background.strong, +                is_checked, +            ), +            Checkbox::Success => checkbox_appearance( +                palette.background.strong, +                palette.success.strong, +                is_checked, +            ), +            Checkbox::Danger => checkbox_appearance( +                palette.background.strong, +                palette.danger.strong, +                is_checked, +            ), +        } +    } +} + +fn checkbox_appearance( +    base: palette::Pair, +    accent: palette::Pair, +    is_checked: bool, +) -> checkbox::Appearance { +    checkbox::Appearance { +        background: Background::Color(if is_checked { +            accent.color +        } else { +            base.color +        }), +        checkmark_color: accent.text, +        border_radius: 2.0, +        border_width: 1.0, +        border_color: accent.color, +        text_color: None, +    } +} + +/*   * Slider   */  impl slider::StyleSheet for Theme { | 
