summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVadim ProductEngine <vsavchuk@productengine.com>2011-09-29 15:35:02 +0300
committerVadim ProductEngine <vsavchuk@productengine.com>2011-09-29 15:35:02 +0300
commitf6a8a2c5460c8f61b37154de01cd2f9575ef87de (patch)
tree59c2e544b5ad4164ea82c657a100c827e972403a
parentbcdd0b52dd3f0b2e0f5d7310526dca79aea7b146 (diff)
STORM-1612 WIP Implemented new click-to-walk/teleport preferences design.
-rw-r--r--indra/newview/app_settings/settings.xml11
-rwxr-xr-xindra/newview/llfloaterpreference.cpp103
-rw-r--r--indra/newview/llfloaterpreference.h16
-rw-r--r--indra/newview/lltoolpie.cpp127
-rw-r--r--indra/newview/lltoolpie.h7
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_move.xml132
6 files changed, 77 insertions, 319 deletions
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 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>ClickToTeleport</key>
- <map>
- <key>Comment</key>
- <string>Click in world to teleport to location</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>ShowOfferedInventory</key>
<map>
<key>Comment</key>
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<LLCheckBoxCtrl>("walk_to_chkbox");
- LLRadioGroup* walk_trigger_radio = getChild<LLRadioGroup>("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<LLCheckBoxCtrl>("teleport_to_chkbox");
- LLRadioGroup* teleport_trigger_radio = getChild<LLRadioGroup>("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<LLRadioGroup>("walk_trigger_radio");
- LLRadioGroup* teleport_trigger_radio = getChild<LLRadioGroup>("teleport_trigger_radio");
-
- walk_trigger_radio->setSelectedIndex(!teleport_trigger_radio->getSelectedIndex());
-}
-
-
-void LLFloaterPreference::fixTeleportRadioValue()
-{
- LLRadioGroup* walk_trigger_radio = getChild<LLRadioGroup>("walk_trigger_radio");
- LLRadioGroup* teleport_trigger_radio = getChild<LLRadioGroup>("teleport_trigger_radio");
-
- teleport_trigger_radio->setSelectedIndex(!walk_trigger_radio->getSelectedIndex());
}
void LLFloaterPreference::updateClickActionSettings()
{
- const bool walk_trigger_enabled = getChild<LLCheckBoxCtrl>("walk_to_chkbox")->getValue().asBoolean();
- const bool teleport_trigger_enabled = getChild<LLCheckBoxCtrl>("teleport_to_chkbox")->getValue().asBoolean();
-
- const bool walk_on_dbl_click = (bool) getChild<LLRadioGroup>("walk_trigger_radio")->getSelectedIndex();
- const bool teleport_on_dbl_click = (bool) getChild<LLRadioGroup>("teleport_trigger_radio")->getSelectedIndex();
+ const int single_clk_action = getChild<LLComboBox>("single_click_action_combo")->getValue().asInteger();
+ const int double_clk_action = getChild<LLComboBox>("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<LLCheckBoxCtrl>("walk_to_chkbox");
- LLCheckBoxCtrl* teleport_trigger_cb = getChild<LLCheckBoxCtrl>("teleport_to_chkbox");
-
- LLRadioGroup* walk_trigger_radio = getChild<LLRadioGroup>("walk_trigger_radio");
- LLRadioGroup* teleport_trigger_radio = getChild<LLRadioGroup>("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<LLComboBox>("single_click_action_combo")->setValue((int)click_to_walk);
+ getChild<LLComboBox>("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<LLViewerObject> 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<LLHudEffectBlob>, 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<LLHUDEffectBlob> 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:
</text>
+ <combo_box
+ height="23"
+ layout="topleft"
+ left_pad="10"
+ top_delta="-6"
+ name="single_click_action_combo"
+ width="200">
+ <combo_box.item
+ label="No action"
+ name="0"
+ value="0"/>
+ <combo_box.item
+ label="Move to clicked point"
+ name="1"
+ value="1"/>
+ <combo_box.commit_callback
+ function="Pref.ClickActionChange"/>
+ </combo_box>
<text
follows="left|top"
type="string"
length="1"
height="10"
layout="topleft"
- left="368"
- name="double_click_lbl"
- width="100"
- top_delta="0">
- Double-Click
+ left="86"
+ name="double_click_action_lbl"
+ width="150"
+ top_pad="12">
+ Double click on land:
</text>
- <check_box
- follows="left|top"
- height="20"
- label="Walk to Click Point:"
- layout="topleft"
- left="83"
- name="walk_to_chkbox"
- width="237"
- top_pad="7">
- <check_box.commit_callback
- function="Pref.CommitClickToWalkCheckbox"/>
- </check_box>
- <radio_group
- height="20"
- layout="topleft"
- left="280"
- top_delta="3"
- name="walk_trigger_radio"
- width="200">
- <radio_item
- height="16"
- label=""
- layout="topleft"
- left="0"
- name="walk_single_click"
- top_delta="20"
- width="110" />
- <radio_item
- height="16"
- label=""
- left_pad="0"
- layout="topleft"
- name="walk_double_click"
- top_delta="0"
- width="75" />
- <radio_group.commit_callback
- function="Pref.CommitWalkTriggerRadio"/>
- </radio_group>
- <check_box
- follows="left|top"
- height="20"
- label="Teleport to Click Point:"
- layout="topleft"
- left="83"
- name="teleport_to_chkbox"
- width="237"
- top_pad="0">
- <check_box.commit_callback
- function="Pref.CommitClickToTeleportCheckbox"/>
- </check_box>
- <radio_group
- height="20"
+ <combo_box
+ height="23"
layout="topleft"
- left="280"
- top_delta="3"
- name="teleport_trigger_radio"
+ left_pad="10"
+ top_delta="-6"
+ name="double_click_action_combo"
width="200">
- <radio_item
- height="16"
- label=""
- layout="topleft"
- left="0"
- name="teleport_single_click"
- top_delta="20"
- width="110" />
- <radio_item
- height="16"
- label=""
- left_pad="0"
- layout="topleft"
- name="teleport_double_click"
- top_delta="0"
- width="75" />
- <radio_group.commit_callback
- function="Pref.CommitTeleportTriggerRadio"/>
- </radio_group>
+ <combo_box.item
+ label="No action"
+ name="0"
+ value="0"/>
+ <combo_box.item
+ label="Move to clicked point"
+ name="1"
+ value="1"/>
+ <combo_box.item
+ label="Teleport to clicked point"
+ name="2"
+ value="2"/>
+ <combo_box.commit_callback
+ function="Pref.ClickActionChange"/>
+ </combo_box>
<button
height="23"
label="Other Devices"