From 278420b2cedc8d87cd47595002d61978c9132cfb Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Wed, 12 Nov 2025 20:32:40 +0900 Subject: [PATCH] implement edit mode toggle --- wlx-overlay-s/src/backend/openvr/mod.rs | 14 ++++++++++ wlx-overlay-s/src/backend/openxr/mod.rs | 14 ++++++++++ wlx-overlay-s/src/backend/task.rs | 1 + wlx-overlay-s/src/gui/panel/button.rs | 5 +++- wlx-overlay-s/src/overlays/edit.rs | 5 ++-- wlx-overlay-s/src/windowing/manager.rs | 34 ++++++++++++++++++++++--- 6 files changed, 66 insertions(+), 7 deletions(-) diff --git a/wlx-overlay-s/src/backend/openvr/mod.rs b/wlx-overlay-s/src/backend/openvr/mod.rs index 55bbae9..68c1cd6 100644 --- a/wlx-overlay-s/src/backend/openvr/mod.rs +++ b/wlx-overlay-s/src/backend/openvr/mod.rs @@ -260,6 +260,20 @@ pub fn openvr_run( TaskType::ToggleSet(set) => { overlays.switch_or_toggle_set(&mut app, set); } + TaskType::ToggleEditMode => { + if !overlays.get_edit_mode() { + Toast::new( + ToastTopic::System, + "Edit mode enabled".into(), + "Hover overlays to see their options".into(), + ) + .with_timeout(5.) + .with_sound(true) + .submit(&mut app); + } + + overlays.set_edit_mode(!overlays.get_edit_mode()); + } #[cfg(feature = "wayvr")] TaskType::WayVR(action) => { wayvr_action(&mut app, &mut overlays, &action); diff --git a/wlx-overlay-s/src/backend/openxr/mod.rs b/wlx-overlay-s/src/backend/openxr/mod.rs index fa7609f..e00ecbc 100644 --- a/wlx-overlay-s/src/backend/openxr/mod.rs +++ b/wlx-overlay-s/src/backend/openxr/mod.rs @@ -544,6 +544,20 @@ pub fn openxr_run( TaskType::ToggleSet(set) => { overlays.switch_or_toggle_set(&mut app, set); } + TaskType::ToggleEditMode => { + if !overlays.get_edit_mode() { + Toast::new( + ToastTopic::System, + "Edit mode enabled".into(), + "Hover overlays to see their options".into(), + ) + .with_timeout(5.) + .with_sound(true) + .submit(&mut app); + } + + overlays.set_edit_mode(!overlays.get_edit_mode()); + } #[cfg(feature = "wayvr")] TaskType::WayVR(action) => { wayvr_action(&mut app, &mut overlays, &action); diff --git a/wlx-overlay-s/src/backend/task.rs b/wlx-overlay-s/src/backend/task.rs index b7ed5a5..e7474e3 100644 --- a/wlx-overlay-s/src/backend/task.rs +++ b/wlx-overlay-s/src/backend/task.rs @@ -58,6 +58,7 @@ pub enum TaskType { CreateOverlay(OverlaySelector, Box), DropOverlay(OverlaySelector), ToggleSet(usize), + ToggleEditMode, System(SystemTask), #[cfg(feature = "wayvr")] WayVR(WayVRAction), diff --git a/wlx-overlay-s/src/gui/panel/button.rs b/wlx-overlay-s/src/gui/panel/button.rs index 5d534a3..0411abf 100644 --- a/wlx-overlay-s/src/gui/panel/button.rs +++ b/wlx-overlay-s/src/gui/panel/button.rs @@ -61,7 +61,10 @@ pub(super) fn setup_custom_button( "::WatchSwapHand" => todo!(), // TODO #[allow(clippy::match_same_arms)] - "::EditToggle" => return, + "::EditToggle" => Box::new(move |_common, _data, app, _| { + app.tasks.enqueue(TaskType::ToggleEditMode); + Ok(EventResult::Consumed) + }), // TODO #[allow(clippy::match_same_arms)] "::OscSend" => return, diff --git a/wlx-overlay-s/src/overlays/edit.rs b/wlx-overlay-s/src/overlays/edit.rs index ead131a..8c04fdb 100644 --- a/wlx-overlay-s/src/overlays/edit.rs +++ b/wlx-overlay-s/src/overlays/edit.rs @@ -20,11 +20,12 @@ use crate::{ type EditModeWrapPanel = GuiPanel>; #[derive(Default)] -pub struct EditModeManager { +pub struct EditWrapperManager { + edit_mode: bool, panel_pool: Vec, } -impl EditModeManager { +impl EditWrapperManager { pub fn wrap_edit_mode( &mut self, owc: &mut OverlayWindowConfig, diff --git a/wlx-overlay-s/src/windowing/manager.rs b/wlx-overlay-s/src/windowing/manager.rs index ea92179..6f73a42 100644 --- a/wlx-overlay-s/src/windowing/manager.rs +++ b/wlx-overlay-s/src/windowing/manager.rs @@ -5,8 +5,11 @@ use slotmap::{HopSlotMap, Key, SecondaryMap}; use crate::{ overlays::{ - anchor::create_anchor, edit::EditModeManager, keyboard::builder::create_keyboard, - screen::create_screens, watch::create_watch, + anchor::create_anchor, + edit::EditWrapperManager, + keyboard::builder::create_keyboard, + screen::create_screens, + watch::{create_watch, WATCH_NAME}, }, state::AppState, windowing::{ @@ -18,7 +21,7 @@ use crate::{ }; pub struct OverlayWindowManager { - wrappers: EditModeManager, + wrappers: EditWrapperManager, overlays: HopSlotMap>, sets: Vec, /// The set that is currently visible. @@ -28,6 +31,7 @@ pub struct OverlayWindowManager { restore_set: usize, anchor_local: Affine3A, watch_id: OverlayID, + edit_mode: bool, } impl OverlayWindowManager @@ -38,13 +42,14 @@ where let mut maybe_keymap = None; let mut me = Self { - wrappers: EditModeManager::default(), + wrappers: EditWrapperManager::default(), overlays: HopSlotMap::with_key(), current_set: Some(0), restore_set: 0, sets: vec![OverlayWindowSet::default()], anchor_local: Affine3A::from_translation(Vec3::NEG_Z), watch_id: OverlayID::null(), // set down below + edit_mode: false, }; if headless { @@ -170,11 +175,32 @@ impl OverlayWindowManager { self.restore_set = (app.session.config.last_set as usize).min(self.sets.len() - 1); } + pub fn get_edit_mode(&self) -> bool { + self.edit_mode + } + pub fn set_edit_mode(&mut self, enabled: bool) { + self.edit_mode = enabled; + if enabled { + return; + } + for o in self.overlays.values_mut() { + self.wrappers.unwrap_edit_mode(&mut o.config); + } + } + pub fn edit_overlay(&mut self, id: OverlayID, enabled: bool, app: &mut AppState) { + if !self.edit_mode { + return; + } + let Some(overlay) = self.overlays.get_mut(id) else { return; }; + if &*overlay.config.name == WATCH_NAME { + return; // FIXME: not a proper solution + } + if enabled { self.wrappers .wrap_edit_mode(&mut overlay.config, app)