From c80df5ac39e31fb17fa8a1158cbea2de8faf0319 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Fri, 23 Sep 2011 18:00:35 +0300 Subject: STORM-1612 FIXED Implemented click-to-walk in Advanced mode. Changes: * Click and double click in-world can now trigger click-to-walk or click-to-teleport actions, depending on preferences. * Grouped keyboard- and mouse-related settings in Preferences -> Move. --- indra/newview/llfloaterpreference.cpp | 166 ++++++++++++++++++++++------------ 1 file changed, 107 insertions(+), 59 deletions(-) (limited to 'indra/newview/llfloaterpreference.cpp') diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index d65928e385..5dd1cc3b97 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -304,7 +304,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mOriginalIMViaEmail(false), mLanguageChanged(false), mAvatarDataInitialized(false), - mDoubleClickActionDirty(false) + mClickActionDirty(false) { //Build Floater is now Called from LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); @@ -348,8 +348,10 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) sSkin = gSavedSettings.getString("SkinCurrent"); - mCommitCallbackRegistrar.add("Pref.CommitDoubleClickChekbox", boost::bind(&LLFloaterPreference::onDoubleClickCheckBox, this, _1)); - mCommitCallbackRegistrar.add("Pref.CommitRadioDoubleClick", boost::bind(&LLFloaterPreference::onDoubleClickRadio, this)); + mCommitCallbackRegistrar.add("Pref.CommitClickToWalkCheckbox", boost::bind(&LLFloaterPreference::onWalkCheckboxCommit, this)); + mCommitCallbackRegistrar.add("Pref.CommitClickToTeleportCheckbox", boost::bind(&LLFloaterPreference::onTeleportCheckboxCommit, this)); + mCommitCallbackRegistrar.add("Pref.CommitWalkTriggerRadio", boost::bind(&LLFloaterPreference::onWalkTriggerRadioCommit, this)); + mCommitCallbackRegistrar.add("Pref.CommitTeleportTriggerRadio", boost::bind(&LLFloaterPreference::onTeleportTriggerRadioCommit, this)); gSavedSettings.getControl("NameTagShowUsernames")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2)); gSavedSettings.getControl("NameTagShowFriends")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2)); @@ -439,8 +441,6 @@ BOOL LLFloaterPreference::postBuild() if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab"))) tabcontainer->selectFirstTab(); - updateDoubleClickControls(); - getChild("cache_location")->setEnabled(FALSE); // make it read-only but selectable (STORM-227) std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""); setCacheLocation(cache_location); @@ -581,10 +581,10 @@ void LLFloaterPreference::apply() saveAvatarProperties(); - if (mDoubleClickActionDirty) + if (mClickActionDirty) { - updateDoubleClickSettings(); - mDoubleClickActionDirty = false; + updateClickActionSettings(); + mClickActionDirty = false; } } @@ -613,11 +613,12 @@ void LLFloaterPreference::cancel() // reverts any changes to current skin gSavedSettings.setString("SkinCurrent", sSkin); - if (mDoubleClickActionDirty) + if (mClickActionDirty) { - updateDoubleClickControls(); - mDoubleClickActionDirty = false; + updateClickActionControls(); + mClickActionDirty = false; } + LLFloaterPreferenceProxy * advanced_proxy_settings = LLFloaterReg::findTypedInstance("prefs_proxy"); if (advanced_proxy_settings) { @@ -681,6 +682,9 @@ void LLFloaterPreference::onOpen(const LLSD& key) // Display selected maturity icons. onChangeMaturity(); + + // Load (double-)click to walk/teleport settings. + updateClickActionControls(); // Enabled/disabled popups, might have been changed by user actions // while preferences floater was closed. @@ -1503,72 +1507,116 @@ void LLFloaterPreference::onClickBlockList() } } -void LLFloaterPreference::onDoubleClickCheckBox(LLUICtrl* ctrl) +void LLFloaterPreference::onClickProxySettings() { - if (!ctrl) return; - mDoubleClickActionDirty = true; - LLRadioGroup* radio_double_click_action = getChild("double_click_action"); - if (!radio_double_click_action) return; - // select default value("teleport") in radio-group. - radio_double_click_action->setSelectedIndex(0); - // set radio-group enabled depending on state of checkbox - radio_double_click_action->setEnabled(ctrl->getValue()); + LLFloaterReg::showInstance("prefs_proxy"); } -void LLFloaterPreference::onDoubleClickRadio() +void LLFloaterPreference::onWalkCheckboxCommit() { - mDoubleClickActionDirty = true; + LLCheckBoxCtrl* walk_trigger_cb = getChild("walk_to_chkbox"); + LLRadioGroup* walk_trigger_radio = getChild("walk_trigger_radio"); + const bool checked = walk_trigger_cb->getValue().asBoolean(); + + mClickActionDirty = true; + walk_trigger_radio->setEnabled(checked); + if (checked) + { + fixWalkRadioValue(); // don't allow two actions on click or double click + } } -void LLFloaterPreference::updateDoubleClickSettings() +void LLFloaterPreference::onTeleportCheckboxCommit() { - LLCheckBoxCtrl* double_click_action_cb = getChild("double_click_chkbox"); - if (!double_click_action_cb) return; - bool enable = double_click_action_cb->getValue().asBoolean(); + LLCheckBoxCtrl* teleport_trigger_cb = getChild("teleport_to_chkbox"); + LLRadioGroup* teleport_trigger_radio = getChild("teleport_trigger_radio"); + const bool checked = teleport_trigger_cb->getValue().asBoolean(); - LLRadioGroup* radio_double_click_action = getChild("double_click_action"); - if (!radio_double_click_action) return; - - // enable double click radio-group depending on state of checkbox - radio_double_click_action->setEnabled(enable); - - if (!enable) + mClickActionDirty = true; + teleport_trigger_radio->setEnabled(checked); + if (checked) { - // set double click action settings values to false if checkbox was unchecked - gSavedSettings.setBOOL("DoubleClickAutoPilot", false); - gSavedSettings.setBOOL("DoubleClickTeleport", false); - } - else - { - std::string selected = radio_double_click_action->getValue().asString(); - bool teleport_selected = selected == "radio_teleport"; - // set double click action settings values depending on chosen radio-button - gSavedSettings.setBOOL( "DoubleClickTeleport", teleport_selected ); - gSavedSettings.setBOOL( "DoubleClickAutoPilot", !teleport_selected ); + fixTeleportRadioValue(); // don't allow two actions on click or double click } } -void LLFloaterPreference::onClickProxySettings() +void LLFloaterPreference::onWalkTriggerRadioCommit() { - LLFloaterReg::showInstance("prefs_proxy"); + mClickActionDirty = true; + fixTeleportRadioValue(); +} + +void LLFloaterPreference::onTeleportTriggerRadioCommit() +{ + mClickActionDirty = true; + fixWalkRadioValue(); +} + +void LLFloaterPreference::fixWalkRadioValue() +{ + LLRadioGroup* walk_trigger_radio = getChild("walk_trigger_radio"); + LLRadioGroup* teleport_trigger_radio = getChild("teleport_trigger_radio"); + + walk_trigger_radio->setSelectedIndex(!teleport_trigger_radio->getSelectedIndex()); +} + + +void LLFloaterPreference::fixTeleportRadioValue() +{ + LLRadioGroup* walk_trigger_radio = getChild("walk_trigger_radio"); + LLRadioGroup* teleport_trigger_radio = getChild("teleport_trigger_radio"); + + teleport_trigger_radio->setSelectedIndex(!walk_trigger_radio->getSelectedIndex()); +} + +void LLFloaterPreference::updateClickActionSettings() +{ + const bool walk_trigger_enabled = getChild("walk_to_chkbox")->getValue().asBoolean(); + const bool teleport_trigger_enabled = getChild("teleport_to_chkbox")->getValue().asBoolean(); + + const bool walk_on_dbl_click = (bool) getChild("walk_trigger_radio")->getSelectedIndex(); + const bool teleport_on_dbl_click = (bool) getChild("teleport_trigger_radio")->getSelectedIndex(); + + gSavedSettings.setBOOL("ClickToWalk", walk_trigger_enabled && !walk_on_dbl_click); + gSavedSettings.setBOOL("ClickToTeleport", teleport_trigger_enabled && !teleport_on_dbl_click); + gSavedSettings.setBOOL("DoubleClickAutoPilot", walk_trigger_enabled && walk_on_dbl_click); + gSavedSettings.setBOOL("DoubleClickTeleport", teleport_trigger_enabled && teleport_on_dbl_click); } -void LLFloaterPreference::updateDoubleClickControls() +void LLFloaterPreference::updateClickActionControls() { - // check is one of double-click actions settings enabled - bool double_click_action_enabled = gSavedSettings.getBOOL("DoubleClickAutoPilot") || gSavedSettings.getBOOL("DoubleClickTeleport"); - LLCheckBoxCtrl* double_click_action_cb = getChild("double_click_chkbox"); - if (double_click_action_cb) + LLCheckBoxCtrl* walk_trigger_cb = getChild("walk_to_chkbox"); + LLCheckBoxCtrl* teleport_trigger_cb = getChild("teleport_to_chkbox"); + + LLRadioGroup* walk_trigger_radio = getChild("walk_trigger_radio"); + LLRadioGroup* teleport_trigger_radio = getChild("teleport_trigger_radio"); + + const bool click_to_walk = gSavedSettings.getBOOL("ClickToWalk"); + const bool click_to_teleport = gSavedSettings.getBOOL("ClickToTeleport"); + const bool dbl_click_to_walk = gSavedSettings.getBOOL("DoubleClickAutoPilot"); + const bool dbl_click_to_teleport = gSavedSettings.getBOOL("DoubleClickTeleport"); + + const bool walk_trigger_enabled = click_to_walk || dbl_click_to_walk; + const bool teleport_trigger_enabled = click_to_teleport || dbl_click_to_teleport; + + walk_trigger_cb->setValue(walk_trigger_enabled); + teleport_trigger_cb->setValue(teleport_trigger_enabled); + + walk_trigger_radio->setEnabled(walk_trigger_enabled); + walk_trigger_radio->setSelectedIndex(dbl_click_to_walk); + + teleport_trigger_radio->setEnabled(teleport_trigger_enabled); + teleport_trigger_radio->setSelectedIndex(dbl_click_to_teleport); + + // Make sure it doesn't look like there is more than one action per trigger. + if (teleport_trigger_enabled) + { + fixWalkRadioValue(); + } + else { - // check checkbox if one of double-click actions settings enabled, uncheck otherwise - double_click_action_cb->setValue(double_click_action_enabled); + fixTeleportRadioValue(); } - LLRadioGroup* double_click_action_radio = getChild("double_click_action"); - if (!double_click_action_radio) return; - // set radio-group enabled if one of double-click actions settings enabled - double_click_action_radio->setEnabled(double_click_action_enabled); - // select button in radio-group depending on setting - double_click_action_radio->setSelectedIndex(gSavedSettings.getBOOL("DoubleClickAutoPilot")); } void LLFloaterPreference::applyUIColor(LLUICtrl* ctrl, const LLSD& param) -- cgit v1.3 From f6a8a2c5460c8f61b37154de01cd2f9575ef87de Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Thu, 29 Sep 2011 15:35:02 +0300 Subject: STORM-1612 WIP Implemented new click-to-walk/teleport preferences design. --- indra/newview/app_settings/settings.xml | 11 -- indra/newview/llfloaterpreference.cpp | 103 ++-------------- indra/newview/llfloaterpreference.h | 16 +-- indra/newview/lltoolpie.cpp | 127 +++----------------- indra/newview/lltoolpie.h | 7 -- .../default/xui/en/panel_preferences_move.xml | 132 ++++++++------------- 6 files changed, 77 insertions(+), 319 deletions(-) (limited to 'indra/newview/llfloaterpreference.cpp') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5ffbbc6163..be4ec93946 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -13566,17 +13566,6 @@ Value 1 - ClickToTeleport - - Comment - Click in world to teleport to location - Persist - 1 - Type - Boolean - Value - 0 - ShowOfferedInventory Comment diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 5dd1cc3b97..9630d7b29f 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -348,10 +348,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) sSkin = gSavedSettings.getString("SkinCurrent"); - mCommitCallbackRegistrar.add("Pref.CommitClickToWalkCheckbox", boost::bind(&LLFloaterPreference::onWalkCheckboxCommit, this)); - mCommitCallbackRegistrar.add("Pref.CommitClickToTeleportCheckbox", boost::bind(&LLFloaterPreference::onTeleportCheckboxCommit, this)); - mCommitCallbackRegistrar.add("Pref.CommitWalkTriggerRadio", boost::bind(&LLFloaterPreference::onWalkTriggerRadioCommit, this)); - mCommitCallbackRegistrar.add("Pref.CommitTeleportTriggerRadio", boost::bind(&LLFloaterPreference::onTeleportTriggerRadioCommit, this)); + mCommitCallbackRegistrar.add("Pref.ClickActionChange", boost::bind(&LLFloaterPreference::onClickActionChange, this)); gSavedSettings.getControl("NameTagShowUsernames")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2)); gSavedSettings.getControl("NameTagShowFriends")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2)); @@ -1512,111 +1509,29 @@ void LLFloaterPreference::onClickProxySettings() LLFloaterReg::showInstance("prefs_proxy"); } -void LLFloaterPreference::onWalkCheckboxCommit() -{ - LLCheckBoxCtrl* walk_trigger_cb = getChild("walk_to_chkbox"); - LLRadioGroup* walk_trigger_radio = getChild("walk_trigger_radio"); - const bool checked = walk_trigger_cb->getValue().asBoolean(); - - mClickActionDirty = true; - walk_trigger_radio->setEnabled(checked); - if (checked) - { - fixWalkRadioValue(); // don't allow two actions on click or double click - } -} - -void LLFloaterPreference::onTeleportCheckboxCommit() -{ - LLCheckBoxCtrl* teleport_trigger_cb = getChild("teleport_to_chkbox"); - LLRadioGroup* teleport_trigger_radio = getChild("teleport_trigger_radio"); - const bool checked = teleport_trigger_cb->getValue().asBoolean(); - - mClickActionDirty = true; - teleport_trigger_radio->setEnabled(checked); - if (checked) - { - fixTeleportRadioValue(); // don't allow two actions on click or double click - } -} - -void LLFloaterPreference::onWalkTriggerRadioCommit() -{ - mClickActionDirty = true; - fixTeleportRadioValue(); -} - -void LLFloaterPreference::onTeleportTriggerRadioCommit() +void LLFloaterPreference::onClickActionChange() { mClickActionDirty = true; - fixWalkRadioValue(); -} - -void LLFloaterPreference::fixWalkRadioValue() -{ - LLRadioGroup* walk_trigger_radio = getChild("walk_trigger_radio"); - LLRadioGroup* teleport_trigger_radio = getChild("teleport_trigger_radio"); - - walk_trigger_radio->setSelectedIndex(!teleport_trigger_radio->getSelectedIndex()); -} - - -void LLFloaterPreference::fixTeleportRadioValue() -{ - LLRadioGroup* walk_trigger_radio = getChild("walk_trigger_radio"); - LLRadioGroup* teleport_trigger_radio = getChild("teleport_trigger_radio"); - - teleport_trigger_radio->setSelectedIndex(!walk_trigger_radio->getSelectedIndex()); } void LLFloaterPreference::updateClickActionSettings() { - const bool walk_trigger_enabled = getChild("walk_to_chkbox")->getValue().asBoolean(); - const bool teleport_trigger_enabled = getChild("teleport_to_chkbox")->getValue().asBoolean(); - - const bool walk_on_dbl_click = (bool) getChild("walk_trigger_radio")->getSelectedIndex(); - const bool teleport_on_dbl_click = (bool) getChild("teleport_trigger_radio")->getSelectedIndex(); + const int single_clk_action = getChild("single_click_action_combo")->getValue().asInteger(); + const int double_clk_action = getChild("double_click_action_combo")->getValue().asInteger(); - gSavedSettings.setBOOL("ClickToWalk", walk_trigger_enabled && !walk_on_dbl_click); - gSavedSettings.setBOOL("ClickToTeleport", teleport_trigger_enabled && !teleport_on_dbl_click); - gSavedSettings.setBOOL("DoubleClickAutoPilot", walk_trigger_enabled && walk_on_dbl_click); - gSavedSettings.setBOOL("DoubleClickTeleport", teleport_trigger_enabled && teleport_on_dbl_click); + gSavedSettings.setBOOL("ClickToWalk", single_clk_action == 1); + gSavedSettings.setBOOL("DoubleClickAutoPilot", double_clk_action == 1); + gSavedSettings.setBOOL("DoubleClickTeleport", double_clk_action == 2); } void LLFloaterPreference::updateClickActionControls() { - LLCheckBoxCtrl* walk_trigger_cb = getChild("walk_to_chkbox"); - LLCheckBoxCtrl* teleport_trigger_cb = getChild("teleport_to_chkbox"); - - LLRadioGroup* walk_trigger_radio = getChild("walk_trigger_radio"); - LLRadioGroup* teleport_trigger_radio = getChild("teleport_trigger_radio"); - const bool click_to_walk = gSavedSettings.getBOOL("ClickToWalk"); - const bool click_to_teleport = gSavedSettings.getBOOL("ClickToTeleport"); const bool dbl_click_to_walk = gSavedSettings.getBOOL("DoubleClickAutoPilot"); const bool dbl_click_to_teleport = gSavedSettings.getBOOL("DoubleClickTeleport"); - const bool walk_trigger_enabled = click_to_walk || dbl_click_to_walk; - const bool teleport_trigger_enabled = click_to_teleport || dbl_click_to_teleport; - - walk_trigger_cb->setValue(walk_trigger_enabled); - teleport_trigger_cb->setValue(teleport_trigger_enabled); - - walk_trigger_radio->setEnabled(walk_trigger_enabled); - walk_trigger_radio->setSelectedIndex(dbl_click_to_walk); - - teleport_trigger_radio->setEnabled(teleport_trigger_enabled); - teleport_trigger_radio->setSelectedIndex(dbl_click_to_teleport); - - // Make sure it doesn't look like there is more than one action per trigger. - if (teleport_trigger_enabled) - { - fixWalkRadioValue(); - } - else - { - fixTeleportRadioValue(); - } + getChild("single_click_action_combo")->setValue((int)click_to_walk); + getChild("double_click_action_combo")->setValue(dbl_click_to_teleport ? 2 : (int)dbl_click_to_walk); } void LLFloaterPreference::applyUIColor(LLUICtrl* ctrl, const LLSD& param) diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index b7263f0ac3..5c74e9f60c 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -105,18 +105,8 @@ protected: // callback for when client turns on shaders void onVertexShaderEnable(); - // callback for clicking the "Walk to Click Point" checkbox - void onWalkCheckboxCommit(); - // callback for clicking the "Teleport to Click Point" checkbox - void onTeleportCheckboxCommit(); - // callback for selecting trigger for "Walk to Click Point" - void onWalkTriggerRadioCommit(); - // callback for selecting trigger for "Teleport to Click Point" - void onTeleportTriggerRadioCommit(); - // make sure the radio buttons have mutually exclusive values - void fixWalkRadioValue(); - // make sure the radio buttons have mutually exclusive values - void fixTeleportRadioValue(); + // callback for commit in the "Single click on land" and "Double click on land" comboboxes. + void onClickActionChange(); // updates click/double-click action settings depending on controls values void updateClickActionSettings(); // updates click/double-click action controls depending on values from settings.xml @@ -173,8 +163,6 @@ public: static void refreshSkin(void* data); private: static std::string sSkin; - // set true if state of double-click action checkbox or radio-group was changed by user - // (reset back to false on apply or cancel) bool mClickActionDirty; ///< Set to true when the click/double-click options get changed by user. bool mGotPersonalInfo; bool mOriginalIMViaEmail; diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index a05fc9536e..b0d9bd5d70 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -35,7 +35,6 @@ #include "llagent.h" #include "llagentcamera.h" #include "llavatarnamecache.h" -#include "lleventtimer.h" #include "llfocusmgr.h" #include "llfirstuse.h" #include "llfloaterland.h" @@ -77,42 +76,6 @@ static void handle_click_action_play(); static void handle_click_action_open_media(LLPointer objectp); static ECursorType cursor_from_parcel_media(U8 click_action); -/** - * Schedule teleport to the specified location when user clicks in world. - * - * Deferring teleport is needed for double-click-to-walk to work. - * If double click in the world view occurs, teleport gets canceled. - */ -class LLClickToTeleportTimer : public LLEventTimer -{ - LOG_CLASS(LLClickToTeleportTimer); -public: - LLClickToTeleportTimer(const LLVector3d& pos); - ~LLClickToTeleportTimer(); - /*virtual*/ BOOL tick(); - -private: - LLVector3d mTeleportPos; -}; - -LLClickToTeleportTimer::LLClickToTeleportTimer(const LLVector3d& pos) -: LLEventTimer(0.33f) // should be greater than double click interval -, mTeleportPos(pos) -{ -}; - -LLClickToTeleportTimer::~LLClickToTeleportTimer() -{ - LLToolPie::instance().mClickToTeleportTimer = NULL; -} - -BOOL LLClickToTeleportTimer::tick() -{ - lldebugs << "Teleporting to " << mTeleportPos << llendl; - gAgent.teleportViaLocationLookAt(mTeleportPos); - return TRUE; // destroy the timer -} - LLToolPie::LLToolPie() : LLTool(std::string("Pie")), mMouseButtonDown( false ), @@ -120,8 +83,6 @@ LLToolPie::LLToolPie() mMouseSteerX(-1), mMouseSteerY(-1), mBlockClickToWalk(false), - mBlockClickToTeleport(false), - mClickToTeleportTimer(NULL), mClickAction(0), mClickActionBuyEnabled( gSavedSettings.getBOOL("ClickActionBuyEnabled") ), mClickActionPayEnabled( gSavedSettings.getBOOL("ClickActionPayEnabled") ) @@ -687,64 +648,35 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) mMouseButtonDown = false; if (click_action == CLICK_ACTION_NONE // not doing 1-click action + && gSavedSettings.getBOOL("ClickToWalk") // click to walk enabled && !gAgent.getFlying() // don't auto-navigate while flying until that works && gAgentAvatarp && !gAgentAvatarp->isSitting() + && !mBlockClickToWalk // another behavior hasn't cancelled click to walk && !mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick && (mPick.mPickType == LLPickInfo::PICK_LAND // we clicked on land || mPick.mObjectID.notNull())) // or on an object { - if (gSavedSettings.getBOOL("ClickToWalk") - && !mBlockClickToWalk) // another behavior hasn't cancelled click to walk - { - // handle special cases of steering picks - LLViewerObject* avatar_object = mPick.getObject(); - - // get pointer to avatar - while (avatar_object && !avatar_object->isAvatar()) - { - avatar_object = (LLViewerObject*)avatar_object->getParent(); - } - - if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf()) - { - const F64 SELF_CLICK_WALK_DISTANCE = 3.0; - // pretend we picked some point a bit in front of avatar - mPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * SELF_CLICK_WALK_DISTANCE; - } - gAgentCamera.setFocusOnAvatar(TRUE, TRUE); - walkToClickedLocation(); - LLFirstUse::notMoving(false); + // handle special cases of steering picks + LLViewerObject* avatar_object = mPick.getObject(); - return TRUE; - } - else if (gSavedSettings.getBOOL("ClickToTeleport") && !mBlockClickToTeleport) + // get pointer to avatar + while (avatar_object && !avatar_object->isAvatar()) { - LLViewerObject* objp = mPick.getObject(); - LLViewerObject* parentp = objp ? objp->getRootEdit() : NULL; - - bool is_in_world = mPick.mObjectID.notNull() && objp && !objp->isHUDAttachment(); - bool is_land = mPick.mPickType == LLPickInfo::PICK_LAND; - bool has_touch_handler = (objp && objp->flagHandleTouch()) || (parentp && parentp->flagHandleTouch()); - bool has_click_action = final_click_action(objp); - - if (is_land || (is_in_world && !has_touch_handler && !has_click_action)) - { - LLVector3d pos = mPick.mPosGlobal; - pos.mdV[VZ] += gAgentAvatarp->getPelvisToFoot(); + avatar_object = (LLViewerObject*)avatar_object->getParent(); + } - if (gSavedSettings.getBOOL("DoubleClickAutoPilot")) - { - // defer for more than the double click interval. - scheduleTeleport(pos); - } - else - { - gAgent.teleportViaLocationLookAt(pos); - } - return TRUE; - } + if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf()) + { + const F64 SELF_CLICK_WALK_DISTANCE = 3.0; + // pretend we picked some point a bit in front of avatar + mPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * SELF_CLICK_WALK_DISTANCE; } + gAgentCamera.setFocusOnAvatar(TRUE, TRUE); + walkToClickedLocation(); + LLFirstUse::notMoving(false); + + return TRUE; } gViewerWindow->setCursor(UI_CURSOR_ARROW); if (hasMouseCapture()) @@ -756,7 +688,6 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) gAgentCamera.setLookAt(LOOKAT_TARGET_CONVERSATION, obj); // maybe look at object/person clicked on mBlockClickToWalk = false; - mBlockClickToTeleport = false; return LLTool::handleMouseUp(x, y, mask); } @@ -777,13 +708,8 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask) llinfos << "LLToolPie handleDoubleClick (becoming mouseDown)" << llendl; } - cancelScheduledTeleport(); - if (gSavedSettings.getBOOL("DoubleClickAutoPilot")) { - // Avoid teleporting for the second time when user releases mouse button after double click. - mBlockClickToTeleport = true; - if ((mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) || (mPick.mObjectID.notNull() && !mPick.mPosGlobal.isExactlyZero())) { @@ -1443,23 +1369,6 @@ bool LLToolPie::inCameraSteerMode() return mMouseButtonDown && mMouseOutsideSlop && gSavedSettings.getBOOL("ClickToWalk"); } -void LLToolPie::scheduleTeleport(const LLVector3d& pos) -{ - // cancel previously scheduled teleport (if any) - cancelScheduledTeleport(); - - // and schedule new one - mClickToTeleportTimer = new LLClickToTeleportTimer(pos); -} - -void LLToolPie::cancelScheduledTeleport() -{ - if (mClickToTeleportTimer) - { - delete mClickToTeleportTimer; - } -} - // true if x,y outside small box around start_x,start_y BOOL LLToolPie::outsideSlop(S32 x, S32 y, S32 start_x, S32 start_y) { diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index 7e84170549..68fe8bc4a5 100644 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -32,7 +32,6 @@ #include "llviewerwindow.h" // for LLPickInfo #include "llhudeffectblob.h" // for LLPointer, apparently -class LLClickToTeleportTimer; class LLViewerObject; class LLObjectSelection; @@ -98,12 +97,8 @@ private: void startCameraSteering(); void stopCameraSteering(); bool inCameraSteerMode(); - void scheduleTeleport(const LLVector3d& pos); - void cancelScheduledTeleport(); private: - friend class LLClickToTeleportTimer; - bool mMouseButtonDown; bool mMouseOutsideSlop; // for this drag, has mouse moved outside slop region S32 mMouseDownX; @@ -114,8 +109,6 @@ private: LLPointer mMouseSteerGrabPoint; bool mClockwise; bool mBlockClickToWalk; - bool mBlockClickToTeleport; - LLClickToTeleportTimer* mClickToTeleportTimer; LLUUID mMediaMouseCaptureID; LLPickInfo mPick; LLPickInfo mHoverPick; diff --git a/indra/newview/skins/default/xui/en/panel_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml index 5a70acddeb..cb547d7c6b 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml @@ -201,100 +201,64 @@ length="1" height="10" layout="topleft" - left="259" - name="single_click_lbl" - width="100" - top_pad="10"> - Single-Click + left="86" + name="single_click_action_lbl" + width="150" + top_pad="20"> + Single click on land: + + + + + - Double-Click + left="86" + name="double_click_action_lbl" + width="150" + top_pad="12"> + Double click on land: - - - - - - - - - - - - - - - - + + + + +