From 97555e67af8b4bcc77df69c5e72156e14948150e Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 7 Jun 2022 04:11:24 +0200 Subject: Implement theme styling for `Container` --- pure/src/helpers.rs | 2 ++ pure/src/widget/container.rs | 23 +++++++++++++++-------- pure/src/widget/pane_grid.rs | 9 +++++---- pure/src/widget/pane_grid/content.rs | 22 ++++++++++++++++------ pure/src/widget/pane_grid/title_bar.rs | 20 ++++++++++++++------ pure/src/widget/pick_list.rs | 5 +++-- pure/src/widget/tooltip.rs | 25 +++++++++++++++++-------- 7 files changed, 72 insertions(+), 34 deletions(-) (limited to 'pure') diff --git a/pure/src/helpers.rs b/pure/src/helpers.rs index 810b3885..216dab53 100644 --- a/pure/src/helpers.rs +++ b/pure/src/helpers.rs @@ -14,6 +14,7 @@ pub fn container<'a, Message, Renderer>( ) -> widget::Container<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: widget::container::StyleSheet, { widget::Container::new(content) } @@ -70,6 +71,7 @@ pub fn tooltip<'a, Message, Renderer>( ) -> widget::Tooltip<'a, Message, Renderer> where Renderer: iced_native::text::Renderer, + Renderer::Theme: widget::container::StyleSheet, { widget::Tooltip::new(content, tooltip, position) } diff --git a/pure/src/widget/container.rs b/pure/src/widget/container.rs index 0ec2351a..8ea9ca72 100644 --- a/pure/src/widget/container.rs +++ b/pure/src/widget/container.rs @@ -15,13 +15,17 @@ use iced_native::{ use std::u32; -pub use iced_style::container::{Style, StyleSheet}; +pub use iced_style::container::{Appearance, StyleSheet}; /// An element decorating some content. /// /// It is normally used for alignment purposes. #[allow(missing_debug_implementations)] -pub struct Container<'a, Message, Renderer> { +pub struct Container<'a, Message, Renderer> +where + Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, +{ padding: Padding, width: Length, height: Length, @@ -29,13 +33,14 @@ pub struct Container<'a, Message, Renderer> { max_height: u32, horizontal_alignment: alignment::Horizontal, vertical_alignment: alignment::Vertical, - style_sheet: Box, + style: ::Style, content: Element<'a, Message, Renderer>, } impl<'a, Message, Renderer> Container<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, { /// Creates an empty [`Container`]. pub fn new(content: T) -> Self @@ -50,7 +55,7 @@ where max_height: u32::MAX, horizontal_alignment: alignment::Horizontal::Left, vertical_alignment: alignment::Vertical::Top, - style_sheet: Default::default(), + style: Default::default(), content: content.into(), } } @@ -112,9 +117,9 @@ where /// Sets the style of the [`Container`]. pub fn style( mut self, - style_sheet: impl Into>, + style: impl Into<::Style>, ) -> Self { - self.style_sheet = style_sheet.into(); + self.style = style.into(); self } } @@ -123,6 +128,7 @@ impl<'a, Message, Renderer> Widget for Container<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: StyleSheet, { fn children(&self) -> Vec { vec![Tree::new(&self.content)] @@ -207,7 +213,7 @@ where cursor_position: Point, viewport: &Rectangle, ) { - let style = self.style_sheet.style(); + let style = theme.appearance(self.style); container::draw_background(renderer, &style, layout.bounds()); @@ -243,8 +249,9 @@ where impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where - Renderer: 'a + iced_native::Renderer, Message: 'a, + Renderer: 'a + iced_native::Renderer, + Renderer::Theme: StyleSheet, { fn from( column: Container<'a, Message, Renderer>, diff --git a/pure/src/widget/pane_grid.rs b/pure/src/widget/pane_grid.rs index e2ba1e7e..69150aa8 100644 --- a/pure/src/widget/pane_grid.rs +++ b/pure/src/widget/pane_grid.rs @@ -19,6 +19,7 @@ pub use iced_native::widget::pane_grid::{ }; use crate::overlay; +use crate::widget::container; use crate::widget::tree::{self, Tree}; use crate::{Element, Widget}; @@ -86,7 +87,7 @@ pub use iced_style::pane_grid::{Line, StyleSheet}; pub struct PaneGrid<'a, Message, Renderer> where Renderer: iced_native::Renderer, - Renderer::Theme: StyleSheet, + Renderer::Theme: StyleSheet + container::StyleSheet, { state: &'a state::Internal, elements: Vec<(Pane, Content<'a, Message, Renderer>)>, @@ -102,7 +103,7 @@ where impl<'a, Message, Renderer> PaneGrid<'a, Message, Renderer> where Renderer: iced_native::Renderer, - Renderer::Theme: StyleSheet, + Renderer::Theme: StyleSheet + container::StyleSheet, { /// Creates a [`PaneGrid`] with the given [`State`] and view function. /// @@ -202,7 +203,7 @@ impl<'a, Message, Renderer> Widget for PaneGrid<'a, Message, Renderer> where Renderer: iced_native::Renderer, - Renderer::Theme: StyleSheet, + Renderer::Theme: StyleSheet + container::StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::() @@ -403,7 +404,7 @@ impl<'a, Message, Renderer> From> where Message: 'a, Renderer: 'a + iced_native::Renderer, - Renderer::Theme: StyleSheet, + Renderer::Theme: StyleSheet + container::StyleSheet, { fn from( pane_grid: PaneGrid<'a, Message, Renderer>, diff --git a/pure/src/widget/pane_grid/content.rs b/pure/src/widget/pane_grid/content.rs index 5069bd4a..9c2a0f4a 100644 --- a/pure/src/widget/pane_grid/content.rs +++ b/pure/src/widget/pane_grid/content.rs @@ -15,22 +15,27 @@ use iced_native::{Clipboard, Layout, Point, Rectangle, Shell, Size}; /// /// [`Pane`]: crate::widget::pane_grid::Pane #[allow(missing_debug_implementations)] -pub struct Content<'a, Message, Renderer> { +pub struct Content<'a, Message, Renderer> +where + Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, +{ title_bar: Option>, body: Element<'a, Message, Renderer>, - style_sheet: Box, + style: ::Style, } impl<'a, Message, Renderer> Content<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, { /// Creates a new [`Content`] with the provided body. pub fn new(body: impl Into>) -> Self { Self { title_bar: None, body: body.into(), - style_sheet: Default::default(), + style: Default::default(), } } @@ -46,9 +51,9 @@ where /// Sets the style of the [`Content`]. pub fn style( mut self, - style_sheet: impl Into>, + style: impl Into<::Style>, ) -> Self { - self.style_sheet = style_sheet.into(); + self.style = style.into(); self } } @@ -56,6 +61,7 @@ where impl<'a, Message, Renderer> Content<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, { pub(super) fn state(&self) -> Tree { let children = if let Some(title_bar) = self.title_bar.as_ref() { @@ -95,10 +101,12 @@ where cursor_position: Point, viewport: &Rectangle, ) { + use container::StyleSheet; + let bounds = layout.bounds(); { - let style = self.style_sheet.style(); + let style = theme.appearance(self.style); container::draw_background(renderer, &style, bounds); } @@ -307,6 +315,7 @@ where impl<'a, Message, Renderer> Draggable for &Content<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, { fn can_be_dragged_at( &self, @@ -328,6 +337,7 @@ impl<'a, T, Message, Renderer> From for Content<'a, Message, Renderer> where T: Into>, Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, { fn from(element: T) -> Self { Self::new(element) diff --git a/pure/src/widget/pane_grid/title_bar.rs b/pure/src/widget/pane_grid/title_bar.rs index 28a3d7fc..950fd990 100644 --- a/pure/src/widget/pane_grid/title_bar.rs +++ b/pure/src/widget/pane_grid/title_bar.rs @@ -13,17 +13,22 @@ use iced_native::{Clipboard, Layout, Padding, Point, Rectangle, Shell, Size}; /// /// [`Pane`]: crate::widget::pane_grid::Pane #[allow(missing_debug_implementations)] -pub struct TitleBar<'a, Message, Renderer> { +pub struct TitleBar<'a, Message, Renderer> +where + Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, +{ content: Element<'a, Message, Renderer>, controls: Option>, padding: Padding, always_show_controls: bool, - style_sheet: Box, + style: ::Style, } impl<'a, Message, Renderer> TitleBar<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, { /// Creates a new [`TitleBar`] with the given content. pub fn new(content: E) -> Self @@ -35,7 +40,7 @@ where controls: None, padding: Padding::ZERO, always_show_controls: false, - style_sheet: Default::default(), + style: Default::default(), } } @@ -57,9 +62,9 @@ where /// Sets the style of the [`TitleBar`]. pub fn style( mut self, - style: impl Into>, + style: impl Into<::Style>, ) -> Self { - self.style_sheet = style.into(); + self.style = style.into(); self } @@ -80,6 +85,7 @@ where impl<'a, Message, Renderer> TitleBar<'a, Message, Renderer> where Renderer: iced_native::Renderer, + Renderer::Theme: container::StyleSheet, { pub(super) fn state(&self) -> Tree { let children = if let Some(controls) = self.controls.as_ref() { @@ -120,8 +126,10 @@ where viewport: &Rectangle, show_controls: bool, ) { + use container::StyleSheet; + let bounds = layout.bounds(); - let style = self.style_sheet.style(); + let style = theme.appearance(self.style); let inherited_style = renderer::Style { text_color: style.text_color.unwrap_or(inherited_style.text_color), }; diff --git a/pure/src/widget/pick_list.rs b/pure/src/widget/pick_list.rs index 8fadd785..7c8a3be6 100644 --- a/pure/src/widget/pick_list.rs +++ b/pure/src/widget/pick_list.rs @@ -1,4 +1,5 @@ //! Display a dropdown list of selectable values. +use crate::widget::container; use crate::widget::scrollable; use crate::widget::tree::{self, Tree}; use crate::{Element, Widget}; @@ -111,7 +112,7 @@ where [T]: ToOwned>, Message: 'a, Renderer: text::Renderer + 'a, - Renderer::Theme: scrollable::StyleSheet, + Renderer::Theme: container::StyleSheet + scrollable::StyleSheet, { fn tag(&self) -> tree::Tag { tree::Tag::of::>() @@ -229,7 +230,7 @@ where [T]: ToOwned>, Message: 'a, Renderer: text::Renderer + 'a, - Renderer::Theme: scrollable::StyleSheet, + Renderer::Theme: container::StyleSheet + scrollable::StyleSheet, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) diff --git a/pure/src/widget/tooltip.rs b/pure/src/widget/tooltip.rs index 15aa32fe..745d100d 100644 --- a/pure/src/widget/tooltip.rs +++ b/pure/src/widget/tooltip.rs @@ -7,27 +7,33 @@ use iced_native::mouse; use iced_native::overlay; use iced_native::renderer; use iced_native::text; +use iced_native::widget::container; use iced_native::widget::tooltip; use iced_native::widget::Text; use iced_native::{Clipboard, Layout, Length, Point, Rectangle, Shell}; -pub use iced_style::container::{Style, StyleSheet}; +pub use iced_style::container::{Appearance, StyleSheet}; pub use tooltip::Position; /// An element to display a widget over another. #[allow(missing_debug_implementations)] -pub struct Tooltip<'a, Message, Renderer: text::Renderer> { +pub struct Tooltip<'a, Message, Renderer: text::Renderer> +where + Renderer: text::Renderer, + Renderer::Theme: container::StyleSheet, +{ content: Element<'a, Message, Renderer>, tooltip: Text, position: Position, - style_sheet: Box, gap: u16, padding: u16, + style: ::Style, } impl<'a, Message, Renderer> Tooltip<'a, Message, Renderer> where Renderer: text::Renderer, + Renderer::Theme: container::StyleSheet, { /// The default padding of a [`Tooltip`] drawn by this renderer. const DEFAULT_PADDING: u16 = 5; @@ -44,9 +50,9 @@ where content: content.into(), tooltip: Text::new(tooltip.to_string()), position, - style_sheet: Default::default(), gap: 0, padding: Self::DEFAULT_PADDING, + style: Default::default(), } } @@ -79,9 +85,9 @@ where /// Sets the style of the [`Tooltip`]. pub fn style( mut self, - style_sheet: impl Into>, + style: impl Into<::Style>, ) -> Self { - self.style_sheet = style_sheet.into(); + self.style = style.into(); self } } @@ -90,6 +96,7 @@ impl<'a, Message, Renderer> Widget for Tooltip<'a, Message, Renderer> where Renderer: text::Renderer, + Renderer::Theme: container::StyleSheet, { fn children(&self) -> Vec { vec![Tree::new(&self.content)] @@ -177,6 +184,7 @@ where tooltip::draw( renderer, + theme, inherited_style, layout, cursor_position, @@ -184,7 +192,7 @@ where self.position, self.gap, self.padding, - self.style_sheet.as_ref(), + self.style, |renderer, limits| { Widget::<(), Renderer>::layout(tooltip, renderer, limits) }, @@ -220,8 +228,9 @@ where impl<'a, Message, Renderer> From> for Element<'a, Message, Renderer> where - Renderer: 'a + text::Renderer, Message: 'a, + Renderer: 'a + text::Renderer, + Renderer::Theme: container::StyleSheet, { fn from( tooltip: Tooltip<'a, Message, Renderer>, -- cgit