From d61cb58d92b6fcd520f665deb093f3747ffd5e5c Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Mon, 18 Oct 2021 15:36:32 +0700
Subject: Wire up `container` styling to `iced_native`

---
 native/src/overlay/menu.rs               |  3 +--
 native/src/renderer/null.rs              |  5 -----
 native/src/widget/container.rs           | 29 ++++++++++-------------------
 native/src/widget/pane_grid.rs           |  5 ++---
 native/src/widget/pane_grid/content.rs   | 11 ++++-------
 native/src/widget/pane_grid/title_bar.rs |  9 +++------
 native/src/widget/scrollable.rs          |  5 +----
 native/src/widget/tooltip.rs             | 16 +++++++---------
 8 files changed, 28 insertions(+), 55 deletions(-)

(limited to 'native')

diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs
index f2367ae7..a6527a8d 100644
--- a/native/src/overlay/menu.rs
+++ b/native/src/overlay/menu.rs
@@ -1,5 +1,4 @@
 //! Build and show dropdown menus.
-use crate::container;
 use crate::event::{self, Event};
 use crate::layout;
 use crate::mouse;
@@ -396,7 +395,7 @@ where
 /// able to use a [`Menu`] in your user interface.
 ///
 /// [renderer]: crate::renderer
-pub trait Renderer: container::Renderer + text::Renderer {
+pub trait Renderer: text::Renderer {
     /// The [`Menu`] style supported by this renderer.
     type Style: Default + Clone;
 }
diff --git a/native/src/renderer/null.rs b/native/src/renderer/null.rs
index 268248fd..fdb6ea92 100644
--- a/native/src/renderer/null.rs
+++ b/native/src/renderer/null.rs
@@ -1,6 +1,5 @@
 use crate::button;
 use crate::checkbox;
-use crate::container;
 use crate::pane_grid;
 use crate::progress_bar;
 use crate::radio;
@@ -123,10 +122,6 @@ impl progress_bar::Renderer for Null {
     const DEFAULT_HEIGHT: u16 = 30;
 }
 
-impl container::Renderer for Null {
-    type Style = ();
-}
-
 impl pane_grid::Renderer for Null {
     type Style = ();
 }
diff --git a/native/src/widget/container.rs b/native/src/widget/container.rs
index 92869873..99bc3d49 100644
--- a/native/src/widget/container.rs
+++ b/native/src/widget/container.rs
@@ -13,11 +13,13 @@ use crate::{
 
 use std::u32;
 
+pub use iced_style::container::{Style, StyleSheet};
+
 /// An element decorating some content.
 ///
 /// It is normally used for alignment purposes.
 #[allow(missing_debug_implementations)]
-pub struct Container<'a, Message, Renderer: self::Renderer> {
+pub struct Container<'a, Message, Renderer> {
     padding: Padding,
     width: Length,
     height: Length,
@@ -25,13 +27,13 @@ pub struct Container<'a, Message, Renderer: self::Renderer> {
     max_height: u32,
     horizontal_alignment: alignment::Horizontal,
     vertical_alignment: alignment::Vertical,
-    style: Renderer::Style,
+    style: &'a dyn StyleSheet,
     content: Element<'a, Message, Renderer>,
 }
 
 impl<'a, Message, Renderer> Container<'a, Message, Renderer>
 where
-    Renderer: self::Renderer,
+    Renderer: crate::Renderer,
 {
     /// Creates an empty [`Container`].
     pub fn new<T>(content: T) -> Self
@@ -46,7 +48,7 @@ where
             max_height: u32::MAX,
             horizontal_alignment: alignment::Horizontal::Left,
             vertical_alignment: alignment::Vertical::Top,
-            style: Renderer::Style::default(),
+            style: Default::default(),
             content: content.into(),
         }
     }
@@ -106,8 +108,8 @@ where
     }
 
     /// Sets the style of the [`Container`].
-    pub fn style(mut self, style: impl Into<Renderer::Style>) -> Self {
-        self.style = style.into();
+    pub fn style(mut self, style: &'a dyn StyleSheet) -> Self {
+        self.style = style;
         self
     }
 }
@@ -115,7 +117,7 @@ where
 impl<'a, Message, Renderer> Widget<Message, Renderer>
     for Container<'a, Message, Renderer>
 where
-    Renderer: self::Renderer,
+    Renderer: crate::Renderer,
 {
     fn width(&self) -> Length {
         self.width
@@ -211,21 +213,10 @@ where
     }
 }
 
-/// The renderer of a [`Container`].
-///
-/// Your [renderer] will need to implement this trait before being
-/// able to use a [`Container`] in your user interface.
-///
-/// [renderer]: crate::renderer
-pub trait Renderer: crate::Renderer {
-    /// The style supported by this renderer.
-    type Style: Default;
-}
-
 impl<'a, Message, Renderer> From<Container<'a, Message, Renderer>>
     for Element<'a, Message, Renderer>
 where
-    Renderer: 'a + self::Renderer,
+    Renderer: 'a + crate::Renderer,
     Message: 'a,
 {
     fn from(
diff --git a/native/src/widget/pane_grid.rs b/native/src/widget/pane_grid.rs
index 1e63fdeb..afecd681 100644
--- a/native/src/widget/pane_grid.rs
+++ b/native/src/widget/pane_grid.rs
@@ -27,7 +27,6 @@ pub use split::Split;
 pub use state::State;
 pub use title_bar::TitleBar;
 
-use crate::container;
 use crate::event::{self, Event};
 use crate::layout;
 use crate::mouse;
@@ -318,7 +317,7 @@ pub struct ResizeEvent {
 impl<'a, Message, Renderer> Widget<Message, Renderer>
     for PaneGrid<'a, Message, Renderer>
 where
-    Renderer: self::Renderer + container::Renderer,
+    Renderer: self::Renderer,
 {
     fn width(&self) -> Length {
         self.width
@@ -565,7 +564,7 @@ where
 /// able to use a [`PaneGrid`] in your user interface.
 ///
 /// [renderer]: crate::renderer
-pub trait Renderer: crate::Renderer + container::Renderer + Sized {
+pub trait Renderer: crate::Renderer + Sized {
     /// The style supported by this renderer.
     type Style: Default;
 }
diff --git a/native/src/widget/pane_grid/content.rs b/native/src/widget/pane_grid/content.rs
index 22b3a310..7858c15d 100644
--- a/native/src/widget/pane_grid/content.rs
+++ b/native/src/widget/pane_grid/content.rs
@@ -13,7 +13,7 @@ use crate::{Clipboard, Element, Hasher, Layout, Point, Rectangle, Size};
 pub struct Content<'a, Message, Renderer: pane_grid::Renderer> {
     title_bar: Option<TitleBar<'a, Message, Renderer>>,
     body: Element<'a, Message, Renderer>,
-    style: <Renderer as container::Renderer>::Style,
+    style: &'a dyn container::StyleSheet,
 }
 
 impl<'a, Message, Renderer> Content<'a, Message, Renderer>
@@ -39,11 +39,8 @@ where
     }
 
     /// Sets the style of the [`Content`].
-    pub fn style(
-        mut self,
-        style: impl Into<<Renderer as container::Renderer>::Style>,
-    ) -> Self {
-        self.style = style.into();
+    pub fn style(mut self, style: &'a dyn container::StyleSheet) -> Self {
+        self.style = style;
         self
     }
 }
@@ -217,7 +214,7 @@ where
 impl<'a, T, Message, Renderer> From<T> for Content<'a, Message, Renderer>
 where
     T: Into<Element<'a, Message, Renderer>>,
-    Renderer: pane_grid::Renderer + container::Renderer,
+    Renderer: pane_grid::Renderer,
 {
     fn from(element: T) -> Self {
         Self::new(element)
diff --git a/native/src/widget/pane_grid/title_bar.rs b/native/src/widget/pane_grid/title_bar.rs
index ce9249d2..22d3a9eb 100644
--- a/native/src/widget/pane_grid/title_bar.rs
+++ b/native/src/widget/pane_grid/title_bar.rs
@@ -17,7 +17,7 @@ pub struct TitleBar<'a, Message, Renderer: pane_grid::Renderer> {
     controls: Option<Element<'a, Message, Renderer>>,
     padding: Padding,
     always_show_controls: bool,
-    style: <Renderer as container::Renderer>::Style,
+    style: &'a dyn container::StyleSheet,
 }
 
 impl<'a, Message, Renderer> TitleBar<'a, Message, Renderer>
@@ -54,11 +54,8 @@ where
     }
 
     /// Sets the style of the [`TitleBar`].
-    pub fn style(
-        mut self,
-        style: impl Into<<Renderer as container::Renderer>::Style>,
-    ) -> Self {
-        self.style = style.into();
+    pub fn style(mut self, style: &'a dyn container::StyleSheet) -> Self {
+        self.style = style;
         self
     }
 
diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs
index 63da539f..ac5b3e4f 100644
--- a/native/src/widget/scrollable.rs
+++ b/native/src/widget/scrollable.rs
@@ -122,10 +122,7 @@ impl<'a, Message, Renderer: crate::Renderer> Scrollable<'a, Message, Renderer> {
     }
 
     /// Sets the style of the [`Scrollable`] .
-    pub fn style<'b>(mut self, style_sheet: &'b dyn StyleSheet) -> Self
-    where
-        'b: 'a,
-    {
+    pub fn style(mut self, style_sheet: &'a dyn StyleSheet) -> Self {
         self.style_sheet = style_sheet;
         self
     }
diff --git a/native/src/widget/tooltip.rs b/native/src/widget/tooltip.rs
index 496cd41e..4e8483ad 100644
--- a/native/src/widget/tooltip.rs
+++ b/native/src/widget/tooltip.rs
@@ -16,7 +16,7 @@ pub struct Tooltip<'a, Message, Renderer: self::Renderer> {
     content: Element<'a, Message, Renderer>,
     tooltip: Text<Renderer>,
     position: Position,
-    style: <Renderer as container::Renderer>::Style,
+    style: &'a dyn container::StyleSheet,
     gap: u16,
     padding: u16,
 }
@@ -70,11 +70,11 @@ where
     }
 
     /// Sets the style of the [`Tooltip`].
-    pub fn style(
-        mut self,
-        style: impl Into<<Renderer as container::Renderer>::Style>,
-    ) -> Self {
-        self.style = style.into();
+    pub fn style<'b>(mut self, style: &'b dyn container::StyleSheet) -> Self
+    where
+        'b: 'a,
+    {
+        self.style = style;
         self
     }
 }
@@ -160,9 +160,7 @@ where
 ///
 /// [`Tooltip`]: struct.Tooltip.html
 /// [renderer]: ../../renderer/index.html
-pub trait Renderer:
-    crate::Renderer + text::Renderer + container::Renderer
-{
+pub trait Renderer: crate::Renderer + text::Renderer {
     /// The default padding of a [`Tooltip`] drawn by this renderer.
     const DEFAULT_PADDING: u16;
 }
-- 
cgit