diff options
Diffstat (limited to 'pure/src')
27 files changed, 324 insertions, 117 deletions
diff --git a/pure/src/element.rs b/pure/src/element.rs index 5450db20..35c68716 100644 --- a/pure/src/element.rs +++ b/pure/src/element.rs @@ -25,7 +25,10 @@ pub struct Element<'a, Message, Renderer> {  impl<'a, Message, Renderer> Element<'a, Message, Renderer> {      /// Creates a new [`Element`] containing the given [`Widget`]. -    pub fn new(widget: impl Widget<Message, Renderer> + 'a) -> Self { +    pub fn new(widget: impl Widget<Message, Renderer> + 'a) -> Self +    where +        Renderer: iced_native::Renderer, +    {          Self {              widget: Box::new(widget),          } @@ -278,6 +281,7 @@ where          &self,          tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -286,6 +290,7 @@ where          self.widget.draw(              tree,              renderer, +            theme,              style,              layout,              cursor_position, diff --git a/pure/src/helpers.rs b/pure/src/helpers.rs index 746b807d..88598f9b 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)  } @@ -41,6 +42,7 @@ pub fn scrollable<'a, Message, Renderer>(  ) -> widget::Scrollable<'a, Message, Renderer>  where      Renderer: iced_native::Renderer, +    Renderer::Theme: widget::scrollable::StyleSheet,  {      widget::Scrollable::new(content)  } @@ -50,7 +52,11 @@ where  /// [`Button`]: widget::Button  pub fn button<'a, Message, Renderer>(      content: impl Into<Element<'a, Message, Renderer>>, -) -> widget::Button<'a, Message, Renderer> { +) -> widget::Button<'a, Message, Renderer> +where +    Renderer: iced_native::Renderer, +    Renderer::Theme: widget::button::StyleSheet, +{      widget::Button::new(content)  } @@ -65,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::text::StyleSheet,  {      widget::Tooltip::new(content, tooltip, position)  } @@ -75,6 +82,7 @@ where  pub fn text<Renderer>(text: impl Into<String>) -> widget::Text<Renderer>  where      Renderer: iced_native::text::Renderer, +    Renderer::Theme: widget::text::StyleSheet,  {      widget::Text::new(text)  } @@ -89,6 +97,7 @@ pub fn checkbox<'a, Message, Renderer>(  ) -> widget::Checkbox<'a, Message, Renderer>  where      Renderer: iced_native::text::Renderer, +    Renderer::Theme: widget::checkbox::StyleSheet + widget::text::StyleSheet,  {      widget::Checkbox::new(is_checked, label, f)  } @@ -96,15 +105,16 @@ where  /// Creates a new [`Radio`].  ///  /// [`Radio`]: widget::Radio -pub fn radio<'a, Message, Renderer, V>( +pub fn radio<Message, Renderer, V>(      label: impl Into<String>,      value: V,      selected: Option<V>,      on_click: impl FnOnce(V) -> Message, -) -> widget::Radio<'a, Message, Renderer> +) -> widget::Radio<Message, Renderer>  where      Message: Clone,      Renderer: iced_native::text::Renderer, +    Renderer::Theme: widget::radio::StyleSheet,      V: Copy + Eq,  {      widget::Radio::new(value, label, selected, on_click) @@ -120,6 +130,7 @@ pub fn toggler<'a, Message, Renderer>(  ) -> widget::Toggler<'a, Message, Renderer>  where      Renderer: iced_native::text::Renderer, +    Renderer::Theme: widget::toggler::StyleSheet,  {      widget::Toggler::new(is_checked, label, f)  } @@ -135,6 +146,7 @@ pub fn text_input<'a, Message, Renderer>(  where      Message: Clone,      Renderer: iced_native::text::Renderer, +    Renderer::Theme: widget::text_input::StyleSheet,  {      widget::TextInput::new(placeholder, value, on_change)  } @@ -142,14 +154,16 @@ where  /// Creates a new [`Slider`].  ///  /// [`Slider`]: widget::Slider -pub fn slider<'a, Message, T>( +pub fn slider<'a, T, Message, Renderer>(      range: std::ops::RangeInclusive<T>,      value: T,      on_change: impl Fn(T) -> Message + 'a, -) -> widget::Slider<'a, T, Message> +) -> widget::Slider<'a, T, Message, Renderer>  where -    Message: Clone,      T: Copy + From<u8> + std::cmp::PartialOrd, +    Message: Clone, +    Renderer: iced_native::Renderer, +    Renderer::Theme: widget::slider::StyleSheet,  {      widget::Slider::new(range, value, on_change)  } @@ -166,6 +180,7 @@ where      T: ToString + Eq + 'static,      [T]: ToOwned<Owned = Vec<T>>,      Renderer: iced_native::text::Renderer, +    Renderer::Theme: widget::pick_list::StyleSheet,  {      widget::PickList::new(options, selected, on_selected)  } @@ -194,14 +209,22 @@ pub fn vertical_space(height: Length) -> widget::Space {  /// Creates a horizontal [`Rule`] with the given height.  ///  /// [`Rule`]: widget::Rule -pub fn horizontal_rule<'a>(height: u16) -> widget::Rule<'a> { +pub fn horizontal_rule<Renderer>(height: u16) -> widget::Rule<Renderer> +where +    Renderer: iced_native::Renderer, +    Renderer::Theme: widget::rule::StyleSheet, +{      widget::Rule::horizontal(height)  }  /// Creates a vertical [`Rule`] with the given width.  ///  /// [`Rule`]: widget::Rule -pub fn vertical_rule<'a>(width: u16) -> widget::Rule<'a> { +pub fn vertical_rule<Renderer>(width: u16) -> widget::Rule<Renderer> +where +    Renderer: iced_native::Renderer, +    Renderer::Theme: widget::rule::StyleSheet, +{      widget::Rule::vertical(width)  } @@ -212,9 +235,13 @@ pub fn vertical_rule<'a>(width: u16) -> widget::Rule<'a> {  ///   * the current value of the [`ProgressBar`].  ///  /// [`ProgressBar`]: widget::ProgressBar -pub fn progress_bar<'a>( +pub fn progress_bar<Renderer>(      range: RangeInclusive<f32>,      value: f32, -) -> widget::ProgressBar<'a> { +) -> widget::ProgressBar<Renderer> +where +    Renderer: iced_native::Renderer, +    Renderer::Theme: widget::progress_bar::StyleSheet, +{      widget::ProgressBar::new(range, value)  } diff --git a/pure/src/lib.rs b/pure/src/lib.rs index fa5fd46f..95aa3098 100644 --- a/pure/src/lib.rs +++ b/pure/src/lib.rs @@ -174,7 +174,9 @@ impl State {      fn diff<Message, Renderer>(          &mut self,          new_element: &Element<'_, Message, Renderer>, -    ) { +    ) where +        Renderer: iced_native::Renderer, +    {          self.state_tree.diff(new_element);      }  } @@ -224,6 +226,7 @@ where      fn draw(          &self,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -232,6 +235,7 @@ where          self.element.as_widget().draw(              &self.state.state_tree,              renderer, +            theme,              style,              layout,              cursor_position, diff --git a/pure/src/overlay.rs b/pure/src/overlay.rs index fecaa2ac..b82d8a67 100644 --- a/pure/src/overlay.rs +++ b/pure/src/overlay.rs @@ -14,7 +14,10 @@ pub fn from_children<'a, Message, Renderer>(      tree: &'a mut Tree,      layout: Layout<'_>,      renderer: &Renderer, -) -> Option<Element<'a, Message, Renderer>> { +) -> Option<Element<'a, Message, Renderer>> +where +    Renderer: iced_native::Renderer, +{      children          .iter()          .zip(&mut tree.children) diff --git a/pure/src/widget.rs b/pure/src/widget.rs index cc04cc96..cd825ad8 100644 --- a/pure/src/widget.rs +++ b/pure/src/widget.rs @@ -11,6 +11,7 @@ pub mod rule;  pub mod scrollable;  pub mod slider;  pub mod svg; +pub mod text;  pub mod text_input;  pub mod toggler;  pub mod tooltip; @@ -19,7 +20,6 @@ pub mod tree;  mod column;  mod row;  mod space; -mod text;  pub use button::Button;  pub use checkbox::Checkbox; @@ -53,7 +53,10 @@ use iced_native::{Clipboard, Length, Point, Rectangle, Shell};  ///  /// If you want to build your own widgets, you will need to implement this  /// trait. -pub trait Widget<Message, Renderer> { +pub trait Widget<Message, Renderer> +where +    Renderer: iced_native::Renderer, +{      /// Returns the width of the [`Widget`].      fn width(&self) -> Length; @@ -75,6 +78,7 @@ pub trait Widget<Message, Renderer> {          &self,          state: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, diff --git a/pure/src/widget/button.rs b/pure/src/widget/button.rs index 456c2509..dd7688e2 100644 --- a/pure/src/widget/button.rs +++ b/pure/src/widget/button.rs @@ -12,7 +12,7 @@ use iced_native::{      Clipboard, Layout, Length, Padding, Point, Rectangle, Shell,  }; -pub use iced_style::button::{Style, StyleSheet}; +pub use iced_style::button::{Appearance, StyleSheet};  use button::State; @@ -50,25 +50,33 @@ use button::State;  ///     disabled_button().on_press(Message::ButtonPressed)  /// }  /// ``` -pub struct Button<'a, Message, Renderer> { +pub struct Button<'a, Message, Renderer> +where +    Renderer: iced_native::Renderer, +    Renderer::Theme: StyleSheet, +{      content: Element<'a, Message, Renderer>,      on_press: Option<Message>, -    style_sheet: Box<dyn StyleSheet + 'a>,      width: Length,      height: Length,      padding: Padding, +    style: <Renderer::Theme as StyleSheet>::Style,  } -impl<'a, Message, Renderer> Button<'a, Message, Renderer> { +impl<'a, Message, Renderer> Button<'a, Message, Renderer> +where +    Renderer: iced_native::Renderer, +    Renderer::Theme: StyleSheet, +{      /// Creates a new [`Button`] with the given content.      pub fn new(content: impl Into<Element<'a, Message, Renderer>>) -> Self {          Button {              content: content.into(),              on_press: None, -            style_sheet: Default::default(),              width: Length::Shrink,              height: Length::Shrink,              padding: Padding::new(5), +            style: <Renderer::Theme as StyleSheet>::Style::default(),          }      } @@ -98,12 +106,12 @@ impl<'a, Message, Renderer> Button<'a, Message, Renderer> {          self      } -    /// Sets the style of the [`Button`]. +    /// Sets the style variant of this [`Button`].      pub fn style(          mut self, -        style_sheet: impl Into<Box<dyn StyleSheet + 'a>>, +        style: <Renderer::Theme as StyleSheet>::Style,      ) -> Self { -        self.style_sheet = style_sheet.into(); +        self.style = style;          self      }  } @@ -113,6 +121,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>  where      Message: 'a + Clone,      Renderer: 'a + iced_native::Renderer, +    Renderer::Theme: StyleSheet,  {      fn tag(&self) -> tree::Tag {          tree::Tag::of::<State>() @@ -191,6 +200,7 @@ where          &self,          tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          _style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -204,13 +214,15 @@ where              bounds,              cursor_position,              self.on_press.is_some(), -            self.style_sheet.as_ref(), +            theme, +            self.style,              || tree.state.downcast_ref::<State>(),          );          self.content.as_widget().draw(              &tree.children[0],              renderer, +            theme,              &renderer::Style {                  text_color: styling.text_color,              }, @@ -254,6 +266,7 @@ impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>>  where      Message: Clone + 'a,      Renderer: iced_native::Renderer + 'a, +    Renderer::Theme: StyleSheet,  {      fn into(self) -> Element<'a, Message, Renderer> {          Element::new(self) diff --git a/pure/src/widget/checkbox.rs b/pure/src/widget/checkbox.rs index 98f55a56..9d6a78ce 100644 --- a/pure/src/widget/checkbox.rs +++ b/pure/src/widget/checkbox.rs @@ -7,14 +7,16 @@ use iced_native::layout::{self, Layout};  use iced_native::mouse;  use iced_native::renderer;  use iced_native::text; +use iced_native::widget;  use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; -pub use iced_native::widget::checkbox::{Checkbox, Style, StyleSheet}; +pub use iced_native::widget::checkbox::{Appearance, Checkbox, StyleSheet};  impl<'a, Message, Renderer> Widget<Message, Renderer>      for Checkbox<'a, Message, Renderer>  where      Renderer: text::Renderer, +    Renderer::Theme: StyleSheet + widget::text::StyleSheet,  {      fn width(&self) -> Length {          <Self as iced_native::Widget<Message, Renderer>>::width(self) @@ -59,6 +61,7 @@ where          &self,          _tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -67,6 +70,7 @@ where          <Self as iced_native::Widget<Message, Renderer>>::draw(              self,              renderer, +            theme,              style,              layout,              cursor_position, @@ -97,6 +101,7 @@ impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>>  where      Message: 'a,      Renderer: text::Renderer + 'a, +    Renderer::Theme: StyleSheet + widget::text::StyleSheet,  {      fn into(self) -> Element<'a, Message, Renderer> {          Element::new(self) diff --git a/pure/src/widget/column.rs b/pure/src/widget/column.rs index 7256f474..74d789a1 100644 --- a/pure/src/widget/column.rs +++ b/pure/src/widget/column.rs @@ -194,6 +194,7 @@ where          &self,          tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -208,6 +209,7 @@ where              child.as_widget().draw(                  state,                  renderer, +                theme,                  style,                  layout,                  cursor_position, diff --git a/pure/src/widget/container.rs b/pure/src/widget/container.rs index 91db1f3f..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<dyn StyleSheet + 'a>, +    style: <Renderer::Theme as StyleSheet>::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<T>(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<Box<dyn StyleSheet + 'a>>, +        style: impl Into<<Renderer::Theme as StyleSheet>::Style>,      ) -> Self { -        self.style_sheet = style_sheet.into(); +        self.style = style.into();          self      }  } @@ -123,6 +128,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>      for Container<'a, Message, Renderer>  where      Renderer: iced_native::Renderer, +    Renderer::Theme: StyleSheet,  {      fn children(&self) -> Vec<Tree> {          vec![Tree::new(&self.content)] @@ -201,18 +207,20 @@ where          &self,          tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          renderer_style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point,          viewport: &Rectangle,      ) { -        let style = self.style_sheet.style(); +        let style = theme.appearance(self.style);          container::draw_background(renderer, &style, layout.bounds());          self.content.as_widget().draw(              &tree.children[0],              renderer, +            theme,              &renderer::Style {                  text_color: style                      .text_color @@ -241,8 +249,9 @@ where  impl<'a, Message, Renderer> From<Container<'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(          column: Container<'a, Message, Renderer>, diff --git a/pure/src/widget/image.rs b/pure/src/widget/image.rs index ef764ec2..c42113dc 100644 --- a/pure/src/widget/image.rs +++ b/pure/src/widget/image.rs @@ -38,6 +38,7 @@ where          &self,          _tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -46,6 +47,7 @@ where          <Self as iced_native::Widget<Message, Renderer>>::draw(              self,              renderer, +            theme,              style,              layout,              cursor_position, diff --git a/pure/src/widget/pane_grid.rs b/pure/src/widget/pane_grid.rs index c532a6de..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}; @@ -83,7 +84,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 + container::StyleSheet, +{      state: &'a state::Internal,      elements: Vec<(Pane, Content<'a, Message, Renderer>)>,      width: Length, @@ -92,12 +97,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 + container::StyleSheet,  {      /// Creates a [`PaneGrid`] with the given [`State`] and view function.      /// @@ -124,7 +130,7 @@ where              on_click: None,              on_drag: None,              on_resize: None, -            style_sheet: Default::default(), +            style: Default::default(),          }      } @@ -184,8 +190,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 +203,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>      for PaneGrid<'a, Message, Renderer>  where      Renderer: iced_native::Renderer, +    Renderer::Theme: StyleSheet + container::StyleSheet,  {      fn tag(&self) -> tree::Tag {          tree::Tag::of::<state::Action>() @@ -331,6 +341,7 @@ where          &self,          tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -342,11 +353,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) @@ -360,6 +372,7 @@ where                  content.draw(                      tree,                      renderer, +                    theme,                      style,                      layout,                      cursor_position, @@ -389,8 +402,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 + 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 e66ac40b..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<TitleBar<'a, Message, Renderer>>,      body: Element<'a, Message, Renderer>, -    style_sheet: Box<dyn container::StyleSheet + 'a>, +    style: <Renderer::Theme as container::StyleSheet>::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<Element<'a, Message, Renderer>>) -> 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<Box<dyn container::StyleSheet + 'a>>, +        style: impl Into<<Renderer::Theme as container::StyleSheet>::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() { @@ -89,15 +95,18 @@ where          &self,          tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          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);          } @@ -112,6 +121,7 @@ where              title_bar.draw(                  &tree.children[1],                  renderer, +                theme,                  style,                  title_bar_layout,                  cursor_position, @@ -122,6 +132,7 @@ where              self.body.as_widget().draw(                  &tree.children[0],                  renderer, +                theme,                  style,                  body_layout,                  cursor_position, @@ -131,6 +142,7 @@ where              self.body.as_widget().draw(                  &tree.children[0],                  renderer, +                theme,                  style,                  layout,                  cursor_position, @@ -303,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, @@ -324,6 +337,7 @@ impl<'a, T, Message, Renderer> From<T> for Content<'a, Message, Renderer>  where      T: Into<Element<'a, Message, Renderer>>,      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 af71dc43..de9591a2 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<Element<'a, Message, Renderer>>,      padding: Padding,      always_show_controls: bool, -    style_sheet: Box<dyn container::StyleSheet + 'a>, +    style: <Renderer::Theme as container::StyleSheet>::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<E>(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<Box<dyn container::StyleSheet + 'a>>, +        style: impl Into<<Renderer::Theme as container::StyleSheet>::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() { @@ -113,14 +119,17 @@ where          &self,          tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          inherited_style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point,          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),          }; @@ -146,6 +155,7 @@ where                  controls.as_widget().draw(                      &tree.children[1],                      renderer, +                    theme,                      &inherited_style,                      controls_layout,                      cursor_position, @@ -158,6 +168,7 @@ where              self.content.as_widget().draw(                  &tree.children[0],                  renderer, +                theme,                  &inherited_style,                  title_layout,                  cursor_position, diff --git a/pure/src/widget/pick_list.rs b/pure/src/widget/pick_list.rs index 255e3681..2c465932 100644 --- a/pure/src/widget/pick_list.rs +++ b/pure/src/widget/pick_list.rs @@ -15,13 +15,15 @@ use iced_native::{  use std::borrow::Cow; -pub use iced_style::pick_list::{Style, StyleSheet}; +pub use iced_style::pick_list::{Appearance, StyleSheet};  /// A widget for selecting a single value from a list of options.  #[allow(missing_debug_implementations)] -pub struct PickList<'a, T, Message, Renderer: text::Renderer> +pub struct PickList<'a, T, Message, Renderer>  where      [T]: ToOwned<Owned = Vec<T>>, +    Renderer: text::Renderer, +    Renderer::Theme: StyleSheet,  {      on_selected: Box<dyn Fn(T) -> Message + 'a>,      options: Cow<'a, [T]>, @@ -31,14 +33,15 @@ where      padding: Padding,      text_size: Option<u16>,      font: Renderer::Font, -    style_sheet: Box<dyn StyleSheet + 'a>, +    style: <Renderer::Theme as StyleSheet>::Style,  } -impl<'a, T: 'a, Message, Renderer: text::Renderer> -    PickList<'a, T, Message, Renderer> +impl<'a, T: 'a, Message, Renderer> PickList<'a, T, Message, Renderer>  where      T: ToString + Eq,      [T]: ToOwned<Owned = Vec<T>>, +    Renderer: text::Renderer, +    Renderer::Theme: StyleSheet,  {      /// The default padding of a [`PickList`].      pub const DEFAULT_PADDING: Padding = Padding::new(5); @@ -59,7 +62,7 @@ where              text_size: None,              padding: Self::DEFAULT_PADDING,              font: Default::default(), -            style_sheet: Default::default(), +            style: Default::default(),          }      } @@ -96,9 +99,9 @@ where      /// Sets the style of the [`PickList`].      pub fn style(          mut self, -        style_sheet: impl Into<Box<dyn StyleSheet + 'a>>, +        style: impl Into<<Renderer::Theme as StyleSheet>::Style>,      ) -> Self { -        self.style_sheet = style_sheet.into(); +        self.style = style.into();          self      }  } @@ -110,6 +113,7 @@ where      [T]: ToOwned<Owned = Vec<T>>,      Message: 'a,      Renderer: text::Renderer + 'a, +    Renderer::Theme: StyleSheet,  {      fn tag(&self) -> tree::Tag {          tree::Tag::of::<pick_list::State<T>>() @@ -181,6 +185,7 @@ where          &self,          _tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          _style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -188,6 +193,7 @@ where      ) {          pick_list::draw(              renderer, +            theme,              layout,              cursor_position,              self.padding, @@ -195,7 +201,7 @@ where              &self.font,              self.placeholder.as_ref().map(String::as_str),              self.selected.as_ref(), -            self.style_sheet.as_ref(), +            self.style,          )      } @@ -214,7 +220,7 @@ where              self.text_size,              self.font.clone(),              &self.options, -            self.style_sheet.as_ref(), +            self.style,          )      }  } @@ -224,8 +230,9 @@ impl<'a, T: 'a, Message, Renderer> Into<Element<'a, Message, Renderer>>  where      T: Clone + ToString + Eq + 'static,      [T]: ToOwned<Owned = Vec<T>>, -    Renderer: text::Renderer + 'a,      Message: 'a, +    Renderer: text::Renderer + 'a, +    Renderer::Theme: StyleSheet,  {      fn into(self) -> Element<'a, Message, Renderer> {          Element::new(self) diff --git a/pure/src/widget/progress_bar.rs b/pure/src/widget/progress_bar.rs index 3016a81a..69c7d302 100644 --- a/pure/src/widget/progress_bar.rs +++ b/pure/src/widget/progress_bar.rs @@ -10,9 +10,10 @@ use iced_native::{Clipboard, Length, Point, Rectangle, Shell};  pub use iced_native::widget::progress_bar::*; -impl<'a, Message, Renderer> Widget<Message, Renderer> for ProgressBar<'a> +impl<'a, Message, Renderer> Widget<Message, Renderer> for ProgressBar<Renderer>  where      Renderer: iced_native::Renderer, +    Renderer::Theme: StyleSheet,  {      fn width(&self) -> Length {          <Self as iced_native::Widget<Message, Renderer>>::width(self) @@ -57,6 +58,7 @@ where          &self,          _tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -65,6 +67,7 @@ where          <Self as iced_native::Widget<Message, Renderer>>::draw(              self,              renderer, +            theme,              style,              layout,              cursor_position, @@ -91,9 +94,10 @@ where  }  impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>> -    for ProgressBar<'a> +    for ProgressBar<Renderer>  where      Renderer: iced_native::Renderer + 'a, +    Renderer::Theme: StyleSheet,  {      fn into(self) -> Element<'a, Message, Renderer> {          Element::new(self) diff --git a/pure/src/widget/radio.rs b/pure/src/widget/radio.rs index 7c98c937..7a6ffbac 100644 --- a/pure/src/widget/radio.rs +++ b/pure/src/widget/radio.rs @@ -7,15 +7,16 @@ use iced_native::layout::{self, Layout};  use iced_native::mouse;  use iced_native::renderer;  use iced_native::text; +use iced_native::widget;  use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; -pub use iced_native::widget::radio::{Radio, Style, StyleSheet}; +pub use iced_native::widget::radio::{Appearance, Radio, StyleSheet}; -impl<'a, Message, Renderer> Widget<Message, Renderer> -    for Radio<'a, Message, Renderer> +impl<Message, Renderer> Widget<Message, Renderer> for Radio<Message, Renderer>  where      Message: Clone,      Renderer: text::Renderer, +    Renderer::Theme: StyleSheet + widget::text::StyleSheet,  {      fn width(&self) -> Length {          <Self as iced_native::Widget<Message, Renderer>>::width(self) @@ -60,6 +61,7 @@ where          &self,          _tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -68,6 +70,7 @@ where          <Self as iced_native::Widget<Message, Renderer>>::draw(              self,              renderer, +            theme,              style,              layout,              cursor_position, @@ -94,10 +97,11 @@ where  }  impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>> -    for Radio<'a, Message, Renderer> +    for Radio<Message, Renderer>  where      Message: 'a + Clone,      Renderer: text::Renderer + 'a, +    Renderer::Theme: StyleSheet + widget::text::StyleSheet,  {      fn into(self) -> Element<'a, Message, Renderer> {          Element::new(self) diff --git a/pure/src/widget/row.rs b/pure/src/widget/row.rs index 0385b8bd..e747adfc 100644 --- a/pure/src/widget/row.rs +++ b/pure/src/widget/row.rs @@ -181,6 +181,7 @@ where          &self,          tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -195,6 +196,7 @@ where              child.as_widget().draw(                  state,                  renderer, +                theme,                  style,                  layout,                  cursor_position, diff --git a/pure/src/widget/rule.rs b/pure/src/widget/rule.rs index ab8537ae..66a47653 100644 --- a/pure/src/widget/rule.rs +++ b/pure/src/widget/rule.rs @@ -10,9 +10,10 @@ use iced_native::{Clipboard, Length, Point, Rectangle, Shell};  pub use iced_native::widget::rule::*; -impl<'a, Message, Renderer> Widget<Message, Renderer> for Rule<'a> +impl<'a, Message, Renderer> Widget<Message, Renderer> for Rule<Renderer>  where      Renderer: iced_native::Renderer, +    Renderer::Theme: StyleSheet,  {      fn width(&self) -> Length {          <Self as iced_native::Widget<Message, Renderer>>::width(self) @@ -57,6 +58,7 @@ where          &self,          _tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -65,6 +67,7 @@ where          <Self as iced_native::Widget<Message, Renderer>>::draw(              self,              renderer, +            theme,              style,              layout,              cursor_position, @@ -90,9 +93,11 @@ where      }  } -impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>> for Rule<'a> +impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>> +    for Rule<Renderer>  where      Renderer: iced_native::Renderer + 'a, +    Renderer::Theme: StyleSheet,  {      fn into(self) -> Element<'a, Message, Renderer> {          Element::new(self) diff --git a/pure/src/widget/scrollable.rs b/pure/src/widget/scrollable.rs index 70e951ef..4e24915b 100644 --- a/pure/src/widget/scrollable.rs +++ b/pure/src/widget/scrollable.rs @@ -15,18 +15,24 @@ pub use iced_style::scrollable::{Scrollbar, Scroller, StyleSheet};  /// A widget that can vertically display an infinite amount of content with a  /// scrollbar.  #[allow(missing_debug_implementations)] -pub struct Scrollable<'a, Message, Renderer> { +pub struct Scrollable<'a, Message, Renderer> +where +    Renderer: iced_native::Renderer, +    Renderer::Theme: StyleSheet, +{      height: Length,      scrollbar_width: u16,      scrollbar_margin: u16,      scroller_width: u16, -    on_scroll: Option<Box<dyn Fn(f32) -> Message + 'a>>, -    style_sheet: Box<dyn StyleSheet + 'a>,      content: Element<'a, Message, Renderer>, +    on_scroll: Option<Box<dyn Fn(f32) -> Message + 'a>>, +    style: <Renderer::Theme as StyleSheet>::Style,  } -impl<'a, Message, Renderer: iced_native::Renderer> -    Scrollable<'a, Message, Renderer> +impl<'a, Message, Renderer> Scrollable<'a, Message, Renderer> +where +    Renderer: iced_native::Renderer, +    Renderer::Theme: StyleSheet,  {      /// Creates a new [`Scrollable`].      pub fn new(content: impl Into<Element<'a, Message, Renderer>>) -> Self { @@ -35,9 +41,9 @@ impl<'a, Message, Renderer: iced_native::Renderer>              scrollbar_width: 10,              scrollbar_margin: 0,              scroller_width: 10, -            on_scroll: None, -            style_sheet: Default::default(),              content: content.into(), +            on_scroll: None, +            style: Default::default(),          }      } @@ -80,9 +86,9 @@ impl<'a, Message, Renderer: iced_native::Renderer>      /// Sets the style of the [`Scrollable`] .      pub fn style(          mut self, -        style_sheet: impl Into<Box<dyn StyleSheet + 'a>>, +        style: impl Into<<Renderer::Theme as StyleSheet>::Style>,      ) -> Self { -        self.style_sheet = style_sheet.into(); +        self.style = style.into();          self      }  } @@ -91,6 +97,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>      for Scrollable<'a, Message, Renderer>  where      Renderer: iced_native::Renderer, +    Renderer::Theme: StyleSheet,  {      fn tag(&self) -> tree::Tag {          tree::Tag::of::<scrollable::State>() @@ -171,6 +178,7 @@ where          &self,          tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -179,16 +187,18 @@ where          scrollable::draw(              tree.state.downcast_ref::<scrollable::State>(),              renderer, +            theme,              layout,              cursor_position,              self.scrollbar_width,              self.scrollbar_margin,              self.scroller_width, -            self.style_sheet.as_ref(), +            self.style,              |renderer, layout, cursor_position, viewport| {                  self.content.as_widget().draw(                      &tree.children[0],                      renderer, +                    theme,                      style,                      layout,                      cursor_position, @@ -257,6 +267,7 @@ impl<'a, Message, Renderer> From<Scrollable<'a, Message, Renderer>>  where      Message: 'a + Clone,      Renderer: 'a + iced_native::Renderer, +    Renderer::Theme: StyleSheet,  {      fn from(          text_input: Scrollable<'a, Message, Renderer>, diff --git a/pure/src/widget/slider.rs b/pure/src/widget/slider.rs index 4d8bbce4..fed979e5 100644 --- a/pure/src/widget/slider.rs +++ b/pure/src/widget/slider.rs @@ -11,7 +11,7 @@ use iced_native::{Clipboard, Layout, Length, Point, Rectangle, Shell, Size};  use std::ops::RangeInclusive; -pub use iced_style::slider::{Handle, HandleShape, Style, StyleSheet}; +pub use iced_style::slider::{Appearance, Handle, HandleShape, StyleSheet};  /// An horizontal bar and a handle that selects a single value from a range of  /// values. @@ -23,7 +23,10 @@ pub use iced_style::slider::{Handle, HandleShape, Style, StyleSheet};  ///  /// # Example  /// ``` -/// # use iced_pure::widget::Slider; +/// # use iced_pure::widget::slider; +/// # use iced_native::renderer::Null; +/// # +/// # type Slider<'a, T, Message> = slider::Slider<'a, T, Message, Null>;  /// #  /// #[derive(Clone)]  /// pub enum Message { @@ -37,7 +40,11 @@ pub use iced_style::slider::{Handle, HandleShape, Style, StyleSheet};  ///  ///   #[allow(missing_debug_implementations)] -pub struct Slider<'a, T, Message> { +pub struct Slider<'a, T, Message, Renderer> +where +    Renderer: iced_native::Renderer, +    Renderer::Theme: StyleSheet, +{      range: RangeInclusive<T>,      step: T,      value: T, @@ -45,13 +52,15 @@ pub struct Slider<'a, T, Message> {      on_release: Option<Message>,      width: Length,      height: u16, -    style_sheet: Box<dyn StyleSheet + 'a>, +    style: <Renderer::Theme as StyleSheet>::Style,  } -impl<'a, T, Message> Slider<'a, T, Message> +impl<'a, T, Message, Renderer> Slider<'a, T, Message, Renderer>  where      T: Copy + From<u8> + std::cmp::PartialOrd,      Message: Clone, +    Renderer: iced_native::Renderer, +    Renderer::Theme: StyleSheet,  {      /// The default height of a [`Slider`].      pub const DEFAULT_HEIGHT: u16 = 22; @@ -88,7 +97,7 @@ where              on_release: None,              width: Length::Fill,              height: Self::DEFAULT_HEIGHT, -            style_sheet: Default::default(), +            style: Default::default(),          }      } @@ -118,9 +127,9 @@ where      /// Sets the style of the [`Slider`].      pub fn style(          mut self, -        style_sheet: impl Into<Box<dyn StyleSheet + 'a>>, +        style: impl Into<<Renderer::Theme as StyleSheet>::Style>,      ) -> Self { -        self.style_sheet = style_sheet.into(); +        self.style = style.into();          self      } @@ -132,11 +141,12 @@ where  }  impl<'a, T, Message, Renderer> Widget<Message, Renderer> -    for Slider<'a, T, Message> +    for Slider<'a, T, Message, Renderer>  where      T: Copy + Into<f64> + num_traits::FromPrimitive,      Message: Clone,      Renderer: iced_native::Renderer, +    Renderer::Theme: StyleSheet,  {      fn tag(&self) -> tree::Tag {          tree::Tag::of::<slider::State>() @@ -195,6 +205,7 @@ where          &self,          tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          _style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -207,7 +218,8 @@ where              tree.state.downcast_ref::<slider::State>(),              self.value,              &self.range, -            self.style_sheet.as_ref(), +            theme, +            self.style,          )      } @@ -227,14 +239,17 @@ where      }  } -impl<'a, T, Message, Renderer> From<Slider<'a, T, Message>> +impl<'a, T, Message, Renderer> From<Slider<'a, T, Message, Renderer>>      for Element<'a, Message, Renderer>  where      T: 'a + Copy + Into<f64> + num_traits::FromPrimitive,      Message: 'a + Clone,      Renderer: 'a + iced_native::Renderer, +    Renderer::Theme: StyleSheet,  { -    fn from(slider: Slider<'a, T, Message>) -> Element<'a, Message, Renderer> { +    fn from( +        slider: Slider<'a, T, Message, Renderer>, +    ) -> Element<'a, Message, Renderer> {          Element::new(slider)      }  } diff --git a/pure/src/widget/space.rs b/pure/src/widget/space.rs index b408153b..7d95ebd7 100644 --- a/pure/src/widget/space.rs +++ b/pure/src/widget/space.rs @@ -56,6 +56,7 @@ where          &self,          _tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -64,6 +65,7 @@ where          <Self as iced_native::Widget<Message, Renderer>>::draw(              self,              renderer, +            theme,              style,              layout,              cursor_position, diff --git a/pure/src/widget/svg.rs b/pure/src/widget/svg.rs index 14180097..501d9bfa 100644 --- a/pure/src/widget/svg.rs +++ b/pure/src/widget/svg.rs @@ -36,6 +36,7 @@ where          &self,          _tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -44,6 +45,7 @@ where          <Self as iced_native::Widget<Message, Renderer>>::draw(              self,              renderer, +            theme,              style,              layout,              cursor_position, diff --git a/pure/src/widget/text.rs b/pure/src/widget/text.rs index 58a939c1..23999a2c 100644 --- a/pure/src/widget/text.rs +++ b/pure/src/widget/text.rs @@ -1,16 +1,19 @@ +//! Write some text for your users to read.  use crate::widget::Tree;  use crate::{Element, Widget};  use iced_native::layout::{self, Layout};  use iced_native::renderer;  use iced_native::text; +use iced_native::widget;  use iced_native::{Length, Point, Rectangle}; -pub use iced_native::widget::Text; +pub use iced_native::widget::text::{Appearance, StyleSheet, Text};  impl<Message, Renderer> Widget<Message, Renderer> for Text<Renderer>  where      Renderer: text::Renderer, +    Renderer::Theme: widget::text::StyleSheet,  {      fn width(&self) -> Length {          <Self as iced_native::Widget<Message, Renderer>>::width(self) @@ -34,6 +37,7 @@ where          &self,          _tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -42,6 +46,7 @@ where          <Self as iced_native::Widget<Message, Renderer>>::draw(              self,              renderer, +            theme,              style,              layout,              cursor_position, @@ -54,6 +59,7 @@ impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>>      for Text<Renderer>  where      Renderer: text::Renderer + 'a, +    Renderer::Theme: widget::text::StyleSheet,  {      fn into(self) -> Element<'a, Message, Renderer> {          Element::new(self) @@ -63,6 +69,7 @@ where  impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>> for &'a str  where      Renderer: text::Renderer + 'a, +    Renderer::Theme: widget::text::StyleSheet,  {      fn into(self) -> Element<'a, Message, Renderer> {          Text::new(self).into() diff --git a/pure/src/widget/text_input.rs b/pure/src/widget/text_input.rs index ee790359..9b0a466a 100644 --- a/pure/src/widget/text_input.rs +++ b/pure/src/widget/text_input.rs @@ -10,7 +10,7 @@ use iced_native::text;  use iced_native::widget::text_input;  use iced_native::{Clipboard, Length, Padding, Point, Rectangle, Shell}; -pub use iced_style::text_input::{Style, StyleSheet}; +pub use iced_style::text_input::{Appearance, StyleSheet};  /// A field that can be filled with text.  /// @@ -33,7 +33,11 @@ pub use iced_style::text_input::{Style, StyleSheet};  /// ```  ///   #[allow(missing_debug_implementations)] -pub struct TextInput<'a, Message, Renderer: text::Renderer> { +pub struct TextInput<'a, Message, Renderer> +where +    Renderer: text::Renderer, +    Renderer::Theme: StyleSheet, +{      placeholder: String,      value: text_input::Value,      is_secure: bool, @@ -43,13 +47,14 @@ pub struct TextInput<'a, Message, Renderer: text::Renderer> {      size: Option<u16>,      on_change: Box<dyn Fn(String) -> Message + 'a>,      on_submit: Option<Message>, -    style_sheet: Box<dyn StyleSheet + 'a>, +    style: <Renderer::Theme as StyleSheet>::Style,  }  impl<'a, Message, Renderer> TextInput<'a, Message, Renderer>  where      Message: Clone,      Renderer: text::Renderer, +    Renderer::Theme: StyleSheet,  {      /// Creates a new [`TextInput`].      /// @@ -71,7 +76,7 @@ where              size: None,              on_change: Box::new(on_change),              on_submit: None, -            style_sheet: Default::default(), +            style: Default::default(),          }      } @@ -83,7 +88,7 @@ where      /// Sets the [`Font`] of the [`TextInput`].      /// -    /// [`Font`]: iced_native::text::Renderer::Font +    /// [`Font`]: text::Renderer::Font      pub fn font(mut self, font: Renderer::Font) -> Self {          self.font = font;          self @@ -116,9 +121,9 @@ where      /// Sets the style of the [`TextInput`].      pub fn style(          mut self, -        style_sheet: impl Into<Box<dyn StyleSheet + 'a>>, +        style: impl Into<<Renderer::Theme as StyleSheet>::Style>,      ) -> Self { -        self.style_sheet = style_sheet.into(); +        self.style = style.into();          self      } @@ -130,12 +135,14 @@ where          &self,          tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          layout: Layout<'_>,          cursor_position: Point,          value: Option<&text_input::Value>,      ) {          text_input::draw(              renderer, +            theme,              layout,              cursor_position,              tree.state.downcast_ref::<text_input::State>(), @@ -144,7 +151,7 @@ where              self.size,              &self.font,              self.is_secure, -            self.style_sheet.as_ref(), +            self.style,          )      }  } @@ -153,7 +160,8 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>      for TextInput<'a, Message, Renderer>  where      Message: Clone, -    Renderer: iced_native::text::Renderer, +    Renderer: text::Renderer, +    Renderer::Theme: StyleSheet,  {      fn tag(&self) -> tree::Tag {          tree::Tag::of::<text_input::State>() @@ -216,6 +224,7 @@ where          &self,          tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          _style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -223,6 +232,7 @@ where      ) {          text_input::draw(              renderer, +            theme,              layout,              cursor_position,              tree.state.downcast_ref::<text_input::State>(), @@ -231,7 +241,7 @@ where              self.size,              &self.font,              self.is_secure, -            self.style_sheet.as_ref(), +            self.style,          )      } @@ -252,6 +262,7 @@ impl<'a, Message, Renderer> From<TextInput<'a, Message, Renderer>>  where      Message: 'a + Clone,      Renderer: 'a + text::Renderer, +    Renderer::Theme: StyleSheet,  {      fn from(          text_input: TextInput<'a, Message, Renderer>, diff --git a/pure/src/widget/toggler.rs b/pure/src/widget/toggler.rs index b9c5ec02..5efa39ab 100644 --- a/pure/src/widget/toggler.rs +++ b/pure/src/widget/toggler.rs @@ -7,14 +7,16 @@ use iced_native::layout::{self, Layout};  use iced_native::mouse;  use iced_native::renderer;  use iced_native::text; +use iced_native::widget;  use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; -pub use iced_native::widget::toggler::{Style, StyleSheet, Toggler}; +pub use iced_native::widget::toggler::{Appearance, StyleSheet, Toggler};  impl<'a, Message, Renderer> Widget<Message, Renderer>      for Toggler<'a, Message, Renderer>  where      Renderer: text::Renderer, +    Renderer::Theme: StyleSheet + widget::text::StyleSheet,  {      fn width(&self) -> Length {          <Self as iced_native::Widget<Message, Renderer>>::width(self) @@ -38,6 +40,7 @@ where          &self,          _state: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -46,6 +49,7 @@ where          <Self as iced_native::Widget<Message, Renderer>>::draw(              self,              renderer, +            theme,              style,              layout,              cursor_position, @@ -97,6 +101,7 @@ impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>>  where      Message: 'a,      Renderer: text::Renderer + 'a, +    Renderer::Theme: StyleSheet + widget::text::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 3887732a..cbc34722 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::widget::{self, 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 + widget::text::StyleSheet, +{      content: Element<'a, Message, Renderer>,      tooltip: Text<Renderer>,      position: Position, -    style_sheet: Box<dyn StyleSheet + 'a>,      gap: u16,      padding: u16, +    style: <Renderer::Theme as container::StyleSheet>::Style,  }  impl<'a, Message, Renderer> Tooltip<'a, Message, Renderer>  where      Renderer: text::Renderer, +    Renderer::Theme: container::StyleSheet + widget::text::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<Box<dyn StyleSheet + 'a>>, +        style: impl Into<<Renderer::Theme as container::StyleSheet>::Style>,      ) -> Self { -        self.style_sheet = style_sheet.into(); +        self.style = style.into();          self      }  } @@ -90,6 +96,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>      for Tooltip<'a, Message, Renderer>  where      Renderer: text::Renderer, +    Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,  {      fn children(&self) -> Vec<Tree> {          vec![Tree::new(&self.content)] @@ -157,6 +164,7 @@ where          &self,          tree: &Tree,          renderer: &mut Renderer, +        theme: &Renderer::Theme,          inherited_style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point, @@ -165,6 +173,7 @@ where          self.content.as_widget().draw(              &tree.children[0],              renderer, +            theme,              inherited_style,              layout,              cursor_position, @@ -175,6 +184,7 @@ where          tooltip::draw(              renderer, +            theme,              inherited_style,              layout,              cursor_position, @@ -182,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)              }, @@ -191,6 +201,7 @@ where                      tooltip,                      &Tree::empty(),                      renderer, +                    theme,                      defaults,                      layout,                      cursor_position, @@ -217,8 +228,9 @@ where  impl<'a, Message, Renderer> From<Tooltip<'a, Message, Renderer>>      for Element<'a, Message, Renderer>  where -    Renderer: 'a + text::Renderer,      Message: 'a, +    Renderer: 'a + text::Renderer, +    Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,  {      fn from(          tooltip: Tooltip<'a, Message, Renderer>, diff --git a/pure/src/widget/tree.rs b/pure/src/widget/tree.rs index 0bb3107a..2f876523 100644 --- a/pure/src/widget/tree.rs +++ b/pure/src/widget/tree.rs @@ -31,7 +31,10 @@ impl Tree {      /// Creates a new [`Tree`] for the provided [`Element`].      pub fn new<'a, Message, Renderer>(          widget: impl Borrow<dyn Widget<Message, Renderer> + 'a>, -    ) -> Self { +    ) -> Self +    where +        Renderer: iced_native::Renderer, +    {          let widget = widget.borrow();          Self { @@ -52,7 +55,9 @@ impl Tree {      pub fn diff<'a, Message, Renderer>(          &mut self,          new: impl Borrow<dyn Widget<Message, Renderer> + 'a>, -    ) { +    ) where +        Renderer: iced_native::Renderer, +    {          if self.tag == new.borrow().tag() {              new.borrow().diff(self)          } else { @@ -64,7 +69,9 @@ impl Tree {      pub fn diff_children<'a, Message, Renderer>(          &mut self,          new_children: &[impl Borrow<dyn Widget<Message, Renderer> + 'a>], -    ) { +    ) where +        Renderer: iced_native::Renderer, +    {          self.diff_children_custom(              new_children,              |tree, widget| tree.diff(widget.borrow()),  | 
