diff options
Diffstat (limited to 'style')
| -rw-r--r-- | style/Cargo.toml | 2 | ||||
| -rw-r--r-- | style/src/button.rs | 9 | ||||
| -rw-r--r-- | style/src/checkbox.rs | 4 | ||||
| -rw-r--r-- | style/src/container.rs | 6 | ||||
| -rw-r--r-- | style/src/menu.rs | 4 | ||||
| -rw-r--r-- | style/src/pane_grid.rs | 38 | ||||
| -rw-r--r-- | style/src/pick_list.rs | 4 | ||||
| -rw-r--r-- | style/src/progress_bar.rs | 4 | ||||
| -rw-r--r-- | style/src/rule.rs | 4 | ||||
| -rw-r--r-- | style/src/scrollable.rs | 6 | ||||
| -rw-r--r-- | style/src/slider.rs | 6 | ||||
| -rw-r--r-- | style/src/text_input.rs | 4 | ||||
| -rw-r--r-- | style/src/theme.rs | 104 | ||||
| -rw-r--r-- | style/src/theme/palette.rs | 22 | 
14 files changed, 138 insertions, 79 deletions
| diff --git a/style/Cargo.toml b/style/Cargo.toml index 0bb354e0..8af4a9b3 100644 --- a/style/Cargo.toml +++ b/style/Cargo.toml @@ -16,7 +16,7 @@ path = "../core"  features = ["palette"]  [dependencies.palette] -version = "0.6" +version = "0.7"  [dependencies.once_cell]  version = "1.15" diff --git a/style/src/button.rs b/style/src/button.rs index a564a2b7..e49ad94a 100644 --- a/style/src/button.rs +++ b/style/src/button.rs @@ -1,5 +1,5 @@  //! Change the apperance of a button. -use iced_core::{Background, Color, Vector}; +use iced_core::{Background, BorderRadius, Color, Vector};  /// The appearance of a button.  #[derive(Debug, Clone, Copy)] @@ -9,7 +9,7 @@ pub struct Appearance {      /// The [`Background`] of the button.      pub background: Option<Background>,      /// The border radius of the button. -    pub border_radius: f32, +    pub border_radius: BorderRadius,      /// The border width of the button.      pub border_width: f32,      /// The border [`Color`] of the button. @@ -23,7 +23,7 @@ impl std::default::Default for Appearance {          Self {              shadow_offset: Vector::default(),              background: None, -            border_radius: 0.0, +            border_radius: 0.0.into(),              border_width: 0.0,              border_color: Color::TRANSPARENT,              text_color: Color::BLACK, @@ -68,6 +68,9 @@ pub trait StyleSheet {                      a: color.a * 0.5,                      ..color                  }), +                Background::Gradient(gradient) => { +                    Background::Gradient(gradient.mul_alpha(0.5)) +                }              }),              text_color: Color {                  a: active.text_color.a * 0.5, diff --git a/style/src/checkbox.rs b/style/src/checkbox.rs index 52b90ec9..cf52c05d 100644 --- a/style/src/checkbox.rs +++ b/style/src/checkbox.rs @@ -1,5 +1,5 @@  //! Change the appearance of a checkbox. -use iced_core::{Background, Color}; +use iced_core::{Background, BorderRadius, Color};  /// The appearance of a checkbox.  #[derive(Debug, Clone, Copy)] @@ -9,7 +9,7 @@ pub struct Appearance {      /// The icon [`Color`] of the checkbox.      pub icon_color: Color,      /// The border radius of the checkbox. -    pub border_radius: f32, +    pub border_radius: BorderRadius,      /// The border width of the checkbox.      pub border_width: f32,      /// The border [`Color`] of the checkbox. diff --git a/style/src/container.rs b/style/src/container.rs index 560b2d5b..ec543ae4 100644 --- a/style/src/container.rs +++ b/style/src/container.rs @@ -1,5 +1,5 @@  //! Change the appearance of a container. -use iced_core::{Background, Color}; +use iced_core::{Background, BorderRadius, Color};  /// The appearance of a container.  #[derive(Debug, Clone, Copy)] @@ -9,7 +9,7 @@ pub struct Appearance {      /// The [`Background`] of the container.      pub background: Option<Background>,      /// The border radius of the container. -    pub border_radius: f32, +    pub border_radius: BorderRadius,      /// The border width of the container.      pub border_width: f32,      /// The border [`Color`] of the container. @@ -21,7 +21,7 @@ impl std::default::Default for Appearance {          Self {              text_color: None,              background: None, -            border_radius: 0.0, +            border_radius: 0.0.into(),              border_width: 0.0,              border_color: Color::TRANSPARENT,          } diff --git a/style/src/menu.rs b/style/src/menu.rs index 7d878748..dbf19dae 100644 --- a/style/src/menu.rs +++ b/style/src/menu.rs @@ -1,5 +1,5 @@  //! Change the appearance of menus. -use iced_core::{Background, Color}; +use iced_core::{Background, BorderRadius, Color};  /// The appearance of a menu.  #[derive(Debug, Clone, Copy)] @@ -11,7 +11,7 @@ pub struct Appearance {      /// The border width of the menu.      pub border_width: f32,      /// The border radius of the menu. -    pub border_radius: f32, +    pub border_radius: BorderRadius,      /// The border [`Color`] of the menu.      pub border_color: Color,      /// The text [`Color`] of a selected option in the menu. diff --git a/style/src/pane_grid.rs b/style/src/pane_grid.rs index fd8fc05f..b99af955 100644 --- a/style/src/pane_grid.rs +++ b/style/src/pane_grid.rs @@ -1,16 +1,17 @@  //! Change the appearance of a pane grid. -use iced_core::Color; +use iced_core::{Background, BorderRadius, Color}; -/// A set of rules that dictate the style of a container. -pub trait StyleSheet { -    /// The supported style of the [`StyleSheet`]. -    type Style: Default; - -    /// The [`Line`] to draw when a split is picked. -    fn picked_split(&self, style: &Self::Style) -> Option<Line>; - -    /// The [`Line`] to draw when a split is hovered. -    fn hovered_split(&self, style: &Self::Style) -> Option<Line>; +/// The appearance of the hovered region of a pane grid. +#[derive(Debug, Clone, Copy)] +pub struct Appearance { +    /// The [`Background`] of the hovered pane region. +    pub background: Background, +    /// The border width of the hovered pane region. +    pub border_width: f32, +    /// The border [`Color`] of the hovered pane region. +    pub border_color: Color, +    /// The border radius of the hovered pane region. +    pub border_radius: BorderRadius,  }  /// A line. @@ -24,3 +25,18 @@ pub struct Line {      /// The width of the [`Line`].      pub width: f32,  } + +/// A set of rules that dictate the style of a container. +pub trait StyleSheet { +    /// The supported style of the [`StyleSheet`]. +    type Style: Default; + +    /// The [`Region`] to draw when a pane is hovered. +    fn hovered_region(&self, style: &Self::Style) -> Appearance; + +    /// The [`Line`] to draw when a split is picked. +    fn picked_split(&self, style: &Self::Style) -> Option<Line>; + +    /// The [`Line`] to draw when a split is hovered. +    fn hovered_split(&self, style: &Self::Style) -> Option<Line>; +} diff --git a/style/src/pick_list.rs b/style/src/pick_list.rs index 11e13b01..961c1e93 100644 --- a/style/src/pick_list.rs +++ b/style/src/pick_list.rs @@ -1,5 +1,5 @@  //! Change the appearance of a pick list. -use iced_core::{Background, Color}; +use iced_core::{Background, BorderRadius, Color};  /// The appearance of a pick list.  #[derive(Debug, Clone, Copy)] @@ -13,7 +13,7 @@ pub struct Appearance {      /// The [`Background`] of the pick list.      pub background: Background,      /// The border radius of the pick list. -    pub border_radius: f32, +    pub border_radius: BorderRadius,      /// The border width of the pick list.      pub border_width: f32,      /// The border color of the pick list. diff --git a/style/src/progress_bar.rs b/style/src/progress_bar.rs index fb1819fc..c05a6ee4 100644 --- a/style/src/progress_bar.rs +++ b/style/src/progress_bar.rs @@ -1,5 +1,5 @@  //! Change the appearance of a progress bar. -use iced_core::Background; +use iced_core::{Background, BorderRadius};  /// The appearance of a progress bar.  #[derive(Debug, Clone, Copy)] @@ -9,7 +9,7 @@ pub struct Appearance {      /// The [`Background`] of the bar of the progress bar.      pub bar: Background,      /// The border radius of the progress bar. -    pub border_radius: f32, +    pub border_radius: BorderRadius,  }  /// A set of rules that dictate the style of a progress bar. diff --git a/style/src/rule.rs b/style/src/rule.rs index b7380747..afae085c 100644 --- a/style/src/rule.rs +++ b/style/src/rule.rs @@ -1,5 +1,5 @@  //! Change the appearance of a rule. -use iced_core::Color; +use iced_core::{BorderRadius, Color};  /// The appearance of a rule.  #[derive(Debug, Clone, Copy)] @@ -9,7 +9,7 @@ pub struct Appearance {      /// The width (thickness) of the rule line.      pub width: u16,      /// The radius of the line corners. -    pub radius: f32, +    pub radius: BorderRadius,      /// The [`FillMode`] of the rule.      pub fill_mode: FillMode,  } diff --git a/style/src/scrollable.rs b/style/src/scrollable.rs index b528c444..952c11e1 100644 --- a/style/src/scrollable.rs +++ b/style/src/scrollable.rs @@ -1,5 +1,5 @@  //! Change the appearance of a scrollable. -use iced_core::{Background, Color}; +use iced_core::{Background, BorderRadius, Color};  /// The appearance of a scrollable.  #[derive(Debug, Clone, Copy)] @@ -7,7 +7,7 @@ pub struct Scrollbar {      /// The [`Background`] of a scrollable.      pub background: Option<Background>,      /// The border radius of a scrollable. -    pub border_radius: f32, +    pub border_radius: BorderRadius,      /// The border width of a scrollable.      pub border_width: f32,      /// The border [`Color`] of a scrollable. @@ -22,7 +22,7 @@ pub struct Scroller {      /// The [`Color`] of the scroller.      pub color: Color,      /// The border radius of the scroller. -    pub border_radius: f32, +    pub border_radius: BorderRadius,      /// The border width of the scroller.      pub border_width: f32,      /// The border [`Color`] of the scroller. diff --git a/style/src/slider.rs b/style/src/slider.rs index 884d3871..f0068558 100644 --- a/style/src/slider.rs +++ b/style/src/slider.rs @@ -1,5 +1,5 @@  //! Change the apperance of a slider. -use iced_core::Color; +use iced_core::{BorderRadius, Color};  /// The appearance of a slider.  #[derive(Debug, Clone, Copy)] @@ -17,6 +17,8 @@ pub struct Rail {      pub colors: (Color, Color),      /// The width of the stroke of a slider rail.      pub width: f32, +    /// The border radius of the corners of the rail. +    pub border_radius: BorderRadius,  }  /// The appearance of the handle of a slider. @@ -45,7 +47,7 @@ pub enum HandleShape {          /// The width of the rectangle.          width: u16,          /// The border radius of the corners of the rectangle. -        border_radius: f32, +        border_radius: BorderRadius,      },  } diff --git a/style/src/text_input.rs b/style/src/text_input.rs index 2616ad5a..90251b5c 100644 --- a/style/src/text_input.rs +++ b/style/src/text_input.rs @@ -1,5 +1,5 @@  //! Change the appearance of a text input. -use iced_core::{Background, Color}; +use iced_core::{Background, BorderRadius, Color};  /// The appearance of a text input.  #[derive(Debug, Clone, Copy)] @@ -7,7 +7,7 @@ pub struct Appearance {      /// The [`Background`] of the text input.      pub background: Background,      /// The border radius of the text input. -    pub border_radius: f32, +    pub border_radius: BorderRadius,      /// The border width of the text input.      pub border_width: f32,      /// The border [`Color`] of the text input. diff --git a/style/src/theme.rs b/style/src/theme.rs index d9893bcf..64497181 100644 --- a/style/src/theme.rs +++ b/style/src/theme.rs @@ -105,7 +105,7 @@ impl application::StyleSheet for Theme {      }  } -impl application::StyleSheet for fn(&Theme) -> application::Appearance { +impl<T: Fn(&Theme) -> application::Appearance> application::StyleSheet for T {      type Style = Theme;      fn appearance(&self, style: &Self::Style) -> application::Appearance { @@ -113,8 +113,10 @@ impl application::StyleSheet for fn(&Theme) -> application::Appearance {      }  } -impl From<fn(&Theme) -> application::Appearance> for Application { -    fn from(f: fn(&Theme) -> application::Appearance) -> Self { +impl<T: Fn(&Theme) -> application::Appearance + 'static> From<T> +    for Application +{ +    fn from(f: T) -> Self {          Self::Custom(Box::new(f))      }  } @@ -139,6 +141,15 @@ pub enum Button {      Custom(Box<dyn button::StyleSheet<Style = Theme>>),  } +impl Button { +    /// Creates a custom [`Button`] style variant. +    pub fn custom( +        style_sheet: impl button::StyleSheet<Style = Theme> + 'static, +    ) -> Self { +        Self::Custom(Box::new(style_sheet)) +    } +} +  impl button::StyleSheet for Theme {      type Style = Button; @@ -146,7 +157,7 @@ impl button::StyleSheet for Theme {          let palette = self.extended_palette();          let appearance = button::Appearance { -            border_radius: 2.0, +            border_radius: 2.0.into(),              ..button::Appearance::default()          }; @@ -217,6 +228,9 @@ impl button::StyleSheet for Theme {                      a: color.a * 0.5,                      ..color                  }), +                Background::Gradient(gradient) => { +                    Background::Gradient(gradient.mul_alpha(0.5)) +                }              }),              text_color: Color {                  a: active.text_color.a * 0.5, @@ -332,7 +346,7 @@ fn checkbox_appearance(              base.color          }),          icon_color, -        border_radius: 2.0, +        border_radius: 2.0.into(),          border_width: 1.0,          border_color: accent.color,          text_color: None, @@ -351,8 +365,8 @@ pub enum Container {      Custom(Box<dyn container::StyleSheet<Style = Theme>>),  } -impl From<fn(&Theme) -> container::Appearance> for Container { -    fn from(f: fn(&Theme) -> container::Appearance) -> Self { +impl<T: Fn(&Theme) -> container::Appearance + 'static> From<T> for Container { +    fn from(f: T) -> Self {          Self::Custom(Box::new(f))      }  } @@ -368,8 +382,8 @@ impl container::StyleSheet for Theme {                  container::Appearance {                      text_color: None, -                    background: palette.background.weak.color.into(), -                    border_radius: 2.0, +                    background: Some(palette.background.weak.color.into()), +                    border_radius: 2.0.into(),                      border_width: 0.0,                      border_color: Color::TRANSPARENT,                  } @@ -379,7 +393,7 @@ impl container::StyleSheet for Theme {      }  } -impl container::StyleSheet for fn(&Theme) -> container::Appearance { +impl<T: Fn(&Theme) -> container::Appearance> container::StyleSheet for T {      type Style = Theme;      fn appearance(&self, style: &Self::Style) -> container::Appearance { @@ -408,7 +422,7 @@ impl slider::StyleSheet for Theme {                  let handle = slider::Handle {                      shape: slider::HandleShape::Rectangle {                          width: 8, -                        border_radius: 4.0, +                        border_radius: 4.0.into(),                      },                      color: Color::WHITE,                      border_color: Color::WHITE, @@ -419,9 +433,10 @@ impl slider::StyleSheet for Theme {                      rail: slider::Rail {                          colors: (                              palette.primary.base.color, -                            palette.primary.base.color, +                            palette.secondary.base.color,                          ), -                        width: 2.0, +                        width: 4.0, +                        border_radius: 2.0.into(),                      },                      handle: slider::Handle {                          color: palette.background.base.color, @@ -493,7 +508,7 @@ impl menu::StyleSheet for Theme {                      text_color: palette.background.weak.text,                      background: palette.background.weak.color.into(),                      border_width: 1.0, -                    border_radius: 0.0, +                    border_radius: 0.0.into(),                      border_color: palette.background.strong.color,                      selected_text_color: palette.primary.strong.text,                      selected_background: palette.primary.strong.color.into(), @@ -539,7 +554,7 @@ impl pick_list::StyleSheet for Theme {                      background: palette.background.weak.color.into(),                      placeholder_color: palette.background.strong.color,                      handle_color: palette.background.weak.text, -                    border_radius: 2.0, +                    border_radius: 2.0.into(),                      border_width: 1.0,                      border_color: palette.background.strong.color,                  } @@ -558,7 +573,7 @@ impl pick_list::StyleSheet for Theme {                      background: palette.background.weak.color.into(),                      placeholder_color: palette.background.strong.color,                      handle_color: palette.background.weak.text, -                    border_radius: 2.0, +                    border_radius: 2.0.into(),                      border_width: 1.0,                      border_color: palette.primary.strong.color,                  } @@ -703,6 +718,25 @@ pub enum PaneGrid {  impl pane_grid::StyleSheet for Theme {      type Style = PaneGrid; +    fn hovered_region(&self, style: &Self::Style) -> pane_grid::Appearance { +        match style { +            PaneGrid::Default => { +                let palette = self.extended_palette(); + +                pane_grid::Appearance { +                    background: Background::Color(Color { +                        a: 0.5, +                        ..palette.primary.base.color +                    }), +                    border_width: 2.0, +                    border_color: palette.primary.strong.color, +                    border_radius: 0.0.into(), +                } +            } +            PaneGrid::Custom(custom) => custom.hovered_region(self), +        } +    } +      fn picked_split(&self, style: &Self::Style) -> Option<pane_grid::Line> {          match style {              PaneGrid::Default => { @@ -746,8 +780,10 @@ pub enum ProgressBar {      Custom(Box<dyn progress_bar::StyleSheet<Style = Theme>>),  } -impl From<fn(&Theme) -> progress_bar::Appearance> for ProgressBar { -    fn from(f: fn(&Theme) -> progress_bar::Appearance) -> Self { +impl<T: Fn(&Theme) -> progress_bar::Appearance + 'static> From<T> +    for ProgressBar +{ +    fn from(f: T) -> Self {          Self::Custom(Box::new(f))      }  } @@ -765,7 +801,7 @@ impl progress_bar::StyleSheet for Theme {          let from_palette = |bar: Color| progress_bar::Appearance {              background: palette.background.strong.color.into(),              bar: bar.into(), -            border_radius: 2.0, +            border_radius: 2.0.into(),          };          match style { @@ -777,7 +813,7 @@ impl progress_bar::StyleSheet for Theme {      }  } -impl progress_bar::StyleSheet for fn(&Theme) -> progress_bar::Appearance { +impl<T: Fn(&Theme) -> progress_bar::Appearance> progress_bar::StyleSheet for T {      type Style = Theme;      fn appearance(&self, style: &Self::Style) -> progress_bar::Appearance { @@ -795,8 +831,8 @@ pub enum Rule {      Custom(Box<dyn rule::StyleSheet<Style = Theme>>),  } -impl From<fn(&Theme) -> rule::Appearance> for Rule { -    fn from(f: fn(&Theme) -> rule::Appearance) -> Self { +impl<T: Fn(&Theme) -> rule::Appearance + 'static> From<T> for Rule { +    fn from(f: T) -> Self {          Self::Custom(Box::new(f))      }  } @@ -811,7 +847,7 @@ impl rule::StyleSheet for Theme {              Rule::Default => rule::Appearance {                  color: palette.background.strong.color,                  width: 1, -                radius: 0.0, +                radius: 0.0.into(),                  fill_mode: rule::FillMode::Full,              },              Rule::Custom(custom) => custom.appearance(self), @@ -819,7 +855,7 @@ impl rule::StyleSheet for Theme {      }  } -impl rule::StyleSheet for fn(&Theme) -> rule::Appearance { +impl<T: Fn(&Theme) -> rule::Appearance> rule::StyleSheet for T {      type Style = Theme;      fn appearance(&self, style: &Self::Style) -> rule::Appearance { @@ -893,13 +929,13 @@ impl scrollable::StyleSheet for Theme {                  let palette = self.extended_palette();                  scrollable::Scrollbar { -                    background: palette.background.weak.color.into(), -                    border_radius: 2.0, +                    background: Some(palette.background.weak.color.into()), +                    border_radius: 2.0.into(),                      border_width: 0.0,                      border_color: Color::TRANSPARENT,                      scroller: scrollable::Scroller {                          color: palette.background.strong.color, -                        border_radius: 2.0, +                        border_radius: 2.0.into(),                          border_width: 0.0,                          border_color: Color::TRANSPARENT,                      }, @@ -920,13 +956,13 @@ impl scrollable::StyleSheet for Theme {                      let palette = self.extended_palette();                      scrollable::Scrollbar { -                        background: palette.background.weak.color.into(), -                        border_radius: 2.0, +                        background: Some(palette.background.weak.color.into()), +                        border_radius: 2.0.into(),                          border_width: 0.0,                          border_color: Color::TRANSPARENT,                          scroller: scrollable::Scroller {                              color: palette.primary.strong.color, -                            border_radius: 2.0, +                            border_radius: 2.0.into(),                              border_width: 0.0,                              border_color: Color::TRANSPARENT,                          }, @@ -1028,7 +1064,7 @@ impl text_input::StyleSheet for Theme {          text_input::Appearance {              background: palette.background.base.color.into(), -            border_radius: 2.0, +            border_radius: 2.0.into(),              border_width: 1.0,              border_color: palette.background.strong.color,              icon_color: palette.background.weak.text, @@ -1044,7 +1080,7 @@ impl text_input::StyleSheet for Theme {          text_input::Appearance {              background: palette.background.base.color.into(), -            border_radius: 2.0, +            border_radius: 2.0.into(),              border_width: 1.0,              border_color: palette.background.base.text,              icon_color: palette.background.weak.text, @@ -1060,7 +1096,7 @@ impl text_input::StyleSheet for Theme {          text_input::Appearance {              background: palette.background.base.color.into(), -            border_radius: 2.0, +            border_radius: 2.0.into(),              border_width: 1.0,              border_color: palette.primary.strong.color,              icon_color: palette.background.weak.text, @@ -1106,7 +1142,7 @@ impl text_input::StyleSheet for Theme {          text_input::Appearance {              background: palette.background.weak.color.into(), -            border_radius: 2.0, +            border_radius: 2.0.into(),              border_width: 1.0,              border_color: palette.background.strong.color,              icon_color: palette.background.strong.color, diff --git a/style/src/theme/palette.rs b/style/src/theme/palette.rs index 0f15494b..aaeb799d 100644 --- a/style/src/theme/palette.rs +++ b/style/src/theme/palette.rs @@ -2,7 +2,9 @@  use iced_core::Color;  use once_cell::sync::Lazy; -use palette::{FromColor, Hsl, Mix, RelativeContrast, Srgb}; +use palette::color_difference::Wcag21RelativeContrast; +use palette::rgb::Rgb; +use palette::{FromColor, Hsl, Mix};  /// A color palette.  #[derive(Debug, Clone, Copy, PartialEq)] @@ -298,11 +300,11 @@ fn deviate(color: Color, amount: f32) -> Color {  }  fn mix(a: Color, b: Color, factor: f32) -> Color { -    let a_lin = Srgb::from(a).into_linear(); -    let b_lin = Srgb::from(b).into_linear(); +    let a_lin = Rgb::from(a).into_linear(); +    let b_lin = Rgb::from(b).into_linear(); -    let mixed = a_lin.mix(&b_lin, factor); -    Srgb::from_linear(mixed).into() +    let mixed = a_lin.mix(b_lin, factor); +    Rgb::from_linear(mixed).into()  }  fn readable(background: Color, text: Color) -> Color { @@ -320,16 +322,16 @@ fn is_dark(color: Color) -> bool {  }  fn is_readable(a: Color, b: Color) -> bool { -    let a_srgb = Srgb::from(a); -    let b_srgb = Srgb::from(b); +    let a_srgb = Rgb::from(a); +    let b_srgb = Rgb::from(b); -    a_srgb.has_enhanced_contrast_text(&b_srgb) +    a_srgb.has_enhanced_contrast_text(b_srgb)  }  fn to_hsl(color: Color) -> Hsl { -    Hsl::from_color(Srgb::from(color)) +    Hsl::from_color(Rgb::from(color))  }  fn from_hsl(hsl: Hsl) -> Color { -    Srgb::from_color(hsl).into() +    Rgb::from_color(hsl).into()  } | 
