feat: Window maximize support, including double cick on headerbar

This commit is contained in:
Michael Aaron Murphy 2022-10-09 16:39:10 +02:00
parent 67ff797018
commit 0365737908
No known key found for this signature in database
GPG key ID: B2732D4240C9212C
2 changed files with 37 additions and 41 deletions

View file

@ -25,7 +25,7 @@ use cosmic::{
text text
}, },
iced_lazy::responsive, iced_lazy::responsive,
iced_winit::window::drag, iced_winit::window::{drag, maximize},
scrollable scrollable
}; };
@ -58,7 +58,7 @@ impl Window {
self.sidebar_toggled = toggled; self.sidebar_toggled = toggled;
self self
} }
pub fn show_maximize(mut self, show: bool) -> Self { pub fn show_maximize(mut self, show: bool) -> Self {
self.show_maximize = show; self.show_maximize = show;
self self
@ -84,7 +84,7 @@ enum Message {
Close, Close,
ToggleSidebar(bool), ToggleSidebar(bool),
Drag, Drag,
Minimize, Minimize,
Maximize, Maximize,
} }
@ -122,7 +122,7 @@ impl Application for Window {
Message::ToggleSidebar(toggled) => self.sidebar_toggled = toggled, Message::ToggleSidebar(toggled) => self.sidebar_toggled = toggled,
Message::Drag => return drag(), Message::Drag => return drag(),
Message::Minimize => {}, Message::Minimize => {},
Message::Maximize => {}, Message::Maximize => return maximize(),
} }
iced::Command::none() iced::Command::none()
@ -135,8 +135,9 @@ impl Application for Window {
self.show_minimize, self.show_minimize,
self.show_maximize, self.show_maximize,
|toggled| Message::ToggleSidebar(toggled), |toggled| Message::ToggleSidebar(toggled),
|| Message::Close, || Message::Close,
|| Message::Drag || Message::Drag,
|| Message::Maximize,
).into(); ).into();
if self.debug { if self.debug {

View file

@ -1,9 +1,8 @@
use apply::Apply; use apply::Apply;
use iced::{self, Element, Length, widget, alignment::Vertical, theme, Renderer}; use iced::{self, alignment::Vertical, theme, widget, Element, Length, Renderer};
use iced_lazy::Component; use iced_lazy::Component;
pub struct HeaderBar<Message> pub struct HeaderBar<Message> {
{
title: String, title: String,
nav_title: String, nav_title: String,
sidebar_active: bool, sidebar_active: bool,
@ -12,6 +11,7 @@ pub struct HeaderBar<Message>
on_sidebar_active: Box<dyn Fn(bool) -> Message>, on_sidebar_active: Box<dyn Fn(bool) -> Message>,
on_close: Box<dyn Fn() -> Message>, on_close: Box<dyn Fn() -> Message>,
on_drag: Box<dyn Fn() -> Message>, on_drag: Box<dyn Fn() -> Message>,
on_maximize: Box<dyn Fn() -> Message>,
} }
pub fn header_bar<Message>( pub fn header_bar<Message>(
@ -22,15 +22,17 @@ pub fn header_bar<Message>(
on_sidebar_active: impl Fn(bool) -> Message + 'static, on_sidebar_active: impl Fn(bool) -> Message + 'static,
on_close: impl Fn() -> Message + 'static, on_close: impl Fn() -> Message + 'static,
on_drag: impl Fn() -> Message + 'static, on_drag: impl Fn() -> Message + 'static,
on_maximize: impl Fn() -> Message + 'static,
) -> HeaderBar<Message> { ) -> HeaderBar<Message> {
HeaderBar::new( HeaderBar::new(
title, title,
toggled, toggled,
show_minimize, show_minimize,
show_maximize, show_maximize,
on_sidebar_active, on_sidebar_active,
on_close, on_close,
on_drag on_drag,
on_maximize,
) )
} }
@ -39,8 +41,8 @@ pub enum HeaderEvent {
Close, Close,
ToggleSidebar, ToggleSidebar,
Drag, Drag,
Minimize, Minimize,
Maximize Maximize,
} }
impl<Message> HeaderBar<Message> { impl<Message> HeaderBar<Message> {
@ -52,6 +54,7 @@ impl<Message> HeaderBar<Message> {
on_sidebar_active: impl Fn(bool) -> Message + 'static, on_sidebar_active: impl Fn(bool) -> Message + 'static,
on_close: impl Fn() -> Message + 'static, on_close: impl Fn() -> Message + 'static,
on_drag: impl Fn() -> Message + 'static, on_drag: impl Fn() -> Message + 'static,
on_maximize: impl Fn() -> Message + 'static,
) -> Self { ) -> Self {
Self { Self {
title: String::from(title), title: String::from(title),
@ -62,6 +65,7 @@ impl<Message> HeaderBar<Message> {
on_sidebar_active: Box::new(on_sidebar_active), on_sidebar_active: Box::new(on_sidebar_active),
on_close: Box::new(on_close), on_close: Box::new(on_close),
on_drag: Box::new(on_drag), on_drag: Box::new(on_drag),
on_maximize: Box::new(on_maximize),
} }
} }
@ -91,31 +95,28 @@ impl<Message> HeaderBar<Message> {
} }
} }
impl<Message: Clone> Component<Message, Renderer> for HeaderBar<Message> impl<Message: Clone> Component<Message, Renderer> for HeaderBar<Message> {
{
type State = (); type State = ();
type Event = HeaderEvent; type Event = HeaderEvent;
fn update( fn update(&mut self, _state: &mut Self::State, event: Self::Event) -> Option<Message> {
&mut self,
_state: &mut Self::State,
event: Self::Event,
) -> Option<Message> {
match event { match event {
HeaderEvent::Close => Some((self.on_close)()), HeaderEvent::Close => Some((self.on_close)()),
HeaderEvent::ToggleSidebar => { HeaderEvent::ToggleSidebar => {
self.sidebar_active = !self.sidebar_active; self.sidebar_active = !self.sidebar_active;
Some((self.on_sidebar_active)(self.sidebar_active)) Some((self.on_sidebar_active)(self.sidebar_active))
}, }
HeaderEvent::Drag => Some((self.on_drag)()), HeaderEvent::Drag => Some((self.on_drag)()),
HeaderEvent::Minimize => None, // HeaderEvent::Minimize => {
HeaderEvent::Maximize => None, // Some((self.on_minimize()))
// },
HeaderEvent::Maximize => Some((self.on_maximize)()),
_ => None,
} }
} }
fn view(&self, _state: &Self::State) -> Element<Self::Event> fn view(&self, _state: &Self::State) -> Element<Self::Event> {
{
let nav_button = { let nav_button = {
let text = widget::text(&self.nav_title) let text = widget::text(&self.nav_title)
.vertical_alignment(Vertical::Center) .vertical_alignment(Vertical::Center)
@ -151,7 +152,7 @@ impl<Message: Clone> Component<Message, Renderer> for HeaderBar<Message>
.width(Length::Fill) .width(Length::Fill)
.height(Length::Fill) .height(Length::Fill)
.into(); .into();
let window_controls = { let window_controls = {
let mut widgets: Vec<Element<HeaderEvent, _>> = Vec::with_capacity(3); let mut widgets: Vec<Element<HeaderEvent, _>> = Vec::with_capacity(3);
@ -163,20 +164,14 @@ impl<Message: Clone> Component<Message, Renderer> for HeaderBar<Message>
}; };
if self.show_minimize { if self.show_minimize {
widgets.push( widgets.push(icon("window-minimize-symbolic", 16, HeaderEvent::Minimize).into());
icon("window-minimize-symbolic", 16, HeaderEvent::Minimize).into()
);
} }
if self.show_maximize { if self.show_maximize {
widgets.push( widgets.push(icon("window-maximize-symbolic", 16, HeaderEvent::Maximize).into());
icon("window-maximize-symbolic", 16, HeaderEvent::Maximize).into()
);
} }
widgets.push( widgets.push(icon("window-close-symbolic", 16, HeaderEvent::Close).into());
icon("window-close-symbolic", 16, HeaderEvent::Close).into()
);
widget::row(widgets) widget::row(widgets)
.spacing(8) .spacing(8)
@ -192,13 +187,13 @@ impl<Message: Clone> Component<Message, Renderer> for HeaderBar<Message>
.apply(widget::event_container) .apply(widget::event_container)
.center_y() .center_y()
.on_press(HeaderEvent::Drag) .on_press(HeaderEvent::Drag)
.on_release(HeaderEvent::Maximize)
.into() .into()
} }
} }
impl<'a, Message: Clone + 'a> From<HeaderBar<Message>> for Element<'a, Message> impl<'a, Message: Clone + 'a> From<HeaderBar<Message>> for Element<'a, Message> {
{
fn from(header_bar: HeaderBar<Message>) -> Self { fn from(header_bar: HeaderBar<Message>) -> Self {
iced_lazy::component(header_bar) iced_lazy::component(header_bar)
} }
} }