From 3ab692e00c38792f25c2d7c52dcd252e984d0359 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Tue, 5 Apr 2022 10:10:37 +0200 Subject: [PATCH] FIRE-31074: Setting double-click actions via Advanced/Developer menu or CTRL-Shift-D shortcut doesn't work anymore --- indra/newview/llviewermenu.cpp | 92 ++++++++++++++++--- .../skins/default/xui/en/menu_viewer.xml | 23 ++--- 2 files changed, 90 insertions(+), 25 deletions(-) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index e4863042f3..916712ecb8 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -159,6 +159,7 @@ #include "llcheckboxctrl.h" #include "llfloatergridstatus.h" #include "llfloaterpreference.h" +#include "llkeyconflict.h" #include "lllogininstance.h" #include "llscenemonitor.h" #include "llsdserialize.h" @@ -9643,26 +9644,88 @@ class LLToggleShaderControl : public view_listener_t }; //[FIX FIRE-1927 - enable DoubleClickTeleport shortcut : SJ] -class LLAdvancedToggleDoubleClickTeleport: public view_listener_t +// This stuff is based on LLPanelPreferenceControls::setKeyBind() and LLPanelPreferenceControls::canKeyBindHandle() +void setDoubleClickAction(const std::string& control) +{ + constexpr LLKeyConflictHandler::ESourceMode mode{ LLKeyConflictHandler::MODE_THIRD_PERSON }; + constexpr EMouseClickType click{ EMouseClickType::CLICK_DOUBLELEFT }; + constexpr KEY key{ KEY_NONE }; + constexpr MASK mask{ MASK_NONE }; + + LLKeyConflictHandler conflictHandler; + conflictHandler.setLoadMode(mode); + conflictHandler.loadFromSettings(mode); + + if (!conflictHandler.canAssignControl(control)) + { + return; + } + + bool is_enabled = conflictHandler.canHandleControl(control, click, key, mask); + if (!is_enabled) + { + // find free spot to add data, if no free spot, assign to first + S32 index = 0; + for (S32 i = 0; i < 3; i++) + { + if (conflictHandler.getControl(control, i).isEmpty()) + { + index = i; + break; + } + } + + bool ignore_mask = true; + conflictHandler.registerControl(control, index, click, key, mask, ignore_mask); + } + else + { + // find specific control and reset it + for (S32 i = 0; i < 3; i++) + { + LLKeyData data = conflictHandler.getControl(control, i); + if (data.mMouse == click && data.mKey == key && data.mMask == mask) + { + conflictHandler.clearControl(control, i); + } + } + } + + conflictHandler.saveToSettings(); +} + +bool isDoubleClickActionEnabled(const std::string control) +{ + constexpr LLKeyConflictHandler::ESourceMode mode{ LLKeyConflictHandler::MODE_THIRD_PERSON }; + constexpr EMouseClickType click{ EMouseClickType::CLICK_DOUBLELEFT }; + constexpr KEY key{ KEY_NONE }; + constexpr MASK mask{ MASK_NONE }; + + LLKeyConflictHandler conflictHandler; + conflictHandler.loadFromSettings(mode); + + return conflictHandler.canHandleControl(control, click, key, mask); +} + +class FSAdvancedToggleDoubleClickAction: public view_listener_t { bool handleEvent(const LLSD& userdata) { - BOOL checked = gSavedSettings.getBOOL("DoubleClickTeleport"); - if (checked) - { - gSavedSettings.setBOOL("DoubleClickTeleport", FALSE); - report_to_nearby_chat(LLTrans::getString("DoubleClickTeleportDisabled")); - } - else - { - gSavedSettings.setBOOL("DoubleClickTeleport", TRUE); - gSavedSettings.setBOOL("DoubleClickAutoPilot", FALSE); - report_to_nearby_chat(LLTrans::getString("DoubleClickTeleportEnabled")); - } + const std::string& control = userdata.asStringRef(); + setDoubleClickAction(control); return true; } }; +class FSAdvancedCheckEnabledDoubleClickAction : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + const std::string& control = userdata.asStringRef(); + return isDoubleClickActionEnabled(control); + } +}; + // Add telemetry controls to the viewer menus class FSTelemetryToggleActive : public view_listener_t { @@ -11917,7 +11980,8 @@ void initialize_menus() view_listener_t::addMenu(new LLAdvancedClickRenderProfile(), "Advanced.ClickRenderProfile"); view_listener_t::addMenu(new LLAdvancedClickRenderBenchmark(), "Advanced.ClickRenderBenchmark"); //[FIX FIRE-1927 - enable DoubleClickTeleport shortcut : SJ] - view_listener_t::addMenu(new LLAdvancedToggleDoubleClickTeleport, "Advanced.ToggleDoubleClickTeleport"); + view_listener_t::addMenu(new FSAdvancedToggleDoubleClickAction, "Advanced.SetDoubleClickAction"); + view_listener_t::addMenu(new FSAdvancedCheckEnabledDoubleClickAction, "Advanced.CheckEnabledDoubleClickAction"); #ifdef TOGGLE_HACKED_GODLIKE_VIEWER view_listener_t::addMenu(new LLAdvancedHandleToggleHackedGodmode(), "Advanced.HandleToggleHackedGodmode"); diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 000ad3fb8f..9f2de93121 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -3353,10 +3353,11 @@ name="DoubleClick Teleport" shortcut="control|shift|D"> + function="Advanced.CheckEnabledDoubleClickAction" + parameter="teleport_to"/> + function="Advanced.SetDoubleClickAction" + parameter="teleport_to"/> @@ -4795,21 +4796,21 @@ label="Double-Click Auto-Pilot" name="Double-ClickAuto-Pilot"> + function="Advanced.CheckEnabledDoubleClickAction" + parameter="walk_to" /> + function="Advanced.SetDoubleClickAction" + parameter="walk_to" /> + function="Advanced.CheckEnabledDoubleClickAction" + parameter="teleport_to" /> + function="Advanced.SetDoubleClickAction" + parameter="teleport_to" />