refactor: make Theme a generic parameter for the cosmic container

This makes the container possible to use with custom themes in cosmic-time
This commit is contained in:
Ashley Wulber 2024-02-02 19:29:41 -05:00 committed by Ashley Wulber
parent 18b2b74b8d
commit 989d14b206

View file

@ -10,11 +10,13 @@ use iced_core::widget::Tree;
use iced_core::{Clipboard, Element, Layout, Length, Padding, Rectangle, Shell, Widget}; use iced_core::{Clipboard, Element, Layout, Length, Padding, Rectangle, Shell, Widget};
pub use iced_style::container::{Appearance, StyleSheet}; pub use iced_style::container::{Appearance, StyleSheet};
pub fn container<'a, Message: 'static, T>( pub fn container<'a, Message: 'static, Theme, E>(
content: T, content: E,
) -> LayerContainer<'a, Message, crate::Renderer> ) -> LayerContainer<'a, Message, Theme, crate::Renderer>
where where
T: Into<Element<'a, Message, crate::Theme, crate::Renderer>>, E: Into<Element<'a, Message, Theme, crate::Renderer>>,
Theme: iced_style::container::StyleSheet + LayeredTheme,
<Theme as iced_widget::container::StyleSheet>::Style: From<crate::theme::Container>,
{ {
LayerContainer::new(content) LayerContainer::new(content)
} }
@ -23,22 +25,25 @@ where
/// ///
/// It is normally used for alignment purposes. /// It is normally used for alignment purposes.
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
pub struct LayerContainer<'a, Message, Renderer> pub struct LayerContainer<'a, Message, Theme, Renderer>
where where
Renderer: iced_core::Renderer, Renderer: iced_core::Renderer,
Theme: iced_style::container::StyleSheet + LayeredTheme,
{ {
layer: Option<cosmic_theme::Layer>, layer: Option<cosmic_theme::Layer>,
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 where
Renderer: iced_core::Renderer, Renderer: iced_core::Renderer,
Theme: iced_style::container::StyleSheet + LayeredTheme,
<Theme as iced_style::container::StyleSheet>::Style: From<crate::theme::Container>,
{ {
/// Creates an empty [`Container`]. /// Creates an empty [`Container`].
pub(crate) fn new<T>(content: T) -> Self pub(crate) fn new<T>(content: T) -> Self
where where
T: Into<Element<'a, Message, crate::Theme, Renderer>>, T: Into<Element<'a, Message, Theme, Renderer>>,
{ {
LayerContainer { LayerContainer {
layer: None, layer: None,
@ -122,16 +127,17 @@ where
/// Sets the style of the [`LayerContainer`]. /// Sets the style of the [`LayerContainer`].
#[must_use] #[must_use]
pub fn style(mut self, style: impl Into<<crate::Theme as StyleSheet>::Style>) -> Self { pub fn style(mut self, style: impl Into<<Theme as StyleSheet>::Style>) -> Self {
self.container = self.container.style(style); self.container = self.container.style(style);
self self
} }
} }
impl<'a, Message, Renderer> Widget<Message, crate::Theme, Renderer> impl<'a, Message, Theme, Renderer> Widget<Message, Theme, Renderer>
for LayerContainer<'a, Message, Renderer> for LayerContainer<'a, Message, Theme, Renderer>
where where
Renderer: iced_core::Renderer, Renderer: iced_core::Renderer,
Theme: iced_style::container::StyleSheet + LayeredTheme + Clone,
{ {
fn children(&self) -> Vec<Tree> { fn children(&self) -> Vec<Tree> {
self.container.children() self.container.children()
@ -213,7 +219,7 @@ where
&self, &self,
tree: &Tree, tree: &Tree,
renderer: &mut Renderer, renderer: &mut Renderer,
theme: &crate::Theme, theme: &Theme,
renderer_style: &renderer::Style, renderer_style: &renderer::Style,
layout: Layout<'_>, layout: Layout<'_>,
cursor_position: mouse::Cursor, cursor_position: mouse::Cursor,
@ -242,20 +248,21 @@ where
tree: &'b mut Tree, tree: &'b mut Tree,
layout: Layout<'_>, layout: Layout<'_>,
renderer: &Renderer, renderer: &Renderer,
) -> Option<overlay::Element<'b, Message, crate::Theme, Renderer>> { ) -> Option<overlay::Element<'b, Message, Theme, Renderer>> {
self.container.overlay(tree, layout, renderer) self.container.overlay(tree, layout, renderer)
} }
} }
impl<'a, Message, Renderer> From<LayerContainer<'a, Message, Renderer>> impl<'a, Message, Theme, Renderer> From<LayerContainer<'a, Message, Theme, Renderer>>
for Element<'a, Message, crate::Theme, Renderer> for Element<'a, Message, Theme, Renderer>
where where
Message: 'a, Message: 'a,
Renderer: 'a + iced_core::Renderer, Renderer: 'a + iced_core::Renderer,
Theme: iced_style::container::StyleSheet + LayeredTheme + 'a + Clone,
{ {
fn from( fn from(
column: LayerContainer<'a, Message, Renderer>, column: LayerContainer<'a, Message, Theme, Renderer>,
) -> Element<'a, Message, crate::Theme, Renderer> { ) -> Element<'a, Message, Theme, Renderer> {
Element::new(column) Element::new(column)
} }
} }