fix: move performance frame listbox (#1209)

* fix performance-frame render

* power mode UI fixes
This commit is contained in:
Roman Makarov authored and GitHub committed 2026-09-26 14:41:08 +03:00
1 parent 9bbda62034
commit c55a6ebe13
3 files changed
+78 -44

No files matched your search

+1 -1
View File
@@ -168,7 +168,7 @@ performance-level-profile-min-mclk-description = Forces the VRAM clock to lowest
performance-level-profile-peak-description = Forces GPU and VRAM clocks to highest levels
performance-level = Performance Level
power-profile-mode = Power Profile Mode:
power-profile-mode = Power Profile Mode
manual-level-needed = Performance level has to be set to "manual" to use power states and modes
power-mizer-mode = PowerMizer Mode
power-mizer-mode-auto = Auto
@@ -33,6 +33,23 @@ pub struct PerformanceFrame {
heuristics_components: Vec<relm4::Controller<PowerProfileHeuristicsList>>,
}
#[derive(Debug, Clone, Default)]
pub struct PerformanceRows {
pub performance_level: gtk::ListBoxRow,
pub power_profile: gtk::ListBoxRow,
pub power_mizer: gtk::ListBoxRow,
}
impl PerformanceRows {
pub fn rows(&self) -> [&gtk::ListBoxRow; 3] {
[
&self.performance_level,
&self.power_profile,
&self.power_mizer,
]
}
}
#[derive(Debug)]
pub enum PerformanceFrameMsg {
PerformanceLevel(Option<PerformanceLevel>),
@@ -53,19 +70,19 @@ impl relm4::Component for PerformanceFrame {
type CommandOutput = ();
view! {
gtk::Box {
set_orientation: gtk::Orientation::Vertical,
set_spacing: 10,
#[watch]
set_visible: model.performance_level.is_some()
|| model.power_profile_modes_table.is_some()
|| model.active_power_mizer_mode.is_some(),
#[root]
PerformanceRows::default() {},
append = &gtk::Box {
#[local]
performance_level_row -> gtk::ListBoxRow {
set_activatable: false,
set_selectable: false,
#[watch]
set_visible: model.performance_level.is_some(),
gtk::Box {
set_orientation: gtk::Orientation::Horizontal,
set_spacing: 10,
#[watch]
set_visible: model.performance_level.is_some(),
gtk::Box {
set_orientation: gtk::Orientation::Vertical,
@@ -113,21 +130,25 @@ impl relm4::Component for PerformanceFrame {
} @ level_select_handler,
},
},
},
append = &gtk::Box {
#[local]
power_profile_row -> gtk::ListBoxRow {
set_activatable: false,
set_selectable: false,
#[watch]
set_visible: model.power_profile_modes_table.is_some(),
gtk::Box {
set_orientation: gtk::Orientation::Horizontal,
set_spacing: 10,
#[watch]
set_visible: model.power_profile_modes_table.is_some(),
gtk::Label {
set_label: &fl!(I18N, "power-profile-mode"),
set_hexpand: true,
set_halign: gtk::Align::Start,
},
gtk::MenuButton {
set_icon_name: "dialog-information-symbolic",
#[watch]
set_visible: model.performance_level != Some(PerformanceLevel::Manual),
@@ -137,9 +158,18 @@ impl relm4::Component for PerformanceFrame {
set_label: &fl!(I18N, "manual-level-needed"),
}
},
add_css_class: css::FLAT,
#[wrap(Some)]
set_child = &gtk::Image {
set_icon_name: Some("info-outline-symbolic"),
set_pixel_size: 12,
},
},
gtk::MenuButton {
set_hexpand: true,
set_halign: gtk::Align::End,
set_always_show_arrow: false,
#[watch]
set_label: model.power_profile_modes_table.as_ref().and_then(|table| table.modes.get(&table.active)).map(|profile| profile.name.as_str()).unwrap_or_default(),
@@ -182,12 +212,18 @@ impl relm4::Component for PerformanceFrame {
},
},
},
},
append = &gtk::Box {
#[local]
power_mizer_row -> gtk::ListBoxRow {
set_activatable: false,
set_selectable: false,
#[watch]
set_visible: model.active_power_mizer_mode.is_some(),
gtk::Box {
set_orientation: gtk::Orientation::Horizontal,
set_spacing: 10,
#[watch]
set_visible: model.active_power_mizer_mode.is_some(),
gtk::Box {
set_orientation: gtk::Orientation::Vertical,
@@ -238,9 +274,12 @@ impl relm4::Component for PerformanceFrame {
fn init(
_init: Self::Init,
_root: Self::Root,
root: Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let performance_level_row = root.performance_level.clone();
let power_profile_row = root.power_profile.clone();
let power_mizer_row = root.power_mizer.clone();
let level_names = PERFORMANCE_LEVELS.map(level_friendly_name);
let level_names_ref = level_names
.iter()
+19 -24
View File
@@ -63,20 +63,7 @@ impl relm4::Component for PowerFrame {
},
#[template]
#[local]
append_child = &card -> AdjustmentCard {
#[template_child]
content {
#[name = "performance_row"]
gtk::ListBoxRow {
set_activatable: false,
set_selectable: false,
#[watch]
set_visible: model.performance_frame.widget().get_visible(),
set_child: Some(model.performance_frame.widget()),
},
},
},
append_child = &card -> AdjustmentCard {},
},
}
@@ -94,20 +81,22 @@ impl relm4::Component for PowerFrame {
performance_frame: PerformanceFrame::launch_default()
.forward(sender.output_sender(), |msg| msg),
};
let visibility_sender = sender.clone();
model
.performance_frame
.widget()
.connect_visible_notify(move |_| {
for row in model.performance_frame.widget().rows() {
card.content.append(row);
let visibility_sender = sender.clone();
row.connect_visible_notify(move |_| {
visibility_sender.input(PowerFrameMsg::RefreshVisibility);
});
}
let widgets = view_output!();
let performance_row = widgets.performance_row.clone();
// FIXME: performance-row should be adjustmentRow like factory. until that we need to sort to get right order
let rows = model.performance_frame.widget().rows().map(Clone::clone);
// FIXME: performance rows should be factory items like AdjustmentRow; until then
// sort to keep the power limit before them when the factory recreates it.
model.power_row.widget().set_sort_func(move |left, right| {
(left == &performance_row)
.cmp(&(right == &performance_row))
rows.iter()
.position(|row| row == left)
.cmp(&rows.iter().position(|row| row == right))
.into()
});
@@ -161,7 +150,13 @@ impl relm4::Component for PowerFrame {
impl PowerFrame {
fn is_available(&self) -> bool {
!self.power_row.is_empty() || self.performance_frame.widget().get_visible()
!self.power_row.is_empty()
|| self
.performance_frame
.widget()
.rows()
.iter()
.any(|row| row.get_visible())
}
pub fn get_user_cap(&self) -> Option<f64> {