From 620e1feac53bb13cb94deeb8492957220707bb32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Maxmili=C3=A1n=20St=C5=99=C3=ADbrn=C3=BD?= Date: Tue, 24 Mar 2026 15:19:30 +0100 Subject: [PATCH] created brightness branch --- src/widgets/brightness.rs | 139 ++++++++++++++++++++++++++++++++++++++ src/widgets/mod.rs | 1 + 2 files changed, 140 insertions(+) create mode 100644 src/widgets/brightness.rs diff --git a/src/widgets/brightness.rs b/src/widgets/brightness.rs new file mode 100644 index 0000000..3724a2e --- /dev/null +++ b/src/widgets/brightness.rs @@ -0,0 +1,139 @@ +use iced::{ + Subscription, Task, + widget::{Column, button, text}, +}; +use iced_layershell::reexport::{Anchor, NewLayerShellSettings}; +use ppd::{PpdProxyBlocking, Result}; +use zbus::blocking::Connection; + +use crate::widget::{Message, PanelWidget}; + +pub struct PowerManagementWidget<'a> { + connection: Option>, +} + +struct Connected<'a> { + window: Option, + current_mode: Box, + modes: Box<[Box]>, + proxy: PpdProxyBlocking<'a>, +} + +#[derive(Debug, Clone)] +pub enum PowerManagement { + ToggleWindow, + SetMode(String), +} + +impl PowerManagementWidget<'_> { + pub fn new() -> Self { + Self { + connection: Self::establish_connection().ok(), + } + } + + fn establish_connection<'a>() -> Result> { + let conn = Connection::system().unwrap(); + let proxy = PpdProxyBlocking::new(&conn)?; + + let modes: Box<[Box]> = proxy + .profiles()? + .iter() + .map(|f| f.profile.clone().into_boxed_str()) + .collect(); + + let current_mode = proxy.active_profile()?.into_boxed_str(); + + Ok(Connected { + current_mode, + modes, + proxy, + window: None, + }) + } +} + +impl PanelWidget for PowerManagementWidget<'_> { + fn update(&mut self, message: &crate::widget::Message) -> iced::Task { + let Message::PowerManagement(msg) = message else { + return Task::none(); + }; + + let Some(conn) = &mut self.connection else { + return Task::none(); + }; + + match msg { + PowerManagement::ToggleWindow => match conn.window { + Some(child) => { + conn.window = None; + Task::done(Message::RemoveWindow(child)) + } + None => { + let id = iced::window::Id::unique(); + conn.window = Some(id); + + Task::done(Message::NewLayerShell { + settings: NewLayerShellSettings { + size: Some((220, 400)), + anchor: Anchor::Top, + layer: iced_layershell::reexport::Layer::Overlay, + keyboard_interactivity: + iced_layershell::reexport::KeyboardInteractivity::OnDemand, + exclusive_zone: None, + ..Default::default() + }, + id, + }) + } + }, + + PowerManagement::SetMode(mode) => { + let _ = conn.proxy.set_active_profile(mode.into()); + + conn.current_mode = conn.proxy.active_profile().unwrap().into_boxed_str(); + Task::none() + } + } + } + + fn subscribe(&self) -> iced::Subscription { + Subscription::none() + } + + fn view(&self) -> Option> { + let Some(conn) = &self.connection else { + return None; + }; + + let output = button(text!("{}", conn.current_mode)) + .on_press(Message::PowerManagement(PowerManagement::ToggleWindow)) + .into(); + + Some(output) + } + + fn render_window( + &self, + id: iced::window::Id, + ) -> Option> { + let Some(conn) = &self.connection else { + return None; + }; + + if conn.window != Some(id) { + return None; + } + + let output = Column::with_children(conn.modes.iter().map(|f| { + button(text!("{}", f)) + .on_press(Message::PowerManagement(PowerManagement::SetMode( + f.clone().into_string(), + ))) + .into() + })) + .into(); + + Some(output) + } +} diff --git a/src/widgets/mod.rs b/src/widgets/mod.rs index 15c857e..4fb01c4 100644 --- a/src/widgets/mod.rs +++ b/src/widgets/mod.rs @@ -1,4 +1,5 @@ pub mod battery; +pub mod brightness; pub mod clock; pub mod power_management; pub mod powerbutton;