diff --git a/lact-gui/i18n/en/lact_gui.ftl b/lact-gui/i18n/en/lact_gui.ftl index ab20e903..f0e2af9e 100644 --- a/lact-gui/i18n/en/lact_gui.ftl +++ b/lact-gui/i18n/en/lact_gui.ftl @@ -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 diff --git a/lact-gui/src/app/pages/oc_page/performance_frame/mod.rs b/lact-gui/src/app/pages/oc_page/performance_frame/mod.rs index e0ea7e79..fe07d63d 100644 --- a/lact-gui/src/app/pages/oc_page/performance_frame/mod.rs +++ b/lact-gui/src/app/pages/oc_page/performance_frame/mod.rs @@ -33,6 +33,23 @@ pub struct PerformanceFrame { heuristics_components: Vec>, } +#[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) -> [>k::ListBoxRow; 3] { + [ + &self.performance_level, + &self.power_profile, + &self.power_mizer, + ] + } +} + #[derive(Debug)] pub enum PerformanceFrameMsg { PerformanceLevel(Option), @@ -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 = >k::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 = >k::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 = >k::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 = >k::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, ) -> ComponentParts { + 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() diff --git a/lact-gui/src/app/pages/oc_page/power_frame.rs b/lact-gui/src/app/pages/oc_page/power_frame.rs index 03ebaf82..bf14a786 100644 --- a/lact-gui/src/app/pages/oc_page/power_frame.rs +++ b/lact-gui/src/app/pages/oc_page/power_frame.rs @@ -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 {