diff --git a/src/app.rs b/src/app.rs index b8ba2a1..a452061 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,6 +1,7 @@ use crate::widget::{Message, PanelWidget}; use crate::widgets::battery::BatteryWidget; use crate::widgets::clock::ClockWidget; +use crate::widgets::power_management::PowerManagementWidget; use crate::widgets::powerbutton::ShutdownWidget; use crate::widgets::spacer::Spacer; @@ -24,6 +25,7 @@ impl App { Box::new(ClockWidget::new()), Box::new(Spacer::new(iced::Length::Fill)), Box::new(BatteryWidget::new()), + Box::new(PowerManagementWidget::new()), ], } } diff --git a/src/widgets/power_management.rs b/src/widgets/power_management.rs index 6c0615e..e59b8ac 100644 --- a/src/widgets/power_management.rs +++ b/src/widgets/power_management.rs @@ -1,35 +1,52 @@ +use std::ops::Index; + use iced::{Subscription, Task}; -use ppd::PpdProxy; -use zbus::connection::Connection; +use ppd::PpdProxyBlocking; +use zbus::blocking::Connection; use crate::widget::{Message, PanelWidget}; -pub struct PowerManagementWidget { +pub struct PowerManagementWidget<'a> { window: Option, current_mode: usize, - names: Vec>, + modes: Box<[Box]>, + proxy: PpdProxyBlocking<'a>, } #[derive(Debug, Clone)] pub enum PowerManagement { ToggleWindow, - SetMode(SetMode), + SetMode(String), } -#[derive(Debug, Clone)] -pub enum SetMode { - Saver, - Medium, - Performant, -} - -impl PowerManagementWidget { +impl PowerManagementWidget<'_> { 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]> = 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 { let Message::PowerManagement(msg) = message else { return Task::none();