mirror of
https://github.com/ilya-zlobintsev/LACT.git
synced 2025-02-25 18:55:26 -06:00
feat: show active power state, better ui
feat: show active power state with an arrow instead of selection
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -44,6 +44,8 @@ mod imp {
|
||||
enabled: AtomicBool,
|
||||
#[property(get, set)]
|
||||
index: AtomicU8,
|
||||
#[property(get, set)]
|
||||
active: AtomicBool,
|
||||
}
|
||||
|
||||
#[glib::object_subclass]
|
||||
|
||||
@@ -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 {}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -46,7 +46,7 @@ template $GpuStatsSection: $PageSection {
|
||||
}
|
||||
|
||||
$InfoRow {
|
||||
name: "GPU Temperature:";
|
||||
name: "GPU Temperature (hotspot):";
|
||||
value: bind template.temperature;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,4 +9,9 @@ template $PowerStateRow: Box {
|
||||
label: bind template.title;
|
||||
hexpand: true;
|
||||
}
|
||||
|
||||
Image {
|
||||
icon-name: "pan-start-symbolic";
|
||||
visible: bind template.active;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,6 @@ template $PowerStatesList: Frame {
|
||||
}
|
||||
|
||||
ListBox states_listbox {
|
||||
selection-mode: browse;
|
||||
selection-mode: none;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user