From 989d14b2067a690ee1c0b302f3776914d1719bfc Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Fri, 2 Feb 2024 19:29:41 -0500 Subject: [PATCH] refactor: make Theme a generic parameter for the cosmic container This makes the container possible to use with custom themes in cosmic-time --- src/widget/cosmic_container.rs | 41 ++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/widget/cosmic_container.rs b/src/widget/cosmic_container.rs index 0c29b425..c5806056 100644 --- a/src/widget/cosmic_container.rs +++ b/src/widget/cosmic_container.rs @@ -10,11 +10,13 @@ use iced_core::widget::Tree; use iced_core::{Clipboard, Element, Layout, Length, Padding, Rectangle, Shell, Widget}; pub use iced_style::container::{Appearance, StyleSheet}; -pub fn container<'a, Message: 'static, T>( - content: T, -) -> LayerContainer<'a, Message, crate::Renderer> +pub fn container<'a, Message: 'static, Theme, E>( + content: E, +) -> LayerContainer<'a, Message, Theme, crate::Renderer> where - T: Into>, + E: Into>, + Theme: iced_style::container::StyleSheet + LayeredTheme, + ::Style: From, { LayerContainer::new(content) } @@ -23,22 +25,25 @@ where /// /// It is normally used for alignment purposes. #[allow(missing_debug_implementations)] -pub struct LayerContainer<'a, Message, Renderer> +pub struct LayerContainer<'a, Message, Theme, Renderer> where Renderer: iced_core::Renderer, + Theme: iced_style::container::StyleSheet + LayeredTheme, { layer: Option, - container: Container<'a, Message, crate::Theme, Renderer>, + container: Container<'a, Message, Theme, Renderer>, } -impl<'a, Message, Renderer> LayerContainer<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> LayerContainer<'a, Message, Theme, Renderer> where Renderer: iced_core::Renderer, + Theme: iced_style::container::StyleSheet + LayeredTheme, + ::Style: From, { /// Creates an empty [`Container`]. pub(crate) fn new(content: T) -> Self where - T: Into>, + T: Into>, { LayerContainer { layer: None, @@ -122,16 +127,17 @@ where /// Sets the style of the [`LayerContainer`]. #[must_use] - pub fn style(mut self, style: impl Into<::Style>) -> Self { + pub fn style(mut self, style: impl Into<::Style>) -> Self { self.container = self.container.style(style); self } } -impl<'a, Message, Renderer> Widget - for LayerContainer<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Widget + for LayerContainer<'a, Message, Theme, Renderer> where Renderer: iced_core::Renderer, + Theme: iced_style::container::StyleSheet + LayeredTheme + Clone, { fn children(&self) -> Vec { self.container.children() @@ -213,7 +219,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &crate::Theme, + theme: &Theme, renderer_style: &renderer::Style, layout: Layout<'_>, cursor_position: mouse::Cursor, @@ -242,20 +248,21 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option> { + ) -> Option> { self.container.overlay(tree, layout, renderer) } } -impl<'a, Message, Renderer> From> - for Element<'a, Message, crate::Theme, Renderer> +impl<'a, Message, Theme, Renderer> From> + for Element<'a, Message, Theme, Renderer> where Message: 'a, Renderer: 'a + iced_core::Renderer, + Theme: iced_style::container::StyleSheet + LayeredTheme + 'a + Clone, { fn from( - column: LayerContainer<'a, Message, Renderer>, - ) -> Element<'a, Message, crate::Theme, Renderer> { + column: LayerContainer<'a, Message, Theme, Renderer>, + ) -> Element<'a, Message, Theme, Renderer> { Element::new(column) } }