From 53dc5464c2f595d1a32174598e280428d3265f15 Mon Sep 17 00:00:00 2001 From: pml68 Date: Tue, 8 Apr 2025 19:40:45 +0200 Subject: feat(material_theme): impl `menu::Catalog`, change `dialog::Catalog` impl --- material_theme/src/dialog.rs | 25 ++++++++++ material_theme/src/lib.rs | 11 ++--- material_theme/src/menu.rs | 29 ++++++++++++ src/types/rendered_element.rs | 105 +++++++++++++++++++++++++++--------------- 4 files changed, 126 insertions(+), 44 deletions(-) create mode 100644 material_theme/src/dialog.rs create mode 100644 material_theme/src/menu.rs diff --git a/material_theme/src/dialog.rs b/material_theme/src/dialog.rs new file mode 100644 index 0000000..68c61b5 --- /dev/null +++ b/material_theme/src/dialog.rs @@ -0,0 +1,25 @@ +use iced_widget::container::Style; +use iced_widget::core::{Background, border}; + +use super::{Theme, text}; + +impl iced_dialog::dialog::Catalog for Theme { + fn default_container<'a>() + -> ::Class<'a> { + Box::new(default_container) + } + + fn default_title<'a>() -> ::Class<'a> { + Box::new(text::surface) + } +} + +pub fn default_container(theme: &Theme) -> Style { + let colors = theme.colorscheme.surface; + Style { + background: Some(Background::Color(colors.surface_container.high)), + text_color: Some(colors.on_surface_variant), + border: border::rounded(28), + ..Style::default() + } +} diff --git a/material_theme/src/lib.rs b/material_theme/src/lib.rs index 273ef9a..a4eea24 100644 --- a/material_theme/src/lib.rs +++ b/material_theme/src/lib.rs @@ -6,6 +6,9 @@ use serde::Deserialize; pub mod button; pub mod container; +#[cfg(feature = "dialog")] +pub mod dialog; +pub mod menu; pub mod scrollable; pub mod text; pub mod utils; @@ -93,14 +96,6 @@ impl iced_anim::Animate for Theme { } } -#[cfg(feature = "dialog")] -impl iced_dialog::dialog::Catalog for Theme { - fn default_container<'a>() - -> ::Class<'a> { - Box::new(container::surface) - } -} - pub static DARK: LazyLock = LazyLock::new(|| { toml::from_str(DARK_THEME_CONTENT).expect("parse dark theme") }); diff --git a/material_theme/src/menu.rs b/material_theme/src/menu.rs new file mode 100644 index 0000000..d1bebec --- /dev/null +++ b/material_theme/src/menu.rs @@ -0,0 +1,29 @@ +use iced_widget::core::{Background, border}; +use iced_widget::overlay::menu::{Catalog, Style, StyleFn}; + +use super::Theme; + +impl Catalog for Theme { + type Class<'a> = StyleFn<'a, Self>; + + fn default<'a>() -> ::Class<'a> { + Box::new(default) + } + + fn style(&self, class: &::Class<'_>) -> Style { + class(self) + } +} + +pub fn default(theme: &Theme) -> Style { + let surface = theme.colorscheme.surface; + let secondary = theme.colorscheme.secondary; + + Style { + border: border::rounded(4), + background: Background::Color(surface.surface_container.base), + text_color: surface.on_surface, + selected_background: Background::Color(secondary.secondary_container), + selected_text_color: secondary.on_secondary_container, + } +} diff --git a/src/types/rendered_element.rs b/src/types/rendered_element.rs index 0a78dcd..77b76e4 100755 --- a/src/types/rendered_element.rs +++ b/src/types/rendered_element.rs @@ -317,53 +317,86 @@ impl<'a> From for Element<'a, Message> { let child_elements = copy.child_elements.unwrap_or_default(); let content: Element<'a, Message> = match copy.name { - ElementName::Text(s) => { - if s.is_empty() { - widget::text("New Text").apply_options(copy.options).into() - } else { - widget::text(s).apply_options(copy.options).into() - } - } - ElementName::Button(s) => { - if s.is_empty() { - widget::button(widget::text("New Button")) - .apply_options(copy.options) - .into() - } else { - widget::button(widget::text(s)) - .apply_options(copy.options) - .into() - } + ElementName::Text(s) => if s.is_empty() { + widget::text("New Text") + } else { + widget::text(s) } + .apply_options(copy.options) + .into(), + ElementName::Button(s) => widget::button(if s.is_empty() { + widget::text("New Button") + } else { + widget::text(s) + }) + .apply_options(copy.options) + .into(), ElementName::Svg(p) => { widget::svg(p).apply_options(copy.options).into() } ElementName::Image(p) => { widget::image(p).apply_options(copy.options).into() } - ElementName::Container => { - widget::container(if child_elements.len() == 1 { - child_elements[0].clone().into() - } else { - Element::from("") - }) - .apply_options(copy.options) - .padding(20) - .into() + ElementName::Container => if child_elements.len() == 1 { + widget::container(child_elements[0].clone()) + } else { + widget::container("New Container") + .padding(20) + .style(|theme| widget::container::Style { + border: iced::border::rounded(4).color( + theme.extended_palette().background.strongest.text, + ), + ..Default::default() + }) } - ElementName::Row => widget::Row::from_vec( - child_elements.into_iter().map(Into::into).collect(), - ) - .padding(20) - .apply_options(copy.options) - .into(), - ElementName::Column => widget::Column::from_vec( - child_elements.into_iter().map(Into::into).collect(), - ) - .padding(20) .apply_options(copy.options) .into(), + ElementName::Row => { + if !child_elements.is_empty() { + widget::Row::with_children( + child_elements.into_iter().map(Into::into), + ) + .apply_options(copy.options) + .into() + } else { + widget::container( + widget::row!["New Row"] + .padding(20) + .apply_options(copy.options), + ) + .style(|theme| widget::container::Style { + border: iced::border::rounded(4).color( + theme.extended_palette().background.strongest.text, + ), + ..Default::default() + }) + .into() + } + } + ElementName::Column => { + if !child_elements.is_empty() { + widget::Column::with_children( + child_elements.into_iter().map(Into::into), + ) + .apply_options(copy.options) + .into() + } else { + widget::container( + widget::column!["New Column"] + .padding(20) + .apply_options(copy.options), + ) + .style(|theme| widget::container::Style { + border: iced::border::rounded(4).color( + theme.extended_palette().background.strongest.text, + ), + ..Default::default() + }) + .into() + } + } }; + iced_drop::droppable(content) .id(value.id().clone()) .drag_hide(true) -- cgit v1.2.3