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