summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/llui/llcommandmanager.cpp32
-rw-r--r--indra/llui/llcommandmanager.h16
-rw-r--r--indra/llui/lltoolbar.cpp233
-rw-r--r--indra/llui/lltoolbar.h22
-rw-r--r--indra/newview/app_settings/commands.xml126
-rw-r--r--indra/newview/lldndbutton.cpp9
-rw-r--r--indra/newview/lldndbutton.h5
-rw-r--r--indra/newview/llfloatertoybox.cpp18
-rw-r--r--indra/newview/llfloatertoybox.h5
-rw-r--r--indra/newview/lltoolbar.cpp365
-rw-r--r--indra/newview/lltoolbar.h82
-rw-r--r--indra/newview/skins/default/textures/textures.xml22
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_toolbar.xml47
-rw-r--r--indra/newview/skins/default/xui/en/floater_toybox.xml5
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml38
15 files changed, 433 insertions, 592 deletions
diff --git a/indra/llui/llcommandmanager.cpp b/indra/llui/llcommandmanager.cpp
index 306b357d6a..6be616b980 100644
--- a/indra/llui/llcommandmanager.cpp
+++ b/indra/llui/llcommandmanager.cpp
@@ -72,9 +72,15 @@ LLCommandManager::LLCommandManager()
LLCommandManager::~LLCommandManager()
{
+ for (CommandVector::iterator cmdIt = mCommands.begin(); cmdIt != mCommands.end(); ++cmdIt)
+ {
+ LLCommand * command = *cmdIt;
+
+ delete command;
+ }
}
-U32 LLCommandManager::count() const
+U32 LLCommandManager::commandCount() const
{
return mCommands.size();
}
@@ -88,20 +94,24 @@ LLCommand * LLCommandManager::getCommand(const std::string& commandName)
{
LLCommand * command_name_match = NULL;
- for (CommandVector::iterator it = mCommands.begin(); it != mCommands.end(); ++it)
+ CommandIndexMap::const_iterator found = mCommandIndices.find(commandName);
+
+ if (found != mCommandIndices.end())
{
- LLCommand * command = *it;
-
- if (command->name() == commandName)
- {
- command_name_match = command;
- break;
- }
+ command_name_match = mCommands[found->second];
}
return command_name_match;
}
+void LLCommandManager::addCommand(LLCommand * command)
+{
+ mCommandIndices[command->name()] = mCommands.size();
+ mCommands.push_back(command);
+
+ llinfos << "Successfully added command: " << command->name() << llendl;
+}
+
//static
bool LLCommandManager::load()
{
@@ -129,9 +139,7 @@ bool LLCommandManager::load()
{
LLCommand * command = new LLCommand(commandParams);
- mgr.mCommands.push_back(command);
-
- llinfos << "Successfully loaded command: " << command->name() << llendl;
+ mgr.addCommand(command);
}
return true;
diff --git a/indra/llui/llcommandmanager.h b/indra/llui/llcommandmanager.h
index 4f3c9b2ada..24378ecd62 100644
--- a/indra/llui/llcommandmanager.h
+++ b/indra/llui/llcommandmanager.h
@@ -24,8 +24,8 @@
* $/LicenseInfo$
*/
-#ifndef LL_COMMANDMANAGER_H
-#define LL_COMMANDMANAGER_H
+#ifndef LL_LLCOMMANDMANAGER_H
+#define LL_LLCOMMANDMANAGER_H
#include "llinitparam.h"
#include "llsingleton.h"
@@ -82,16 +82,22 @@ public:
LLCommandManager();
~LLCommandManager();
- U32 count() const;
+ U32 commandCount() const;
LLCommand * getCommand(U32 commandIndex);
LLCommand * getCommand(const std::string& commandName);
static bool load();
+protected:
+ void addCommand(LLCommand * command);
+
private:
+ typedef std::map<std::string, U32> CommandIndexMap;
typedef std::vector<LLCommand *> CommandVector;
- CommandVector mCommands;
+
+ CommandVector mCommands;
+ CommandIndexMap mCommandIndices;
};
-#endif // LL_COMMANDMANAGER_H
+#endif // LL_LLCOMMANDMANAGER_H
diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
index 167dbfcc47..e052c1c876 100644
--- a/indra/llui/lltoolbar.cpp
+++ b/indra/llui/lltoolbar.cpp
@@ -27,9 +27,12 @@
#include "linden_common.h"
-#include "boost/foreach.hpp"
+#include <boost/foreach.hpp>
#include "lltoolbar.h"
+#include "llcommandmanager.h"
+#include "lltrans.h"
+
static LLDefaultChildRegistry::Register<LLToolBar> r1("toolbar");
namespace LLToolBarEnums
@@ -55,8 +58,8 @@ LLToolBar::Params::Params()
button_icon("button_icon"),
button_icon_and_text("button_icon_and_text"),
wrap("wrap", true),
- min_width("min_width", 0),
- max_width("max_width", S32_MAX),
+ min_button_width("min_button_width", 0),
+ max_button_width("max_button_width", S32_MAX),
background_image("background_image")
{}
@@ -68,10 +71,12 @@ LLToolBar::LLToolBar(const LLToolBar::Params& p)
mNeedsLayout(false),
mCenterPanel(NULL),
mCenteringStack(NULL),
- mMinWidth(p.min_width),
- mMaxWidth(p.max_width),
+ mMinButtonWidth(p.min_button_width),
+ mMaxButtonWidth(p.max_button_width),
mBackgroundImage(p.background_image)
{
+ mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_ONLY] = p.button_icon;
+ mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_WITH_TEXT] = p.button_icon_and_text;
}
void LLToolBar::initFromParams(const LLToolBar::Params& p)
@@ -109,120 +114,192 @@ void LLToolBar::initFromParams(const LLToolBar::Params& p)
mCenteringStack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p));
- addRow();
-
BOOST_FOREACH (LLToolBarButton::Params button_p, p.buttons)
{
+ // buttons always follow left and top, for all orientations
+ button_p.follows.flags = FOLLOWS_LEFT|FOLLOWS_TOP;
+ button_p.fillFrom(mButtonParams[mButtonType]);
+
LLRect button_rect(button_p.rect);
{ // remove any offset from button
if (orientation == LLLayoutStack::HORIZONTAL)
{
- button_rect.setOriginAndSize(0, 0, mMinWidth, getRect().getHeight());
+ button_rect.setOriginAndSize(0, 0, mMinButtonWidth, button_rect.getHeight());
}
else // VERTICAL
{
- button_rect.setOriginAndSize(0, 0, mMinWidth, button_rect.getHeight());
+ button_rect.setOriginAndSize(0, 0, mMinButtonWidth, button_rect.getHeight());
}
}
- button_p.fillFrom((mButtonType == BTNTYPE_ICONS_ONLY)
- ? p.button_icon // icon only
- : p.button_icon_and_text); // icon + text
+ // use our calculated rect
+ button_p.rect = button_rect;
+ LLToolBarButton* buttonp = LLUICtrlFactory::create<LLToolBarButton>(button_p);
+
+ mButtons.push_back(buttonp);
+ mCenterPanel->addChild(buttonp);
- mButtons.push_back(LLUICtrlFactory::create<LLToolBarButton>(button_p));
mNeedsLayout = true;
}
-
- updateLayout();
}
-void LLToolBar::addButton(LLToolBarButton* buttonp)
+bool LLToolBar::addCommand(LLCommand * command)
{
- LLLayoutPanel::Params panel_p;
- panel_p.name = buttonp->getName() + "_panel";
- panel_p.user_resize = false;
- panel_p.auto_resize= false;
- panel_p.fit_content = true;
+ //
+ // Init basic toolbar button params
+ //
- LLLayoutPanel* panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
-
- panel->addChild(buttonp);
- mStacks.back()->addChild(panel);
+ LLToolBarButton::Params button_p;
+ button_p.fillFrom(mButtonParams[mButtonType]);
+
+ button_p.name = command->name();
+ button_p.label = LLTrans::getString(command->labelRef());
+ button_p.tool_tip = LLTrans::getString(command->tooltipRef());
+
+ //
+ // Set up the button rectangle
+ //
+
+ S32 btn_width = mMinButtonWidth;
+ S32 btn_height = mButtonParams[mButtonType].rect.height;
+
+ if ((mSideType == LLToolBarEnums::SIDE_BOTTOM) || (mSideType == LLToolBarEnums::SIDE_TOP))
+ {
+ btn_height = getRect().getHeight();
+ }
+
+ LLRect button_rect;
+ button_rect.setOriginAndSize(0, 0, btn_width, btn_height);
+
+ button_p.rect = button_rect;
+
+ //
+ // Add it to the list of buttons
+ //
+
+ LLToolBarButton * toolbar_button = LLUICtrlFactory::create<LLToolBarButton>(button_p);
+
+ toolbar_button->reshape(llclamp(toolbar_button->getRect().getWidth(), mMinButtonWidth, mMaxButtonWidth), toolbar_button->getRect().getHeight());
+
+ mButtons.push_back(toolbar_button);
+ mCenterPanel->addChild(toolbar_button);
+
+ mNeedsLayout = true;
+
+ return true;
}
-void LLToolBar::updateLayout()
+void LLToolBar::updateLayoutAsNeeded()
{
- mCenteringStack->updateLayout();
-
if (!mNeedsLayout) return;
- mNeedsLayout = false;
- { // clean up existing rows
+ LLLayoutStack::ELayoutOrientation orientation = getOrientation(mSideType);
+
+ // our terminology for orientation-agnostic layout is that
+ // length refers to a distance in the direction we stack the buttons
+ // and girth refers to a distance in the direction buttons wrap
+ S32 row_running_length = 0;
+ S32 max_length = (orientation == LLLayoutStack::HORIZONTAL)
+ ? getRect().getWidth()
+ : getRect().getHeight();
+ S32 max_row_girth = 0;
+ S32 cur_start = 0;
+ S32 cur_row = 0;
+
+ LLRect panel_rect = mCenterPanel->getLocalRect();
+
+ std::vector<LLToolBarButton*> buttons_in_row;
+
BOOST_FOREACH(LLToolBarButton* button, mButtons)
{
- if (button->getParent())
+ S32 button_clamped_width = llclamp(button->getRect().getWidth(), mMinButtonWidth, mMaxButtonWidth);
+ S32 button_length = (orientation == LLLayoutStack::HORIZONTAL)
+ ? button_clamped_width
+ : button->getRect().getHeight();
+ S32 button_girth = (orientation == LLLayoutStack::HORIZONTAL)
+ ? button->getRect().getHeight()
+ : button_clamped_width;
+
+ // handle wrapping
+ if (row_running_length + button_length > max_length
+ && cur_start != 0) // not first button in row
+ { // go ahead and wrap
+ if (orientation == LLLayoutStack::VERTICAL)
{
- button->getParent()->removeChild(button);
+ // row girth is clamped to allowable button widths
+ max_row_girth = llclamp(max_row_girth, mMinButtonWidth, mMaxButtonWidth);
}
+ // make buttons in current row all same girth
+ BOOST_FOREACH(LLToolBarButton* button, buttons_in_row)
+ {
+ if (orientation == LLLayoutStack::HORIZONTAL)
+ {
+ button->reshape(llclamp(button->getRect().getWidth(), mMinButtonWidth, mMaxButtonWidth), max_row_girth);
}
-
- BOOST_FOREACH(LLLayoutStack* stack, mStacks)
+ else // VERTICAL
{
- delete stack;
+ button->reshape(max_row_girth, button->getRect().getHeight());
+ }
}
- mStacks.clear();
+ buttons_in_row.clear();
+
+ row_running_length = 0;
+ cur_start = 0;
+ cur_row += max_row_girth;
+ max_row_girth = 0;
}
- // start with one row of buttons
- addRow();
- S32 total_width = 0, total_height = 0;
- S32 max_total_width = 0, max_total_height = 0;
- S32 max_width = getRect().getWidth(), max_height = getRect().getHeight();
- BOOST_FOREACH(LLToolBarButton* button, mButtons)
+ LLRect button_rect;
+ if (orientation == LLLayoutStack::HORIZONTAL)
{
- S32 button_width = button->getRect().getWidth();
- S32 button_height = button->getRect().getHeight();
-
- if (getOrientation(mSideType) == LLLayoutStack::HORIZONTAL
- && total_width + button_height > getRect().getWidth())
+ button_rect.setLeftTopAndSize(cur_start, panel_rect.mTop - cur_row, button_clamped_width, button->getRect().getHeight());
+ }
+ else // VERTICAL
{
- addRow();
- total_width = 0;
+ button_rect.setLeftTopAndSize(cur_row, panel_rect.mTop - cur_start, button_clamped_width, button->getRect().getHeight());
}
- addButton(button);
-
- total_width += button_width;
- total_height += button_height;
- max_total_width = llmax(max_total_width, total_width);
- max_total_height = llmax(max_total_height, total_height);
- max_width = llmax(button->getRect().getWidth(), max_width);
- max_height = llmax(button->getRect().getHeight(), max_height);
+ button->setShape(button_rect);
+
+ buttons_in_row.push_back(button);
+
+ row_running_length += button_length;
+ cur_start = row_running_length;
+ max_row_girth = llmax(button_girth, max_row_girth);
}
- if (getOrientation(mSideType) == LLLayoutStack::HORIZONTAL)
+ // final resizing in "girth" direction
+ S32 total_girth = cur_row + max_row_girth; // increment by size of final row
+
+ // grow and optionally shift toolbar to accomodate buttons
+ if (orientation == LLLayoutStack::HORIZONTAL)
{
- BOOST_FOREACH(LLLayoutStack* stack, mStacks)
- {
- stack->reshape(max_total_width, stack->getParent()->getRect().getHeight());
- stack->updateLayout();
+ if (mSideType == SIDE_TOP)
+ { // shift down to maintain top edge
+ translate(0, getRect().getHeight() - total_girth);
}
+
+ reshape(getRect().getWidth(), total_girth);
}
- else
+ else // VERTICAL
{
- BOOST_FOREACH(LLLayoutStack* stack, mStacks)
- {
- stack->reshape(stack->getParent()->getRect().getWidth(), max_total_height);
- stack->updateLayout();
+ if (mSideType == SIDE_RIGHT)
+ { // shift left to maintain right edge
+ translate(getRect().getWidth() - total_girth, 0);
+ }
+ reshape(total_girth, getRect().getHeight());
}
- reshape(max_total_width, getRect().getHeight());
- }
+ // recenter toolbar buttons
+ mCenteringStack->updateLayout();
+
+ // don't clear flag until after we've resized ourselves, to avoid laying out every frame
+ mNeedsLayout = false;
}
void LLToolBar::draw()
{
- updateLayout();
+ updateLayoutAsNeeded();
{ // draw background
LLRect bg_rect;
@@ -232,22 +309,6 @@ void LLToolBar::draw()
LLUICtrl::draw();
}
-void LLToolBar::addRow()
-{
- LLLayoutStack::ELayoutOrientation orientation = getOrientation(mSideType);
-
- LLLayoutStack::Params stack_p;
- stack_p.rect = getLocalRect();
- stack_p.name = llformat("button_stack_%d", mStacks.size());
- stack_p.orientation = orientation;
- stack_p.follows.flags = (orientation == LLLayoutStack::HORIZONTAL)
- ? (FOLLOWS_TOP|FOLLOWS_BOTTOM) // horizontal
- : (FOLLOWS_LEFT|FOLLOWS_RIGHT); // vertical
-
- mStacks.push_back(LLUICtrlFactory::create<LLLayoutStack>(stack_p));
- mCenterPanel->addChild(mStacks.back());
-}
-
void LLToolBar::reshape(S32 width, S32 height, BOOL called_from_parent)
{
LLUICtrl::reshape(width, height, called_from_parent);
diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h
index 3a593e42d9..85cd6d5170 100644
--- a/indra/llui/lltoolbar.h
+++ b/indra/llui/lltoolbar.h
@@ -33,6 +33,9 @@
#include "llbutton.h"
+class LLCommand;
+
+
class LLToolBarButton : public LLButton
{
public:
@@ -50,6 +53,8 @@ namespace LLToolBarEnums
{
BTNTYPE_ICONS_ONLY = 0,
BTNTYPE_ICONS_WITH_TEXT,
+
+ BTNTYPE_COUNT
};
enum SideType
@@ -93,8 +98,8 @@ public:
button_icon_and_text;
Optional<bool> wrap;
- Optional<S32> min_width,
- max_width;
+ Optional<S32> min_button_width,
+ max_button_width;
// get rid of this
Multiple<LLToolBarButton::Params> buttons;
@@ -107,16 +112,16 @@ public:
void draw();
void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+ bool addCommand(LLCommand * command);
+
protected:
friend class LLUICtrlFactory;
LLToolBar(const Params&);
void initFromParams(const Params&);
- void addButton(LLToolBarButton* buttonp);
- void updateLayout();
private:
- void addRow();
+ void updateLayoutAsNeeded();
std::list<LLToolBarButton*> mButtons;
LLToolBarEnums::ButtonType mButtonType;
@@ -125,13 +130,14 @@ private:
LLLayoutPanel* mCenterPanel;
LLToolBarEnums::SideType mSideType;
- std::vector<LLLayoutStack*> mStacks;
bool mWrap;
bool mNeedsLayout;
- S32 mMinWidth,
- mMaxWidth;
+ S32 mMinButtonWidth,
+ mMaxButtonWidth;
LLUIImagePtr mBackgroundImage;
+
+ LLToolBarButton::Params mButtonParams[LLToolBarEnums::BTNTYPE_COUNT];
};
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
index 8e45e866ca..5cb8ddffcd 100644
--- a/indra/newview/app_settings/commands.xml
+++ b/indra/newview/app_settings/commands.xml
@@ -7,6 +7,83 @@
function="Floater.ToolbarToggle"
param="avatar"
/>
+ <command name="build"
+ icon="Command_Build_Icon"
+ label_ref="Command_Build_Label"
+ tooltip_ref="Command_Build_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="build"
+ />
+ <command name="chat"
+ icon="Command_Chat_Icon"
+ label_ref="Command_Chat_Label"
+ tooltip_ref="Command_Chat_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="chat"
+ />
+ <command name="compass"
+ icon="Command_Compass_Icon"
+ label_ref="Command_Compass_Label"
+ tooltip_ref="Command_Compass_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="compass"
+ />
+ <command name="gestures"
+ icon="Command_Gestures_Icon"
+ label_ref="Command_Gestures_Label"
+ tooltip_ref="Command_Gestures_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="gestures"
+ />
+ <command name="howto"
+ icon="Command_HowTo_Icon"
+ label_ref="Command_HowTo_Label"
+ tooltip_ref="Command_HowTo_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="howto"
+ />
+ <command name="landmarks"
+ icon="Command_Landmarks_Icon"
+ label_ref="Command_Landmarks_Label"
+ tooltip_ref="Command_Landmarks_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="landmarks"
+ />
+ <command name="map"
+ icon="Command_Map_Icon"
+ label_ref="Command_Map_Label"
+ tooltip_ref="Command_Map_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="map"
+ />
+ <command name="move"
+ icon="Command_Move_Icon"
+ label_ref="Command_Move_Label"
+ tooltip_ref="Command_Move_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="move"
+ />
+ <command name="myland"
+ icon="Command_MyLand_Icon"
+ label_ref="Command_MyLand_Label"
+ tooltip_ref="Command_MyLand_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="myland"
+ />
+ <command name="mystuff"
+ icon="Command_MyStuff_Icon"
+ label_ref="Command_MyStuff_Label"
+ tooltip_ref="Command_MyStuff_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="mystuff"
+ />
+ <command name="people"
+ icon="Command_People_Icon"
+ label_ref="Command_People_Label"
+ tooltip_ref="Command_People_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="people"
+ />
<command name="places"
icon="Command_Places_Icon"
label_ref="Command_Places_Label"
@@ -14,4 +91,53 @@
function="Floater.ToolbarToggle"
param="places"
/>
+ <command name="search"
+ icon="Command_Search_Icon"
+ label_ref="Command_Search_Label"
+ tooltip_ref="Command_Search_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="search"
+ />
+ <command name="settings"
+ icon="Command_Settings_Icon"
+ label_ref="Command_Settings_Label"
+ tooltip_ref="Command_Settings_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="settings"
+ />
+ <command name="shop"
+ icon="Command_Shop_Icon"
+ label_ref="Command_Shop_Label"
+ tooltip_ref="Command_Shop_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="shop"
+ />
+ <command name="snapshot"
+ icon="Command_Snapshot_Icon"
+ label_ref="Command_Snapshot_Label"
+ tooltip_ref="Command_Snapshot_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="snapshot"
+ />
+ <command name="speak"
+ icon="Command_Speak_Icon"
+ label_ref="Command_Speak_Label"
+ tooltip_ref="Command_Speak_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="speak"
+ />
+ <command name="upload"
+ icon="Command_Upload_Icon"
+ label_ref="Command_Upload_Label"
+ tooltip_ref="Command_Upload_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="upload"
+ />
+ <command name="view"
+ icon="Command_View_Icon"
+ label_ref="Command_View_Label"
+ tooltip_ref="Command_View_Tooltip"
+ function="Floater.ToolbarToggle"
+ param="view"
+ />
</commands>
diff --git a/indra/newview/lldndbutton.cpp b/indra/newview/lldndbutton.cpp
index 8a38c8a643..7c9dda6b1d 100644
--- a/indra/newview/lldndbutton.cpp
+++ b/indra/newview/lldndbutton.cpp
@@ -31,16 +31,9 @@
static LLDefaultChildRegistry::Register<LLDragAndDropButton> r("dnd_button");
-LLDragAndDropButton::Params::Params()
-{
-
-}
-
LLDragAndDropButton::LLDragAndDropButton(const Params& params)
: LLButton(params)
-{
-
-}
+{}
BOOL LLDragAndDropButton::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, EAcceptance* accept, std::string& tooltip_msg)
{
diff --git a/indra/newview/lldndbutton.h b/indra/newview/lldndbutton.h
index 0642cbb7b9..53ea2f5ea7 100644
--- a/indra/newview/lldndbutton.h
+++ b/indra/newview/lldndbutton.h
@@ -43,10 +43,7 @@
class LLDragAndDropButton : public LLButton
{
public:
- struct Params : public LLInitParam::Block<Params, LLButton::Params>
- {
- Params();
- };
+ struct Params : public LLInitParam::Block<Params, LLButton::Params> {};
LLDragAndDropButton(const Params& params);
diff --git a/indra/newview/llfloatertoybox.cpp b/indra/newview/llfloatertoybox.cpp
index b4fb2e45ab..eaaaeb3357 100644
--- a/indra/newview/llfloatertoybox.cpp
+++ b/indra/newview/llfloatertoybox.cpp
@@ -29,12 +29,15 @@
#include "llfloatertoybox.h"
#include "llbutton.h"
+#include "llcommandmanager.h"
#include "llpanel.h"
+#include "lltoolbar.h"
LLFloaterToybox::LLFloaterToybox(const LLSD& key)
: LLFloater(key)
, mBtnRestoreDefaults(NULL)
+ , mToolBar(NULL)
{
mCommitCallbackRegistrar.add("Toybox.RestoreDefaults", boost::bind(&LLFloaterToybox::onBtnRestoreDefaults, this));
}
@@ -48,23 +51,20 @@ BOOL LLFloaterToybox::postBuild()
center();
mBtnRestoreDefaults = getChild<LLButton>("btn_restore_defaults");
+ mToolBar = getChild<LLToolBar>("toybox_toolbar");
//
// Create Buttons
//
-/*
- LLToyboxButtons::load();
- for (size_t i = 0; i < LLToyboxButtons::buttonCount(); i++)
- {
- LLToyboxButton * button = LLToyboxButtons::get(i);
+ LLCommandManager& cmdMgr = LLCommandManager::instance();
- // Panel opacity depends on whether or not button position is established
- LLPanel * buttonPanel = createPanelForButton(button);
+ for (U32 i = 0; i < cmdMgr.commandCount(); i++)
+ {
+ LLCommand * command = cmdMgr.getCommand(i);
- mToolBar->add(buttonPanel);
+ mToolBar->addCommand(command);
}
-*/
return TRUE;
}
diff --git a/indra/newview/llfloatertoybox.h b/indra/newview/llfloatertoybox.h
index bb9392a0e3..3574e060bf 100644
--- a/indra/newview/llfloatertoybox.h
+++ b/indra/newview/llfloatertoybox.h
@@ -31,10 +31,10 @@
class LLButton;
+class LLToolBar;
-class LLFloaterToybox
-: public LLFloater
+class LLFloaterToybox : public LLFloater
{
public:
LLFloaterToybox(const LLSD& key);
@@ -53,6 +53,7 @@ protected:
public:
LLButton * mBtnRestoreDefaults;
+ LLToolBar * mToolBar;
};
#endif // LL_LLFLOATERTOYBOX_H
diff --git a/indra/newview/lltoolbar.cpp b/indra/newview/lltoolbar.cpp
deleted file mode 100644
index c4f599561d..0000000000
--- a/indra/newview/lltoolbar.cpp
+++ /dev/null
@@ -1,365 +0,0 @@
-/**
- * @file lltoolbar.cpp
- * @author James Cook, Richard Nelson
- * @brief Large friendly buttons at bottom of screen.
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "lltoolbar.h"
-
-#include "imageids.h"
-#include "llfloaterreg.h"
-#include "llfontgl.h"
-#include "llflyoutbutton.h"
-#include "llrect.h"
-#include "llparcel.h"
-
-#include "llagent.h"
-#include "llagentwearables.h"
-#include "llbutton.h"
-#include "llfocusmgr.h"
-#include "llviewercontrol.h"
-#include "llmenucommands.h"
-#include "llimview.h"
-#include "lluiconstants.h"
-#include "llvoavatarself.h"
-#include "lltooldraganddrop.h"
-#include "llfloaterinventory.h"
-#include "llfloaterchatterbox.h"
-#include "llfloatersnapshot.h"
-#include "llinventorypanel.h"
-#include "lltoolmgr.h"
-#include "llui.h"
-#include "llviewermenu.h"
-//#include "llfirstuse.h"
-#include "llpanelblockedlist.h"
-#include "llscrolllistctrl.h"
-#include "llscrolllistitem.h"
-#include "llscrolllistcell.h"
-#include "llviewerparcelmgr.h"
-#include "lluictrlfactory.h"
-#include "llviewerwindow.h"
-#include "lltoolgrab.h"
-#include "llcombobox.h"
-#include "lllayoutstack.h"
-
-#if LL_DARWIN
-
- #include "llresizehandle.h"
-
-#endif // LL_DARWIN
-
-//
-// Globals
-//
-
-LLToolBar *gToolBar = NULL;
-
-//
-// Statics
-//
-F32 LLToolBar::sInventoryAutoOpenTime = 1.f;
-
-//
-// Functions
-//
-
-LLToolBar::LLToolBar()
- : LLPanel(),
-
- mInventoryAutoOpen(FALSE),
- mNumUnreadIMs(0)
-#if LL_DARWIN
- , mResizeHandle(NULL)
-#endif // LL_DARWIN
-{
- setIsChrome(TRUE);
- setFocusRoot(TRUE);
-
- mCommitCallbackRegistrar.add("HandleCommunicate", &LLToolBar::onClickCommunicate);
-}
-
-
-BOOL LLToolBar::postBuild()
-{
- for (child_list_const_iter_t child_iter = getChildList()->begin();
- child_iter != getChildList()->end(); ++child_iter)
- {
- LLView *view = *child_iter;
- LLButton* buttonp = dynamic_cast<LLButton*>(view);
- if(buttonp)
- {
- buttonp->setSoundFlags(LLView::SILENT);
- }
- }
-
-#if LL_DARWIN
- if(mResizeHandle == NULL)
- {
- LLRect rect(0, 0, RESIZE_HANDLE_WIDTH, RESIZE_HANDLE_HEIGHT);
- LLResizeHandle::Params p;
- p.name("");
- p.rect(rect);
- p.min_width(RESIZE_HANDLE_WIDTH);
- p.min_height(RESIZE_HANDLE_HEIGHT);
- p.enabled(false);
- mResizeHandle = LLUICtrlFactory::create<LLResizeHandle>(p);
- addChildInBack(mResizeHandle);
- LLLayoutStack* toolbar_stack = getChild<LLLayoutStack>("toolbar_stack");
- toolbar_stack->reshape(toolbar_stack->getRect().getWidth() - RESIZE_HANDLE_WIDTH, toolbar_stack->getRect().getHeight());
- }
-#endif // LL_DARWIN
-
- layoutButtons();
-
- return TRUE;
-}
-
-LLToolBar::~LLToolBar()
-{
- // LLView destructor cleans up children
-}
-
-
-BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
- LLButton* inventory_btn = getChild<LLButton>("inventory_btn");
- if (!inventory_btn) return FALSE;
-
- LLRect button_screen_rect;
- inventory_btn->localRectToScreen(inventory_btn->getRect(),&button_screen_rect);
-
- const LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
- if(active_panel)
- {
- mInventoryAutoOpen = FALSE;
- }
- else if (button_screen_rect.pointInRect(x, y))
- {
- if (mInventoryAutoOpen)
- {
- if (!active_panel &&
- mInventoryAutoOpenTimer.getElapsedTimeF32() > sInventoryAutoOpenTime)
- {
- LLFloaterInventory::showAgentInventory();
- }
- }
- else
- {
- mInventoryAutoOpen = TRUE;
- mInventoryAutoOpenTimer.reset();
- }
- }
-
- return LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
-}
-
-// static
-void LLToolBar::toggle(void*)
-{
- BOOL show = gSavedSettings.getBOOL("ShowToolBar");
- gSavedSettings.setBOOL("ShowToolBar", !show);
- gToolBar->setVisible(!show);
-}
-
-
-// static
-BOOL LLToolBar::visible(void*)
-{
- return gToolBar->getVisible();
-}
-
-
-void LLToolBar::layoutButtons()
-{
-#if LL_DARWIN
- const S32 FUDGE_WIDTH_OF_SCREEN = 4;
- S32 width = gViewerWindow->getWindowWidthScaled() + FUDGE_WIDTH_OF_SCREEN;
- S32 pad = 2;
-
- // this function may be called before postBuild(), in which case mResizeHandle won't have been set up yet.
- if(mResizeHandle != NULL)
- {
- // Only when running in windowed mode on the Mac, leave room for a resize widget on the right edge of the bar.
- width -= RESIZE_HANDLE_WIDTH;
-
- LLRect r;
- r.mLeft = width - pad;
- r.mBottom = 0;
- r.mRight = r.mLeft + RESIZE_HANDLE_WIDTH;
- r.mTop = r.mBottom + RESIZE_HANDLE_HEIGHT;
- mResizeHandle->setRect(r);
- mResizeHandle->setVisible(TRUE);
- }
-#endif // LL_DARWIN
-}
-
-
-// virtual
-void LLToolBar::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
- LLPanel::reshape(width, height, called_from_parent);
-
- layoutButtons();
-}
-
-
-// Per-frame updates of visibility
-void LLToolBar::refresh()
-{
- BOOL show = gSavedSettings.getBOOL("ShowToolBar");
- BOOL mouselook = gAgent.cameraMouselook();
- setVisible(show && !mouselook);
-
- if (isInVisibleChain())
- {
- updateCommunicateList();
- }
-}
-
-void LLToolBar::updateCommunicateList()
-{
- LLFlyoutButton* communicate_button = getChild<LLFlyoutButton>("communicate_btn");
- LLSD selected = communicate_button->getValue();
-
- communicate_button->removeall();
-
- //LLFloater* frontmost_floater = LLFloaterChatterBox::getInstance()->getActiveFloater();
- LLScrollListItem* itemp = NULL;
-
- LLSD contact_sd;
- contact_sd["value"] = "contacts";
- /*contact_sd["columns"][0]["value"] = LLFloaterMyFriends::getInstance()->getShortTitle();
- if (LLFloaterMyFriends::getInstance() == frontmost_floater)
- {
- contact_sd["columns"][0]["font"]["name"] = "SANSSERIF_SMALL";
- contact_sd["columns"][0]["font"]["style"] = "BOLD";
- // make sure current tab is selected in list
- if (selected.isUndefined())
- {
- selected = "contacts";
- }
- }*/
- itemp = communicate_button->addElement(contact_sd, ADD_TOP);
-
- communicate_button->addSeparator(ADD_TOP);
- communicate_button->add(getString("Redock Windows"), LLSD("redock"), ADD_TOP);
- communicate_button->addSeparator(ADD_TOP);
- communicate_button->add(getString("Blocked List"), LLSD("mute list"), ADD_TOP);
-
- std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it;
-
- /*if (gIMMgr->getIMFloaterHandles().size() > 0)
- {
- communicate_button->addSeparator(ADD_TOP);
- }
-
- for(floater_handle_it = gIMMgr->getIMFloaterHandles().begin(); floater_handle_it != gIMMgr->getIMFloaterHandles().end(); ++floater_handle_it)
- {
- LLFloaterIMPanel* im_floaterp = (LLFloaterIMPanel*)floater_handle_it->get();
- if (im_floaterp)
- {
- std::string floater_title = im_floaterp->getNumUnreadMessages() > 0 ? "*" : "";
- floater_title.append(im_floaterp->getShortTitle());
- LLSD im_sd;
- im_sd["value"] = im_floaterp->getSessionID();
- im_sd["columns"][0]["value"] = floater_title;
- if (im_floaterp == frontmost_floater)
- {
- im_sd["columns"][0]["font"]["name"] = "SANSSERIF_SMALL";
- im_sd["columns"][0]["font"]["style"] = "BOLD";
- if (selected.isUndefined())
- {
- selected = im_floaterp->getSessionID();
- }
- }
- itemp = communicate_button->addElement(im_sd, ADD_TOP);
- }
- }*/
-
- communicate_button->setValue(selected);
-}
-
-
-// static
-void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, const LLSD& user_data)
-{
- LLFlyoutButton* communicate_button = dynamic_cast<LLFlyoutButton*>(ctrl);
- llassert_always(communicate_button);
-
- LLSD selected_option = communicate_button->getValue();
-
- if (selected_option.asString() == "contacts")
- {
- LLFloaterReg::showInstance("contacts", "friends");
- }
- else if (selected_option.asString() == "local chat")
- {
- LLFloaterReg::showInstance("communicate", "local");
- }
- else if (selected_option.asString() == "redock")
- {
- /*LLFloaterChatterBox* chatterbox_instance = LLFloaterChatterBox::getInstance();
- if(chatterbox_instance)
- {
- chatterbox_instance->addFloater(LLFloaterMyFriends::getInstance(), FALSE);
-
- LLUUID session_to_show;
-
- std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it;
- for(floater_handle_it = gIMMgr->getIMFloaterHandles().begin(); floater_handle_it != gIMMgr->getIMFloaterHandles().end(); ++floater_handle_it)
- {
- LLFloater* im_floaterp = floater_handle_it->get();
- if (im_floaterp)
- {
- if (im_floaterp->isFrontmost())
- {
- session_to_show = ((LLFloaterIMPanel*)im_floaterp)->getSessionID();
- }
- chatterbox_instance->addFloater(im_floaterp, FALSE);
- }
- }
- LLFloaterReg::showInstance("communicate", session_to_show);
- }*/
- }
- else if (selected_option.asString() == "mute list")
- {
- LLPanelBlockedList::showPanelAndSelect(LLUUID::null);
- }
- else if (selected_option.isUndefined()) // user just clicked the communicate button, treat as toggle
- {
- /*LLFloaterReg::toggleInstance("communicate");*/
- }
- else // otherwise selection_option is undifined or a specific IM session id
- {
- /*LLFloaterReg::showInstance("communicate", selected_option);*/
- }
-}
-
-
diff --git a/indra/newview/lltoolbar.h b/indra/newview/lltoolbar.h
deleted file mode 100644
index 217b3c0ac8..0000000000
--- a/indra/newview/lltoolbar.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * @file lltoolbar.h
- * @brief Large friendly buttons at bottom of screen.
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLTOOLBAR_H
-#define LL_LLTOOLBAR_H
-
-#include "llpanel.h"
-
-#include "llframetimer.h"
-
-class LLResizeHandle;
-
-class LLToolBar
-: public LLPanel
-{
-public:
- LLToolBar();
- ~LLToolBar();
-
- /*virtual*/ BOOL postBuild();
-
- /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg);
-
- /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
-
- static void toggle(void*);
- static BOOL visible(void*);
-
- // Move buttons to appropriate locations based on rect.
- void layoutButtons();
-
- // Per-frame refresh call
- void refresh();
-
- // callbacks
- static void onClickCommunicate(LLUICtrl*, const LLSD&);
-
- static F32 sInventoryAutoOpenTime;
-
-private:
- void updateCommunicateList();
-
-
-private:
- BOOL mInventoryAutoOpen;
- LLFrameTimer mInventoryAutoOpenTimer;
- S32 mNumUnreadIMs;
-#if LL_DARWIN
- LLResizeHandle *mResizeHandle;
-#endif // LL_DARWIN
-};
-
-extern LLToolBar *gToolBar;
-
-#endif
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 598e39730c..d68594097c 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -125,8 +125,26 @@ with the same filename but different name
<texture name="Checkbox_Press" file_name="widgets/Checkbox_Press.png" preload="true" />
<texture name="Check_Mark" file_name="icons/check_mark" preload="true" />
- <texture name="Command_Avatar_Icon" file_name="icons/SL_Logo.png" preload="true" />
- <texture name="Command_Places_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_Avatar_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_Build_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_Chat_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_Compass_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_Gestures_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_HowTo_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_Landmarks_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_Map_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_Move_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_MyLand_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_MyStuff_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_People_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_Places_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_Search_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_Settings_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_Shop_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_Snapshot_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_Speak_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_Upload_Icon" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="Command_View_Icon" file_name="icons/SL_Logo.png" preload="true" />
<texture name="ComboButton_Disabled" file_name="widgets/ComboButton_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
diff --git a/indra/newview/skins/default/xui/en/floater_test_toolbar.xml b/indra/newview/skins/default/xui/en/floater_test_toolbar.xml
index 138322eca7..85f0f104fc 100644
--- a/indra/newview/skins/default/xui/en/floater_test_toolbar.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_toolbar.xml
@@ -7,33 +7,64 @@
name="floater_test_toolbar"
translate="false"
width="500">
- <toolbar name="test_toolbar_horizontal"
+ <toolbar name="test_toolbar_top"
follows="left|right|top"
height="50"
width="500"
left="0"
top="20"
+ min_width="100"
side="top">
<button auto_resize="true"
- label="Button 1"/>
+ label="Button"/>
<button auto_resize="true"
label="Button with long label"/>
<button auto_resize="true"
label="Button with longest label of all"/>
</toolbar>
- <toolbar name="test_toolbar_vertical"
+ <toolbar name="test_toolbar_left"
follows="left|bottom|top"
- height="430"
+ height="380"
width="100"
left="0"
top="70"
+ min_width="100"
side="left">
<button height="30"
- label="Button 1"/>
+ label="Button"/>
<button height="50"
- label="Button 2"/>
+ label="Button with long label"/>
<button height="60"
- label="Button 3"/>
+ label="Button with longest label of all"/>
+ </toolbar>
+ <toolbar name="test_toolbar_right"
+ follows="right|bottom|top"
+ height="380"
+ width="100"
+ right="500"
+ top="70"
+ min_width="100"
+ side="right">
+ <button auto_resize="true"
+ label="Button 1"/>
+ <button auto_resize="true"
+ label="Button with long label"/>
+ <button auto_resize="true"
+ label="Button with longest label of all"/>
+ </toolbar>
+ <toolbar name="test_toolbar_bottom"
+ follows="left|right|bottom"
+ height="50"
+ width="500"
+ left="0"
+ bottom="500"
+ min_width="100"
+ side="bottom">
+ <button auto_resize="true"
+ label="Button"/>
+ <button auto_resize="true"
+ label="Button with long label"/>
+ <button auto_resize="true"
+ label="Button with longest label of all"/>
</toolbar>
-
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_toybox.xml b/indra/newview/skins/default/xui/en/floater_toybox.xml
index 1951497309..5f3a59d964 100644
--- a/indra/newview/skins/default/xui/en/floater_toybox.xml
+++ b/indra/newview/skins/default/xui/en/floater_toybox.xml
@@ -11,6 +11,7 @@
legacy_header_height="18"
name="Toybox"
open_centered="true"
+ save_rect="true"
single_instance="true"
title="Customize toolbars"
width="658">
@@ -45,7 +46,11 @@
<toolbar
bottom="395"
left="40"
+ max_button_width="140"
+ min_button_width="140"
+ name="toybox_toolbar"
right="-40"
+ side="top"
top="85">
</toolbar>
<button
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 3b986664db..d4c2bc50ca 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -3653,8 +3653,44 @@ Try enclosing path to the editor with double quotes.
<!-- commands -->
<string name="Command_Avatar_Label">Avatar</string>
- <string name="Command_Avatar_Tooltip">Customize your avatar</string>
+ <string name="Command_Avatar_Tooltip">Change the appearance of your avatar</string>
+ <string name="Command_Build_Label">Build</string>
+ <string name="Command_Build_Tooltip">Building, reshaping terrain</string>
+ <string name="Command_Chat_Label">Chat</string>
+ <string name="Command_Chat_Tooltip">Chat with people nearby</string>
+ <string name="Command_Compass_Label">Compass</string>
+ <string name="Command_Compass_Tooltip"></string>
+ <string name="Command_Gestures_Label">Gestures</string>
+ <string name="Command_Gestures_Tooltip"></string>
+ <string name="Command_HowTo_Label">How To</string>
+ <string name="Command_HowTo_Tooltip"></string>
+ <string name="Command_Landmarks_Label">Landmarks</string>
+ <string name="Command_Landmarks_Tooltip"></string>
+ <string name="Command_Map_Label">Map</string>
+ <string name="Command_Map_Tooltip"></string>
+ <string name="Command_Move_Label">Move</string>
+ <string name="Command_Move_Tooltip"></string>
+ <string name="Command_MyLand_Label">My Land</string>
+ <string name="Command_MyLand_Tooltip">Information about the land you're visiting</string>
+ <string name="Command_MyStuff_Label">My Stuff</string>
+ <string name="Command_MyStuff_Tooltip">View and use your belongings</string>
+ <string name="Command_People_Label">People</string>
+ <string name="Command_People_Tooltip"></string>
<string name="Command_Places_Label">Places</string>
<string name="Command_Places_Tooltip">Destination guide</string>
+ <string name="Command_Search_Label">Search</string>
+ <string name="Command_Search_Tooltip">Find...</string>
+ <string name="Command_Settings_Label">Settings</string>
+ <string name="Command_Settings_Tooltip">Preferences</string>
+ <string name="Command_Shop_Label">Shop</string>
+ <string name="Command_Shop_Tooltip"></string>
+ <string name="Command_Snapshot_Label">Snapshot</string>
+ <string name="Command_Snapshot_Tooltip">Take a picture</string>
+ <string name="Command_Speak_Label">Speak</string>
+ <string name="Command_Speak_Tooltip">Speak with people nearby using your microphone</string>
+ <string name="Command_Upload_Label">Upload</string>
+ <string name="Command_Upload_Tooltip"></string>
+ <string name="Command_View_Label">View</string>
+ <string name="Command_View_Tooltip">Changing your view of the world</string>
</strings>