diff --git a/Cargo.lock b/Cargo.lock index f2a90728..543350b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1992,7 +1992,7 @@ dependencies = [ [[package]] name = "rog_aura" -version = "1.2.0" +version = "1.2.1" dependencies = [ "serde", "serde_derive", diff --git a/rog-aura/Cargo.toml b/rog-aura/Cargo.toml index d885877b..43b32d33 100644 --- a/rog-aura/Cargo.toml +++ b/rog-aura/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rog_aura" -version = "1.2.0" +version = "1.2.1" license = "MPL-2.0" readme = "README.md" authors = ["Luke "] diff --git a/rog-aura/src/builtin_modes.rs b/rog-aura/src/builtin_modes.rs index a7760cac..56517238 100644 --- a/rog-aura/src/builtin_modes.rs +++ b/rog-aura/src/builtin_modes.rs @@ -346,6 +346,53 @@ impl Default for AuraEffect { } } +pub struct AuraParameters { + pub zone: bool, + pub colour1: bool, + pub colour2: bool, + pub speed: bool, + pub direction: bool, +} + +impl AuraParameters { + pub const fn new( + zone: bool, + colour1: bool, + colour2: bool, + speed: bool, + direction: bool, + ) -> Self { + Self { + zone, + colour1, + colour2, + speed, + direction, + } + } +} + +impl AuraEffect { + /// A helper to provide detail on what effects have which parameters, e.g the static + /// factory mode accepts only one colour. + pub const fn allowed_parameters(mode: AuraModeNum) -> AuraParameters { + match mode { + AuraModeNum::Static => AuraParameters::new(true, true, false, false, false), + AuraModeNum::Breathe => AuraParameters::new(true, true, true, true, false), + AuraModeNum::Strobe => AuraParameters::new(true, false, false, true, false), + AuraModeNum::Rainbow => AuraParameters::new(true, false, false, true, true), + AuraModeNum::Star => AuraParameters::new(true, true, true, true, true), + AuraModeNum::Rain => AuraParameters::new(true, false, false, true, false), + AuraModeNum::Highlight => AuraParameters::new(true, true, false, false, false), + AuraModeNum::Laser => AuraParameters::new(true, true, false, true, false), + AuraModeNum::Ripple => AuraParameters::new(true, true, false, true, false), + AuraModeNum::Pulse => AuraParameters::new(true, true, false, false, false), + AuraModeNum::Comet => AuraParameters::new(true, true, false, false, false), + AuraModeNum::Flash => AuraParameters::new(true, true, false, false, false), + } + } +} + /// Parses `AuraEffect` in to packet data for writing to the USB interface /// /// Byte structure where colour is RGB, one byte per R, G, B: diff --git a/rog-control-center/src/pages/aura_page.rs b/rog-control-center/src/pages/aura_page.rs index aab1ff93..3aebce84 100644 --- a/rog-control-center/src/pages/aura_page.rs +++ b/rog-control-center/src/pages/aura_page.rs @@ -1,11 +1,4 @@ -use egui::{RichText, Ui}; -use rog_aura::{AuraModeNum, AuraZone, Colour, Speed}; -use rog_supported::SupportedFunctions; - -use crate::{ - page_states::{AuraState, PageDataStates}, - RogApp, RogDbusClientBlocking, -}; +use crate::{widgets::aura_modes_group, RogApp}; impl<'a> RogApp<'a> { pub fn aura_page(&mut self, ctx: &egui::Context) { @@ -17,174 +10,7 @@ impl<'a> RogApp<'a> { } = self; egui::CentralPanel::default().show(ctx, |ui| { - Self::aura_modes(supported, states, dbus, ui); + aura_modes_group(supported, states, dbus, ui); }); } - - fn aura_modes( - supported: &SupportedFunctions, - states: &mut PageDataStates, - dbus: &mut RogDbusClientBlocking, - ui: &mut Ui, - ) { - let mut changed = false; - let mut selected = states.aura.current_mode; - - let has_keyzones = supported - .keyboard_led - .multizone_led_mode - .contains(&AuraZone::Key2); - let has_logo = supported - .keyboard_led - .multizone_led_mode - .contains(&AuraZone::Logo); - let has_lightbar = supported - .keyboard_led - .multizone_led_mode - .contains(&AuraZone::BarLeft) - || supported - .keyboard_led - .multizone_led_mode - .contains(&AuraZone::BarRight); - - ui.heading("Aura modes"); - let mut item = |a: AuraModeNum, ui: &mut Ui| { - if ui - .selectable_value(&mut selected, a, format!("{:?}", a)) - .clicked() - { - changed = true; - } - }; - - ui.horizontal_wrapped(|ui| { - for a in states.aura.modes.keys() { - item(*a, ui); - } - }); - - // TODO: Need some sort of mapping to enable options only if - // they actually work. - if let Some(effect) = states.aura.modes.get_mut(&selected) { - let mut zone_button = |a: AuraZone, ui: &mut Ui| { - ui.selectable_value(&mut effect.zone, a, format!("{:?}", a)); - }; - let mut speed_button = |a: Speed, ui: &mut Ui| { - ui.selectable_value(&mut effect.speed, a, format!("{:?}", a)); - }; - let mut dir_button = |a: rog_aura::Direction, ui: &mut Ui| { - ui.selectable_value(&mut effect.direction, a, format!("{:?}", a)); - }; - - let mut c1: [f32; 3] = effect.colour1.into(); - let mut c2: [f32; 3] = effect.colour2.into(); - - ui.separator(); - ui.horizontal_wrapped(|ui| { - ui.vertical(|ui| { - let h = 16.0; - ui.set_row_height(22.0); - if has_keyzones || has_lightbar || has_logo { - ui.horizontal_wrapped(|ui| { - ui.label(RichText::new("Zone").size(h)); - }); - } - ui.horizontal_wrapped(|ui| { - ui.label(RichText::new("Colour 1").size(h)); - }); - ui.horizontal_wrapped(|ui| { - ui.label(RichText::new("Colour 2").size(h)); - }); - ui.horizontal_wrapped(|ui| { - ui.label(RichText::new("Speed").size(h)); - }); - ui.horizontal_wrapped(|ui| { - ui.label(RichText::new("Direction").size(h)); - }); - }); - ui.vertical(|ui| { - ui.set_row_height(22.0); - if has_keyzones || has_lightbar || has_logo { - ui.horizontal_wrapped(|ui| { - zone_button(AuraZone::None, ui); - if has_keyzones { - zone_button(AuraZone::Key1, ui); - zone_button(AuraZone::Key2, ui); - zone_button(AuraZone::Key3, ui); - zone_button(AuraZone::Key4, ui); - } - if has_logo { - zone_button(AuraZone::Logo, ui); - } - if has_lightbar { - zone_button(AuraZone::BarLeft, ui); - zone_button(AuraZone::BarRight, ui); - } - }); - } - - egui::color_picker::color_edit_button_rgb(ui, &mut c1); - egui::color_picker::color_edit_button_rgb(ui, &mut c2); - - ui.horizontal_wrapped(|ui| { - speed_button(Speed::Low, ui); - speed_button(Speed::Med, ui); - speed_button(Speed::High, ui); - }); - - ui.horizontal_wrapped(|ui| { - dir_button(rog_aura::Direction::Left, ui); - dir_button(rog_aura::Direction::Down, ui); - dir_button(rog_aura::Direction::Right, ui); - dir_button(rog_aura::Direction::Up, ui); - }); - }); - }); - - effect.colour1 = Colour::from(&c1); - effect.colour2 = Colour::from(&c2); - } - - ui.separator(); - ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| { - if ui.add(egui::Button::new("Cancel")).clicked() { - let notif = states.aura.was_notified.clone(); - match AuraState::new(notif, supported, dbus) { - Ok(a) => states.aura.modes = a.modes, - Err(e) => states.error = Some(e.to_string()), - } - } - - if ui.add(egui::Button::new("Apply")).clicked() { - changed = true; - } - }); - - // egui::TopBottomPanel::bottom("error_bar") - // .default_height(26.0) - // .show(ctx, |ui| { - // ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| { - // if ui.add(egui::Button::new("Cancel")).clicked() { - // let notif = states.aura.was_notified.clone(); - // states.aura.modes = AuraState::new(notif, supported, dbus).modes; - // } - - // if ui.add(egui::Button::new("Apply")).clicked() { - // changed = true; - // } - // }); - // }); - - if changed { - states.aura.current_mode = selected; - - dbus.proxies() - .led() - .set_led_mode(states.aura.modes.get(&selected).unwrap()) - .map_err(|err| { - states.error = Some(err.to_string()); - }) - .ok(); - } - } } diff --git a/rog-control-center/src/widgets/aura_modes.rs b/rog-control-center/src/widgets/aura_modes.rs new file mode 100644 index 00000000..46d6398d --- /dev/null +++ b/rog-control-center/src/widgets/aura_modes.rs @@ -0,0 +1,187 @@ +use egui::{RichText, Ui}; +use rog_aura::{AuraEffect, AuraModeNum, AuraZone, Colour, Speed}; +use rog_supported::SupportedFunctions; + +use crate::{ + page_states::{AuraState, PageDataStates}, + RogDbusClientBlocking, +}; + +pub fn aura_modes_group( + supported: &SupportedFunctions, + states: &mut PageDataStates, + dbus: &mut RogDbusClientBlocking, + ui: &mut Ui, +) { + let mut changed = false; + let mut selected = states.aura.current_mode; + let allowed = AuraEffect::allowed_parameters(selected); + + let has_keyzones = supported + .keyboard_led + .multizone_led_mode + .contains(&AuraZone::Key2); + let has_logo = supported + .keyboard_led + .multizone_led_mode + .contains(&AuraZone::Logo); + let has_lightbar = supported + .keyboard_led + .multizone_led_mode + .contains(&AuraZone::BarLeft) + || supported + .keyboard_led + .multizone_led_mode + .contains(&AuraZone::BarRight); + + ui.heading("Aura modes"); + let mut item = |a: AuraModeNum, ui: &mut Ui| { + if ui + .selectable_value(&mut selected, a, format!("{:?}", a)) + .clicked() + { + changed = true; + } + }; + + ui.horizontal_wrapped(|ui| { + for a in states.aura.modes.keys() { + item(*a, ui); + } + }); + + if let Some(effect) = states.aura.modes.get_mut(&selected) { + let mut zone_button = |a: AuraZone, ui: &mut Ui| { + ui.selectable_value(&mut effect.zone, a, format!("{:?}", a)); + }; + let mut speed_button = |a: Speed, ui: &mut Ui| { + ui.selectable_value(&mut effect.speed, a, format!("{:?}", a)); + }; + let mut dir_button = |a: rog_aura::Direction, ui: &mut Ui| { + ui.selectable_value(&mut effect.direction, a, format!("{:?}", a)); + }; + + let mut c1: [f32; 3] = effect.colour1.into(); + let mut c2: [f32; 3] = effect.colour2.into(); + + ui.separator(); + ui.horizontal_wrapped(|ui| { + ui.vertical(|ui| { + let h = 16.0; + ui.set_row_height(22.0); + if has_keyzones || has_lightbar || has_logo { + ui.horizontal_wrapped(|ui| { + ui.set_enabled(allowed.zone); + ui.label(RichText::new("Zone").size(h)); + }); + } + ui.horizontal_wrapped(|ui| { + ui.set_enabled(allowed.colour1); + ui.label(RichText::new("Colour 1").size(h)); + }); + + ui.horizontal_wrapped(|ui| { + ui.set_enabled(allowed.colour2); + ui.label(RichText::new("Colour 2").size(h)); + }); + + ui.horizontal_wrapped(|ui| { + ui.set_enabled(allowed.speed); + ui.label(RichText::new("Speed").size(h)); + }); + ui.horizontal_wrapped(|ui| { + ui.set_enabled(allowed.direction); + ui.label(RichText::new("Direction").size(h)); + }); + ui.set_enabled(true); + }); + ui.vertical(|ui| { + ui.set_row_height(22.0); + if has_keyzones || has_lightbar || has_logo { + ui.horizontal_wrapped(|ui| { + ui.set_enabled(allowed.zone); + zone_button(AuraZone::None, ui); + if has_keyzones { + zone_button(AuraZone::Key1, ui); + zone_button(AuraZone::Key2, ui); + zone_button(AuraZone::Key3, ui); + zone_button(AuraZone::Key4, ui); + } + if has_logo { + zone_button(AuraZone::Logo, ui); + } + if has_lightbar { + zone_button(AuraZone::BarLeft, ui); + zone_button(AuraZone::BarRight, ui); + } + }); + } + + ui.set_enabled(allowed.colour1); + egui::color_picker::color_edit_button_rgb(ui, &mut c1); + ui.set_enabled(allowed.colour2); + egui::color_picker::color_edit_button_rgb(ui, &mut c2); + + ui.set_enabled(allowed.speed); + ui.horizontal_wrapped(|ui| { + speed_button(Speed::Low, ui); + speed_button(Speed::Med, ui); + speed_button(Speed::High, ui); + }); + + ui.set_enabled(allowed.direction); + ui.horizontal_wrapped(|ui| { + dir_button(rog_aura::Direction::Left, ui); + dir_button(rog_aura::Direction::Down, ui); + dir_button(rog_aura::Direction::Right, ui); + dir_button(rog_aura::Direction::Up, ui); + }); + }); + }); + + effect.colour1 = Colour::from(&c1); + effect.colour2 = Colour::from(&c2); + } + + ui.separator(); + ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| { + if ui.add(egui::Button::new("Cancel")).clicked() { + let notif = states.aura.was_notified.clone(); + match AuraState::new(notif, supported, dbus) { + Ok(a) => states.aura.modes = a.modes, + Err(e) => states.error = Some(e.to_string()), + } + } + + if ui.add(egui::Button::new("Apply")).clicked() { + changed = true; + } + }); + + // egui::TopBottomPanel::bottom("error_bar") + // .default_height(26.0) + // .show(ctx, |ui| { + // ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| { + // if ui.add(egui::Button::new("Cancel")).clicked() { + // let notif = states.aura.was_notified.clone(); + // states.aura.modes = AuraState::new(notif, supported, dbus).modes; + // } + + // if ui.add(egui::Button::new("Apply")).clicked() { + // changed = true; + // } + // }); + // }); + + if changed { + states.aura.current_mode = selected; + + dbus.proxies() + .led() + .set_led_mode(states.aura.modes.get(&selected).unwrap()) + .map_err(|err| { + states.error = Some(err.to_string()); + }) + .ok(); + } +} diff --git a/rog-control-center/src/widgets/mod.rs b/rog-control-center/src/widgets/mod.rs index 1132c541..7c82babc 100644 --- a/rog-control-center/src/widgets/mod.rs +++ b/rog-control-center/src/widgets/mod.rs @@ -1,4 +1,5 @@ mod anime_power; +mod aura_modes; mod aura_power; mod fan_graph; mod rog_bios; @@ -6,6 +7,7 @@ mod side_panel; mod top_bar; pub use anime_power::*; +pub use aura_modes::*; pub use aura_power::*; pub use fan_graph::*; pub use rog_bios::*;