feat: Add minimize window support to headerbar
This commit is contained in:
parent
92634bf720
commit
59d1b4c38d
3 changed files with 60 additions and 99 deletions
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue