From e1802e402bf0ef63c2861bd7c5c7a13b3aecd87f Mon Sep 17 00:00:00 2001 From: yum Date: Sat, 9 Sep 2023 19:43:19 -0700 Subject: Add `lock at spawn` option I find it kind of annoying when people wave around a big chatbox so I added the option to have the chatbox be locked in worldspace whenever it's visible. This defaults to on and can be disabled. --- GUI/GUI/GUI/Config.cpp | 3 +++ GUI/GUI/GUI/Config.h | 1 + GUI/GUI/GUI/Frame.cpp | 17 +++++++++++++++++ GUI/GUI/GUI/Frame.h | 1 + Scripts/transcribe_v2.py | 21 ++++++++++++++------- 5 files changed, 36 insertions(+), 7 deletions(-) diff --git a/GUI/GUI/GUI/Config.cpp b/GUI/GUI/GUI/Config.cpp index db4b184..8d5cdbf 100644 --- a/GUI/GUI/GUI/Config.cpp +++ b/GUI/GUI/GUI/Config.cpp @@ -83,6 +83,7 @@ AppConfig::AppConfig(wxTextCtrl* out) enable_debug_mode(false), reset_on_toggle(true), enable_previews(true), + enable_lock_at_spawn(true), gpu_idx(0), keybind("ctrl+x"), @@ -124,6 +125,7 @@ bool AppConfig::Serialize(const std::filesystem::path& path) { cm.Set("enable_debug_mode", enable_debug_mode); cm.Set("reset_on_toggle", reset_on_toggle); cm.Set("enable_previews", enable_previews); + cm.Set("enable_lock_at_spawn", enable_lock_at_spawn); cm.Set("gpu_idx", gpu_idx); cm.Set("keybind", keybind); @@ -178,6 +180,7 @@ bool AppConfig::Deserialize(const std::filesystem::path& path) { cm.Get("enable_debug_mode", c.enable_debug_mode); cm.Get("reset_on_toggle", c.reset_on_toggle); cm.Get("enable_previews", c.enable_previews); + cm.Get("enable_lock_at_spawn", c.enable_lock_at_spawn); cm.Get("gpu_idx", c.gpu_idx); cm.Get("keybind", c.keybind); diff --git a/GUI/GUI/GUI/Config.h b/GUI/GUI/GUI/Config.h index 4137c59..6e82f14 100644 --- a/GUI/GUI/GUI/Config.h +++ b/GUI/GUI/GUI/Config.h @@ -69,6 +69,7 @@ public: bool enable_debug_mode; bool reset_on_toggle; bool enable_previews; + bool enable_lock_at_spawn; int gpu_idx; std::string keybind; diff --git a/GUI/GUI/GUI/Frame.cpp b/GUI/GUI/GUI/Frame.cpp index 2823437..a124ff1 100644 --- a/GUI/GUI/GUI/Frame.cpp +++ b/GUI/GUI/GUI/Frame.cpp @@ -71,6 +71,7 @@ namespace { ID_PY_APP_ENABLE_DEBUG_MODE, ID_PY_APP_RESET_ON_TOGGLE, ID_PY_APP_ENABLE_PREVIEWS, + ID_PY_APP_ENABLE_LOCK_AT_SPAWN, ID_PY_APP_ROWS, ID_PY_APP_COLS, ID_PY_APP_GPU_IDX, @@ -954,6 +955,15 @@ Frame::Frame() ); py_app_enable_previews_ = py_app_enable_previews; + auto* py_app_enable_lock_at_spawn = new wxCheckBox(py_config_panel, + ID_PY_APP_ENABLE_LOCK_AT_SPAWN, "Lock chatbox at spawn"); + py_app_enable_lock_at_spawn->SetValue(app_c_->enable_lock_at_spawn); + py_app_enable_lock_at_spawn->SetToolTip( + "If checked, the custom chatbox will be locked in world " + "space when spawned. This minimizes the visual " + "disruption for other players."); + py_app_enable_lock_at_spawn_ = py_app_enable_lock_at_spawn; + // Hack: Add newlines before and after the button text to make // the buttons bigger, and easier to click from inside VR. auto* py_app_start_button = new wxButton(py_config_panel, @@ -971,6 +981,8 @@ Frame::Frame() /*flags=*/wxEXPAND); sizer->Add(py_app_enable_previews, /*proportion=*/0, /*flags=*/wxEXPAND); + sizer->Add(py_app_enable_lock_at_spawn, /*proportion=*/0, + /*flags=*/wxEXPAND); sizer->Add(py_app_enable_browser_src, /*proportion=*/0, /*flags=*/wxEXPAND); sizer->Add(py_app_enable_local_beep, /*proportion=*/0, @@ -1555,6 +1567,9 @@ void Frame::ApplyConfigToInputFields() auto* py_app_enable_previews = static_cast(FindWindowById(ID_PY_APP_ENABLE_PREVIEWS)); py_app_enable_previews->SetValue(app_c_->enable_previews); + auto* py_app_enable_lock_at_spawn = static_cast(FindWindowById(ID_PY_APP_ENABLE_LOCK_AT_SPAWN)); + py_app_enable_lock_at_spawn->SetValue(app_c_->enable_lock_at_spawn); + // Unity panel auto* unity_assets_path = static_cast(FindWindowById(ID_UNITY_ASSETS_FILE_PICKER)); unity_assets_path->SetPath(app_c_->assets_path); @@ -2262,6 +2277,7 @@ void Frame::OnAppStart(wxCommandEvent& event) { const bool enable_debug_mode = py_app_enable_debug_mode_->GetValue(); const bool reset_on_toggle = py_app_reset_on_toggle_->GetValue(); const bool enable_previews = py_app_enable_previews_->GetValue(); + const bool enable_lock_at_spawn = py_app_enable_lock_at_spawn_->GetValue(); ASSIGN_OR_RETURN_VOID(int, rows, stoiInRange(transcribe_out_, py_app_rows_->GetValue().ToStdString(), "rows", 1, 10)); ASSIGN_OR_RETURN_VOID(int, cols, stoiInRange(transcribe_out_, py_app_cols_->GetValue().ToStdString(), "cols", 1, 120)); @@ -2295,6 +2311,7 @@ void Frame::OnAppStart(wxCommandEvent& event) { app_c_->enable_debug_mode = enable_debug_mode; app_c_->reset_on_toggle = reset_on_toggle; app_c_->enable_previews = enable_previews; + app_c_->enable_lock_at_spawn = enable_lock_at_spawn; app_c_->gpu_idx = gpu_idx; app_c_->keybind = keybind; app_c_->Serialize(AppConfig::kConfigPath); diff --git a/GUI/GUI/GUI/Frame.h b/GUI/GUI/GUI/Frame.h index 7baf77f..d33db06 100644 --- a/GUI/GUI/GUI/Frame.h +++ b/GUI/GUI/GUI/Frame.h @@ -73,6 +73,7 @@ private: wxCheckBox* py_app_enable_debug_mode_; wxCheckBox* py_app_reset_on_toggle_; wxCheckBox* py_app_enable_previews_; + wxCheckBox* py_app_enable_lock_at_spawn_; wxCheckBox* unity_clear_osc_; wxCheckBox* unity_enable_phonemes_; diff --git a/Scripts/transcribe_v2.py b/Scripts/transcribe_v2.py index 5f43e3a..4305a07 100644 --- a/Scripts/transcribe_v2.py +++ b/Scripts/transcribe_v2.py @@ -713,9 +713,6 @@ def vrInputThread(ctrl: ThreadControl): if now - last_rising > 1.5: # Long press: treat as the end of transcription. state = PAUSE_STATE - if not ctrl.cfg["use_builtin"]: - ctrl.pager.getSyncWindow() - ctrl.pager.lockWorld(True) ctrl.stream.pause(True) @@ -749,12 +746,17 @@ def vrInputThread(ctrl: ThreadControl): ctrl.stream.getSamples() ctrl.collector.dropAudio() ctrl.pager.clear() + if ctrl.cfg["enable_lock_at_spawn"]: + # Give the board 0.5 seconds to disappear before unlocking from + # world space. + time.sleep(0.5) + ctrl.pager.lockWorld(False) else: # Short hold if state == RECORD_STATE: print("PAUSED", file=sys.stderr) state = PAUSE_STATE - if not ctrl.cfg["use_builtin"]: + if not ctrl.cfg["use_builtin"] and not ctrl.cfg["enable_lock_at_spawn"]: ctrl.pager.getSyncWindow() ctrl.pager.lockWorld(True) @@ -769,7 +771,7 @@ def vrInputThread(ctrl: ThreadControl): if not ctrl.cfg["use_builtin"]: ctrl.pager.getSyncWindow() ctrl.pager.toggleBoard(True) - ctrl.pager.lockWorld(False) + ctrl.pager.lockWorld(ctrl.cfg["enable_lock_at_spawn"]) ctrl.pager.ellipsis(True) if ctrl.cfg["reset_on_toggle"]: if ctrl.cfg["enable_debug_mode"]: @@ -835,13 +837,18 @@ def kbInputThread(ctrl: ThreadControl): ctrl.stream.getSamples() ctrl.collector.dropAudio() ctrl.pager.clear() + if ctrl.cfg["enable_lock_at_spawn"]: + # Give the board 0.5 seconds to disappear before unlocking from + # world space. + time.sleep(0.5) + ctrl.pager.lockWorld(False) continue # Short hold if state == RECORD_STATE: print("PAUSED", file=sys.stderr) state = PAUSE_STATE - if not ctrl.cfg["use_builtin"]: + if not ctrl.cfg["use_builtin"] and not ctrl.cfg["enable_lock_at_spawn"]: ctrl.pager.getSyncWindow() ctrl.pager.lockWorld(True) @@ -856,7 +863,7 @@ def kbInputThread(ctrl: ThreadControl): if not ctrl.cfg["use_builtin"]: ctrl.pager.getSyncWindow() ctrl.pager.toggleBoard(True) - ctrl.pager.lockWorld(False) + ctrl.pager.lockWorld(ctrl.cfg["enable_lock_at_spawn"]) ctrl.pager.ellipsis(True) if ctrl.cfg["reset_on_toggle"]: if ctrl.cfg["enable_debug_mode"]: -- cgit v1.2.3