From beae8e82f5136d3652d6cc5bb97c6e844a42ccb1 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Wed, 22 Jul 2026 14:56:13 +0900 Subject: [PATCH] save/reset playspace center --- dash-frontend/assets/lang/de.json | 6 +++- dash-frontend/assets/lang/en.json | 4 +++ dash-frontend/assets/lang/es.json | 6 +++- dash-frontend/assets/lang/it.json | 6 +++- dash-frontend/assets/lang/ja.json | 6 +++- dash-frontend/assets/lang/pl.json | 6 +++- dash-frontend/assets/lang/zh_CN.json | 6 +++- dash-frontend/src/tab/settings/macros.rs | 30 +++++++++++++++++++ dash-frontend/src/tab/settings/mod.rs | 12 ++++++++ .../src/tab/settings/tab_space_drag.rs | 27 ++++++++++++++++- .../src/tab/settings/tab_troubleshooting.rs | 7 ----- wayvr/src/backend/openvr/playspace.rs | 3 ++ wayvr/src/backend/openxr/playspace.rs | 3 ++ wayvr/src/backend/task.rs | 2 +- wayvr/src/overlays/dashboard.rs | 2 +- wlx-common/src/dash_interface.rs | 1 + 16 files changed, 111 insertions(+), 16 deletions(-) diff --git a/dash-frontend/assets/lang/de.json b/dash-frontend/assets/lang/de.json index 4a18a994..7563aaf7 100644 --- a/dash-frontend/assets/lang/de.json +++ b/dash-frontend/assets/lang/de.json @@ -194,7 +194,11 @@ "COLOR_PALETTE_CUSTOM_URL": "Füge dein eigenes benutzerdefiniertes Thema hinzu!", "COLOR_PALETTE_CUSTOM_URL2": "Klicken Sie hier, um das Web-Handbuch zu öffnen.", "SNAP_ANGLE_DEG": "Snap-Winkel für Fensterneigung und Rollwinkel", - "SNAP_ANGLE_DEG_HELP": "Gegriffene Fenster rasten in diesem Winkel auf der Nick- und Rollachse ein." + "SNAP_ANGLE_DEG_HELP": "Gegriffene Fenster rasten in diesem Winkel auf der Nick- und Rollachse ein.", + "SAVE_PLAYSPACE_CENTER": "Playspace-Zentrum speichern", + "SAVE_PLAYSPACE_CENTER_HELP": "Nutzen Sie den aktuellen Playspace für die Zuweisung zum Zurücksetzen des Playspaces.", + "RESET_PLAYSPACE_CENTER": "Playspace-Zentrum zurücksetzen", + "RESET_PLAYSPACE_CENTER_HELP": "Zuvor festgelegtes Playspace-Zentrum zurücksetzen." }, "HELLO": "Hallo!", "AUDIO": { diff --git a/dash-frontend/assets/lang/en.json b/dash-frontend/assets/lang/en.json index 7bbf534a..3382cb31 100644 --- a/dash-frontend/assets/lang/en.json +++ b/dash-frontend/assets/lang/en.json @@ -167,6 +167,10 @@ "REQUIRES_RESTART": "Requires restart", "RESET_PLAYSPACE": "Reset playspace", "RESET_PLAYSPACE_HELP": "Clear the stage space offset.", + "SAVE_PLAYSPACE_CENTER": "Save playspace center", + "SAVE_PLAYSPACE_CENTER_HELP": "Use current playspace for reset playspace binding.", + "RESET_PLAYSPACE_CENTER": "Reset playspace center", + "RESET_PLAYSPACE_CENTER_HELP": "Clear previously set playspace center.", "RESTART_SOFTWARE": "Restart software", "RESTART_SOFTWARE_HELP": "Apply settings that require a restart", "ROUND_MULTIPLIER": "UI Edge roundness", diff --git a/dash-frontend/assets/lang/es.json b/dash-frontend/assets/lang/es.json index c49727e8..feec03d5 100644 --- a/dash-frontend/assets/lang/es.json +++ b/dash-frontend/assets/lang/es.json @@ -194,7 +194,11 @@ "COLOR_PALETTE_CUSTOM_URL": "¡Añade tu propio tema personalizado!", "COLOR_PALETTE_CUSTOM_URL2": "Haz clic para abrir el manual web.", "SNAP_ANGLE_DEG": "Ángulo de ajuste de cabeceo y alabeo de la ventana", - "SNAP_ANGLE_DEG_HELP": "Las ventanas agarradas se ajustan a este ángulo en los ejes de cabeceo y balanceo." + "SNAP_ANGLE_DEG_HELP": "Las ventanas agarradas se ajustan a este ángulo en los ejes de cabeceo y balanceo.", + "SAVE_PLAYSPACE_CENTER": "Guardar centro del playspace", + "SAVE_PLAYSPACE_CENTER_HELP": "Usa el playspace actual para el comando de restablecer playspace.", + "RESET_PLAYSPACE_CENTER": "Reiniciar centro del playspace", + "RESET_PLAYSPACE_CENTER_HELP": "Borra el centro del playspace establecido previamente." }, "HELLO": "¡Hola!", "AUDIO": { diff --git a/dash-frontend/assets/lang/it.json b/dash-frontend/assets/lang/it.json index 75c9103e..313cf42d 100644 --- a/dash-frontend/assets/lang/it.json +++ b/dash-frontend/assets/lang/it.json @@ -215,7 +215,11 @@ "COLOR_PALETTE_CUSTOM_URL": "Aggiungi il tuo tema personalizzato!", "COLOR_PALETTE_CUSTOM_URL2": "Clicca per aprire il manuale web.", "SNAP_ANGLE_DEG": "Angolo di scatto beccheggio e rollio finestra", - "SNAP_ANGLE_DEG_HELP": "Le finestre afferrate si allineano a questo angolo sugli assi di beccheggio e rollio." + "SNAP_ANGLE_DEG_HELP": "Le finestre afferrate si allineano a questo angolo sugli assi di beccheggio e rollio.", + "SAVE_PLAYSPACE_CENTER": "Salva centro playspace", + "SAVE_PLAYSPACE_CENTER_HELP": "Usa il playspace corrente per il comando di reset del playspace.", + "RESET_PLAYSPACE_CENTER": "Ripristina centro playspace", + "RESET_PLAYSPACE_CENTER_HELP": "Ripristina il centro del playspace impostato precedentemente." }, "APPLICATION_LAUNCHER": "Lanciatore applicazioni", "APPLICATION_STARTED": "Applicazione avviata", diff --git a/dash-frontend/assets/lang/ja.json b/dash-frontend/assets/lang/ja.json index c9cc7c06..466d466d 100644 --- a/dash-frontend/assets/lang/ja.json +++ b/dash-frontend/assets/lang/ja.json @@ -194,7 +194,11 @@ "COLOR_PALETTE_CUSTOM_URL": "カスタムテーマを追加しましょう!", "COLOR_PALETTE_CUSTOM_URL2": "クリックしてウェブマニュアルを開く。", "SNAP_ANGLE_DEG": "ウィンドウのピッチ・ロールのスナップ角度", - "SNAP_ANGLE_DEG_HELP": "掴んでいるウィンドウが、ピッチ軸とロール軸でこの角度にスナップします。" + "SNAP_ANGLE_DEG_HELP": "掴んでいるウィンドウが、ピッチ軸とロール軸でこの角度にスナップします。", + "SAVE_PLAYSPACE_CENTER": "プレイスペースの中心を保存", + "SAVE_PLAYSPACE_CENTER_HELP": "現在のプレイスペースを、プレイスペースのリセットバインディングに使用します。", + "RESET_PLAYSPACE_CENTER": "playspaceの中心をリセット", + "RESET_PLAYSPACE_CENTER_HELP": "previously set playspace center をリセットします。" }, "HELLO": "こんにちは!", "AUDIO": { diff --git a/dash-frontend/assets/lang/pl.json b/dash-frontend/assets/lang/pl.json index 1a543be0..d445c469 100644 --- a/dash-frontend/assets/lang/pl.json +++ b/dash-frontend/assets/lang/pl.json @@ -189,7 +189,11 @@ "COLOR_PALETTE_CUSTOM_URL": "Dodaj własny motyw!", "COLOR_PALETTE_CUSTOM_URL2": "Kliknij, aby otworzyć instrukcję internetową.", "SNAP_ANGLE_DEG": "Kąt przyciągania pochylenia i przechyłu okna", - "SNAP_ANGLE_DEG_HELP": "Chwycone okna przyciągają się do tego kąta na osi pochylenia i obrotu." + "SNAP_ANGLE_DEG_HELP": "Chwycone okna przyciągają się do tego kąta na osi pochylenia i obrotu.", + "SAVE_PLAYSPACE_CENTER": "Zapisz centrum obszaru gry", + "SAVE_PLAYSPACE_CENTER_HELP": "Użyj aktualnego obszaru gry dla przypisania resetowania obszaru gry.", + "RESET_PLAYSPACE_CENTER": "Zresetuj środek obszaru gry", + "RESET_PLAYSPACE_CENTER_HELP": "Wyczyść poprzednio ustawiony środek obszaru playspace." }, "APPLICATION_LAUNCHER": "Uruchamiacz aplikacji", "APPLICATIONS": "Aplikacje", diff --git a/dash-frontend/assets/lang/zh_CN.json b/dash-frontend/assets/lang/zh_CN.json index f39ae596..f261e06d 100644 --- a/dash-frontend/assets/lang/zh_CN.json +++ b/dash-frontend/assets/lang/zh_CN.json @@ -215,7 +215,11 @@ "COLOR_PALETTE_CUSTOM_URL": "添加自定义主题!", "COLOR_PALETTE_CUSTOM_URL2": "点击打开网页版手册。", "SNAP_ANGLE_DEG": "窗口俯仰与翻滚捕捉角度", - "SNAP_ANGLE_DEG_HELP": "抓取的窗口在俯仰轴和翻滚轴上将对齐到此角度。" + "SNAP_ANGLE_DEG_HELP": "抓取的窗口在俯仰轴和翻滚轴上将对齐到此角度。", + "SAVE_PLAYSPACE_CENTER": "保存 Playspace 中心", + "SAVE_PLAYSPACE_CENTER_HELP": "将当前活动空间用于重置活动空间的绑定。", + "RESET_PLAYSPACE_CENTER": "重置游玩区域中心", + "RESET_PLAYSPACE_CENTER_HELP": "清除之前设置的 Playspace 中心。" }, "APPLICATION_LAUNCHER": "应用启动器", "APPLICATION_STARTED": "应用已启动", diff --git a/dash-frontend/src/tab/settings/macros.rs b/dash-frontend/src/tab/settings/macros.rs index f716773a..9593f806 100644 --- a/dash-frontend/src/tab/settings/macros.rs +++ b/dash-frontend/src/tab/settings/macros.rs @@ -336,6 +336,36 @@ pub fn options_danger_button( Ok(()) } +pub fn options_button( + mp: &mut MacroParams, + parent: WidgetID, + translation: &str, + icon: &str, + task: Task, +) -> anyhow::Result<()> { + let id = mp.idx.to_string(); + mp.idx += 1; + + let mut params = TemplateParams::new(); + params.insert("id", &id); + params.insert("translation", translation); + params.insert("icon", icon); + + mp.parser_state + .instantiate_template(mp.doc_params, "ButtonText", mp.layout, parent, params)?; + + let btn = mp.parser_state.fetch_component_as::(&id)?; + btn.on_click(Rc::new({ + let tasks = mp.tasks.clone(); + move |_common, _e| { + tasks.push(task.clone()); + Ok(()) + } + })); + + Ok(()) +} + pub fn options_autostart_app( mp: &mut MacroParams, parent: WidgetID, diff --git a/dash-frontend/src/tab/settings/mod.rs b/dash-frontend/src/tab/settings/mod.rs index 6de9544d..a9e78c5b 100644 --- a/dash-frontend/src/tab/settings/mod.rs +++ b/dash-frontend/src/tab/settings/mod.rs @@ -78,7 +78,9 @@ pub(crate) enum Task { OpenContextMenu(Vec2, Vec), RemoveAutostartApp(Rc), ResetPlayspace, + ResetPlayspaceCenter, RestartSoftware, + SavePlayspaceCenter, SetTab(TabNameEnum), SettingUpdated(SettingType), UpdateBool(SettingType, bool), @@ -200,6 +202,16 @@ impl Tab for TabSettings { std::fs::remove_dir_all(&path)?; std::fs::create_dir(&path)?; } + Task::SavePlayspaceCenter => { + frontend.interface.playspace_task(data, DashPlayspaceTask::SaveCenter)?; + return Ok(()); + } + Task::ResetPlayspaceCenter => { + frontend + .interface + .playspace_task(data, DashPlayspaceTask::ResetCenter)?; + return Ok(()); + } Task::ResetPlayspace => { frontend.interface.playspace_task(data, DashPlayspaceTask::Reset)?; return Ok(()); diff --git a/dash-frontend/src/tab/settings/tab_space_drag.rs b/dash-frontend/src/tab/settings/tab_space_drag.rs index aa6bf8d0..7a95f659 100644 --- a/dash-frontend/src/tab/settings/tab_space_drag.rs +++ b/dash-frontend/src/tab/settings/tab_space_drag.rs @@ -8,7 +8,7 @@ use wgui::{ use crate::{ tab::settings::{ SettingType, SettingsMountParams, SettingsTab, - macros::{options_category, options_checkbox, options_slider_f32}, + macros::{options_button, options_category, options_checkbox, options_slider_f32}, }, util::wgui_simple, }; @@ -56,6 +56,31 @@ impl State { if !par.feats.openxr || par.feats.monado { // monado or openvr + + options_button( + par.mp, + c, + "APP_SETTINGS.RESET_PLAYSPACE", + "dashboard/refresh.svg", + super::Task::ResetPlayspace, + )?; + + options_button( + par.mp, + c, + "APP_SETTINGS.SAVE_PLAYSPACE_CENTER", + "dashboard/recenter.svg", + super::Task::SavePlayspaceCenter, + )?; + + options_button( + par.mp, + c, + "APP_SETTINGS.RESET_PLAYSPACE_CENTER", + "dashboard/trash.svg", + super::Task::ResetPlayspaceCenter, + )?; + options_checkbox(par.mp, id_common_options_parent, SettingType::SpaceDragUnlocked)?; options_slider_f32( diff --git a/dash-frontend/src/tab/settings/tab_troubleshooting.rs b/dash-frontend/src/tab/settings/tab_troubleshooting.rs index 8635efe5..4327c267 100644 --- a/dash-frontend/src/tab/settings/tab_troubleshooting.rs +++ b/dash-frontend/src/tab/settings/tab_troubleshooting.rs @@ -15,13 +15,6 @@ impl State { "APP_SETTINGS.TROUBLESHOOTING", "dashboard/cpu.svg", )?; - options_danger_button( - par.mp, - c, - "APP_SETTINGS.RESET_PLAYSPACE", - "dashboard/recenter.svg", - Task::ResetPlayspace, - )?; options_danger_button( par.mp, c, diff --git a/wayvr/src/backend/openvr/playspace.rs b/wayvr/src/backend/openvr/playspace.rs index a4f9a422..2746ff97 100644 --- a/wayvr/src/backend/openvr/playspace.rs +++ b/wayvr/src/backend/openvr/playspace.rs @@ -58,6 +58,9 @@ impl PlayspaceMover { PlayspaceTask::SaveCenter => { self.save_center(chaperone_mgr); } + PlayspaceTask::ResetCenter => { + self.playspace_state.openvr_space_center = Affine3A::IDENTITY; + } } } diff --git a/wayvr/src/backend/openxr/playspace.rs b/wayvr/src/backend/openxr/playspace.rs index 06c7a5bd..641726a9 100644 --- a/wayvr/src/backend/openxr/playspace.rs +++ b/wayvr/src/backend/openxr/playspace.rs @@ -65,6 +65,9 @@ impl PlayspaceMover { PlayspaceTask::SaveCenter => { self.save_center(&mut monado.ipc); } + PlayspaceTask::ResetCenter => { + self.playspace_state.openxr_space_center = Affine3A::IDENTITY; + } } } diff --git a/wayvr/src/backend/task.rs b/wayvr/src/backend/task.rs index d86dca22..c3a31be5 100644 --- a/wayvr/src/backend/task.rs +++ b/wayvr/src/backend/task.rs @@ -63,8 +63,8 @@ pub enum PlayspaceTask { Recenter, Reset, FixFloor, - #[cfg(feature = "openvr")] SaveCenter, + ResetCenter, } #[derive(Debug, Clone)] diff --git a/wayvr/src/overlays/dashboard.rs b/wayvr/src/overlays/dashboard.rs index a1084294..92df245d 100644 --- a/wayvr/src/overlays/dashboard.rs +++ b/wayvr/src/overlays/dashboard.rs @@ -513,8 +513,8 @@ impl DashInterface for DashInterfaceLive { DashPlayspaceTask::FixFloor => PlayspaceTask::FixFloor, DashPlayspaceTask::Recenter => PlayspaceTask::Recenter, DashPlayspaceTask::Reset => PlayspaceTask::Reset, - #[cfg(feature = "openvr")] DashPlayspaceTask::SaveCenter => PlayspaceTask::SaveCenter, + DashPlayspaceTask::ResetCenter => PlayspaceTask::ResetCenter, }; app.tasks.enqueue(TaskType::Playspace(task)); Ok(()) diff --git a/wlx-common/src/dash_interface.rs b/wlx-common/src/dash_interface.rs index f960fc06..bf2ab4fe 100644 --- a/wlx-common/src/dash_interface.rs +++ b/wlx-common/src/dash_interface.rs @@ -42,6 +42,7 @@ pub enum DashPlayspaceTask { Recenter, Reset, SaveCenter, + ResetCenter, } #[derive(Clone, Copy)]