diff --git a/dash-frontend/assets/gui/dashboard.xml b/dash-frontend/assets/gui/dashboard.xml index 5b1eebe7..94289ab7 100644 --- a/dash-frontend/assets/gui/dashboard.xml +++ b/dash-frontend/assets/gui/dashboard.xml @@ -14,7 +14,10 @@ height="~side_button_size" color="background_contrast(transparent)" border_color="background_contrast" - hover_border_color="on_background_contrast" + hover_color="tertiary" + hover_border_color="tertiary(rgb-mult-0.5)" + sticky_color="primary" + sticky_border_color="primary(rgb-mult-0.5)" tooltip="${tooltip}" tooltip_side="${tooltip_side}" > @@ -22,6 +25,8 @@ + +
@@ -136,10 +141,10 @@
- -
diff --git a/dash-frontend/src/frontend.rs b/dash-frontend/src/frontend.rs index 78b35e45..327b3e64 100644 --- a/dash-frontend/src/frontend.rs +++ b/dash-frontend/src/frontend.rs @@ -1,11 +1,12 @@ -use std::{path::PathBuf, rc::Rc}; +use std::{collections::HashMap, path::PathBuf, rc::Rc}; use chrono::Timelike; use glam::Vec2; +use strum::EnumCount; use wgui::{ assets::{AssetPath, AssetProvider}, components::button::ComponentButton, - event::StyleSetRequest, + event::{CallbackDataCommon, StyleSetRequest}, font_config::WguiFontConfig, globals::WguiGlobals, i18n::Translation, @@ -61,6 +62,7 @@ pub struct Frontend { state: ParserState, current_tab: Option>>, + side_buttons: Vec<(TabType, Rc)>, pub tasks: FrontendTasks, @@ -181,6 +183,7 @@ impl Frontend { layout, state, current_tab: None, + side_buttons: Vec::with_capacity(TabType::COUNT), globals, tasks, ticks: 0, @@ -439,6 +442,15 @@ impl Frontend { self.current_tab = Some(tab); + let mut common = CallbackDataCommon { + state: &self.layout.state, + alterables: &mut self.layout.alterables, + }; + + for (t, btn) in self.side_buttons.iter() { + btn.set_sticky_state(&mut common, tab_type == *t); + } + Ok(()) } @@ -454,34 +466,29 @@ impl Frontend { // ################################ // "Home" side button - self.tasks.handle_button( - &self.state.fetch_component_as::("btn_side_home")?, - FrontendTask::SetTab(TabType::Home), - ); + let btn = self.state.fetch_component_as::("btn_side_home")?; + self.tasks.handle_button(&btn, FrontendTask::SetTab(TabType::Home)); + self.side_buttons.push((TabType::Home, btn)); // "Apps" side button - self.tasks.handle_button( - &self.state.fetch_component_as::("btn_side_apps")?, - FrontendTask::SetTab(TabType::Apps), - ); + let btn = self.state.fetch_component_as::("btn_side_apps")?; + self.tasks.handle_button(&btn, FrontendTask::SetTab(TabType::Apps)); + self.side_buttons.push((TabType::Apps, btn)); // "Games" side button - self.tasks.handle_button( - &self.state.fetch_component_as::("btn_side_games")?, - FrontendTask::SetTab(TabType::Games), - ); + let btn = self.state.fetch_component_as::("btn_side_games")?; + self.tasks.handle_button(&btn, FrontendTask::SetTab(TabType::Games)); + self.side_buttons.push((TabType::Games, btn)); // "Monado side button" - self.tasks.handle_button( - &self.state.fetch_component_as::("btn_side_monado")?, - FrontendTask::SetTab(TabType::Monado), - ); + let btn = self.state.fetch_component_as::("btn_side_monado")?; + self.tasks.handle_button(&btn, FrontendTask::SetTab(TabType::Monado)); + self.side_buttons.push((TabType::Monado, btn)); // "Settings" side button - self.tasks.handle_button( - &self.state.fetch_component_as::("btn_side_settings")?, - FrontendTask::SetTab(TabType::Settings), - ); + let btn = self.state.fetch_component_as::("btn_side_settings")?; + self.tasks.handle_button(&btn, FrontendTask::SetTab(TabType::Settings)); + self.side_buttons.push((TabType::Settings, btn)); // ################################ // BOTTOM BAR BUTTONS diff --git a/dash-frontend/src/tab/mod.rs b/dash-frontend/src/tab/mod.rs index 6d8ae8c6..881084de 100644 --- a/dash-frontend/src/tab/mod.rs +++ b/dash-frontend/src/tab/mod.rs @@ -1,3 +1,5 @@ +use strum::EnumCount; + use crate::frontend::Frontend; pub mod apps; @@ -8,7 +10,7 @@ pub mod monado; pub mod settings; pub mod welcome; -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, EnumCount)] pub enum TabType { Home, Apps,