feat: show active power state, better ui

feat: show active power state with an arrow instead of selection
This commit is contained in:
Ilya Zlobintsev
2023-11-19 15:48:16 +02:00
parent 7ccacc25b7
commit bd1020fa1b
11 changed files with 66 additions and 16 deletions

View File

@@ -64,7 +64,7 @@ impl OcPage {
performance_level_frame.connect_settings_changed(
clone!(@strong performance_level_frame, @strong power_states_frame => move || {
let level = performance_level_frame.get_selected_performance_level();
power_states_frame.set_sensitive(level == PerformanceLevel::Manual);
power_states_frame.set_configurable(level == PerformanceLevel::Manual);
}),
);
@@ -88,6 +88,7 @@ impl OcPage {
pub fn set_stats(&self, stats: &DeviceStats, initial: bool) {
self.stats_section.set_stats(stats);
self.power_states_frame.set_stats(stats);
if initial {
self.power_cap_frame.set_data(
stats.power.cap_current,

View File

@@ -49,7 +49,7 @@ impl PerformanceFrame {
.build();
let unavailable_label = Label::new(Some(
"Performance level has to be set to \"manual\" to use power profile modes",
"Performance level has to be set to \"manual\" to use power states and modes",
));
let mode_info_popover = Popover::builder().child(&unavailable_label).build();
let manual_info_button = MenuButton::builder()

View File

@@ -44,6 +44,8 @@ mod imp {
enabled: AtomicBool,
#[property(get, set)]
index: AtomicU8,
#[property(get, set)]
active: AtomicBool,
}
#[glib::object_subclass]

View File

@@ -1,7 +1,7 @@
use std::collections::HashMap;
use gtk::glib::{self, subclass::types::ObjectSubclassIsExt, Object};
use lact_client::schema::{amdgpu_sysfs::gpu_handle::PowerLevelKind, PowerStates};
use lact_client::schema::{amdgpu_sysfs::gpu_handle::PowerLevelKind, DeviceStats, PowerStates};
glib::wrapper! {
pub struct PowerStatesFrame(ObjectSubclass<imp::PowerStatesFrame>)
@@ -26,6 +26,16 @@ impl PowerStatesFrame {
imp.vram_states_list.connect_values_changed(f);
}
pub fn set_stats(&self, stats: &DeviceStats) {
let imp = self.imp();
if let Some(core_state) = stats.core_power_state {
imp.core_states_list.set_active_state(core_state);
}
if let Some(memory_state) = stats.memory_power_state {
imp.vram_states_list.set_active_state(memory_state);
}
}
pub fn get_enabled_power_states(&self) -> HashMap<PowerLevelKind, Vec<u8>> {
let imp = self.imp();
let core_states = imp.core_states_list.get_enabled_power_states();
@@ -49,21 +59,27 @@ impl Default for PowerStatesFrame {
mod imp {
use crate::app::root_stack::oc_page::power_states::power_states_list::PowerStatesList;
use gtk::{
glib::{self, subclass::InitializingObject, StaticTypeExt},
glib::{self, subclass::InitializingObject, Properties, StaticTypeExt},
prelude::ObjectExt,
subclass::{
prelude::*,
widget::{CompositeTemplateClass, WidgetImpl},
},
CompositeTemplate,
};
use std::sync::atomic::AtomicBool;
#[derive(CompositeTemplate, Default)]
#[derive(CompositeTemplate, Default, Properties)]
#[properties(wrapper_type = super::PowerStatesFrame)]
#[template(file = "ui/oc_page/power_states_frame.blp")]
pub struct PowerStatesFrame {
#[template_child]
pub core_states_list: TemplateChild<PowerStatesList>,
#[template_child]
pub vram_states_list: TemplateChild<PowerStatesList>,
#[property(get, set)]
configurable: AtomicBool,
}
#[glib::object_subclass]
@@ -82,7 +98,7 @@ mod imp {
}
}
// #[glib::derived_properties]
#[glib::derived_properties]
impl ObjectImpl for PowerStatesFrame {}
impl WidgetImpl for PowerStatesFrame {}

View File

@@ -1,7 +1,7 @@
use crate::app::root_stack::oc_page::power_states::power_state_row::PowerStateRow;
use gtk::{
gio,
glib::{self, clone, subclass::types::ObjectSubclassIsExt, Cast, Object},
glib::{self, clone, subclass::types::ObjectSubclassIsExt, Cast, CastNone, Object},
prelude::{ListBoxRowExt, WidgetExt},
ListBoxRow, Widget,
};
@@ -50,6 +50,18 @@ impl PowerStatesList {
}
}
pub fn set_active_state(&self, i: usize) {
let imp = self.imp();
for object in imp.states_listbox.observe_children().into_iter().flatten() {
let list_row: ListBoxRow = object.downcast().unwrap();
if let Some(row) = list_row.child().and_downcast::<PowerStateRow>() {
let active = row.index() == i as u8;
row.set_active(active);
}
}
}
fn rows(&self) -> Vec<PowerStateRow> {
let children = self.imp().states_listbox.observe_children();
children

View File

@@ -46,7 +46,7 @@ template $GpuStatsSection: $PageSection {
}
$InfoRow {
name: "GPU Temperature:";
name: "GPU Temperature (hotspot):";
value: bind template.temperature;
}
}

View File

@@ -9,4 +9,9 @@ template $PowerStateRow: Box {
label: bind template.title;
hexpand: true;
}
Image {
icon-name: "pan-start-symbolic";
visible: bind template.active;
}
}

View File

@@ -14,10 +14,12 @@ template $PowerStatesFrame: Box {
$PowerStatesList core_states_list {
title: "GPU power states";
sensitive: bind template.configurable;
}
$PowerStatesList vram_states_list {
title: "VRAM power states";
sensitive: bind template.configurable;
}
}
}

View File

@@ -11,6 +11,6 @@ template $PowerStatesList: Frame {
}
ListBox states_listbox {
selection-mode: browse;
selection-mode: none;
}
}