forked from max_ag/wayland_panel
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,6 +1,7 @@
|
||||||
use crate::widget::{Message, PanelWidget};
|
use crate::widget::{Message, PanelWidget};
|
||||||
use crate::widgets::battery::BatteryWidget;
|
use crate::widgets::battery::BatteryWidget;
|
||||||
use crate::widgets::clock::ClockWidget;
|
use crate::widgets::clock::ClockWidget;
|
||||||
|
use crate::widgets::powerbutton::ShutdownWidget;
|
||||||
use crate::widgets::spacer::Spacer;
|
use crate::widgets::spacer::Spacer;
|
||||||
|
|
||||||
use iced::Color;
|
use iced::Color;
|
||||||
|
|
@ -20,6 +21,8 @@ impl App {
|
||||||
widgets: vec![
|
widgets: vec![
|
||||||
Box::new(ClockWidget::new()),
|
Box::new(ClockWidget::new()),
|
||||||
Box::new(Spacer::new(iced::Length::Fill)),
|
Box::new(Spacer::new(iced::Length::Fill)),
|
||||||
|
Box::new(ShutdownWidget::new()),
|
||||||
|
Box::new(Spacer::new(iced::Length::Fill)),
|
||||||
Box::new(BatteryWidget::new()),
|
Box::new(BatteryWidget::new()),
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
@ -33,7 +36,7 @@ impl App {
|
||||||
if let Some(elem) = self
|
if let Some(elem) = self
|
||||||
.widgets
|
.widgets
|
||||||
.iter()
|
.iter()
|
||||||
.find(|widget| widget.own_window(id))
|
.find(|widget| widget.has_window(id))
|
||||||
.map(|widget| widget.view(id))
|
.map(|widget| widget.view(id))
|
||||||
{
|
{
|
||||||
return elem;
|
return elem;
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,13 @@ use iced::Subscription;
|
||||||
use iced::Task;
|
use iced::Task;
|
||||||
use iced_layershell::to_layer_message;
|
use iced_layershell::to_layer_message;
|
||||||
|
|
||||||
|
use crate::widgets::powerbutton::ShutdownEvents;
|
||||||
|
|
||||||
pub trait PanelWidget {
|
pub trait PanelWidget {
|
||||||
fn update(&mut self, message: &Message) -> Task<Message>;
|
fn update(&mut self, message: &Message) -> Task<Message>;
|
||||||
fn subscribe(&self) -> Subscription<Message>;
|
fn subscribe(&self) -> Subscription<Message>;
|
||||||
fn view(&self, id: iced::window::Id) -> Element<'_, Message>;
|
fn view(&self, id: iced::window::Id) -> Element<'_, Message>;
|
||||||
fn own_window(&self, _id: iced::window::Id) -> bool {
|
fn has_window(&self, _id: iced::window::Id) -> bool {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -17,4 +19,5 @@ pub trait PanelWidget {
|
||||||
pub enum Message {
|
pub enum Message {
|
||||||
Battery(Option<f64>),
|
Battery(Option<f64>),
|
||||||
Time,
|
Time,
|
||||||
|
ShutdownEvent(ShutdownEvents),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
pub mod battery;
|
pub mod battery;
|
||||||
pub mod clock;
|
pub mod clock;
|
||||||
|
pub mod powerbutton;
|
||||||
pub mod spacer;
|
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