diff options
author | 2022-06-01 01:44:59 +0200 | |
---|---|---|
committer | 2022-06-01 01:46:14 +0200 | |
commit | 6f69df3d415bfc922ce15539746026843bd410e6 (patch) | |
tree | 8683025be83c085aa5363d8927e46b7aa4d22694 | |
parent | a206d22670eda60d6364444f690633dc11e75a41 (diff) | |
download | iced-6f69df3d415bfc922ce15539746026843bd410e6.tar.gz iced-6f69df3d415bfc922ce15539746026843bd410e6.tar.bz2 iced-6f69df3d415bfc922ce15539746026843bd410e6.zip |
Implement theme styling for `PaneGrid`
-rw-r--r-- | native/src/widget/pane_grid.rs | 39 | ||||
-rw-r--r-- | pure/src/widget/pane_grid.rs | 25 | ||||
-rw-r--r-- | style/src/pane_grid.rs | 33 | ||||
-rw-r--r-- | style/src/theme.rs | 26 |
4 files changed, 74 insertions, 49 deletions
diff --git a/native/src/widget/pane_grid.rs b/native/src/widget/pane_grid.rs index fb056f79..f903c021 100644 --- a/native/src/widget/pane_grid.rs +++ b/native/src/widget/pane_grid.rs @@ -93,7 +93,11 @@ pub use iced_style::pane_grid::{Line, StyleSheet}; /// .on_resize(10, Message::PaneResized); /// ``` #[allow(missing_debug_implementations)] -pub struct PaneGrid<'a, Message, Renderer> { +pub struct PaneGrid<'a, Message, Renderer> +where + Renderer: crate::Renderer, + Renderer::Theme: StyleSheet, +{ state: &'a mut state::Internal, action: &'a mut state::Action, elements: Vec<(Pane, Content<'a, Message, Renderer>)>, @@ -103,12 +107,13 @@ pub struct PaneGrid<'a, Message, Renderer> { on_click: Option<Box<dyn Fn(Pane) -> Message + 'a>>, on_drag: Option<Box<dyn Fn(DragEvent) -> Message + 'a>>, on_resize: Option<(u16, Box<dyn Fn(ResizeEvent) -> Message + 'a>)>, - style_sheet: Box<dyn StyleSheet + 'a>, + style: <Renderer::Theme as StyleSheet>::Style, } impl<'a, Message, Renderer> PaneGrid<'a, Message, Renderer> where Renderer: crate::Renderer, + Renderer::Theme: StyleSheet, { /// Creates a [`PaneGrid`] with the given [`State`] and view function. /// @@ -136,7 +141,7 @@ where on_click: None, on_drag: None, on_resize: None, - style_sheet: Default::default(), + style: Default::default(), } } @@ -196,8 +201,11 @@ where } /// Sets the style of the [`PaneGrid`]. - pub fn style(mut self, style: impl Into<Box<dyn StyleSheet + 'a>>) -> Self { - self.style_sheet = style.into(); + pub fn style( + mut self, + style: impl Into<<Renderer::Theme as StyleSheet>::Style>, + ) -> Self { + self.style = style.into(); self } } @@ -468,11 +476,12 @@ pub fn draw<Renderer, T>( layout: Layout<'_>, cursor_position: Point, renderer: &mut Renderer, - style: &renderer::Style, + theme: &Renderer::Theme, + default_style: &renderer::Style, viewport: &Rectangle, spacing: u16, resize_leeway: Option<u16>, - style_sheet: &dyn StyleSheet, + style: <Renderer::Theme as StyleSheet>::Style, elements: impl Iterator<Item = (Pane, T)>, draw_pane: impl Fn( T, @@ -484,6 +493,7 @@ pub fn draw<Renderer, T>( ), ) where Renderer: crate::Renderer, + Renderer::Theme: StyleSheet, { let picked_pane = action.picked_pane(); @@ -545,7 +555,7 @@ pub fn draw<Renderer, T>( draw_pane( pane, renderer, - style, + default_style, layout, pane_cursor_position, viewport, @@ -558,7 +568,7 @@ pub fn draw<Renderer, T>( draw_pane( pane, renderer, - style, + default_style, layout, pane_cursor_position, viewport, @@ -569,9 +579,9 @@ pub fn draw<Renderer, T>( if let Some((axis, split_region, is_picked)) = picked_split { let highlight = if is_picked { - style_sheet.picked_split() + theme.picked_split(style) } else { - style_sheet.hovered_split() + theme.hovered_split(style) }; if let Some(highlight) = highlight { @@ -649,6 +659,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer> for PaneGrid<'a, Message, Renderer> where Renderer: crate::Renderer, + Renderer::Theme: StyleSheet, { fn width(&self) -> Length { self.width @@ -766,11 +777,12 @@ where layout, cursor_position, renderer, + theme, style, viewport, self.spacing, self.on_resize.as_ref().map(|(leeway, _)| *leeway), - self.style_sheet.as_ref(), + self.style, self.elements.iter().map(|(pane, content)| (*pane, content)), |pane, renderer, style, layout, cursor_position, rectangle| { pane.draw( @@ -801,8 +813,9 @@ where impl<'a, Message, Renderer> From<PaneGrid<'a, Message, Renderer>> for Element<'a, Message, Renderer> where - Renderer: 'a + crate::Renderer, Message: 'a, + Renderer: 'a + crate::Renderer, + Renderer::Theme: StyleSheet, { fn from( pane_grid: PaneGrid<'a, Message, Renderer>, diff --git a/pure/src/widget/pane_grid.rs b/pure/src/widget/pane_grid.rs index 168fe12b..e2ba1e7e 100644 --- a/pure/src/widget/pane_grid.rs +++ b/pure/src/widget/pane_grid.rs @@ -83,7 +83,11 @@ pub use iced_style::pane_grid::{Line, StyleSheet}; /// .on_resize(10, Message::PaneResized); /// ``` #[allow(missing_debug_implementations)] -pub struct PaneGrid<'a, Message, Renderer> { +pub struct PaneGrid<'a, Message, Renderer> +where + Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, +{ state: &'a state::Internal, elements: Vec<(Pane, Content<'a, Message, Renderer>)>, width: Length, @@ -92,12 +96,13 @@ pub struct PaneGrid<'a, Message, Renderer> { on_click: Option<Box<dyn Fn(Pane) -> Message + 'a>>, on_drag: Option<Box<dyn Fn(DragEvent) -> Message + 'a>>, on_resize: Option<(u16, Box<dyn Fn(ResizeEvent) -> Message + 'a>)>, - style_sheet: Box<dyn StyleSheet + 'a>, + style: <Renderer::Theme as StyleSheet>::Style, } impl<'a, Message, Renderer> PaneGrid<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, { /// Creates a [`PaneGrid`] with the given [`State`] and view function. /// @@ -124,7 +129,7 @@ where on_click: None, on_drag: None, on_resize: None, - style_sheet: Default::default(), + style: Default::default(), } } @@ -184,8 +189,11 @@ where } /// Sets the style of the [`PaneGrid`]. - pub fn style(mut self, style: impl Into<Box<dyn StyleSheet + 'a>>) -> Self { - self.style_sheet = style.into(); + pub fn style( + mut self, + style: impl Into<<Renderer::Theme as StyleSheet>::Style>, + ) -> Self { + self.style = style.into(); self } } @@ -194,6 +202,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer> for PaneGrid<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::<state::Action>() @@ -343,11 +352,12 @@ where layout, cursor_position, renderer, + theme, style, viewport, self.spacing, self.on_resize.as_ref().map(|(leeway, _)| *leeway), - self.style_sheet.as_ref(), + self.style, self.elements .iter() .zip(&tree.children) @@ -391,8 +401,9 @@ where impl<'a, Message, Renderer> From<PaneGrid<'a, Message, Renderer>> for Element<'a, Message, Renderer> where - Renderer: 'a + iced_native::Renderer, Message: 'a, + Renderer: 'a + iced_native::Renderer, + Renderer::Theme: StyleSheet, { fn from( pane_grid: PaneGrid<'a, Message, Renderer>, diff --git a/style/src/pane_grid.rs b/style/src/pane_grid.rs index a12ac3f5..5bae353f 100644 --- a/style/src/pane_grid.rs +++ b/style/src/pane_grid.rs @@ -4,11 +4,13 @@ use iced_core::Color; /// A set of rules that dictate the style of a container. pub trait StyleSheet { + type Style: Default + Copy; + /// The [`Line`] to draw when a split is picked. - fn picked_split(&self) -> Option<Line>; + fn picked_split(&self, style: Self::Style) -> Option<Line>; /// The [`Line`] to draw when a split is hovered. - fn hovered_split(&self) -> Option<Line>; + fn hovered_split(&self, style: Self::Style) -> Option<Line>; } /// A line. @@ -22,30 +24,3 @@ pub struct Line { /// The width of the [`Line`]. pub width: f32, } - -struct Default; - -impl StyleSheet for Default { - fn picked_split(&self) -> Option<Line> { - None - } - - fn hovered_split(&self) -> Option<Line> { - None - } -} - -impl<'a> std::default::Default for Box<dyn StyleSheet + 'a> { - fn default() -> Self { - Box::new(Default) - } -} - -impl<'a, T> From<T> for Box<dyn StyleSheet + 'a> -where - T: StyleSheet + 'a, -{ - fn from(style_sheet: T) -> Self { - Box::new(style_sheet) - } -} diff --git a/style/src/theme.rs b/style/src/theme.rs index 2f9fd4fa..71330c2e 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::pane_grid; use crate::radio; use crate::slider; use crate::toggler; @@ -253,3 +254,28 @@ impl toggler::StyleSheet for Theme { } } } + +/* + * Pane Grid + */ +impl pane_grid::StyleSheet for Theme { + type Style = (); + + fn picked_split(&self, _style: Self::Style) -> Option<pane_grid::Line> { + let palette = self.extended_palette(); + + Some(pane_grid::Line { + color: palette.primary.strong.color, + width: 2.0, + }) + } + + fn hovered_split(&self, _style: Self::Style) -> Option<pane_grid::Line> { + let palette = self.extended_palette(); + + Some(pane_grid::Line { + color: palette.primary.base.color, + width: 2.0, + }) + } +} |