power management new

This commit is contained in:
Jiří Maxmilián Stříbrný 2026-03-23 22:59:17 +01:00
parent 99b2e565b9
commit 632a0abd10
2 changed files with 34 additions and 15 deletions

View file

@ -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::power_management::PowerManagementWidget;
use crate::widgets::powerbutton::ShutdownWidget; use crate::widgets::powerbutton::ShutdownWidget;
use crate::widgets::spacer::Spacer; use crate::widgets::spacer::Spacer;
@ -24,6 +25,7 @@ impl App {
Box::new(ClockWidget::new()), Box::new(ClockWidget::new()),
Box::new(Spacer::new(iced::Length::Fill)), Box::new(Spacer::new(iced::Length::Fill)),
Box::new(BatteryWidget::new()), Box::new(BatteryWidget::new()),
Box::new(PowerManagementWidget::new()),
], ],
} }
} }

View file

@ -1,35 +1,52 @@
use std::ops::Index;
use iced::{Subscription, Task}; use iced::{Subscription, Task};
use ppd::PpdProxy; use ppd::PpdProxyBlocking;
use zbus::connection::Connection; use zbus::blocking::Connection;
use crate::widget::{Message, PanelWidget}; use crate::widget::{Message, PanelWidget};
pub struct PowerManagementWidget { pub struct PowerManagementWidget<'a> {
window: Option<iced::window::Id>, window: Option<iced::window::Id>,
current_mode: usize, current_mode: usize,
names: Vec<Box<str>>, modes: Box<[Box<str>]>,
proxy: PpdProxyBlocking<'a>,
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum PowerManagement { pub enum PowerManagement {
ToggleWindow, ToggleWindow,
SetMode(SetMode), SetMode(String),
} }
#[derive(Debug, Clone)] impl PowerManagementWidget<'_> {
pub enum SetMode {
Saver,
Medium,
Performant,
}
impl PowerManagementWidget {
pub fn new() -> Self { pub fn new() -> Self {
let conn = Connection::system().await.unwrap(); let conn = Connection::system().unwrap();
let proxy = PpdProxyBlocking::new(&conn).unwrap();
let modes: Box<[Box<str>]> = proxy
.profiles()
.unwrap()
.iter()
.map(|f| f.profile.clone().into_boxed_str())
.collect();
let current_mode_str = proxy.active_profile().unwrap();
let current_mode = modes
.iter()
.position(|m| m.as_ref() == current_mode_str.as_str())
.unwrap();
Self {
window: None,
modes,
current_mode,
proxy,
}
} }
} }
impl PanelWidget for PowerManagementWidget { impl PanelWidget for PowerManagementWidget<'_> {
fn update(&mut self, message: &crate::widget::Message) -> iced::Task<crate::widget::Message> { fn update(&mut self, message: &crate::widget::Message) -> iced::Task<crate::widget::Message> {
let Message::PowerManagement(msg) = message else { let Message::PowerManagement(msg) = message else {
return Task::none(); return Task::none();