Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lact-gui/i18n/en/lact_gui.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ mem-pstate-clock-voltage = VRAM P-State {$pstate} Voltage (mV)
pstates = Power States
gpu-pstates = GPU Power States
vram-pstates = VRAM Power States
pstates-manual-needed = Note: performance level must be set to 'manual' to toggle power states
pstates-manual-needed = Performance level must be set to 'manual' to toggle power states
enable-pstate-config = Enable power state configuration

show-historical-charts = Show Historical Charts
Expand Down
1 change: 1 addition & 0 deletions lact-gui/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ mod info_row_level;
pub(crate) mod msg;
mod overdrive_dialog;
mod page_section;
mod page_section_expander;
pub(crate) mod pages;
mod process_monitor;

Expand Down
3 changes: 2 additions & 1 deletion lact-gui/src/app/info_row.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,8 @@ impl Default for InfoRow {
}

mod imp {
use std::{cell::RefCell, str::FromStr};

use glib::Properties;
use gtk::{
Label, glib,
Expand All @@ -126,7 +128,6 @@ mod imp {
subclass::{prelude::*, widget::WidgetImpl},
};
use relm4::{RelmWidgetExt, css, view};
use std::{cell::RefCell, str::FromStr};

#[derive(Default, Properties)]
#[properties(wrapper_type = super::InfoRow)]
Expand Down
6 changes: 4 additions & 2 deletions lact-gui/src/app/info_row_level.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,13 @@ impl Default for InfoRowLevel {
}

mod imp {
use crate::app::info_row::{InfoRow, InfoRowExt};
use std::cell::RefCell;

use glib::Properties;
use gtk::{LevelBar, glib, prelude::*, subclass::prelude::*};
use relm4::view;
use std::cell::RefCell;

use crate::app::info_row::{InfoRow, InfoRowExt};

#[derive(Default, Properties)]
#[properties(wrapper_type = super::InfoRowLevel)]
Expand Down
3 changes: 2 additions & 1 deletion lact-gui/src/app/page_section.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ impl PageSection {
unsafe impl<T: ObjectSubclass + BoxImpl> IsSubclassable<T> for PageSection {}

mod imp {
use std::cell::RefCell;

use glib::Properties;
use gtk::{
Label,
Expand All @@ -40,7 +42,6 @@ mod imp {
subclass::{prelude::*, widget::WidgetImpl},
};
use relm4::{RelmWidgetExt, css, view};
use std::cell::RefCell;

#[derive(Default, Properties)]
#[properties(wrapper_type = super::PageSection)]
Expand Down
132 changes: 132 additions & 0 deletions lact-gui/src/app/page_section_expander.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
use cairo::glib::subclass::types::ObjectSubclassIsExt;
use gtk::prelude::*;
use gtk::{
glib::{
self, Object,
subclass::types::{IsSubclassable, ObjectSubclass},
},
subclass::box_::BoxImpl,
};

glib::wrapper! {
pub struct PageSectionExpander(ObjectSubclass<imp::PageSectionExpander>)
@extends gtk::Box, gtk::Widget,
@implements gtk::Orientable, gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget;
}

impl PageSectionExpander {
pub fn new(name: &str) -> Self {
Object::builder().property("name", name).build()
}

pub fn append_header(&self, widget: &impl IsA<gtk::Widget>) {
self.imp().header_box.append(widget);
}

pub fn append_expandable(&self, widget: &impl IsA<gtk::Widget>) {
self.imp().children_box.append(widget);
}
}

unsafe impl<T: ObjectSubclass + BoxImpl> IsSubclassable<T> for PageSectionExpander {}

mod imp {
use std::cell::RefCell;

use glib::Properties;
use gtk::{
Label,
glib::{self},
prelude::*,
subclass::{prelude::*, widget::WidgetImpl},
};
use relm4::{RelmWidgetExt, view};

#[derive(Default, Properties)]
#[properties(wrapper_type = super::PageSectionExpander)]
pub struct PageSectionExpander {
section_label: Label,
pub(super) header_box: gtk::Box,
pub(super) content_box: gtk::Box,
pub(super) children_box: gtk::Box,
pub(super) expander: gtk::Expander,

#[property(get, set)]
name: RefCell<String>,

#[property(get, set)]
expanded: std::cell::Cell<bool>,
}

#[glib::object_subclass]
impl ObjectSubclass for PageSectionExpander {
const NAME: &'static str = "PageSectionExpander";
type Type = super::PageSectionExpander;
type ParentType = gtk::Box;
}

#[glib::derived_properties]
impl ObjectImpl for PageSectionExpander {
fn constructed(&self) {
self.parent_constructed();
let obj = self.obj();

let section_label = &self.section_label;
let header_box = &self.header_box;
let content_box = &self.content_box;
let children_box = &self.children_box;
let expander = &self.expander;

view! {
#[local_ref]
obj {
set_orientation: gtk::Orientation::Vertical,
set_spacing: 10,

#[local_ref]
append = expander {
set_child: Some(content_box),
set_label_widget : Some(header_box),
},
},

#[local_ref]
header_box {
set_orientation: gtk::Orientation::Horizontal,
set_spacing: 10,

#[local_ref]
append = section_label {
set_use_markup: true,
set_halign: gtk::Align::Start,
set_margin_vertical: 5,
// align label with normal PageSection
set_margin_start: -1,
set_margin_end: 1,
},
},

#[local_ref]
content_box {
set_orientation: gtk::Orientation::Vertical,

#[local_ref]
append = children_box {
set_orientation: gtk::Orientation::Vertical,
set_spacing: 10,
set_margin_all: 10,
},
},
}

obj.bind_property("name", &self.section_label, "label")
.transform_to(|_, value: String| {
Some(format!("<span font_desc='13'><b>{value}</b></span>"))
})
.build();
}
}

impl WidgetImpl for PageSectionExpander {}
impl BoxImpl for PageSectionExpander {}
}
1 change: 1 addition & 0 deletions lact-gui/src/app/pages/oc_page/power_states/mod.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
pub mod power_states_frame;
mod power_states_list;
mod power_states_row;
55 changes: 37 additions & 18 deletions lact-gui/src/app/pages/oc_page/power_states/power_states_frame.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use crate::{
APP_BROKER, I18N,
app::{
msg::AppMsg,
page_section_expander::PageSectionExpander,
pages::oc_page::power_states::power_states_list::{
PowerStatesListMsg, PowerStatesListOptions,
},
Expand All @@ -17,8 +18,9 @@ use i18n_embed_fl::fl;
use indexmap::IndexMap;
use lact_schema::{DeviceStats, PowerStates};
use relm4::{
Component, ComponentController, ComponentParts, ComponentSender, RelmObjectExt, RelmWidgetExt,
binding::BoolBinding,
Component, ComponentController, ComponentParts, ComponentSender, RelmObjectExt,
binding::{Binding, BoolBinding},
css,
};
use std::sync::Arc;

Expand All @@ -27,7 +29,6 @@ pub struct PowerStatesFrame {
vram_states_list: relm4::Controller<PowerStatesList>,
states_configurable: BoolBinding,
states_configured: BoolBinding,
states_expanded: BoolBinding,
performance_level: Option<PerformanceLevel>,
configured_signal: SignalHandlerId,
vram_clock_ratio: f64,
Expand All @@ -43,6 +44,7 @@ pub enum PowerStatesFrameMsg {
PerformanceLevel(Option<PerformanceLevel>),
VramClockRatio(f64),
Configurable(bool),
InternalConfigurableChanged(bool),
}

#[relm4::component(pub)]
Expand All @@ -52,20 +54,14 @@ impl relm4::SimpleComponent for PowerStatesFrame {
type Output = ();

view! {
gtk::Expander {
set_label: Some(&fl!(I18N, "pstates")),
add_binding: (&model.states_expanded, "expanded"),
set_margin_horizontal: 20,

gtk::Box {
PageSectionExpander::new(&fl!(I18N, "pstates")) {
append_expandable = &gtk::Box {
set_orientation: gtk::Orientation::Vertical,
set_margin_all: 10,
set_spacing: 5,
add_binding: (&model.states_configurable, "sensitive"),

gtk::Label {
set_label: &fl!(I18N, "pstates-manual-needed"),
set_margin_horizontal: 10,
add_css_class: css::DIM_LABEL,
set_halign: gtk::Align::Start,
#[watch]
set_visible: model.performance_level.is_some_and(|level| level != PerformanceLevel::Manual),
Expand All @@ -76,15 +72,25 @@ impl relm4::SimpleComponent for PowerStatesFrame {
add_binding: (&model.states_configured, "active"),
#[watch]
set_visible: model.performance_level.is_some(),
#[watch]
set_sensitive: model.performance_level.is_some_and(|level| level == PerformanceLevel::Manual),
},

gtk::Box {
set_spacing: 10,
set_orientation: gtk::Orientation::Horizontal,
add_binding: (&model.states_configured, "sensitive"),

append = model.core_states_list.widget(),
append = model.vram_states_list.widget(),
gtk::Box {
#[watch]
set_visible: !model.core_states_list.model().is_empty(),
append = model.core_states_list.widget(),
},

gtk::Box {
#[watch]
set_visible: !model.vram_states_list.model().is_empty(),
append = model.vram_states_list.widget(),
},
}
}
}
Expand All @@ -93,7 +99,7 @@ impl relm4::SimpleComponent for PowerStatesFrame {
fn init(
_: Self::Init,
root: Self::Root,
_sender: ComponentSender<Self>,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let core_states_list = PowerStatesList::builder()
.launch(PowerStatesListOptions {
Expand All @@ -110,7 +116,10 @@ impl relm4::SimpleComponent for PowerStatesFrame {

let states_configured = BoolBinding::new(false);

let configured_signal = states_configured.connect_value_notify(|_| {
let configured_signal = states_configured.connect_value_notify(move |states_configured| {
sender.input(PowerStatesFrameMsg::InternalConfigurableChanged(
states_configured.get(),
));
APP_BROKER.send(AppMsg::SettingsChanged);
});

Expand All @@ -120,7 +129,6 @@ impl relm4::SimpleComponent for PowerStatesFrame {
states_configurable: BoolBinding::new(false),
states_configured,
configured_signal,
states_expanded: BoolBinding::new(false),
performance_level: None,
vram_clock_ratio: 1.0,
};
Expand Down Expand Up @@ -163,6 +171,11 @@ impl relm4::SimpleComponent for PowerStatesFrame {
|| !self.vram_states_list.model().is_empty());
self.states_configurable.set_value(value);

self.core_states_list
.emit(PowerStatesListMsg::Configurable(value));
self.vram_states_list
.emit(PowerStatesListMsg::Configurable(value));

if !value {
self.states_configured.block_signal(&self.configured_signal);
self.states_configured.set_value(false);
Expand All @@ -173,6 +186,12 @@ impl relm4::SimpleComponent for PowerStatesFrame {
PowerStatesFrameMsg::PerformanceLevel(level) => {
self.performance_level = level;
}
PowerStatesFrameMsg::InternalConfigurableChanged(configurable) => {
self.core_states_list
.emit(PowerStatesListMsg::Configurable(configurable));
self.vram_states_list
.emit(PowerStatesListMsg::Configurable(configurable));
}
}
}
}
Expand Down
Loading
Loading