feat: Window maximize support, including double cick on headerbar
This commit is contained in:
parent
67ff797018
commit
0365737908
2 changed files with 37 additions and 41 deletions
|
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -136,7 +136,8 @@ impl Application for Window {
|
||||||
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 {
|
||||||
|
|
|
||||||
|
|
@ -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,6 +22,7 @@ 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,
|
||||||
|
|
@ -30,7 +31,8 @@ pub fn header_bar<Message>(
|
||||||
show_maximize,
|
show_maximize,
|
||||||
on_sidebar_active,
|
on_sidebar_active,
|
||||||
on_close,
|
on_close,
|
||||||
on_drag
|
on_drag,
|
||||||
|
on_maximize,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -40,7 +42,7 @@ pub enum HeaderEvent {
|
||||||
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)
|
||||||
|
|
@ -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,12 +187,12 @@ 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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue