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

View file

@ -1,9 +1,8 @@
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;
pub struct HeaderBar<Message>
{
pub struct HeaderBar<Message> {
title: String,
nav_title: String,
sidebar_active: bool,
@ -12,6 +11,7 @@ pub struct HeaderBar<Message>
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>,
}
pub fn header_bar<Message>(
@ -22,15 +22,17 @@ pub fn header_bar<Message>(
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,
title,
toggled,
show_minimize,
show_maximize,
on_sidebar_active,
on_close,
on_drag
on_sidebar_active,
on_close,
on_drag,
on_maximize,
)
}
@ -39,8 +41,8 @@ pub enum HeaderEvent {
Close,
ToggleSidebar,
Drag,
Minimize,
Maximize
Minimize,
Maximize,
}
impl<Message> HeaderBar<Message> {
@ -52,6 +54,7 @@ impl<Message> HeaderBar<Message> {
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),
@ -62,6 +65,7 @@ impl<Message> HeaderBar<Message> {
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),
}
}
@ -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 Event = HeaderEvent;
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 {
HeaderEvent::Close => Some((self.on_close)()),
HeaderEvent::ToggleSidebar => {
self.sidebar_active = !self.sidebar_active;
Some((self.on_sidebar_active)(self.sidebar_active))
},
}
HeaderEvent::Drag => Some((self.on_drag)()),
HeaderEvent::Minimize => None,
HeaderEvent::Maximize => None,
// HeaderEvent::Minimize => {
// 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 text = widget::text(&self.nav_title)
.vertical_alignment(Vertical::Center)
@ -151,7 +152,7 @@ impl<Message: Clone> Component<Message, Renderer> for HeaderBar<Message>
.width(Length::Fill)
.height(Length::Fill)
.into();
let window_controls = {
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 {
widgets.push(
icon("window-minimize-symbolic", 16, HeaderEvent::Minimize).into()
);
widgets.push(icon("window-minimize-symbolic", 16, HeaderEvent::Minimize).into());
}
if self.show_maximize {
widgets.push(
icon("window-maximize-symbolic", 16, HeaderEvent::Maximize).into()
);
widgets.push(icon("window-maximize-symbolic", 16, HeaderEvent::Maximize).into());
}
widgets.push(
icon("window-close-symbolic", 16, HeaderEvent::Close).into()
);
widgets.push(icon("window-close-symbolic", 16, HeaderEvent::Close).into());
widget::row(widgets)
.spacing(8)
@ -192,13 +187,13 @@ impl<Message: Clone> Component<Message, Renderer> for HeaderBar<Message>
.apply(widget::event_container)
.center_y()
.on_press(HeaderEvent::Drag)
.on_release(HeaderEvent::Maximize)
.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 {
iced_lazy::component(header_bar)
}
}
}