feat: Add minimize window support to headerbar

This commit is contained in:
Michael Aaron Murphy 2022-10-11 15:27:39 +02:00
parent 92634bf720
commit 59d1b4c38d
No known key found for this signature in database
GPG key ID: B2732D4240C9212C
3 changed files with 60 additions and 99 deletions

View file

@ -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]

View file

@ -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<Message> {
let mut header: Element<Message, _> = 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<Message, _> = 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);

View file

@ -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<Message> {
title: String,
nav_title: String,
sidebar_active: bool,
show_minimize: bool,
show_maximize: bool,
on_sidebar_active: Box<dyn Fn(bool) -> Message>,
on_close: Box<dyn Fn() -> Message>,
on_drag: Box<dyn Fn() -> Message>,
on_maximize: Box<dyn Fn() -> Message>,
#[setters(strip_option)]
on_close: Option<Message>,
#[setters(strip_option)]
on_drag: Option<Message>,
#[setters(strip_option)]
on_maximize: Option<Message>,
#[setters(strip_option)]
on_minimize: Option<Message>,
#[setters(strip_option)]
on_sidebar_toggle: Option<Message>,
}
pub fn header_bar<Message>(
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<Message> {
HeaderBar::new(
title,
toggled,
show_minimize,
show_maximize,
on_sidebar_active,
on_close,
on_drag,
on_maximize,
)
pub fn header_bar<Message>() -> HeaderBar<Message> {
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<Message> HeaderBar<Message> {
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<Message: Clone> Component<Message, Renderer> for HeaderBar<Message> {
type State = ();
@ -102,17 +53,25 @@ impl<Message: Clone> Component<Message, Renderer> for HeaderBar<Message> {
fn update(&mut self, _state: &mut Self::State, event: Self::Event) -> Option<Message> {
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,
}
}