From 03de81d2fba272fe0d243775c54357b6a9dd2aa2 Mon Sep 17 00:00:00 2001 From: Gabriele Musco Date: Mon, 12 Feb 2024 13:27:46 +0100 Subject: [PATCH] feat: battery icon with percentage (still inactive, missing piece from monado/libmonado) --- src/ui/battery_status.rs | 35 ++++++++++++++++++++++++++ src/ui/factories/device_row_factory.rs | 24 +++++++++++++++++- src/ui/mod.rs | 1 + src/xr_devices.rs | 6 ++--- 4 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 src/ui/battery_status.rs diff --git a/src/ui/battery_status.rs b/src/ui/battery_status.rs new file mode 100644 index 0000000..3b5db10 --- /dev/null +++ b/src/ui/battery_status.rs @@ -0,0 +1,35 @@ +use std::fmt::Display; + +#[derive(Debug, Clone, Default)] +pub struct BatteryStatus { + /// between 0 and 100 + pub percentage: u8, +} + +impl Display for BatteryStatus { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(&format!("{}%", self.percentage)) + } +} + +impl BatteryStatus { + pub fn new(percentage: u8) -> Self { + Self { percentage } + } + + pub fn icon(&self) -> &str { + match self.percentage { + n if n >= 100 => "battery-level-100-symbolic", + n if n >= 90 => "battery-level-90-symbolic", + n if n >= 80 => "battery-level-80-symbolic", + n if n >= 70 => "battery-level-70-symbolic", + n if n >= 60 => "battery-level-60-symbolic", + n if n >= 50 => "battery-level-50-symbolic", + n if n >= 40 => "battery-level-40-symbolic", + n if n >= 30 => "battery-level-30-symbolic", + n if n >= 20 => "battery-level-20-symbolic", + n if n >= 10 => "battery-level-10-symbolic", + _ => "battery-level-0-symbolic", + } + } +} diff --git a/src/ui/factories/device_row_factory.rs b/src/ui/factories/device_row_factory.rs index ba62888..89dcb18 100644 --- a/src/ui/factories/device_row_factory.rs +++ b/src/ui/factories/device_row_factory.rs @@ -1,5 +1,5 @@ use crate::{ - ui::devices_box::DevicesBoxMsg, + ui::{battery_status::BatteryStatus, devices_box::DevicesBoxMsg}, xr_devices::{XRDevice, XRDeviceRole}, }; use adw::prelude::*; @@ -42,6 +42,7 @@ pub struct DeviceRowModel { subtitle: String, state: DeviceRowState, suffix: Option, + battery_status: Option, } #[derive(Debug, Default)] @@ -50,6 +51,7 @@ pub struct DeviceRowModelInit { pub subtitle: Option, pub state: Option, pub suffix: Option, + pub battery_status: Option, } impl DeviceRowModelInit { @@ -57,6 +59,9 @@ impl DeviceRowModelInit { Self { title: Some(d.dev_type.to_string()), subtitle: Some(d.name.clone()), + battery_status: d + .battery + .map(|bat| BatteryStatus::new((bat * 100.0).trunc() as u8)), ..Default::default() } } @@ -86,6 +91,22 @@ impl AsyncFactoryComponent for DeviceRowModel { add_prefix: icon = >k::Image { set_icon_name: Some(self.state.icon()), }, + add_suffix: batt_info = >k::Box { + set_visible: self.battery_status.is_some(), + set_orientation: gtk::Orientation::Horizontal, + set_spacing: 6, + gtk::Image { + set_icon_name: self.battery_status + .as_ref() + .map(|bs| bs.icon()), + }, + gtk::Label { + set_text: &self.battery_status + .as_ref() + .map(|bs| bs.to_string()) + .unwrap_or_default(), + }, + }, set_title: self.title.as_str(), set_subtitle: self.subtitle.as_str(), } @@ -120,6 +141,7 @@ impl AsyncFactoryComponent for DeviceRowModel { title: init.title.unwrap_or_default(), subtitle: init.subtitle.unwrap_or_default(), state: init.state.unwrap_or_default(), + battery_status: init.battery_status, suffix: init.suffix, } } diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 00baec8..d474fca 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -1,6 +1,7 @@ mod about_dialog; mod alert; pub mod app; +mod battery_status; mod build_window; pub mod cmdline_opts; mod debug_view; diff --git a/src/xr_devices.rs b/src/xr_devices.rs index dce6af6..795e8a6 100644 --- a/src/xr_devices.rs +++ b/src/xr_devices.rs @@ -229,8 +229,8 @@ pub struct XRDevice { pub dev_type: XRDeviceRole, pub name: String, pub id: String, - pub battery: f32, // battery percentage, from 0 to 1 maybe - // still need to implement it in monado & gui + pub battery: Option, // battery percentage, from 0 to 1 maybe + // still need to implement it in monado } impl Default for XRDevice { @@ -239,7 +239,7 @@ impl Default for XRDevice { dev_type: XRDeviceRole::GenericTracker, name: String::default(), id: String::default(), - battery: f32::default(), + battery: Option::default(), } } }