From bb43da3b0827465ac1a8b11cd1d111682a706826 Mon Sep 17 00:00:00 2001 From: Aleksander Date: Thu, 2 Jul 2026 19:47:24 +0200 Subject: [PATCH] dash-frontend: clickable links --- dash-frontend/assets/gui/tab/donate.xml | 2 +- .../assets/gui/tab/welcome_page_5.xml | 8 +++---- dash-frontend/src/frontend.rs | 12 ++++++++++ dash-frontend/src/tab/donate.rs | 22 +++++++++++-------- dash-frontend/src/tab/welcome.rs | 6 +++++ dash-frontend/src/util/openxr_bindings.rs | 2 +- dash-frontend/src/views/bindings.rs | 12 +++++----- 7 files changed, 43 insertions(+), 21 deletions(-) diff --git a/dash-frontend/assets/gui/tab/donate.xml b/dash-frontend/assets/gui/tab/donate.xml index ffa9ebe6..5b7d8610 100644 --- a/dash-frontend/assets/gui/tab/donate.xml +++ b/dash-frontend/assets/gui/tab/donate.xml @@ -5,7 +5,7 @@
-
+
diff --git a/dash-frontend/src/frontend.rs b/dash-frontend/src/frontend.rs index fc10d9ed..3ad7f540 100644 --- a/dash-frontend/src/frontend.rs +++ b/dash-frontend/src/frontend.rs @@ -114,6 +114,7 @@ pub enum FrontendTask { RecenterPlayspace, PushToast(Translation), PlaySound(SoundType), + OpenURL(Rc), HideDashboard, } @@ -367,6 +368,7 @@ impl Frontend { FrontendTask::PushToast(content) => self.toast_manager.push(content), FrontendTask::PlaySound(sound_type) => self.queue_play_sound(sound_type), FrontendTask::HideDashboard => self.action_hide_dashboard(params.data), + FrontendTask::OpenURL(url) => self.action_open_url(url), }; Ok(()) } @@ -542,4 +544,14 @@ impl Frontend { fn action_hide_dashboard(&mut self, data: &mut T) { self.interface.toggle_dashboard(data); } + + fn action_open_url(&mut self, url: Rc) { + let _ = std::process::Command::new("xdg-open").arg(url.as_ref()).spawn(); + self + .tasks + .push(FrontendTask::PushToast(Translation::from_raw_text_string(format!( + "Opened URL: {}", + url + )))); + } } diff --git a/dash-frontend/src/tab/donate.rs b/dash-frontend/src/tab/donate.rs index 7fb4c843..4ab8c0b2 100644 --- a/dash-frontend/src/tab/donate.rs +++ b/dash-frontend/src/tab/donate.rs @@ -4,13 +4,13 @@ use wgui::{ assets::AssetPath, components::button::ComponentButton, globals::WguiGlobals, - layout::{Layout, WidgetID}, - parser::{Fetchable, ParseDocumentParams, ParserState, TemplateParams}, + layout::WidgetID, + parser::{Fetchable, ParseDocumentParams, ParserState}, task::Tasks, }; use crate::{ - frontend::{Frontend, FrontendTask, FrontendTasks}, + frontend::{Frontend, FrontendTask}, tab::{Tab, TabType}, }; @@ -22,8 +22,8 @@ pub struct TabDonate { #[allow(dead_code)] pub state: ParserState, marker: PhantomData, + #[allow(dead_code)] tasks: Tasks, - frontend_tasks: FrontendTasks, } impl Tab for TabDonate { @@ -31,10 +31,10 @@ impl Tab for TabDonate { TabType::Donate } - fn update(&mut self, frontend: &mut Frontend, _time_ms: u32, _user_data: &mut T) -> anyhow::Result<()> { - for task in self.tasks.drain() { - match task {} - } + fn update(&mut self, _frontend: &mut Frontend, _time_ms: u32, _user_data: &mut T) -> anyhow::Result<()> { + // for task in self.tasks.drain() { + // match task {} + // } Ok(()) } @@ -52,13 +52,17 @@ impl TabDonate { pub fn new(frontend: &mut Frontend, parent_id: WidgetID, _data: &mut T) -> anyhow::Result { let state = wgui::parser::parse_from_assets(&doc_params(&frontend.globals), &mut frontend.layout, parent_id)?; + frontend.tasks.handle_button( + &state.fetch_component_as::("btn_donate")?, + FrontendTask::OpenURL(Rc::from("https://opencollective.com/wayvr-org")), + ); + let tasks = Tasks::::new(); Ok(Self { state, marker: PhantomData, tasks, - frontend_tasks: frontend.tasks.clone(), }) } } diff --git a/dash-frontend/src/tab/welcome.rs b/dash-frontend/src/tab/welcome.rs index b7b2eacf..91ecae91 100644 --- a/dash-frontend/src/tab/welcome.rs +++ b/dash-frontend/src/tab/welcome.rs @@ -145,6 +145,12 @@ impl TabWelcome { }); } + if let Ok(btn) = state.fetch_component_as::("btn_wayvr_org") { + self + .frontend_tasks + .handle_button(&btn, FrontendTask::OpenURL(Rc::from("https://wayvr.org"))); + } + self.state_tab = Some(state); Ok(()) diff --git a/dash-frontend/src/util/openxr_bindings.rs b/dash-frontend/src/util/openxr_bindings.rs index 3cdbea1f..bb4e420e 100644 --- a/dash-frontend/src/util/openxr_bindings.rs +++ b/dash-frontend/src/util/openxr_bindings.rs @@ -91,7 +91,7 @@ pub struct ParsedOpenXrInputPath { pub component: XrInputComponent, } -impl<'a> TryFrom<&'a str> for ParsedOpenXrInputPath { +impl TryFrom<&str> for ParsedOpenXrInputPath { type Error = anyhow::Error; fn try_from(path: &str) -> anyhow::Result { diff --git a/dash-frontend/src/views/bindings.rs b/dash-frontend/src/views/bindings.rs index e7ee768a..033a4c1a 100644 --- a/dash-frontend/src/views/bindings.rs +++ b/dash-frontend/src/views/bindings.rs @@ -91,7 +91,7 @@ impl ViewTrait for View { } Task::UpdateThreshold(action_name, side, i, val) => { let cur_profile = &mut self.profiles[self.cur_profile_idx]; - let action_mut = get_action_mut(cur_profile, &*action_name); + let action_mut = get_action_mut(cur_profile, &action_name); let threshold = if matches!(side, XrInputSide::Right) { action_mut.threshold_right.get_or_insert(DEFAULT_BUTTON_THRESHOLDS) @@ -124,10 +124,10 @@ impl ViewTrait for View { *side_mut = None; } "subpath" => { - apply_subpath(side_mut, &side, &value, self.controller_profile); + apply_subpath(side_mut, side, value, self.controller_profile); } "comp" => { - apply_comp(side_mut, &side, &value); + apply_comp(side_mut, side, value); } "click" => match value { "triple" => { @@ -244,7 +244,7 @@ impl View { &mut mp, self.list_parent, action.into(), - &self.controller_profile, + self.controller_profile, current, )?; } @@ -616,7 +616,7 @@ fn create_dropdown( let title = item.translation(); context_menu::Cell { - action_name: Some(item.action_str(&*action, side)), + action_name: Some(item.action_str(&action, side)), title, tooltip: None, attribs: vec![], @@ -624,7 +624,7 @@ fn create_dropdown( }) .collect::>(); - if let Some(action_str) = B::clear_str(&*action, side) { + if let Some(action_str) = B::clear_str(&action, side) { cells.insert( 0, context_menu::Cell {