power button implemented (without the power button functionality)
This commit is contained in:
parent
23fe371656
commit
3789f5eb7b
4 changed files with 99 additions and 2 deletions
|
|
@ -1,3 +1,4 @@
|
|||
pub mod battery;
|
||||
pub mod clock;
|
||||
pub mod powerbutton;
|
||||
pub mod spacer;
|
||||
|
|
|
|||
90
src/widgets/powerbutton.rs
Normal file
90
src/widgets/powerbutton.rs
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
use crate::widget::{Message, PanelWidget};
|
||||
use iced::{
|
||||
Subscription, Task,
|
||||
widget::{button, row, text},
|
||||
};
|
||||
use iced_layershell::reexport::{Anchor, NewLayerShellSettings};
|
||||
|
||||
pub struct ShutdownWidget {
|
||||
window: Option<iced::window::Id>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum ShutdownEvents {
|
||||
PowerButtonPressed,
|
||||
ShutdownConfirmed,
|
||||
ShutdownCanceled,
|
||||
}
|
||||
|
||||
impl ShutdownWidget {
|
||||
pub fn new() -> Self {
|
||||
Self { window: None }
|
||||
}
|
||||
}
|
||||
|
||||
impl PanelWidget for ShutdownWidget {
|
||||
fn update(&mut self, message: &crate::widget::Message) -> iced::Task<crate::widget::Message> {
|
||||
let Message::ShutdownEvent(event) = message else {
|
||||
return Task::none();
|
||||
};
|
||||
|
||||
match event {
|
||||
ShutdownEvents::PowerButtonPressed => match self.window {
|
||||
Some(child) => {
|
||||
self.window = None;
|
||||
Task::done(Message::RemoveWindow(child))
|
||||
}
|
||||
None => {
|
||||
let id = iced::window::Id::unique();
|
||||
self.window = Some(id);
|
||||
|
||||
Task::done(Message::NewLayerShell {
|
||||
settings: NewLayerShellSettings {
|
||||
size: Some((220, 40)),
|
||||
anchor: Anchor::Top,
|
||||
layer: iced_layershell::reexport::Layer::Overlay,
|
||||
keyboard_interactivity:
|
||||
iced_layershell::reexport::KeyboardInteractivity::OnDemand,
|
||||
exclusive_zone: None,
|
||||
..Default::default()
|
||||
},
|
||||
id,
|
||||
})
|
||||
}
|
||||
},
|
||||
ShutdownEvents::ShutdownConfirmed => Task::none(),
|
||||
ShutdownEvents::ShutdownCanceled => match self.window {
|
||||
Some(child) => {
|
||||
self.window = None;
|
||||
Task::done(Message::RemoveWindow(child))
|
||||
}
|
||||
None => Task::none(),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
fn subscribe(&self) -> iced::Subscription<crate::widget::Message> {
|
||||
Subscription::none()
|
||||
}
|
||||
|
||||
fn has_window(&self, id: iced::window::Id) -> bool {
|
||||
self.window == Some(id)
|
||||
}
|
||||
|
||||
fn view(&self, id: iced::window::Id) -> iced::Element<'_, crate::widget::Message> {
|
||||
match self.window {
|
||||
Some(child_id) if id == child_id => row![
|
||||
text("Shut down?"),
|
||||
button("✓").on_press(Message::ShutdownEvent(ShutdownEvents::ShutdownConfirmed)),
|
||||
button("✗").on_press(Message::ShutdownEvent(ShutdownEvents::ShutdownCanceled)),
|
||||
]
|
||||
.spacing(8)
|
||||
.align_y(iced::Alignment::Center)
|
||||
.into(),
|
||||
|
||||
_ => button("⏻")
|
||||
.on_press(Message::ShutdownEvent(ShutdownEvents::PowerButtonPressed))
|
||||
.into(),
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue