diff --git a/Cargo.toml b/Cargo.toml index b3bfbd03..79490cc2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,7 @@ debug = ["iced/debug"] [dependencies] freedesktop-icons = "0.2.1" apply = "0.3.0" +derive_setters = "0.1.5" [dependencies.iced] git = "https://github.com/pop-os/iced.git" @@ -23,7 +24,7 @@ features = ["cosmic-theme", "svg"] [dependencies.iced_style] git = "https://github.com/pop-os/iced.git" branch = "cosmic-design-system" -# path = "../iced/native" +# path = "../iced/style" features = ["cosmic-theme"] [dependencies.iced_native] diff --git a/examples/cosmic/src/main.rs b/examples/cosmic/src/main.rs index 21d5743c..b1cf307a 100644 --- a/examples/cosmic/src/main.rs +++ b/examples/cosmic/src/main.rs @@ -25,7 +25,7 @@ use cosmic::{ text }, iced_lazy::responsive, - iced_winit::window::{drag, maximize}, + iced_winit::window::{drag, maximize, minimize}, scrollable }; @@ -82,7 +82,7 @@ enum Message { TogglerToggled(bool), PickListSelected(&'static str), Close, - ToggleSidebar(bool), + ToggleSidebar, Drag, Minimize, Maximize, @@ -119,9 +119,9 @@ impl Application for Window { Message::TogglerToggled(value) => self.toggler_value = value, Message::PickListSelected(value) => self.pick_list_selected = Some(value), Message::Close => self.exit = true, - Message::ToggleSidebar(toggled) => self.sidebar_toggled = toggled, + Message::ToggleSidebar => self.sidebar_toggled = !self.sidebar_toggled, Message::Drag => return drag(), - Message::Minimize => {}, + Message::Minimize => return minimize(), Message::Maximize => return maximize(), } @@ -129,16 +129,17 @@ impl Application for Window { } fn view(&self) -> Element { - let mut header: Element = header_bar( - self.title().as_str(), - self.sidebar_toggled, - self.show_minimize, - self.show_maximize, - |toggled| Message::ToggleSidebar(toggled), - || Message::Close, - || Message::Drag, - || Message::Maximize, - ).into(); + let mut header: Element = header_bar() + .title(self.title()) + .sidebar_active(self.sidebar_toggled) + .show_minimize(self.show_minimize) + .show_maximize(self.show_maximize) + .on_close(Message::Close) + .on_drag(Message::Drag) + .on_maximize(Message::Maximize) + .on_minimize(Message::Minimize) + .on_sidebar_toggle(Message::ToggleSidebar) + .into(); if self.debug { header = header.explain(Color::WHITE); diff --git a/src/widget/header_bar.rs b/src/widget/header_bar.rs index 386b1b95..6a43478e 100644 --- a/src/widget/header_bar.rs +++ b/src/widget/header_bar.rs @@ -1,39 +1,40 @@ use apply::Apply; +use derive_setters::*; use iced::{self, alignment::Vertical, theme, widget, Element, Length, Renderer}; use iced_lazy::Component; +#[derive(Setters)] pub struct HeaderBar { title: String, nav_title: String, sidebar_active: bool, show_minimize: bool, show_maximize: bool, - on_sidebar_active: Box Message>, - on_close: Box Message>, - on_drag: Box Message>, - on_maximize: Box Message>, + #[setters(strip_option)] + on_close: Option, + #[setters(strip_option)] + on_drag: Option, + #[setters(strip_option)] + on_maximize: Option, + #[setters(strip_option)] + on_minimize: Option, + #[setters(strip_option)] + on_sidebar_toggle: Option, } -pub fn header_bar( - title: &str, - toggled: bool, - show_minimize: bool, - show_maximize: bool, - on_sidebar_active: impl Fn(bool) -> Message + 'static, - on_close: impl Fn() -> Message + 'static, - on_drag: impl Fn() -> Message + 'static, - on_maximize: impl Fn() -> Message + 'static, -) -> HeaderBar { - HeaderBar::new( - title, - toggled, - show_minimize, - show_maximize, - on_sidebar_active, - on_close, - on_drag, - on_maximize, - ) +pub fn header_bar() -> HeaderBar { + HeaderBar { + title: String::default(), + nav_title: String::default(), + sidebar_active: false, + show_minimize: false, + show_maximize: false, + on_sidebar_toggle: None, + on_close: None, + on_drag: None, + on_maximize: None, + on_minimize: None + } } #[derive(Debug, Clone)] @@ -45,56 +46,6 @@ pub enum HeaderEvent { Maximize, } -impl HeaderBar { - pub fn new( - title: &str, - toggled: bool, - show_minimize: bool, - show_maximize: bool, - on_sidebar_active: impl Fn(bool) -> Message + 'static, - on_close: impl Fn() -> Message + 'static, - on_drag: impl Fn() -> Message + 'static, - on_maximize: impl Fn() -> Message + 'static, - ) -> Self { - Self { - title: String::from(title), - nav_title: String::new(), - sidebar_active: toggled, - show_minimize, - show_maximize, - on_sidebar_active: Box::new(on_sidebar_active), - on_close: Box::new(on_close), - on_drag: Box::new(on_drag), - on_maximize: Box::new(on_maximize), - } - } - - pub fn title(mut self, title: &str) -> Self { - self.title = title.to_string(); - self - } - - pub fn nav_title(mut self, nav_title: &str) -> Self { - self.nav_title = nav_title.to_string(); - self - } - - pub fn sidebar_active(mut self, sidebar_active: bool) -> Self { - self.sidebar_active = sidebar_active; - self - } - - pub fn show_minimize(mut self, show_minimize: bool) -> Self { - self.show_minimize = show_minimize; - self - } - - pub fn show_maximize(mut self, show_maximize: bool) -> Self { - self.show_maximize = show_maximize; - self - } -} - impl Component for HeaderBar { type State = (); @@ -102,17 +53,25 @@ impl Component for HeaderBar { fn update(&mut self, _state: &mut Self::State, event: Self::Event) -> Option { match event { - HeaderEvent::Close => Some((self.on_close)()), - HeaderEvent::ToggleSidebar => { - self.sidebar_active = !self.sidebar_active; - Some((self.on_sidebar_active)(self.sidebar_active)) + HeaderEvent::Close => { + self.on_close.clone() + } + + HeaderEvent::ToggleSidebar => { + self.on_sidebar_toggle.clone() + } + + HeaderEvent::Drag => { + self.on_drag.clone() + } + + HeaderEvent::Maximize => { + self.on_maximize.clone() + } + + HeaderEvent::Minimize => { + self.on_minimize.clone() } - HeaderEvent::Drag => Some((self.on_drag)()), - // HeaderEvent::Minimize => { - // Some((self.on_minimize())) - // }, - HeaderEvent::Maximize => Some((self.on_maximize)()), - _ => None, } }