From 024d41727fc317228e39c5c8aa607c347a59b6c3 Mon Sep 17 00:00:00 2001 From: Denis Benato Date: Mon, 26 Jan 2026 22:38:07 +0100 Subject: [PATCH] feat: support TUF lighting power --- rog-control-center/src/main.rs | 10 +++- rog-control-center/src/ui/mod.rs | 3 ++ rog-control-center/ui/main_window.slint | 3 ++ rog-control-center/ui/pages/aura.slint | 54 +++++++++++++++++++++ rog-control-center/ui/widgets/sidebar.slint | 4 ++ 5 files changed, 72 insertions(+), 2 deletions(-) diff --git a/rog-control-center/src/main.rs b/rog-control-center/src/main.rs index 24a905b7..2e72d48a 100644 --- a/rog-control-center/src/main.rs +++ b/rog-control-center/src/main.rs @@ -148,6 +148,12 @@ async fn main() -> Result<()> { } }; + let is_tuf = { + let b = board_name.to_lowercase(); + let p = prod_family.to_lowercase(); + b.contains("tuf") || p.contains("tuf") + }; + #[cfg(feature = "rog_ally")] if is_rog_ally { config.notifications.enabled = false; @@ -198,7 +204,7 @@ async fn main() -> Result<()> { loop { if is_rog_ally { let config_copy_2 = config.clone(); - let newui = setup_window(config.clone(), prefetched_supported.clone()); + let newui = setup_window(config.clone(), prefetched_supported.clone(), is_tuf); newui.window().on_close_requested(move || { exit(0); }); @@ -256,7 +262,7 @@ async fn main() -> Result<()> { }); } else { let config_copy_2 = config_copy.clone(); - let newui = setup_window(config_copy, pref_for_invoke.clone()); + let newui = setup_window(config_copy, pref_for_invoke.clone(), is_tuf); newui.window().on_close_requested(move || { if let Ok(mut app_state) = app_state_copy.lock() { *app_state = AppState::MainWindowClosed; diff --git a/rog-control-center/src/ui/mod.rs b/rog-control-center/src/ui/mod.rs index 27e108c1..457cdffe 100644 --- a/rog-control-center/src/ui/mod.rs +++ b/rog-control-center/src/ui/mod.rs @@ -120,6 +120,7 @@ pub fn show_toast( pub fn setup_window( config: Arc>, prefetched_supported: std::sync::Arc>>, + is_tuf: bool, ) -> MainWindow { slint::set_xdg_app_id("rog-control-center") .map_err(|e| warn!("Couldn't set application ID: {e:?}")) @@ -127,6 +128,8 @@ pub fn setup_window( let ui = MainWindow::new() .map_err(|e| warn!("Couldn't create main window: {e:?}")) .unwrap(); + // propagate TUF flag to the UI so the sidebar can swap logo branding + ui.set_is_tuf(is_tuf); ui.window() .show() .map_err(|e| warn!("Couldn't show main window: {e:?}")) diff --git a/rog-control-center/ui/main_window.slint b/rog-control-center/ui/main_window.slint index e476448b..cedc341f 100644 --- a/rog-control-center/ui/main_window.slint +++ b/rog-control-center/ui/main_window.slint @@ -35,6 +35,8 @@ export component MainWindow inherits Window { true, // About ]; private property show_notif; + // TODO: change if TUF on the logo in the menu on the main page + in property is_tuf: false; private property fade_cover; private property toast: false; private property toast_text: "I show when something is waiting"; @@ -80,6 +82,7 @@ export component MainWindow inherits Window { @tr("Menu7" => "About"), ]; available: root.sidebar_items_avilable; + is_tuf: root.is_tuf; } Button { diff --git a/rog-control-center/ui/pages/aura.slint b/rog-control-center/ui/pages/aura.slint index 43d803ae..ba16f533 100644 --- a/rog-control-center/ui/pages/aura.slint +++ b/rog-control-center/ui/pages/aura.slint @@ -252,6 +252,60 @@ export component PageAura inherits Rectangle { } } + // TUF devices: show the same configurable power groups as `New`, since + // `setup_aura` fills `AuraPageData.supported_power_zones` and `led_power` + // appropriately for TUF devices. This ensures the Power Settings panel + // reflects what the firmware reports for TUF models. + if root.show_aura_power && AuraPageData.device_type == AuraDevType.Tuf: Rectangle { + background: Palette.background; + width: 100%; + height: 100%; + opacity: 1; + ScrollView { + VerticalLayout { + padding: 30px; + padding-top: 10px; + spacing: 10px; + alignment: LayoutAlignment.start; + + for state[idx] in AuraPageData.led_power.states: tuf_zone := AuraPowerGroup { + group-title: AuraPageData.power_zone_names[state.zone_name_idx]; + boot_checked: state.boot; + boot_toggled => { + AuraPageData.led_power.states[idx].boot = tuf_zone.boot_checked; + AuraPageData.cb_led_power(AuraPageData.led_power); + } + awake_checked: state.awake; + awake_toggled => { + AuraPageData.led_power.states[idx].awake = tuf_zone.awake_checked; + AuraPageData.cb_led_power(AuraPageData.led_power); + } + sleep_checked: state.sleep; + sleep_toggled => { + AuraPageData.led_power.states[idx].sleep = tuf_zone.sleep_checked; + AuraPageData.cb_led_power(AuraPageData.led_power); + } + shutdown_checked: state.shutdown; + shutdown_toggled => { + AuraPageData.led_power.states[idx].shutdown = tuf_zone.shutdown_checked; + AuraPageData.cb_led_power(AuraPageData.led_power); + } + } + } + + Button { + x: root.width - self.width - 6px; + y: 6px; + text: "✕"; + height: 36px; + clicked => { + root.show_aura_power = false; + root.show_fade_cover = false; + } + } + } + } + if root.show_aura_power && AuraPageData.device_type == AuraDevType.Old: Rectangle { background: Palette.background; width: 100%; diff --git a/rog-control-center/ui/widgets/sidebar.slint b/rog-control-center/ui/widgets/sidebar.slint index f29254e5..60eab5bb 100644 --- a/rog-control-center/ui/widgets/sidebar.slint +++ b/rog-control-center/ui/widgets/sidebar.slint @@ -52,6 +52,7 @@ component SideBarItem inherits Rectangle { export component SideBar inherits Rectangle { in property <[string]> model: []; in property <[bool]> available: []; + in property is_tuf: false; out property current-item: 0; out property current-focused: fs.has-focus ? fs.focused-tab : -1; @@ -99,6 +100,9 @@ export component SideBar inherits Rectangle { Image { height: 100px; + // TODO: change if TUF on the logo in the menu on the main page + // If running on a TUF model, replace the ROG red with TUF orange + // (add data/tuf-control-center.png and switch here when available) source: @image-url("../../data/rog-control-center.png"); horizontal-alignment: center; image-fit: contain;