summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorMerov Linden <merov@lindenlab.com>2010-09-09 10:40:25 -0700
committerMerov Linden <merov@lindenlab.com>2010-09-09 10:40:25 -0700
commit81ea8d1751a8866b9ec998542c7d6e9b5645f357 (patch)
tree1f7f45a9bcf469efe9fc30c68aee2638342c1557 /indra/newview
parentf2d61c7371171e0ee1329186116c585aa5de7f52 (diff)
parent72e597a6f9e6dacbb41383ee8ee29e55acff4b74 (diff)
Pull from lindenlab/viewer-development
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/app_settings/settings.xml22
-rw-r--r--indra/newview/installers/windows/installer_template.nsi2
-rw-r--r--indra/newview/llagentwearables.cpp13
-rw-r--r--indra/newview/llavataractions.cpp16
-rw-r--r--indra/newview/llavataractions.h12
-rw-r--r--indra/newview/llbottomtray.cpp293
-rw-r--r--indra/newview/llbottomtray.h98
-rw-r--r--indra/newview/llchatbar.cpp29
-rw-r--r--indra/newview/llfloatermap.cpp9
-rw-r--r--indra/newview/llfloaterperms.cpp2
-rw-r--r--indra/newview/llfloatersnapshot.cpp5
-rw-r--r--indra/newview/llhudeffectbeam.cpp5
-rw-r--r--indra/newview/llhudeffectbeam.h1
-rw-r--r--indra/newview/llhudeffecttrail.cpp5
-rw-r--r--indra/newview/llhudeffecttrail.h1
-rw-r--r--indra/newview/llhudobject.cpp21
-rw-r--r--indra/newview/llhudobject.h2
-rw-r--r--indra/newview/llnearbychatbar.cpp36
-rw-r--r--indra/newview/llnearbychatbar.h3
-rw-r--r--indra/newview/llnetmap.cpp260
-rw-r--r--indra/newview/llnetmap.h28
-rw-r--r--indra/newview/lloutfitslist.cpp6
-rw-r--r--indra/newview/llpanelpeople.cpp20
-rw-r--r--indra/newview/llpanelpeople.h1
-rw-r--r--indra/newview/llpanelpeoplemenus.cpp7
-rw-r--r--indra/newview/llselectmgr.cpp4
-rw-r--r--indra/newview/llsidetray.cpp300
-rw-r--r--indra/newview/llsidetray.h9
-rw-r--r--indra/newview/llspeakbutton.cpp8
-rw-r--r--indra/newview/llspeakbutton.h9
-rw-r--r--indra/newview/llviewermessage.cpp3
-rw-r--r--indra/newview/llviewerwindow.cpp10
-rw-r--r--indra/newview/llvoavatar.cpp9
-rw-r--r--indra/newview/llvoavatar.h1
-rw-r--r--indra/newview/llvoavatarself.cpp1
-rw-r--r--indra/newview/llwearableitemslist.h2
-rw-r--r--indra/newview/pipeline.cpp21
-rw-r--r--indra/newview/skins/default/colors.xml6
-rw-r--r--indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Dock_Foreground.pngbin0 -> 2899 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Dock_Press.pngbin0 -> 2886 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Undock_Foreground.pngbin0 -> 2896 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Undock_Press.pngbin0 -> 2920 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_map.xml38
-rw-r--r--indra/newview/skins/default/xui/en/floater_side_bar_tab.xml6
-rw-r--r--indra/newview/skins/default/xui/en/menu_mini_map.xml10
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml9
-rw-r--r--indra/newview/skins/default/xui/en/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml32
-rw-r--r--indra/newview/skins/default/xui/en/panel_classified_info.xml96
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_classified.xml74
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pick.xml71
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_profile.xml71
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_wearable.xml65
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml158
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmarks.xml137
-rw-r--r--indra/newview/skins/default/xui/en/panel_my_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_notes.xml171
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_edit.xml105
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_inventory.xml96
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml373
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_info.xml95
-rw-r--r--indra/newview/skins/default/xui/en/panel_picks.xml223
-rw-r--r--indra/newview/skins/default/xui/en/panel_place_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_places.xml360
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml183
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_view.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml23
-rw-r--r--indra/newview/skins/default/xui/en/panel_teleport_history.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_teleport_history_item.xml1
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_appearance.xml8
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_inventory.xml175
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_item_info.xml12
74 files changed, 2912 insertions, 978 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 74a9a1e166..18fe156294 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2787,6 +2787,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>EffectScriptChatParticles</key>
+ <map>
+ <key>Comment</key>
+ <string>1 = normal behavior, 0 = disable display of swirling lights when scripts communicate</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>EnableRippleWater</key>
<map>
<key>Comment</key>
@@ -4669,6 +4680,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>MiniMapAutoCenter</key>
+ <map>
+ <key>Comment</key>
+ <string>Center the focal point of the minimap.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>Marker</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index 49ae58d53a..d1cd335783 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -45,7 +45,7 @@ RequestExecutionLevel admin ; on Vista we must be admin because we write to Prog
# *TODO: Move these into the language files themselves
LangString LanguageCode ${LANG_DANISH} "da"
LangString LanguageCode ${LANG_GERMAN} "de"
-Langstring LanguageCode ${LANG_ENGLISH} "en"
+LangString LanguageCode ${LANG_ENGLISH} "en"
LangString LanguageCode ${LANG_SPANISH} "es"
LangString LanguageCode ${LANG_FRENCH} "fr"
LangString LanguageCode ${LANG_JAPANESE} "ja"
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 4c2caae2c6..dd08e6c49a 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -1619,11 +1619,14 @@ void LLAgentWearables::queryWearableCache()
gAgentQueryManager.mActiveCacheQueries[baked_index] = gAgentQueryManager.mWearablesCacheQueryID;
}
-
- llinfos << "Requesting texture cache entry for " << num_queries << " baked textures" << llendl;
- gMessageSystem->sendReliable(gAgent.getRegion()->getHost());
- gAgentQueryManager.mNumPendingQueries++;
- gAgentQueryManager.mWearablesCacheQueryID++;
+ //VWR-22113: gAgent.getRegion() can return null if invalid, seen here on logout
+ if(gAgent.getRegion())
+ {
+ llinfos << "Requesting texture cache entry for " << num_queries << " baked textures" << llendl;
+ gMessageSystem->sendReliable(gAgent.getRegion()->getHost());
+ gAgentQueryManager.mNumPendingQueries++;
+ gAgentQueryManager.mWearablesCacheQueryID++;
+ }
}
LLUUID LLAgentWearables::computeBakedTextureHash(LLVOAvatarDefines::EBakedTextureIndex baked_index,
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index eedadb962f..b9ae976e58 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -689,6 +689,7 @@ void LLAvatarActions::toggleBlock(const LLUUID& id)
LLMuteList::getInstance()->add(mute);
}
}
+
// static
bool LLAvatarActions::canOfferTeleport(const LLUUID& id)
{
@@ -704,6 +705,21 @@ bool LLAvatarActions::canOfferTeleport(const LLUUID& id)
return true;
}
+// static
+bool LLAvatarActions::canOfferTeleport(const uuid_vec_t& ids)
+{
+ bool result = true;
+ for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
+ {
+ if(!canOfferTeleport(*it))
+ {
+ result = false;
+ break;
+ }
+ }
+ return result;
+}
+
void LLAvatarActions::inviteToGroup(const LLUUID& id)
{
LLFloaterGroupPicker* widget = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(id));
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index cd8ac3b653..6313ae0759 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -171,12 +171,18 @@ public:
static void csr(const LLUUID& id, std::string name);
/**
- * Checks whether can offer teleport to the avatar
- * Can't offer only for offline friends
+ * Checks whether we can offer a teleport to the avatar, only offline friends
+ * cannot be offered a teleport.
+ *
+ * @return false if avatar is a friend and not visibly online
*/
static bool canOfferTeleport(const LLUUID& id);
-
+ /**
+ * @return false if any one of the specified avatars a friend and not visibly online
+ */
+ static bool canOfferTeleport(const uuid_vec_t& ids);
+
private:
static bool callbackAddFriend(const LLSD& notification, const LLSD& response);
static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 6ee4387236..f3ade83d00 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -49,6 +49,48 @@
#include "lltoolmgr.h"
#include "llviewerparcelmgr.h"
+#include "llviewerwindow.h"
+#include "llsdserialize.h"
+
+// Distance from mouse down on which drag'n'drop should be started.
+#define DRAG_START_DISTANCE 3
+
+static const std::string SORTING_DATA_FILE_NAME = "bottomtray_buttons_order.xml";
+
+LLDefaultChildRegistry::Register<LLBottomtrayButton> bottomtray_button("bottomtray_button");
+
+// LLBottomtrayButton methods
+
+// virtual
+BOOL LLBottomtrayButton::handleHover(S32 x, S32 y, MASK mask)
+{
+ S32 screenX, screenY;
+ localPointToScreen(x, y, &screenX, &screenY);
+ // pass hover to bottomtray
+ LLBottomTray::getInstance()->handleHover(screenX, screenY, mask);
+ return FALSE;
+}
+//virtual
+BOOL LLBottomtrayButton::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+ S32 screenX, screenY;
+ localPointToScreen(x, y, &screenX, &screenY);
+ // pass mouse up to bottomtray
+ LLBottomTray::getInstance()->onDraggableButtonMouseUp(this,screenX, screenY, mask);
+ LLButton::handleMouseUp(x, y, mask);
+ return FALSE;
+}
+//virtual
+BOOL LLBottomtrayButton::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ S32 screenX, screenY;
+ localPointToScreen(x, y, &screenX, &screenY);
+ // pass mouse up to bottomtray
+ LLBottomTray::getInstance()->onDraggableButtonMouseDown(this,screenX, screenY, mask);
+ LLButton::handleMouseDown(x, y, mask);
+ return FALSE;
+}
+
static void update_build_button_enable_state()
{
bool can_edit = LLToolMgr::getInstance()->canEdit();
@@ -153,6 +195,10 @@ LLBottomTray::LLBottomTray(const LLSD&)
, mCamButton(NULL)
, mBottomTrayLite(NULL)
, mIsInLiteMode(false)
+, mDragStarted(false)
+, mDraggedItem(NULL)
+, mLandingTab(NULL)
+, mCheckForDrag(false)
{
// Firstly add ourself to IMSession observers, so we catch session events
// before chiclets do that.
@@ -177,6 +223,8 @@ LLBottomTray::LLBottomTray(const LLSD&)
mBottomTrayLite->setFollowsAll();
mBottomTrayLite->setVisible(FALSE);
}
+
+ mImageDragIndication = LLUI::getUIImage(getString("DragIndicationImageName"));
}
LLBottomTray::~LLBottomTray()
@@ -504,11 +552,253 @@ BOOL LLBottomTray::postBuild()
showWellButton(RS_IM_WELL, !LLIMWellWindow::getInstance()->isWindowEmpty());
showWellButton(RS_NOTIFICATION_WELL, !LLNotificationWellWindow::getInstance()->isWindowEmpty());
+ loadButtonsOrder();
+
LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&update_build_button_enable_state));
return TRUE;
}
+//Drag-n-drop
+
+void LLBottomTray::onDraggableButtonMouseDown(LLUICtrl* ctrl, S32 x, S32 y, MASK mask)
+{
+ if (ctrl == NULL) return;
+ LLView* parent_view = ctrl->getParent();
+ if(parent_view != NULL)
+ {
+ // we actually drag'n'drop panel (not button) in code, so have to find a parent
+ // of button which called this method on mouse down.
+ LLPanel* parent = dynamic_cast<LLPanel*>(parent_view);
+ // It may happen that we clicked not usual button, but button inside widget(speak, gesture)
+ // so we'll need to get a level higher to reach layout panel as a parent.
+ if(parent == NULL) parent = dynamic_cast<LLPanel*>(parent_view->getParent());
+ if (parent && parent->getVisible())
+ {
+ mDraggedItem = parent;
+ mCheckForDrag = true;
+ mStartX = x;
+ mStartY = y;
+ }
+ }
+}
+
+LLPanel* LLBottomTray::findChildPanelByLocalCoords(S32 x, S32 y)
+{
+ LLPanel* ctrl = 0;
+ S32 screenX, screenY;
+ const child_list_t* list = mToolbarStack->getChildList();
+
+ localPointToScreen(x, y, &screenX, &screenY);
+
+ // look for a child panel which contains the point (screenX, screenY) in it's rectangle
+ for (child_list_const_iter_t i = list->begin(); i != list->end(); ++i)
+ {
+ LLRect rect;
+ localRectToScreen((*i)->getRect(), &rect);
+
+ if (rect.pointInRect(screenX, screenY))
+ {
+ ctrl = dynamic_cast<LLPanel*>(*i);
+ break;
+ }
+ }
+
+ return ctrl;
+}
+
+BOOL LLBottomTray::handleHover(S32 x, S32 y, MASK mask)
+{
+ // if mouse down on draggable item was done, check whether we should start DnD
+ if (mCheckForDrag)
+ {
+ // Start drag'n'drop if mouse cursor was dragged away frome mouse down location enough
+ if(sqrt((float)((mStartX-x)*(mStartX-x)+(mStartY-y)*(mStartY-y))) > DRAG_START_DISTANCE)
+ {
+ mDragStarted = true;
+ mCheckForDrag = false;
+ }
+ }
+ if (mDragStarted)
+ {
+ // Check whether the cursor is over draggable area, find which panel it is and set is as
+ // landing tab for drag'n'drop
+ if(isCursorOverDraggableArea(x, y))
+ {
+ LLPanel* panel = findChildPanelByLocalCoords(x,y);
+ if (panel && panel != mDraggedItem) mLandingTab = panel;
+ gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROWDRAG);
+ }
+ else
+ {
+ gViewerWindow->getWindow()->setCursor(UI_CURSOR_NO);
+ }
+ }
+
+ return TRUE;
+}
+
+bool LLBottomTray::isCursorOverDraggableArea(S32 x, S32 y)
+{
+ bool result = getRect().pointInRect(x, y);
+ result = result && mNearbyChatBar->calcScreenRect().mRight < x;
+ result = result && mChicletPanel->calcScreenRect().mRight > x;
+ return result;
+}
+
+void LLBottomTray::updateButtonsOrdersAfterDnD()
+{
+ // *TODO: change implementation of this method to support simplify it
+ // (and according to future possible changes in the way button order is saved between sessions).
+ state_object_map_t::const_iterator it = mStateProcessedObjectMap.begin();
+ state_object_map_t::const_iterator it_end = mStateProcessedObjectMap.end();
+ // Speak button is currently the only draggable button not in mStateProcessedObjectMap,
+ // so if dragged_state is not found in that map, it should be RS_BUTTON_SPEAK. Change this code if any other
+ // exclusions from mStateProcessedObjectMap will become draggable.
+ EResizeState dragged_state = RS_BUTTON_SPEAK;
+ EResizeState landing_state = RS_NORESIZE;
+ bool landing_state_found = false;
+ // Find states for dragged item and landing tab
+ for (; it != it_end; ++it)
+ {
+ if (it->second == mDraggedItem)
+ {
+ dragged_state = it->first;
+ }
+ else if (it->second == mLandingTab)
+ {
+ landing_state = it->first;
+ landing_state_found = true;
+ }
+ }
+
+ // Update order of buttons according to drag'n'drop
+ mButtonsOrder.erase(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), dragged_state));
+ if (!landing_state_found && mLandingTab == getChild<LLPanel>(PANEL_CHICLET_NAME))
+ {
+ mButtonsOrder.push_back(dragged_state);
+ }
+ else
+ {
+ if (!landing_state_found) landing_state = RS_BUTTON_SPEAK;
+ mButtonsOrder.insert(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), landing_state), dragged_state);
+ }
+ // Synchronize button process order with their order
+ resize_state_vec_t::const_iterator it1 = mButtonsOrder.begin();
+ const resize_state_vec_t::const_iterator it_end1 = mButtonsOrder.end();
+ resize_state_vec_t::iterator it2 = mButtonsProcessOrder.begin();
+ for (; it1 != it_end1; ++it1)
+ {
+ // Skip Speak because it is not in mButtonsProcessOrder(it's the reason why mButtonsOrder was introduced).
+ // If any other draggable items will be added to bottomtray later, they should also be skipped here.
+ if (*it1 != RS_BUTTON_SPEAK)
+ {
+ *it2 = *it1;
+ ++it2;
+ }
+ }
+
+ saveButtonsOrder();
+}
+
+void LLBottomTray::saveButtonsOrder()
+{
+ std::string user_dir = gDirUtilp->getLindenUserDir();
+ if (user_dir.empty()) return;
+
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME);
+ LLSD settings_llsd;
+ int i = 0;
+ const resize_state_vec_t::const_iterator it_end = mButtonsOrder.end();
+ // we use numbers as keys for map which is saved in file and contains resize states as its values
+ for (resize_state_vec_t::const_iterator it = mButtonsOrder.begin(); it != it_end; ++it, i++)
+ {
+ std::string str = llformat("%d", i);
+ settings_llsd[str] = *it;
+ }
+ llofstream file;
+ file.open(filename);
+ LLSDSerialize::toPrettyXML(settings_llsd, file);
+}
+
+void LLBottomTray::loadButtonsOrder()
+{
+ // load per-resident sorting information
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME);
+
+ LLSD settings_llsd;
+ llifstream file;
+ file.open(filename);
+ if (!file.is_open()) return;
+
+ LLSDSerialize::fromXML(settings_llsd, file);
+
+
+ mButtonsOrder.clear();
+ mButtonsProcessOrder.clear();
+ int i = 0;
+ // getting button order from file
+ for (LLSD::map_const_iterator iter = settings_llsd.beginMap();
+ iter != settings_llsd.endMap(); ++iter, ++i)
+ {
+ std::string str = llformat("%d", i);
+ EResizeState state = (EResizeState)settings_llsd[str].asInteger();
+ mButtonsOrder.push_back(state);
+ // RS_BUTTON_SPEAK is skipped, because it shouldn't be in mButtonsProcessOrder (it does not hide or shrink).
+ if (state != RS_BUTTON_SPEAK)
+ {
+ mButtonsProcessOrder.push_back(state);
+ }
+ }
+
+ // There are other panels in layout stack order of which is not saved. Also, panels order of which is saved,
+ // are already in layout stack but in wrong order. The most convenient way to place them is moving them
+ // to front one by one (because in this case we don't have to pass the panel before which we want to insert our
+ // panel to movePanel()). So panels are moved in order from the end of mButtonsOrder vector(reverse iterator is used).
+ const resize_state_vec_t::const_reverse_iterator it_end = mButtonsOrder.rend();
+ // placing panels in layout stack according to button order which we loaded in previous for
+ for (resize_state_vec_t::const_reverse_iterator it = mButtonsOrder.rbegin(); it != it_end; ++it, ++i)
+ {
+ LLPanel* panel_to_move = *it == RS_BUTTON_SPEAK ? mSpeakPanel : mStateProcessedObjectMap[*it];
+ mToolbarStack->movePanel(panel_to_move, NULL, true); // prepend
+ }
+ // Nearbychat is not stored in order settings file, but it must be the first of the panels, so moving it
+ // manually here
+ mToolbarStack->movePanel(mNearbyChatBar, NULL, true);
+}
+
+void LLBottomTray::onDraggableButtonMouseUp(LLUICtrl* ctrl, S32 x, S32 y, MASK mask)
+{
+ //if mouse up happened over area where drop is possible, change order of buttons
+ if (mLandingTab != NULL && mDraggedItem != NULL && mDragStarted)
+ {
+ if(isCursorOverDraggableArea(x, y))
+ {
+ // change order of panels in layout stack
+ mToolbarStack->movePanel(mDraggedItem, (LLPanel*)mLandingTab);
+ // change order of buttons in order vectors
+ updateButtonsOrdersAfterDnD();
+ }
+ }
+ gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
+ mDragStarted = false;
+ mDraggedItem = NULL;
+ mLandingTab = NULL;
+ mCheckForDrag = false;
+}
+
+void LLBottomTray::draw()
+{
+ LLPanel::draw();
+ if (mLandingTab)
+ {
+ static S32 w = mImageDragIndication->getWidth();
+ static S32 h = mImageDragIndication->getHeight();
+ LLRect rect = mLandingTab->calcScreenRect();
+ mImageDragIndication->draw(rect.mLeft - w/2, rect.getHeight(), w, h);
+ }
+}
+
bool LLBottomTray::onContextMenuItemEnabled(const LLSD& userdata)
{
std::string item = userdata.asString();
@@ -1181,6 +1471,9 @@ void LLBottomTray::initResizeStateContainers()
mButtonsProcessOrder.push_back(RS_BUTTON_WORLD_MAP);
mButtonsProcessOrder.push_back(RS_BUTTON_MINI_MAP);
+ mButtonsOrder.push_back(RS_BUTTON_SPEAK);
+ mButtonsOrder.insert(mButtonsOrder.end(), mButtonsProcessOrder.begin(), mButtonsProcessOrder.end());
+
// init default widths
// process buttons that can be hidden on resize...
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index bd9d35f209..14a29895f5 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -47,6 +47,30 @@ class LLBottomTrayLite;
extern template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance();
#endif
+/**
+ * Class for buttons that should have drag'n'drop ability in bottomtray.
+ * These buttons pass mouse events handling to bottomtray.
+ */
+class LLBottomtrayButton : public LLButton
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLButton::Params>
+ {
+ Params(){}
+ };
+ /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+
+protected:
+ LLBottomtrayButton(const Params& p)
+ : LLButton(p)
+ {
+
+ }
+ friend class LLUICtrlFactory;
+};
+
class LLBottomTray
: public LLSingleton<LLBottomTray>
, public LLPanel
@@ -101,6 +125,18 @@ public:
*/
LLIMChiclet* createIMChiclet(const LLUUID& session_id);
+ // Below are methods that were introduced or overriden in bottomtray to handle drag'n'drop
+
+ virtual void draw();
+
+ /**
+ * These three methods handle drag'n'drop, they may be called directly from child buttons.
+ */
+ /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
+ void onDraggableButtonMouseDown(LLUICtrl* button, S32 x, S32 y, MASK mask);
+ void onDraggableButtonMouseUp(LLUICtrl* button, S32 x, S32 y, MASK mask);
+
+
private:
typedef enum e_resize_status_type
{
@@ -134,6 +170,29 @@ private:
| RS_BUTTON_BUILD | RS_BUTTON_SEARCH | RS_BUTTON_WORLD_MAP | RS_BUTTON_MINI_MAP
}EResizeState;
+ // Below are three methods that were introduced to handle drag'n'drop
+
+ /**
+ * finds a panel under the specified LOCAL point
+ */
+ LLPanel* findChildPanelByLocalCoords(S32 x, S32 y);
+
+ /**
+ * checks whether the cursor is over an area where the dragged button may be dropped
+ */
+ bool isCursorOverDraggableArea(S32 x, S32 y);
+
+ /**
+ * Updates process(shrink/show/hide) order of buttons and order in which they'll be stored for further save/load.
+ * It is called when dragged button is dropped
+ */
+ void updateButtonsOrdersAfterDnD();
+
+ // saves order of buttons to file on disk
+ void saveButtonsOrder();
+ // reads order of buttons from file on disk
+ void loadButtonsOrder();
+
/**
* Updates child controls size and visibility when it is necessary to reduce total width.
*
@@ -360,6 +419,13 @@ private:
* Contains order in which child buttons should be processed in show/hide, extend/shrink methods.
*/
resize_state_vec_t mButtonsProcessOrder;
+ /**
+ * Contains order in which child buttons are shown.
+ * It traces order of all bottomtray buttons that may change place via drag'n'drop and should
+ * save and load it between sessions. mButtonsProcessOrder is not enough for it because it contains only
+ * buttons that may be hidden.
+ */
+ resize_state_vec_t mButtonsOrder;
protected:
@@ -381,6 +447,38 @@ protected:
LLButton* mMovementButton;
LLBottomTrayLite* mBottomTrayLite;
bool mIsInLiteMode;
+
+ // Drag'n'Drop
+
+ /**
+ * Is true if mouse down happened on draggable button.
+ * Set false whether on drag start or on mouse up.
+ */
+ bool mCheckForDrag;
+ /**
+ * These two variables hold corrdinates of mouse down on draggable button.
+ * They are used to compare with current coordinates of cursor and determine whether drag'n'drop should start.
+ */
+ S32 mStartX;
+ S32 mStartY;
+ /**
+ * True if drag'n'drop is happening.
+ */
+ bool mDragStarted;
+
+ /**
+ * Pointer to panel which is currently dragged (though it seems to user that button is dragged,
+ * we are changing place of layout panel).
+ */
+ LLPanel* mDraggedItem;
+ /**
+ * Panel before which the dragged button will be inserted.
+ */
+ LLPanel* mLandingTab;
+ /**
+ * Image used to show position where dragged button will be dropped.
+ */
+ LLUIImage* mImageDragIndication;
};
#endif // LL_LLBOTTOMPANEL_H
diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp
index 967db21244..7d82ec3a71 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -673,11 +673,30 @@ public:
bool handle(const LLSD& tokens, const LLSD& query_map,
LLMediaCtrl* web)
{
- if (tokens.size() < 2) return false;
- S32 channel = tokens[0].asInteger();
- std::string mesg = tokens[1].asString();
- send_chat_from_viewer(mesg, CHAT_TYPE_NORMAL, channel);
- return true;
+ bool retval = false;
+ // Need at least 2 tokens to have a valid message.
+ if (tokens.size() < 2)
+ {
+ retval = false;
+ }
+ else
+ {
+ S32 channel = tokens[0].asInteger();
+ // VWR-19499 Restrict function to chat channels greater than 0.
+ if ((channel > 0) && (channel < 2147483647))
+ {
+ retval = true;
+ // Say mesg on channel
+ std::string mesg = tokens[1].asString();
+ send_chat_from_viewer(mesg, CHAT_TYPE_NORMAL, channel);
+ }
+ else
+ {
+ retval = false;
+ // Tell us this is an unsupported SLurl.
+ }
+ }
+ return retval;
}
};
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index 0f8b709f29..c9d7eff02b 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -47,7 +47,10 @@
//
// Constants
//
-const F32 MAP_MINOR_DIR_THRESHOLD = 0.08f;
+
+// The minor cardinal direction labels are hidden if their height is more
+// than this proportion of the map.
+const F32 MAP_MINOR_DIR_THRESHOLD = 0.07f;
const S32 MAP_PADDING_LEFT = 0;
const S32 MAP_PADDING_TOP = 2;
const S32 MAP_PADDING_RIGHT = 2;
@@ -93,7 +96,7 @@ BOOL LLFloaterMap::postBuild()
mTextBoxNorthWest = getChild<LLTextBox> ("floater_map_northwest");
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
-
+
registrar.add("Minimap.Zoom", boost::bind(&LLFloaterMap::handleZoom, this, _2));
registrar.add("Minimap.Tracker", boost::bind(&LLFloaterMap::handleStopTracking, this, _2));
@@ -255,7 +258,7 @@ void LLFloaterMap::reshape(S32 width, S32 height, BOOL called_from_parent)
void LLFloaterMap::handleZoom(const LLSD& userdata)
{
std::string level = userdata.asString();
-
+
F32 scale = 0.0f;
if (level == std::string("close"))
scale = LLNetMap::MAP_SCALE_MAX;
diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp
index bb851a349e..74dfede23e 100644
--- a/indra/newview/llfloaterperms.cpp
+++ b/indra/newview/llfloaterperms.cpp
@@ -115,7 +115,7 @@ U32 LLFloaterPerms::getEveryonePerms(std::string prefix)
//static
U32 LLFloaterPerms::getNextOwnerPerms(std::string prefix)
{
- U32 flags = 0;
+ U32 flags = PERM_MOVE;
if ( gSavedSettings.getBOOL(prefix+"NextOwnerCopy") )
{
flags |= PERM_COPY;
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index f58f704ff2..278fee799a 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -35,6 +35,7 @@
#include "llagentcamera.h"
#include "llcallbacklist.h"
#include "llcriticaldamp.h"
+#include "llfloaterperms.h"
#include "llui.h"
#include "llfocusmgr.h"
#include "llbutton.h"
@@ -999,8 +1000,8 @@ void LLSnapshotLivePreview::saveTexture()
LLFolderType::FT_SNAPSHOT_CATEGORY,
LLInventoryType::IT_SNAPSHOT,
PERM_ALL, // Note: Snapshots to inventory is a special case of content upload
- PERM_NONE, // that ignores the user's premissions preferences and continues to
- PERM_NONE, // always use these fairly permissive hard-coded initial perms. - MG
+ LLFloaterPerms::getGroupPerms(), // that is more permissive than other uploads
+ LLFloaterPerms::getEveryonePerms(),
"Snapshot : " + pos_string,
callback, expected_upload_cost, userdata);
gViewerWindow->playSnapshotAnimAndSound();
diff --git a/indra/newview/llhudeffectbeam.cpp b/indra/newview/llhudeffectbeam.cpp
index 078ccff2d0..37b7b2e75d 100644
--- a/indra/newview/llhudeffectbeam.cpp
+++ b/indra/newview/llhudeffectbeam.cpp
@@ -305,6 +305,11 @@ void LLHUDEffectBeam::render()
}
}
+void LLHUDEffectBeam::renderForTimer()
+{
+ render();
+}
+
void LLHUDEffectBeam::setupParticle(const S32 i)
{
LLVector3d start_pos_global;
diff --git a/indra/newview/llhudeffectbeam.h b/indra/newview/llhudeffectbeam.h
index a700e4e657..fdee5178af 100644
--- a/indra/newview/llhudeffectbeam.h
+++ b/indra/newview/llhudeffectbeam.h
@@ -52,6 +52,7 @@ protected:
~LLHUDEffectBeam();
/*virtual*/ void render();
+ /*virtual*/ void renderForTimer();
/*virtual*/ void packData(LLMessageSystem *mesgsys);
/*virtual*/ void unpackData(LLMessageSystem *mesgsys, S32 blocknum);
private:
diff --git a/indra/newview/llhudeffecttrail.cpp b/indra/newview/llhudeffecttrail.cpp
index 9072707974..39b526c1b5 100644
--- a/indra/newview/llhudeffecttrail.cpp
+++ b/indra/newview/llhudeffecttrail.cpp
@@ -280,3 +280,8 @@ void LLHUDEffectSpiral::render()
return;
}
}
+
+void LLHUDEffectSpiral::renderForTimer()
+{
+ render();
+}
diff --git a/indra/newview/llhudeffecttrail.h b/indra/newview/llhudeffecttrail.h
index bade3ff997..6f5a328c63 100644
--- a/indra/newview/llhudeffecttrail.h
+++ b/indra/newview/llhudeffecttrail.h
@@ -62,6 +62,7 @@ protected:
~LLHUDEffectSpiral();
/*virtual*/ void render();
+ /*virtual*/ void renderForTimer();
/*virtual*/ void packData(LLMessageSystem *mesgsys);
/*virtual*/ void unpackData(LLMessageSystem *mesgsys, S32 blocknum);
private:
diff --git a/indra/newview/llhudobject.cpp b/indra/newview/llhudobject.cpp
index 6af0ae2b6a..3e814a0773 100644
--- a/indra/newview/llhudobject.cpp
+++ b/indra/newview/llhudobject.cpp
@@ -305,6 +305,27 @@ void LLHUDObject::renderAllForSelect()
}
// static
+void LLHUDObject::renderAllForTimer()
+{
+ LLHUDObject *hud_objp;
+
+ hud_object_list_t::iterator object_it;
+ for (object_it = sHUDObjects.begin(); object_it != sHUDObjects.end(); )
+ {
+ hud_object_list_t::iterator cur_it = object_it++;
+ hud_objp = (*cur_it);
+ if (hud_objp->getNumRefs() == 1)
+ {
+ sHUDObjects.erase(cur_it);
+ }
+ else if (hud_objp->isVisible())
+ {
+ hud_objp->renderForTimer();
+ }
+ }
+}
+
+// static
void LLHUDObject::sortObjects()
{
sHUDObjects.sort(hud_object_further_away());
diff --git a/indra/newview/llhudobject.h b/indra/newview/llhudobject.h
index ff70b6a52f..97145b9a84 100644
--- a/indra/newview/llhudobject.h
+++ b/indra/newview/llhudobject.h
@@ -69,6 +69,7 @@ public:
static void updateAll();
static void renderAll();
static void renderAllForSelect();
+ static void renderAllForTimer();
static void cleanupHUDObjects();
@@ -100,6 +101,7 @@ protected:
virtual void render() = 0;
virtual void renderForSelect() {};
+ virtual void renderForTimer() {};
protected:
U8 mType;
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 4f9845d704..a8e4a759b7 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -103,10 +103,10 @@ LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p)
, mViewAllItemIndex(0)
, mGetMoreItemIndex(0)
{
- LLButton::Params button_params = p.combo_button;
+ LLBottomtrayButton::Params button_params = p.combo_button;
button_params.follows.flags(FOLLOWS_LEFT|FOLLOWS_BOTTOM|FOLLOWS_RIGHT);
- mButton = LLUICtrlFactory::create<LLButton>(button_params);
+ mButton = LLUICtrlFactory::create<LLBottomtrayButton>(button_params);
mButton->reshape(getRect().getWidth(),getRect().getHeight());
mButton->setCommitCallback(boost::bind(&LLGestureComboList::onButtonCommit, this));
@@ -865,14 +865,30 @@ public:
bool handle(const LLSD& tokens, const LLSD& query_map,
LLMediaCtrl* web)
{
- if (tokens.size() < 2) return false;
- S32 channel = tokens[0].asInteger();
-
- // Send unescaped message, see EXT-6353.
- std::string unescaped_mesg (LLURI::unescape(tokens[1].asString()));
-
- send_chat_from_viewer(unescaped_mesg, CHAT_TYPE_NORMAL, channel);
- return true;
+ bool retval = false;
+ // Need at least 2 tokens to have a valid message.
+ if (tokens.size() < 2)
+ {
+ retval = false;
+ }
+ else
+ {
+ S32 channel = tokens[0].asInteger();
+ // VWR-19499 Restrict function to chat channels greater than 0.
+ if ((channel > 0) && (channel < 2147483647))
+ {
+ retval = true;
+ // Send unescaped message, see EXT-6353.
+ std::string unescaped_mesg (LLURI::unescape(tokens[1].asString()));
+ send_chat_from_viewer(unescaped_mesg, CHAT_TYPE_NORMAL, channel);
+ }
+ else
+ {
+ retval = false;
+ // Tell us this is an unsupported SLurl.
+ }
+ }
+ return retval;
}
};
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h
index 955a665624..cc905736fd 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llnearbychatbar.h
@@ -34,6 +34,7 @@
#include "llvoiceclient.h"
#include "lloutputmonitorctrl.h"
#include "llspeakers.h"
+#include "llbottomtray.h"
class LLGestureComboList
@@ -43,7 +44,7 @@ class LLGestureComboList
public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
- Optional<LLButton::Params> combo_button;
+ Optional<LLBottomtrayButton::Params> combo_button;
Optional<LLScrollListCtrl::Params> combo_list;
Params();
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index e4a96cca14..6db8001d57 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -55,6 +55,7 @@
#include "llviewermenu.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
+#include "llviewerwindow.h"
#include "llworld.h"
#include "llworldmapview.h" // shared draw code
@@ -69,6 +70,7 @@ const F32 MAP_SCALE_ZOOM_FACTOR = 1.04f; // Zoom in factor per click of scroll w
const F32 MIN_DOT_RADIUS = 3.5f;
const F32 DOT_SCALE = 0.75f;
const F32 MIN_PICK_SCALE = 2.f;
+const S32 MOUSE_DRAG_SLOP = 2; // How far the mouse needs to move before we think it's a drag
LLNetMap::LLNetMap (const Params & p)
: LLUICtrl (p),
@@ -77,11 +79,12 @@ LLNetMap::LLNetMap (const Params & p)
mPixelsPerMeter( MAP_SCALE_MID / REGION_WIDTH_METERS ),
mObjectMapTPM(0.f),
mObjectMapPixels(0.f),
- mTargetPanX(0.f),
- mTargetPanY(0.f),
- mCurPanX(0.f),
- mCurPanY(0.f),
- mUpdateNow(FALSE),
+ mTargetPan(0.f, 0.f),
+ mCurPan(0.f, 0.f),
+ mStartPan(0.f, 0.f),
+ mMouseDown(0, 0),
+ mPanning(false),
+ mUpdateNow(false),
mObjectImageCenterGlobal( gAgentCamera.getCameraPositionGlobal() ),
mObjectRawImagep(),
mObjectImagep(),
@@ -98,7 +101,9 @@ LLNetMap::~LLNetMap()
void LLNetMap::setScale( F32 scale )
{
- mScale = llclamp(scale, 0.1f, 16.f*1024.f); // [reasonably small , unreasonably large]
+ scale = llclamp(scale, MAP_SCALE_MIN, MAP_SCALE_MAX);
+ mCurPan *= scale / mScale;
+ mScale = scale;
if (mObjectImagep.notNull())
{
@@ -115,13 +120,7 @@ void LLNetMap::setScale( F32 scale )
mPixelsPerMeter = mScale / REGION_WIDTH_METERS;
mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS);
- mUpdateNow = TRUE;
-}
-
-void LLNetMap::translatePan( F32 delta_x, F32 delta_y )
-{
- mTargetPanX += delta_x;
- mTargetPanY += delta_y;
+ mUpdateNow = true;
}
@@ -141,9 +140,12 @@ void LLNetMap::draw()
{
createObjectImage();
}
-
- mCurPanX = lerp(mCurPanX, mTargetPanX, LLCriticalDamp::getInterpolant(0.1f));
- mCurPanY = lerp(mCurPanY, mTargetPanY, LLCriticalDamp::getInterpolant(0.1f));
+
+ static LLUICachedControl<bool> auto_center("MiniMapAutoCenter", true);
+ if (auto_center)
+ {
+ mCurPan = lerp(mCurPan, mTargetPan, LLCriticalDamp::getInterpolant(0.1f));
+ }
// Prepare a scissor region
F32 rotation = 0;
@@ -174,8 +176,8 @@ void LLNetMap::draw()
}
// region 0,0 is in the middle
- S32 center_sw_left = getRect().getWidth() / 2 + llfloor(mCurPanX);
- S32 center_sw_bottom = getRect().getHeight() / 2 + llfloor(mCurPanY);
+ S32 center_sw_left = getRect().getWidth() / 2 + llfloor(mCurPan.mV[VX]);
+ S32 center_sw_bottom = getRect().getHeight() / 2 + llfloor(mCurPan.mV[VY]);
gGL.pushMatrix();
@@ -256,26 +258,24 @@ void LLNetMap::draw()
}
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
}
-
-
- LLVector3d old_center = mObjectImageCenterGlobal;
- LLVector3d new_center = gAgentCamera.getCameraPositionGlobal();
-
- new_center.mdV[0] = (5.f/mObjectMapTPM)*floor(0.2f*mObjectMapTPM*new_center.mdV[0]);
- new_center.mdV[1] = (5.f/mObjectMapTPM)*floor(0.2f*mObjectMapTPM*new_center.mdV[1]);
- new_center.mdV[2] = 0.f;
+ // Redraw object layer periodically
if (mUpdateNow || (map_timer.getElapsedTimeF32() > 0.5f))
{
- mUpdateNow = FALSE;
- mObjectImageCenterGlobal = new_center;
+ mUpdateNow = false;
+
+ // Locate the centre of the object layer, accounting for panning
+ LLVector3 new_center = globalPosToView(gAgentCamera.getCameraPositionGlobal());
+ new_center.mV[VX] -= mCurPan.mV[VX];
+ new_center.mV[VY] -= mCurPan.mV[VY];
+ new_center.mV[VZ] = 0.f;
+ mObjectImageCenterGlobal = viewPosToGlobal(llfloor(new_center.mV[VX]), llfloor(new_center.mV[VY]));
- // Center moved enough.
// Create the base texture.
U8 *default_texture = mObjectRawImagep->getData();
memset( default_texture, 0, mObjectImagep->getWidth() * mObjectImagep->getHeight() * mObjectImagep->getComponents() );
- // Draw buildings
+ // Draw objects
gObjectList.renderObjectsForMap(*this);
mObjectImagep->setSubImage(mObjectRawImagep, 0, 0, mObjectImagep->getWidth(), mObjectImagep->getHeight());
@@ -361,7 +361,8 @@ void LLNetMap::draw()
show_as_friend ? map_avatar_friend_color : map_avatar_color,
pos_map.mV[VZ], mDotRadius);
- F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), LLVector2(local_mouse_x,local_mouse_y));
+ F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
+ LLVector2(local_mouse_x,local_mouse_y));
if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist)
{
closest_dist = dist_to_cursor;
@@ -392,12 +393,22 @@ void LLNetMap::draw()
// Draw dot for self avatar position
pos_global = gAgent.getPositionGlobal();
pos_map = globalPosToView(pos_global);
- LLUIImagePtr you = LLWorldMapView::sAvatarYouLargeImage;
S32 dot_width = llround(mDotRadius * 2.f);
- you->draw(llround(pos_map.mV[VX] - mDotRadius),
- llround(pos_map.mV[VY] - mDotRadius),
- dot_width,
- dot_width);
+ LLUIImagePtr you = LLWorldMapView::sAvatarYouLargeImage;
+ if (you)
+ {
+ you->draw(llround(pos_map.mV[VX] - mDotRadius),
+ llround(pos_map.mV[VY] - mDotRadius),
+ dot_width,
+ dot_width);
+
+ F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
+ LLVector2(local_mouse_x,local_mouse_y));
+ if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist)
+ {
+ mClosestAgentToCursor = gAgent.getID();
+ }
+ }
// Draw frustum
F32 meters_to_pixels = mScale/ LLWorld::getInstance()->getRegionWidthInMeters();
@@ -472,8 +483,8 @@ LLVector3 LLNetMap::globalPosToView( const LLVector3d& global_pos )
pos_local.rotVec( rot );
}
- pos_local.mV[VX] += getRect().getWidth() / 2 + mCurPanX;
- pos_local.mV[VY] += getRect().getHeight() / 2 + mCurPanY;
+ pos_local.mV[VX] += getRect().getWidth() / 2 + mCurPan.mV[VX];
+ pos_local.mV[VY] += getRect().getHeight() / 2 + mCurPan.mV[VY];
return pos_local;
}
@@ -506,8 +517,8 @@ void LLNetMap::drawTracking(const LLVector3d& pos_global, const LLColor4& color,
LLVector3d LLNetMap::viewPosToGlobal( S32 x, S32 y )
{
- x -= llround(getRect().getWidth() / 2 + mCurPanX);
- y -= llround(getRect().getHeight() / 2 + mCurPanY);
+ x -= llround(getRect().getWidth() / 2 + mCurPan.mV[VX]);
+ y -= llround(getRect().getHeight() / 2 + mCurPan.mV[VY]);
LLVector3 pos_local( (F32)x, (F32)y, 0 );
@@ -532,10 +543,20 @@ LLVector3d LLNetMap::viewPosToGlobal( S32 x, S32 y )
BOOL LLNetMap::handleScrollWheel(S32 x, S32 y, S32 clicks)
{
// note that clicks are reversed from what you'd think: i.e. > 0 means zoom out, < 0 means zoom in
- F32 scale = mScale;
-
- scale *= pow(MAP_SCALE_ZOOM_FACTOR, -clicks);
- setScale(llclamp(scale, MAP_SCALE_MIN, MAP_SCALE_MAX));
+ F32 new_scale = mScale * pow(MAP_SCALE_ZOOM_FACTOR, -clicks);
+ F32 old_scale = mScale;
+
+ setScale(new_scale);
+
+ static LLUICachedControl<bool> auto_center("MiniMapAutoCenter", true);
+ if (!auto_center)
+ {
+ // Adjust pan to center the zoom on the mouse pointer
+ LLVector2 zoom_offset;
+ zoom_offset.mV[VX] = x - getRect().getWidth() / 2;
+ zoom_offset.mV[VY] = y - getRect().getHeight() / 2;
+ mCurPan -= zoom_offset * mScale / old_scale - zoom_offset;
+ }
return TRUE;
}
@@ -546,20 +567,32 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, MASK mask )
{
return FALSE;
}
-
- // mToolTipMsg = "[AGENT][REGION](Double-click to open Map)"
-
- LLStringUtil::format_map_t args;
- std::string fullname;
- if(mClosestAgentToCursor.notNull() && gCacheName->getFullName(mClosestAgentToCursor, fullname))
- {
- args["[AGENT]"] = fullname + "\n";
- }
- else
+
+ std::string avatar_name;
+ if(mClosestAgentToCursor.notNull() && gCacheName->getFullName(mClosestAgentToCursor, avatar_name))
{
- args["[AGENT]"] = "";
+ // only show tooltip if same inspector not already open
+ LLFloater* existing_inspector = LLFloaterReg::findInstance("inspect_avatar");
+ if (!existing_inspector
+ || !existing_inspector->getVisible()
+ || existing_inspector->getKey()["avatar_id"].asUUID() != mClosestAgentToCursor)
+ {
+ LLInspector::Params p;
+ p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
+ p.message(avatar_name);
+ p.image.name("Inspector_I");
+ p.click_callback(boost::bind(showAvatarInspector, mClosestAgentToCursor));
+ p.visible_time_near(6.f);
+ p.visible_time_far(3.f);
+ p.delay_time(0.35f);
+ p.wrap(false);
+
+ LLToolTipMgr::instance().show(p);
+ }
+ return TRUE;
}
-
+
+ LLStringUtil::format_map_t args;
LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( viewPosToGlobal( x, y ) );
if( region )
{
@@ -569,10 +602,10 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, MASK mask )
{
args["[REGION]"] = "";
}
-
+
std::string msg = mToolTipMsg;
LLStringUtil::format(msg, args);
-
+
LLRect sticky_rect;
// set sticky_rect
if (region)
@@ -592,6 +625,21 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, MASK mask )
return TRUE;
}
+// static
+void LLNetMap::showAvatarInspector(const LLUUID& avatar_id)
+{
+ LLSD params;
+ params["avatar_id"] = avatar_id;
+
+ if (LLToolTipMgr::instance().toolTipVisible())
+ {
+ LLRect rect = LLToolTipMgr::instance().getToolTipRect();
+ params["pos"]["x"] = rect.mLeft;
+ params["pos"]["y"] = rect.mTop;
+ }
+
+ LLFloaterReg::showInstance("inspect_avatar", params);
+}
void LLNetMap::renderScaledPointGlobal( const LLVector3d& pos, const LLColor4U &color, F32 radius_meters )
{
@@ -715,5 +763,99 @@ void LLNetMap::createObjectImage()
mObjectImagep = LLViewerTextureManager::getLocalTexture( mObjectRawImagep.get(), FALSE);
}
setScale(mScale);
- mUpdateNow = TRUE;
+ mUpdateNow = true;
+}
+
+BOOL LLNetMap::handleMouseDown( S32 x, S32 y, MASK mask )
+{
+ if (!(mask & MASK_SHIFT)) return FALSE;
+
+ // Start panning
+ gFocusMgr.setMouseCapture(this);
+
+ mStartPan = mCurPan;
+ mMouseDown.mX = x;
+ mMouseDown.mY = y;
+ return TRUE;
+}
+
+BOOL LLNetMap::handleMouseUp( S32 x, S32 y, MASK mask )
+{
+ if (hasMouseCapture())
+ {
+ if (mPanning)
+ {
+ // restore mouse cursor
+ S32 local_x, local_y;
+ local_x = mMouseDown.mX + llfloor(mCurPan.mV[VX] - mStartPan.mV[VX]);
+ local_y = mMouseDown.mY + llfloor(mCurPan.mV[VY] - mStartPan.mV[VY]);
+ LLRect clip_rect = getRect();
+ clip_rect.stretch(-8);
+ clip_rect.clipPointToRect(mMouseDown.mX, mMouseDown.mY, local_x, local_y);
+ LLUI::setMousePositionLocal(this, local_x, local_y);
+
+ // finish the pan
+ mPanning = false;
+
+ mMouseDown.set(0, 0);
+
+ // auto centre
+ mTargetPan.setZero();
+ }
+ gViewerWindow->showCursor();
+ gFocusMgr.setMouseCapture(NULL);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+// static
+bool LLNetMap::outsideSlop( S32 x, S32 y, S32 start_x, S32 start_y, S32 slop )
+{
+ S32 dx = x - start_x;
+ S32 dy = y - start_y;
+
+ return (dx <= -slop || slop <= dx || dy <= -slop || slop <= dy);
+}
+
+BOOL LLNetMap::handleHover( S32 x, S32 y, MASK mask )
+{
+ if (hasMouseCapture())
+ {
+ if (mPanning || outsideSlop(x, y, mMouseDown.mX, mMouseDown.mY, MOUSE_DRAG_SLOP))
+ {
+ if (!mPanning)
+ {
+ // just started panning, so hide cursor
+ mPanning = true;
+ gViewerWindow->hideCursor();
+ }
+
+ LLVector2 delta(static_cast<F32>(gViewerWindow->getCurrentMouseDX()),
+ static_cast<F32>(gViewerWindow->getCurrentMouseDY()));
+
+ // Set pan to value at start of drag + offset
+ mCurPan += delta;
+ mTargetPan = mCurPan;
+
+ gViewerWindow->moveCursorToCenter();
+ }
+
+ // Doesn't really matter, cursor should be hidden
+ gViewerWindow->setCursor( UI_CURSOR_TOOLPAN );
+ }
+ else
+ {
+ if (mask & MASK_SHIFT)
+ {
+ // If shift is held, change the cursor to hint that the map can be dragged
+ gViewerWindow->setCursor( UI_CURSOR_TOOLPAN );
+ }
+ else
+ {
+ gViewerWindow->setCursor( UI_CURSOR_CROSS );
+ }
+ }
+
+ return TRUE;
}
diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h
index 6808642505..e25ada4c95 100644
--- a/indra/newview/llnetmap.h
+++ b/indra/newview/llnetmap.h
@@ -37,7 +37,6 @@
class LLColor4U;
class LLCoordGL;
class LLImageRaw;
-class LLTextBox;
class LLViewerTexture;
class LLNetMap : public LLUICtrl
@@ -66,17 +65,17 @@ public:
/*virtual*/ void draw();
/*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
+ /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleHover( S32 x, S32 y, MASK mask );
/*virtual*/ BOOL handleToolTip( S32 x, S32 y, MASK mask);
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
void setScale( F32 scale );
void setToolTipMsg(const std::string& msg) { mToolTipMsg = msg; }
void renderScaledPointGlobal( const LLVector3d& pos, const LLColor4U &color, F32 radius );
-
-private:
- void translatePan( F32 delta_x, F32 delta_y );
- void setPan( F32 x, F32 y ) { mTargetPanX = x; mTargetPanY = y; }
+private:
const LLVector3d& getObjectImageCenterGlobal() { return mObjectImageCenterGlobal; }
void renderPoint(const LLVector3 &pos, const LLColor4U &color,
S32 diameter, S32 relative_height = 0);
@@ -87,10 +86,15 @@ private:
void drawTracking( const LLVector3d& pos_global,
const LLColor4& color,
BOOL draw_arrow = TRUE);
-
+ static void showAvatarInspector(const LLUUID& avatar_id);
+
void createObjectImage();
private:
+ static bool outsideSlop(S32 x, S32 y, S32 start_x, S32 start_y, S32 slop);
+
+ bool mUpdateNow;
+
LLUIColor mBackgroundColor;
F32 mScale; // Size of a region in pixels
@@ -98,11 +102,13 @@ private:
F32 mObjectMapTPM; // texels per meter on map
F32 mObjectMapPixels; // Width of object map in pixels
F32 mDotRadius; // Size of avatar markers
- F32 mTargetPanX;
- F32 mTargetPanY;
- F32 mCurPanX;
- F32 mCurPanY;
- BOOL mUpdateNow;
+
+ bool mPanning; // map is being dragged
+ LLVector2 mTargetPan;
+ LLVector2 mCurPan;
+ LLVector2 mStartPan; // pan offset at start of drag
+ LLCoordGL mMouseDown; // pointer position at start of drag
+
LLVector3d mObjectImageCenterGlobal;
LLPointer<LLImageRaw> mObjectRawImagep;
LLPointer<LLViewerTexture> mObjectImagep;
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 51f9a03a9c..a0ef43ea80 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -439,6 +439,7 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
static LLXMLNodePtr accordionXmlNode = getAccordionTabXMLNode();
LLAccordionCtrlTab* tab = LLUICtrlFactory::defaultBuilder<LLAccordionCtrlTab>(accordionXmlNode, NULL, NULL);
+ if (!tab) continue;
tab->setName(name);
tab->setTitle(name);
@@ -455,10 +456,7 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
mAccordion->removeCollapsibleCtrl(tab);
// kill removed tab
- if (tab != NULL)
- {
- tab->die();
- }
+ tab->die();
continue;
}
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 8627274e80..06ba08b51c 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -776,12 +776,6 @@ void LLPanelPeople::buttonSetAction(const std::string& btn_name, const commit_si
button->setClickedCallback(cb);
}
-bool LLPanelPeople::isFriendOnline(const LLUUID& id)
-{
- uuid_vec_t ids = mOnlineFriendList->getIDs();
- return std::find(ids.begin(), ids.end(), id) != ids.end();
-}
-
void LLPanelPeople::updateButtons()
{
std::string cur_tab = getActiveTabName();
@@ -843,11 +837,11 @@ void LLPanelPeople::updateButtons()
bool enable_calls = LLVoiceClient::getInstance()->isVoiceWorking() && LLVoiceClient::getInstance()->voiceEnabled();
- buttonSetEnabled("teleport_btn", friends_tab_active && item_selected && isFriendOnline(selected_uuids.front()));
- buttonSetEnabled("view_profile_btn", item_selected);
- buttonSetEnabled("im_btn", multiple_selected); // allow starting the friends conference for multiple selection
- buttonSetEnabled("call_btn", multiple_selected && enable_calls);
- buttonSetEnabled("share_btn", item_selected); // not implemented yet
+ buttonSetEnabled("view_profile_btn",item_selected);
+ buttonSetEnabled("share_btn", item_selected);
+ buttonSetEnabled("im_btn", multiple_selected); // allow starting the friends conference for multiple selection
+ buttonSetEnabled("call_btn", multiple_selected && enable_calls);
+ buttonSetEnabled("teleport_btn", multiple_selected && LLAvatarActions::canOfferTeleport(selected_uuids));
bool none_group_selected = item_selected && selected_id.isNull();
buttonSetEnabled("group_info_btn", !none_group_selected);
@@ -1328,7 +1322,9 @@ void LLPanelPeople::onGroupCallButtonClicked()
void LLPanelPeople::onTeleportButtonClicked()
{
- LLAvatarActions::offerTeleport(getCurrentItemID());
+ uuid_vec_t selected_uuids;
+ getCurrentItemIDs(selected_uuids);
+ LLAvatarActions::offerTeleport(selected_uuids);
}
void LLPanelPeople::onShareButtonClicked()
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index 3b8b736be1..d0913ee756 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -72,7 +72,6 @@ private:
void updateNearbyList();
void updateRecentList();
- bool isFriendOnline(const LLUUID& id);
bool isItemsFreeOfFriends(const uuid_vec_t& uuids);
void updateButtons();
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index efca3ae1c2..f12c4de2f7 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -81,6 +81,7 @@ LLContextMenu* NearbyMenu::createMenu()
// registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, mUUIDs)); // *TODO: unimplemented
registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startConference, mUUIDs));
registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startAdhocCall, mUUIDs));
+ registrar.add("Avatar.OfferTeleport", boost::bind(&NearbyMenu::offerTeleport, this));
registrar.add("Avatar.RemoveFriend",boost::bind(&LLAvatarActions::removeFriendsDialog, mUUIDs));
// registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::startIM, mUUIDs)); // *TODO: unimplemented
// registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, mUUIDs)); // *TODO: unimplemented
@@ -168,8 +169,7 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
}
else if(item == std::string("can_offer_teleport"))
{
- const LLUUID& id = mUUIDs.front();
- return LLAvatarActions::canOfferTeleport(id);
+ return LLAvatarActions::canOfferTeleport(mUUIDs);
}
return false;
}
@@ -191,8 +191,7 @@ void NearbyMenu::offerTeleport()
{
// boost::bind cannot recognize overloaded method LLAvatarActions::offerTeleport(),
// so we have to use a wrapper.
- const LLUUID& id = mUUIDs.front();
- LLAvatarActions::offerTeleport(id);
+ LLAvatarActions::offerTeleport(mUUIDs);
}
} // namespace LLPanelPeopleMenus
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index c9b60bf7f5..fb60b1ece7 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -5629,6 +5629,10 @@ void LLSelectMgr::updateSelectionCenter()
LLVector3d select_center;
// keep a list of jointed objects for showing the joint HUDEffects
+ // Initialize the bounding box to the root prim, so the BBox orientation
+ // matches the root prim's (affecting the orientation of the manipulators).
+ bbox.addBBoxAgent( (mSelectedObjects->getFirstRootObject(TRUE))->getBoundingBoxAgent() );
+
std::vector < LLViewerObject *> jointed_objects;
for (LLObjectSelection::iterator iter = mSelectedObjects->begin();
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 85b6e0dec4..7af3ad9896 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -111,7 +111,11 @@ public:
};
protected:
LLSideTrayTab(const Params& params);
-
+
+ void dock();
+ void undock(LLFloater* floater_tab);
+
+ LLSideTray* getSideTray();
public:
virtual ~LLSideTrayTab();
@@ -176,6 +180,7 @@ BOOL LLSideTrayTab::postBuild()
title_panel->getChild<LLTextBox>(TAB_PANEL_CAPTION_TITLE_BOX)->setValue(mTabTitle);
+ getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this));
getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this));
return true;
@@ -210,63 +215,130 @@ void LLSideTrayTab::onOpen (const LLSD& key)
panel->onOpen(key);
}
+// Attempts to get the existing side tray instance.
+// Needed to avoid recursive calls of LLSideTray::getInstance().
+LLSideTray* LLSideTrayTab::getSideTray()
+{
+ // First, check if the side tray is our parent (i.e. we're attached).
+ LLSideTray* side_tray = dynamic_cast<LLSideTray*>(getParent());
+ if (!side_tray)
+ {
+ // Detached? Ok, check if the instance exists at all/
+ if (LLSideTray::instanceCreated())
+ {
+ side_tray = LLSideTray::getInstance();
+ }
+ else
+ {
+ llerrs << "No safe way to get the side tray instance" << llendl;
+ }
+ }
+
+ return side_tray;
+}
+
void LLSideTrayTab::toggleTabDocked()
{
- LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", LLSD().with("name", mTabTitle));
+ std::string tab_name = getName();
+
+ LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
if (!floater_tab) return;
- LLFloaterReg::toggleInstance("side_bar_tab", LLSD().with("name", mTabTitle));
+ LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
- LLSideTray* side_tray = LLSideTray::getInstance();
+ bool docking = !LLFloater::isShown(floater_tab);
- if (LLFloater::isShown(floater_tab))
+ // Hide the "Tear Off" button when a tab gets undocked
+ // and show "Dock" button instead.
+ getChild<LLButton>("undock")->setVisible(docking);
+ getChild<LLButton>("dock")->setVisible(!docking);
+
+ if (docking)
{
- // Remove the tab from Side Tray's tabs list.
- // We have to do it despite removing the tab from Side Tray's child view tree
- // by addChild(). Otherwise the tab could be accessed by the pointer in LLSideTray::mTabs.
- if (!side_tray->removeTab(this))
- {
- llwarns << "Failed to remove tab " << getName() << " from side tray" << llendl;
- return;
- }
+ dock();
+ }
+ else
+ {
+ undock(floater_tab);
+ }
+}
- setVisible(true); // *HACK: restore visibility after being hidden by LLSideTray::selectTabByName().
- floater_tab->addChild(this);
- floater_tab->setTitle(mTabTitle);
+void LLSideTrayTab::dock()
+{
+ LLSideTray* side_tray = getSideTray();
+ if (!side_tray) return;
- LLRect rect = side_tray->getLocalRect();
- floater_tab->reshape(rect.getWidth(), rect.getHeight());
+ if (!side_tray->addTab(this))
+ {
+ llwarns << "Failed to add tab " << getName() << " to side tray" << llendl;
+ return;
+ }
- rect.mTop -= floater_tab->getHeaderHeight();
- setRect(rect);
- reshape(rect.getWidth(), rect.getHeight());
+ setRect(side_tray->getLocalRect());
+ reshape(getRect().getWidth(), getRect().getHeight());
- // Set FOLLOWS_ALL flag for the tab to follow floater dimensions upon resizing.
- setFollowsAll();
+ // Select the re-docked tab.
+ side_tray->selectTabByName(getName());
- if (!side_tray->getCollapsed())
- {
- side_tray->collapseSideBar();
- }
+ if (side_tray->getCollapsed())
+ {
+ side_tray->expandSideBar();
+ }
+}
+
+void LLSideTrayTab::undock(LLFloater* floater_tab)
+{
+ LLSideTray* side_tray = getSideTray();
+ if (!side_tray) return;
+
+ // Remove the tab from Side Tray's tabs list.
+ // We have to do it despite removing the tab from Side Tray's child view tree
+ // by addChild(). Otherwise the tab could be accessed by the pointer in LLSideTray::mTabs.
+ if (!side_tray->removeTab(this))
+ {
+ llwarns << "Failed to remove tab " << getName() << " from side tray" << llendl;
+ return;
+ }
+
+ setVisible(true); // *HACK: restore visibility after being hidden by LLSideTray::selectTabByName().
+ floater_tab->addChild(this);
+ floater_tab->setTitle(mTabTitle);
+
+ // Reshape the floater if needed.
+ LLRect floater_rect;
+ if (floater_tab->hasSavedRect())
+ {
+ // We've got saved rect for the floater, hence no need to reshape it.
+ floater_rect = floater_tab->getLocalRect();
}
else
{
- if (!side_tray->addTab(this))
- {
- llwarns << "Failed to add tab " << getName() << " to side tray" << llendl;
- return;
- }
+ // Detaching for the first time. Reshape the floater.
+ floater_rect = side_tray->getLocalRect();
+ floater_tab->reshape(floater_rect.getWidth(), floater_rect.getHeight());
+ }
+
+ // Reshape the panel.
+ {
+ LLRect panel_rect = floater_rect;
+ panel_rect.mTop -= floater_tab->getHeaderHeight();
+ setRect(panel_rect);
+ reshape(panel_rect.getWidth(), panel_rect.getHeight());
+ }
- setRect(side_tray->getLocalRect());
- reshape(getRect().getWidth(), getRect().getHeight());
+ // Set FOLLOWS_ALL flag for the tab to follow floater dimensions upon resizing.
+ setFollowsAll();
- // Select the re-docked tab.
- side_tray->selectTabByName(getName());
+ if (!side_tray->getCollapsed())
+ {
+ side_tray->collapseSideBar();
+ }
- if (side_tray->getCollapsed())
- {
- side_tray->expandSideBar();
- }
+ if (side_tray->getActiveTab() != this)
+ {
+ // When a tab other then current active tab is detached from Side Tray
+ // onOpen() should be called as tab visibility is changed.
+ onOpen(LLSD());
}
}
@@ -334,10 +406,9 @@ public:
tab->toggleTabDocked();
- LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", LLSD().with("name", tab->getTabTitle()));
+ LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab->getName());
if (!floater_tab) return FALSE;
-
LLRect original_rect = floater_tab->getRect();
S32 header_snap_y = floater_tab->getHeaderHeight() / 2;
S32 snap_x = screen_x - original_rect.mLeft - original_rect.getWidth() / 2;
@@ -444,6 +515,7 @@ BOOL LLSideTray::postBuild()
getCollapseSignal().connect(boost::bind(&LLScreenChannelBase::resetPositionAndSize, (*it).channel, _2));
}
}
+
return true;
}
@@ -451,16 +523,20 @@ void LLSideTray::handleLoginComplete()
{
//reset tab to "home" tab if it was changesd during login process
selectTabByName("sidebar_home");
+
+ detachTabs();
}
LLSideTrayTab* LLSideTray::getTab(const std::string& name)
{
- return getChild<LLSideTrayTab>(name,false);
+ return findChild<LLSideTrayTab>(name,false);
}
bool LLSideTray::isTabAttached(const std::string& name)
{
LLSideTrayTab* tab = getTab(name);
+ if (!tab) return false;
+
return std::find(mTabs.begin(), mTabs.end(), tab) != mTabs.end();
}
@@ -485,6 +561,54 @@ void LLSideTray::toggleTabButton(LLSideTrayTab* tab)
}
}
+LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel_name, const LLSD& params)
+{
+ LLView* view = tab->findChildView(panel_name, true);
+ if (!view) return NULL;
+
+ std::string tab_name = tab->getName();
+
+ // Select tab and expand Side Tray only when a tab is attached.
+ if (isTabAttached(tab_name))
+ {
+ selectTabByName(tab_name);
+ if (mCollapsed)
+ expandSideBar();
+ }
+ else
+ {
+ LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
+ if (!floater_tab) return NULL;
+
+ // Restore the floater if it was minimized.
+ if (floater_tab->isMinimized())
+ {
+ floater_tab->setMinimized(FALSE);
+ }
+
+ // Send the floater to the front.
+ floater_tab->setFrontmost();
+ }
+
+ LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(view->getParent());
+ if (container)
+ {
+ LLSD new_params = params;
+ new_params[LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME] = panel_name;
+ container->onOpen(new_params);
+
+ return container->getCurrentPanel();
+ }
+
+ LLPanel* panel = dynamic_cast<LLPanel*>(view);
+ if (panel)
+ {
+ panel->onOpen(params);
+ }
+
+ return panel;
+}
+
bool LLSideTray::selectTabByIndex(size_t index)
{
if(index>=mTabs.size())
@@ -497,6 +621,7 @@ bool LLSideTray::selectTabByIndex(size_t index)
bool LLSideTray::selectTabByName (const std::string& name)
{
LLSideTrayTab* new_tab = getTab(name);
+ if (!new_tab) return false;
// Bail out if already selected.
if (new_tab == mActiveTab)
@@ -623,6 +748,9 @@ bool LLSideTray::removeTab(LLSideTrayTab* tab)
removeChild(tab);
mTabs.erase(tab_it);
+ // Add the tab to detached tabs list.
+ mDetachedTabs.push_back(tab);
+
// Remove the button from the buttons panel so that it isn't drawn anymore.
mButtonsPanel->removeChild(btn);
@@ -684,6 +812,13 @@ bool LLSideTray::addTab(LLSideTrayTab* tab)
// Arrange tabs after inserting a new one.
arrange();
+ // Remove the tab from the list of detached tabs.
+ child_vector_iter_t tab_it = std::find(mDetachedTabs.begin(), mDetachedTabs.end(), tab);
+ if (tab_it != mDetachedTabs.end())
+ {
+ mDetachedTabs.erase(tab_it);
+ }
+
return true;
}
@@ -733,8 +868,10 @@ void LLSideTray::processTriState ()
void LLSideTray::onTabButtonClick(string name)
{
- LLSideTrayTab* side_bar = getTab(name);
- if(side_bar == mActiveTab)
+ LLSideTrayTab* tab = getTab(name);
+ if (!tab) return;
+
+ if(tab == mActiveTab)
{
processTriState ();
return;
@@ -827,6 +964,28 @@ void LLSideTray::arrange()
mButtonsPanel->setVisible(hasTabs());
}
+// Detach those tabs that were detached when the viewer exited last time.
+void LLSideTray::detachTabs()
+{
+ // copy mTabs because LLSideTray::toggleTabDocked() modifies it.
+ child_vector_t tabs = mTabs;
+
+ for (child_vector_const_iter_t it = tabs.begin(); it != tabs.end(); ++it)
+ {
+ LLSideTrayTab* tab = *it;
+
+ std::string floater_ctrl_name = LLFloater::getControlName("side_bar_tab", LLSD(tab->getName()));
+ std::string vis_ctrl_name = LLFloaterReg::getVisibilityControlName(floater_ctrl_name);
+ if (!LLUI::sSettingGroups["floater"]->controlExists(vis_ctrl_name)) continue;
+
+ bool is_visible = LLUI::sSettingGroups["floater"]->getBOOL(vis_ctrl_name);
+ if (!is_visible) continue;
+
+ llassert(isTabAttached(tab->getName()));
+ tab->toggleTabDocked();
+ }
+}
+
void LLSideTray::collapseSideBar()
{
mCollapsed = true;
@@ -919,35 +1078,19 @@ void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent)
*/
LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& params)
{
- //arrange tabs
+ // Look up the tab in the list of detached tabs.
child_vector_const_iter_t child_it;
- for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
+ for ( child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it)
{
- LLView* view = (*child_it)->findChildView(panel_name,true);
- if(view)
- {
- selectTabByName ((*child_it)->getName());
- if(mCollapsed)
- expandSideBar();
-
- LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(view->getParent());
- if(container)
- {
- LLSD new_params = params;
- new_params[LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME] = panel_name;
- container->onOpen(new_params);
-
- return container->getCurrentPanel();
- }
-
- LLPanel* panel = dynamic_cast<LLPanel*>(view);
- if(panel)
- {
- panel->onOpen(params);
- }
+ LLPanel* panel = openChildPanel(*child_it, panel_name, params);
+ if (panel) return panel;
+ }
- return panel;
- }
+ // Look up the tab in the list of attached tabs.
+ for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
+ {
+ LLPanel* panel = openChildPanel(*child_it, panel_name, params);
+ if (panel) return panel;
}
return NULL;
}
@@ -957,7 +1100,9 @@ void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name,
if(!sub_panel)
return;
- if (sub_panel->isInVisibleChain())
+ // If a panel is visible and attached to Side Tray (has LLSideTray among its ancestors)
+ // it should be toggled off by collapsing Side Tray.
+ if (sub_panel->isInVisibleChain() && sub_panel->hasAncestor(this))
{
LLSideTray::getInstance()->collapseSideBar();
}
@@ -1001,6 +1146,17 @@ LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse)
LLPanel* LLSideTray::getPanel(const std::string& panel_name)
{
+ // Look up the panel in the list of detached tabs.
+ for ( child_vector_const_iter_t child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it)
+ {
+ LLPanel *panel = findChildPanel(*child_it,panel_name,true);
+ if(panel)
+ {
+ return panel;
+ }
+ }
+
+ // Look up the panel in the list of attached tabs.
for ( child_vector_const_iter_t child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
{
LLPanel *panel = findChildPanel(*child_it,panel_name,true);
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index f0cc2c1146..248def8e3d 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -173,10 +173,13 @@ protected:
LLButton* createButton (const std::string& name,const std::string& image,const std::string& tooltip,
LLUICtrl::commit_callback_t callback);
void arrange ();
+ void detachTabs ();
void reflectCollapseChange();
void toggleTabButton (LLSideTrayTab* tab);
+ LLPanel* openChildPanel (LLSideTrayTab* tab, const std::string& panel_name, const LLSD& params);
+
private:
// Implementation of LLDestroyClass<LLSideTray>
static void destroyClass()
@@ -187,15 +190,11 @@ private:
}
private:
-
- typedef std::pair<LLButton*, LLSideTrayTab*> detached_tab_t;
- typedef std::map<std::string, detached_tab_t> detached_tab_map_t;
-
LLPanel* mButtonsPanel;
typedef std::map<std::string,LLButton*> button_map_t;
button_map_t mTabButtons;
child_vector_t mTabs;
- detached_tab_map_t mDetachedTabs;
+ child_vector_t mDetachedTabs;
tab_order_vector_t mOriginalTabOrder;
LLSideTrayTab* mActiveTab;
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
index b8838346d0..3dce66f394 100644
--- a/indra/newview/llspeakbutton.cpp
+++ b/indra/newview/llspeakbutton.cpp
@@ -37,6 +37,8 @@
#include "llspeakbutton.h"
+#include "llbottomtray.h"
+
static LLDefaultChildRegistry::Register<LLSpeakButton> t1("talk_button");
//////////////////////////////////////////////////////////////////////////
@@ -67,7 +69,7 @@ void LLSpeakButton::setSpeakBtnEnabled(bool enabled)
}
void LLSpeakButton::setFlyoutBtnEnabled(bool enabled)
{
- LLButton* show_btn = getChild<LLButton>("speak_flyout_btn");
+ LLButton* show_btn = getChild<LLBottomtrayButton>("speak_flyout_btn");
show_btn->setEnabled(enabled);
}
@@ -96,9 +98,9 @@ LLSpeakButton::LLSpeakButton(const Params& p)
mSpeakBtn->setMouseUpCallback(boost::bind(&LLSpeakButton::onMouseUp_SpeakBtn, this));
mSpeakBtn->setToggleState(FALSE);
- LLButton::Params show_params = p.show_button;
+ LLBottomtrayButton::Params show_params = p.show_button;
show_params.rect(show_rect);
- mShowBtn = LLUICtrlFactory::create<LLButton>(show_params);
+ mShowBtn = LLUICtrlFactory::create<LLBottomtrayButton>(show_params);
addChild(mShowBtn);
LLTransientFloaterMgr::getInstance()->addControlView(mShowBtn);
diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h
index ec1d07b633..2fdf80c1f2 100644
--- a/indra/newview/llspeakbutton.h
+++ b/indra/newview/llspeakbutton.h
@@ -33,6 +33,7 @@
class LLCallFloater;
class LLButton;
class LLOutputMonitorCtrl;
+class LLBottomtrayButton;
/*
* Button displaying voice chat status. Displays voice chat options when
@@ -44,10 +45,8 @@ public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
- Optional<LLButton::Params>
- speak_button,
- show_button;
-
+ Optional<LLButton::Params> speak_button;
+ Optional<LLBottomtrayButton::Params> show_button;
Optional<LLOutputMonitorCtrl::Params> monitor;
Params();
@@ -86,7 +85,7 @@ protected:
private:
LLButton* mSpeakBtn;
- LLButton* mShowBtn;
+ LLBottomtrayButton* mShowBtn;
LLHandle<LLFloater> mPrivateCallPanel;
LLOutputMonitorCtrl* mOutputMonitor;
};
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 85759319a6..6d0cbbf8f2 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3009,7 +3009,8 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
// Make swirly things only for talking objects. (not script debug messages, though)
if (chat.mSourceType == CHAT_SOURCE_OBJECT
- && chat.mChatType != CHAT_TYPE_DEBUG_MSG)
+ && chat.mChatType != CHAT_TYPE_DEBUG_MSG
+ && gSavedSettings.getBOOL("EffectScriptChatParticles") )
{
LLPointer<LLViewerPartSourceChat> psc = new LLViewerPartSourceChat(chatter->getPositionAgent());
psc->setSourceObject(chatter);
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 13db913f60..556451e390 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -156,6 +156,7 @@
#include "lltrans.h"
#include "lluictrlfactory.h"
#include "llurldispatcher.h" // SLURL from other app instance
+#include "llversioninfo.h"
#include "llvieweraudio.h"
#include "llviewercamera.h"
#include "llviewergesture.h"
@@ -1932,6 +1933,11 @@ void LLViewerWindow::setMenuBackgroundColor(bool god_mode, bool dev_grid)
LLSD args;
LLColor4 new_bg_color;
+ // no l10n problem because channel is always an english string
+ std::string channel = LLVersionInfo::getChannel();
+ bool isProject = (channel.find("Project") != std::string::npos);
+
+ // god more important than project, proj more important than grid
if(god_mode && LLGridManager::getInstance()->isInProductionGrid())
{
new_bg_color = LLUIColorTable::instance().getColor( "MenuBarGodBgColor" );
@@ -1940,6 +1946,10 @@ void LLViewerWindow::setMenuBackgroundColor(bool god_mode, bool dev_grid)
{
new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionGodBgColor" );
}
+ else if (!god_mode && isProject)
+ {
+ new_bg_color = LLUIColorTable::instance().getColor( "MenuBarProjectBgColor" );
+ }
else if(!god_mode && !LLGridManager::getInstance()->isInProductionGrid())
{
new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionBgColor" );
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 9af1198df1..f985ee0c15 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -2320,7 +2320,6 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
idleUpdateNameTag( root_pos_last );
idleUpdateRenderCost();
- idleUpdateTractorBeam();
return TRUE;
}
@@ -3075,14 +3074,6 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
}
}
-//--------------------------------------------------------------------
-// draw tractor beam when editing objects
-//--------------------------------------------------------------------
-// virtual
-void LLVOAvatar::idleUpdateTractorBeam()
-{
-}
-
void LLVOAvatar::idleUpdateBelowWater()
{
F32 avatar_height = (F32)(getPositionGlobal().mdV[VZ]);
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 6d9424c8be..d51b8701af 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -208,7 +208,6 @@ public:
void idleUpdateWindEffect();
void idleUpdateNameTag(const LLVector3& root_pos_last);
void idleUpdateRenderCost();
- void idleUpdateTractorBeam();
void idleUpdateBelowWater();
//--------------------------------------------------------------------
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 1a5d7289f4..a231afad3f 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -635,6 +635,7 @@ BOOL LLVOAvatarSelf::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
return TRUE;
}
LLVOAvatar::idleUpdate(agent, world, time);
+ idleUpdateTractorBeam();
return TRUE;
}
diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h
index 2b05273dc7..b060c9f076 100644
--- a/indra/newview/llwearableitemslist.h
+++ b/indra/newview/llwearableitemslist.h
@@ -361,7 +361,7 @@ private:
bool mSortWearableTypeByName;
LLWearableTypeOrder(ETypeListOrder order_priority, bool sort_asset_by_name, bool sort_wearable_by_name);
- LLWearableTypeOrder(){};
+ LLWearableTypeOrder() : mOrderPriority(ORDER_RANK_UNKNOWN), mSortAssetTypeByName(false), mSortWearableTypeByName(false) {};
};
ETypeListOrder getTypeListOrder(LLAssetType::EType item_type) const;
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index e4c2ca9ae3..1ee3b84b5e 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -3211,11 +3211,24 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
LLVertexBuffer::unbind();
- if (!LLPipeline::sReflectionRender && !LLPipeline::sRenderDeferred && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
+ if (!LLPipeline::sReflectionRender && !LLPipeline::sRenderDeferred)
{
- // Render debugging beacons.
- gObjectList.renderObjectBeacons();
- gObjectList.resetObjectBeacons();
+ if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
+ {
+ // Render debugging beacons.
+ gObjectList.renderObjectBeacons();
+ gObjectList.resetObjectBeacons();
+ }
+ else
+ {
+ // Make sure particle effects disappear
+ LLHUDObject::renderAllForTimer();
+ }
+ }
+ else
+ {
+ // Make sure particle effects disappear
+ LLHUDObject::renderAllForTimer();
}
LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderGeomEnd");
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 5ba1fc9b21..b489294f38 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -86,6 +86,9 @@
<color
name="LtOrange"
value="1 .85 .73 1" />
+ <color
+ name="MdBlue"
+ value=".07 .38 .51 1" />
<!-- This color name makes potentially unused colors show up bright purple.
Leave this here until all Unused? are removed below, otherwise
@@ -749,4 +752,7 @@
<color
name="ChatTimestampColor"
reference="White" />
+ <color
+ name="MenuBarProjectBgColor"
+ reference="MdBlue" />
</colors>
diff --git a/indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png b/indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png
new file mode 100644
index 0000000000..50c01062a5
--- /dev/null
+++ b/indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Dock_Press.png b/indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Dock_Press.png
new file mode 100644
index 0000000000..bf2065cd37
--- /dev/null
+++ b/indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Dock_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png b/indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png
new file mode 100644
index 0000000000..8b48258142
--- /dev/null
+++ b/indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Undock_Press.png b/indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Undock_Press.png
new file mode 100644
index 0000000000..09efe779fe
--- /dev/null
+++ b/indra/newview/skins/default/textures/taskpanel/Sidebar_Icon_Undock_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 082b37d80b..ce67cf0083 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -428,6 +428,12 @@ with the same filename but different name
<texture name="SegmentedBtn_Right_Selected_Disabled" file_name="widgets/SegmentedBtn_Right_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="Shirt_Large" file_name="icons/Shirt_Large.png" preload="false" />
+
+ <texture name="Sidebar_Icon_Dock_Foreground" file_name="taskpanel/Sidebar_Icon_Dock_Foreground.png" preload="false" />
+ <texture name="Sidebar_Icon_Dock_Press" file_name="taskpanel/Sidebar_Icon_Dock_Press.png" preload="false" />
+ <texture name="Sidebar_Icon_Undock_Foreground" file_name="taskpanel/Sidebar_Icon_Undock_Foreground.png" preload="false" />
+ <texture name="Sidebar_Icon_Undock_Press" file_name="taskpanel/Sidebar_Icon_Undock_Press.png" preload="false" />
+
<texture name="Shop" file_name="icons/Shop.png" preload="false" />
<texture name="SkipBackward_Off" file_name="icons/SkipBackward_Off.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/en/floater_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml
index efd96624ab..6370ff9243 100644
--- a/indra/newview/skins/default/xui/en/floater_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_map.xml
@@ -7,8 +7,8 @@
follows="top|right"
height="174"
layout="topleft"
- min_height="174"
- min_width="174"
+ min_height="128"
+ min_width="128"
name="Map"
title=""
help_topic="map"
@@ -19,40 +19,8 @@
top="0"
width="200">
<floater.string
- name="mini_map_north">
- N
- </floater.string>
- <floater.string
- name="mini_map_east">
- E
- </floater.string>
- <floater.string
- name="mini_map_west">
- W
- </floater.string>
- <floater.string
- name="mini_map_south">
- S
- </floater.string>
- <floater.string
- name="mini_map_southeast">
- SE
- </floater.string>
- <floater.string
- name="mini_map_northeast">
- NE
- </floater.string>
- <floater.string
- name="mini_map_southwest">
- SW
- </floater.string>
- <floater.string
- name="mini_map_northwest">
- NW
- </floater.string>
- <floater.string
name="ToolTipMsg">
- [AGENT][REGION](Double-click to open Map)
+ [REGION](Double-click to open Map, shift-drag to pan)
</floater.string>
<floater.string name="mini_map_caption">
MINIMAP
diff --git a/indra/newview/skins/default/xui/en/floater_side_bar_tab.xml b/indra/newview/skins/default/xui/en/floater_side_bar_tab.xml
index 1466c2d2a5..bf0913fde7 100644
--- a/indra/newview/skins/default/xui/en/floater_side_bar_tab.xml
+++ b/indra/newview/skins/default/xui/en/floater_side_bar_tab.xml
@@ -1,5 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<floater
can_close="false"
- can_resize="true">
+ can_resize="true"
+ min_width="150"
+ save_rect="true"
+ save_visibility="true"
+ >
</floater>
diff --git a/indra/newview/skins/default/xui/en/menu_mini_map.xml b/indra/newview/skins/default/xui/en/menu_mini_map.xml
index f5ea3e735b..8fe89d3934 100644
--- a/indra/newview/skins/default/xui/en/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/en/menu_mini_map.xml
@@ -29,6 +29,7 @@
function="Minimap.Zoom"
parameter="far" />
</menu_item_call>
+ <menu_item_separator />
<menu_item_check
label="Rotate Map"
name="Rotate Map">
@@ -38,6 +39,15 @@
function="ToggleControl"
parameter="MiniMapRotate" />
</menu_item_check>
+ <menu_item_check
+ label="Auto Center"
+ name="Auto Center">
+ <menu_item_check.on_check
+ control="MiniMapAutoCenter" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="MiniMapAutoCenter" />
+ </menu_item_check>
<menu_item_separator />
<menu_item_call
label="Stop Tracking"
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
index 588342595e..5d58a9d289 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
@@ -57,4 +57,13 @@
<on_click
function="Avatar.Pay" />
</menu_item_call>
+ <menu_item_call
+ label="Offer Teleport"
+ name="teleport">
+ <menu_item_call.on_click
+ function="Avatar.OfferTeleport"/>
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_offer_teleport"/>
+ </menu_item_call>
</context_menu>
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
index 876ff9961b..f58715be56 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
@@ -79,6 +79,7 @@
left_pad="3"
right="-53"
name="info_btn"
+ tab_stop="false"
top_delta="-2"
width="16" />
<button
@@ -89,6 +90,7 @@
left_pad="5"
right="-28"
name="profile_btn"
+ tab_stop="false"
tool_tip="View profile"
top_delta="-2"
width="20" />
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 4b622691b3..cdd596222d 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -12,6 +12,9 @@
top="28"
width="1310">
<string
+ name="DragIndicationImageName"
+ value="Accordion_ArrowOpened_Off" />
+ <string
name="SpeakBtnToolTip"
value="Turns microphone on/off" />
<string
@@ -135,7 +138,7 @@
name="movement_panel"
user_resize="false"
width="83">
- <button
+ <bottomtray_button
follows="left|right"
height="23"
image_pressed="PushButton_Press"
@@ -152,7 +155,8 @@
<init_callback
function="Button.SetDockableFloaterToggle"
parameter="moveview" />
- </button>
+ </bottomtray_button>
+
</layout_panel>
<layout_panel
auto_resize="false"
@@ -165,7 +169,7 @@
name="cam_panel"
user_resize="false"
width="83">
- <button
+ <bottomtray_button
follows="left|right"
height="23"
image_pressed="PushButton_Press"
@@ -183,7 +187,7 @@
<init_callback
function="Button.SetDockableFloaterToggle"
parameter="camera" />
- </button>
+ </bottomtray_button>
</layout_panel>
<layout_panel
auto_resize="false"
@@ -195,7 +199,7 @@
name="snapshot_panel"
user_resize="false"
width="39">
- <button
+ <bottomtray_button
follows="left|right"
height="23"
image_overlay="Snapshot_Off"
@@ -212,7 +216,7 @@
<init_callback
function="Button.SetFloaterToggle"
parameter="snapshot" />
- </button>
+ </bottomtray_button>
</layout_panel>
<layout_panel
auto_resize="false"
@@ -228,7 +232,7 @@
<!--*FIX: Build Floater is not opened with default registration. Will be fixed soon.
Disabled for now.
-->
- <button
+ <bottomtray_button
follows="left|right"
height="23"
image_pressed="PushButton_Press"
@@ -246,7 +250,7 @@ Disabled for now.
<commit_callback
function="Build.Toggle"
parameter="build" />
- </button>
+ </bottomtray_button>
</layout_panel>
<layout_panel
auto_resize="false"
@@ -259,7 +263,7 @@ Disabled for now.
name="search_btn_panel"
user_resize="false"
width="83">
- <button
+ <bottomtray_button
follows="left|right"
height="23"
image_pressed="PushButton_Press"
@@ -277,7 +281,7 @@ Disabled for now.
<init_callback
function="Button.SetFloaterToggle"
parameter="search" />
- </button>
+ </bottomtray_button>
</layout_panel>
<layout_panel
auto_resize="false"
@@ -290,7 +294,7 @@ Disabled for now.
name="world_map_btn_panel"
user_resize="false"
width="83">
- <button
+ <bottomtray_button
follows="left|right"
height="23"
image_pressed="PushButton_Press"
@@ -308,7 +312,7 @@ Disabled for now.
<init_callback
function="Button.SetFloaterToggle"
parameter="world_map" />
- </button>
+ </bottomtray_button>
</layout_panel>
<layout_panel
auto_resize="false"
@@ -321,7 +325,7 @@ Disabled for now.
name="mini_map_btn_panel"
user_resize="false"
width="83">
- <button
+ <bottomtray_button
follows="left|right"
height="23"
image_pressed="PushButton_Press"
@@ -339,7 +343,7 @@ Disabled for now.
<init_callback
function="Button.SetFloaterToggle"
parameter="mini_map" />
- </button>
+ </bottomtray_button>
</layout_panel>
<layout_panel
follows="left|right"
diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml
index 268cb4e5f9..0fb7691ee7 100644
--- a/indra/newview/skins/default/xui/en/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml
@@ -39,7 +39,7 @@
Disabled
</panel.string>
<button
- follows="top|right"
+ follows="top|left"
height="24"
image_hover_unselected="BackButton_Over"
image_pressed="BackButton_Press"
@@ -398,30 +398,74 @@
top_pad="5"
left="9"
name="buttons">
- <button
- follows="bottom|left"
- height="23"
- label="Teleport"
- layout="topleft"
- left="0"
- name="teleport_btn"
- top="0"
- width="101" />
- <button
- follows="bottom|left"
- height="23"
- label="Map"
- layout="topleft"
- left_pad="3"
- name="show_on_map_btn"
- width="100" />
- <button
- follows="bottom|left"
- height="23"
- label="Edit"
- layout="topleft"
- name="edit_btn"
- left_pad="3"
- width="101" />
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ name="layout_stack1"
+ left="0"
+ orientation="horizontal"
+ top_pad="0"
+ width="309">
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ name="layout_panel1"
+ user_resize="false"
+ auto_resize="true"
+ width="101">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ left="0"
+ name="teleport_btn"
+ top="0"
+ width="101" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="show_on_map_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="100">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Map"
+ layout="topleft"
+ name="show_on_map_btn"
+ top="0"
+ width="100" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="edit_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="101">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Edit"
+ layout="topleft"
+ name="edit_btn"
+ top="0"
+ width="101" />
+ </layout_panel>
+ </layout_stack>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
index a5c74b08e7..5934956559 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
@@ -23,7 +23,7 @@
Save
</string>
<button
- follows="top|right"
+ follows="top|left"
height="24"
image_hover_unselected="BackButton_Over"
image_pressed="BackButton_Press"
@@ -119,7 +119,7 @@
layout="topleft"
left="10"
top_pad="2"
- max_length="63"
+ max_length="30"
name="classified_name"
prevalidate_callback="ascii"
text_color="black"
@@ -147,7 +147,7 @@
layout="topleft"
left="10"
top_pad="2"
- max_length="1023"
+ max_length="64"
name="classified_desc"
text_color="black"
word_wrap="true" />
@@ -301,22 +301,56 @@
name="bottom_panel"
top_pad="5"
width="303">
- <button
- follows="bottom|left"
- height="23"
- label="[LABEL]"
- layout="topleft"
- name="save_changes_btn"
- left="0"
- top="0"
- width="152" />
- <button
- follows="bottom|left"
- height="23"
- label="Cancel"
- layout="topleft"
- name="cancel_btn"
- left_pad="3"
- width="153" />
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ name="bottom_panel_ls"
+ left="1"
+ orientation="horizontal"
+ top_pad="0"
+ width="309">
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ name="save_changes_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="156">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="[LABEL]"
+ layout="topleft"
+ name="save_changes_btn"
+ left="1"
+ top="0"
+ width="155" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="show_on_map_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="157">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ left="1"
+ top="0"
+ width="156" />
+ </layout_panel>
+ </layout_stack>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
index f50e182313..c4b831b71c 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -17,7 +17,7 @@
(will update after save)
</panel.string>
<button
- follows="top|right"
+ follows="top|left"
height="24"
image_hover_unselected="BackButton_Over"
image_pressed="BackButton_Press"
@@ -183,22 +183,57 @@
name="bottom_panel"
top_pad="5"
width="303">
- <button
- follows="bottom|left"
- height="23"
- label="Save Pick"
- layout="topleft"
- name="save_changes_btn"
- left="0"
- top="0"
- width="152" />
- <button
- follows="bottom|left"
- height="23"
- label="Cancel"
- layout="topleft"
- name="cancel_btn"
- left_pad="3"
- width="153" />
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ name="layout_stack1"
+ left="2"
+ orientation="horizontal"
+ top_pad="0"
+ width="303">
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="layout_panel1"
+ user_resize="false"
+ auto_resize="true"
+ width="150">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Save Pick"
+ layout="topleft"
+ name="save_changes_btn"
+ top="0"
+ left="1"
+ width="149" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ left_pad="4"
+ name="layout_panel1"
+ user_resize="false"
+ auto_resize="true"
+ width="150">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ top="0"
+ left="1"
+ width="149" />
+ </layout_panel>
+ </layout_stack>
+
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
index 5072ec3a66..8715a3a7a8 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
@@ -325,28 +325,63 @@
</panel>
</scroll_container>
<panel
- follows="bottom|left"
+ follows="bottom|left|right"
height="28"
left="0"
name="profile_me_buttons_panel"
top_pad="0"
width="313">
- <button
- follows="bottom|left"
- height="23"
- label="Save Changes"
- layout="topleft"
- left="8"
- name="save_btn"
- top="5"
- width="152" />
- <button
- follows="bottom|left"
- height="23"
- label="Cancel"
- layout="topleft"
- left_pad="3"
- name="cancel_btn"
- width="153" />
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="28"
+ layout="topleft"
+ name="bottom_panel_ls"
+ left="7"
+ orientation="horizontal"
+ top_pad="0"
+ width="295">
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ name="save_changes_btn_lp"
+ top="0"
+ user_resize="false"
+ auto_resize="true"
+ width="153">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Save Changes"
+ layout="topleft"
+ left="1"
+ name="save_btn"
+ top="0"
+ width="152" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="show_on_map_btn_lp"
+ top="0"
+ user_resize="false"
+ auto_resize="true"
+ width="154">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left="1"
+ name="cancel_btn"
+ top="0"
+ width="153" />
+ </layout_panel>
+ </layout_stack>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
index 9fb777e0e7..95c1c822b8 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
@@ -187,7 +187,7 @@
width="150" />
<radio_group
control_name="AvatarSex"
- follows="left|top|right"
+ follows="top|right"
height="20"
layout="topleft"
left="210"
@@ -217,6 +217,7 @@
</radio_group>
<!-- graphical labels for the radio buttons above -->
<icon
+ follows="top|right"
height="16"
image_name="icons/Male.png"
layout="topleft"
@@ -226,6 +227,7 @@
top="7"
width="16" />
<icon
+ follows="top|right"
height="16"
image_name="icons/Female.png"
layout="topleft"
@@ -416,22 +418,55 @@
name="button_panel"
top_pad="6"
width="333">
- <button
- follows="bottomleft"
+ <layout_stack
+ follows="bottom|left|right"
height="23"
- label="Save As"
layout="topleft"
- left="8"
- name="save_as_button"
+ mouse_opaque="false"
+ name="button_panel_ls"
+ left="0"
+ orientation="horizontal"
top="0"
- width="153" />
- <button
- follows="bottomleft"
- height="23"
- label="Undo Changes"
- layout="topleft"
- left_pad="7"
- name="revert_button"
- width="152" />
+ width="333">
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ mouse_opaque="false"
+ name="save_as_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="154">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Save As"
+ layout="topleft"
+ left="1"
+ name="save_as_button"
+ top="0"
+ width="153" />
+ </layout_panel>
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ mouse_opaque="false"
+ name="revert_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="152">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Undo Changes"
+ layout="topleft"
+ left_pad="7"
+ name="revert_button"
+ width="152" />
+ </layout_panel>
+ </layout_stack>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index 4998322d62..eb02d4104b 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -183,51 +183,121 @@ background_visible="true"
left="0"
top_pad="0"
name="button_row"
- follows="bottom|left"
+ follows="bottom|left|right"
width="313">
- <button
- follows="bottom|left"
- height="23"
- image_overlay="Refresh_Off"
- layout="topleft"
- left="0"
- top="5"
- name="btn_refresh"
- width="23" />
- <button
- follows="bottom|left"
- label="Chat"
- name="btn_chat"
- left_pad="3"
- height="23"
- width="82" />
- <button
- follows="bottom|left"
- left_pad="3"
- height="23"
- name="btn_call"
- label="Group Call"
- layout="topleft"
- tool_tip="Call this group"
- width="112" />
- <button
- follows="bottom|left"
- height="23"
- label="Save"
- label_selected="Save"
- name="btn_apply"
- left_pad="3"
- width="82" />
- <button
- follows="bottom|left"
- height="23"
- layout="topleft"
- left="0"
- label="Create Group"
- name="btn_create"
- visible="true"
- tool_tip="Create a new Group"
- width="103" />
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="25"
+ layout="topleft"
+ name="button_row_ls"
+ left="2"
+ orientation="horizontal"
+ top_pad="5"
+ width="309">
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ name="btn_refresh_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="24">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ image_overlay="Refresh_Off"
+ layout="topleft"
+ left="1"
+ top="0"
+ name="btn_refresh"
+ width="23" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="btn_chat_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="83">
+ <button
+ follows="bottom|left|right"
+ label="Chat"
+ name="btn_chat"
+ left="1"
+ height="23"
+ top="0"
+ width="82" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="call_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="113">
+ <button
+ follows="bottom|left|right"
+ left="1"
+ height="23"
+ name="btn_call"
+ label="Group Call"
+ layout="topleft"
+ tool_tip="Call this group"
+ top="0"
+ width="112" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="btn_apply_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="83">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Save"
+ label_selected="Save"
+ name="btn_apply"
+ left="1"
+ top="0"
+ width="82" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="btn_create_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="104">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ left="1"
+ top="0"
+ label="Create Group"
+ name="btn_create"
+ visible="true"
+ tool_tip="Create a new Group"
+ width="103" />
+ </layout_panel>
+ </layout_stack>
<!--<button
left_pad="3"
height="23"
diff --git a/indra/newview/skins/default/xui/en/panel_group_list_item.xml b/indra/newview/skins/default/xui/en/panel_group_list_item.xml
index ab34cbf20e..0b84ac03c5 100644
--- a/indra/newview/skins/default/xui/en/panel_group_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_list_item.xml
@@ -55,6 +55,7 @@
left_pad="3"
right="-31"
name="info_btn"
+ tab_stop="false"
top_delta="-2"
width="16" />
<!--*TODO: Should only appear on rollover-->
@@ -66,6 +67,7 @@
left_pad="5"
right="-3"
name="profile_btn"
+ tab_stop="false"
tool_tip="View profile"
top_delta="-2"
width="20" />
diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml
index a7e87f2a1e..7e415f45a4 100644
--- a/indra/newview/skins/default/xui/en/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml
@@ -97,51 +97,94 @@
left="3"
name="bottom_panel"
width="313">
- <button
- follows="bottom|left"
- tool_tip="Show additional options"
- height="25"
- image_hover_unselected="Toolbar_Left_Over"
- image_overlay="OptionsMenu_Off"
- image_selected="Toolbar_Left_Selected"
- image_unselected="Toolbar_Left_Off"
- layout="topleft"
- left="0"
- name="options_gear_btn"
- top="1"
- width="31" />
- <button
- follows="bottom|left"
- height="25"
- image_hover_unselected="Toolbar_Middle_Over"
- image_overlay="AddItem_Off"
- image_selected="Toolbar_Middle_Selected"
- image_unselected="Toolbar_Middle_Off"
- layout="topleft"
- left_pad="1"
- name="add_btn"
- tool_tip="Add new landmark"
- width="31" />
- <icon
- follows="bottom|left"
- height="25"
- image_name="Toolbar_Middle_Off"
- layout="topleft"
- left_pad="1"
- name="dummy_icon"
- width="209"
- />
- <dnd_button
- follows="bottom|left"
- height="25"
- image_hover_unselected="Toolbar_Right_Over"
- image_overlay="TrashItem_Off"
- image_selected="Toolbar_Right_Selected"
- image_unselected="Toolbar_Right_Off"
- layout="topleft"
- left_pad="1"
- name="trash_btn"
- tool_tip="Remove selected landmark"
- width="31" />
- </panel>
+
+ <layout_stack
+ animate="false"
+ border_size="0"
+ follows="left|right|bottom"
+ height="25"
+ layout="topleft"
+ orientation="horizontal"
+ top_pad="1"
+ left="0"
+ name="bottom_panel"
+ width="307">
+ <layout_panel
+ auto_resize="false"
+ height="25"
+ layout="topleft"
+ name="options_gear_btn_panel"
+ width="32">
+ <button
+ follows="bottom|left"
+ tool_tip="Show additional options"
+ height="25"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
+ layout="topleft"
+ left="0"
+ name="options_gear_btn"
+ top="0"
+ width="31" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="25"
+ layout="topleft"
+ name="add_btn_panel"
+ width="32">
+ <button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left="0"
+ name="add_btn"
+ tool_tip="Add new landmark"
+ top="0"
+ width="31" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="true"
+ height="25"
+ layout="topleft"
+ name="dummy_panel"
+ width="212">
+ <icon
+ follows="bottom|left|right"
+ height="25"
+ image_name="Toolbar_Middle_Off"
+ layout="topleft"
+ left="0"
+ top="0"
+ name="dummy_icon"
+ width="211" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="25"
+ layout="topleft"
+ name="trash_btn_panel"
+ width="31">
+ <dnd_button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Right_Over"
+ image_overlay="TrashItem_Off"
+ image_selected="Toolbar_Right_Selected"
+ image_unselected="Toolbar_Right_Off"
+ left="0"
+ layout="topleft"
+ name="trash_btn"
+ tool_tip="Remove selected landmark"
+ top="0"
+ width="31"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml
index 4629bb9cfe..684d38146a 100644
--- a/indra/newview/skins/default/xui/en/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml
@@ -392,7 +392,7 @@
height="28"
width="315">
<button
- follows="bottom|right"
+ follows="bottom"
height="23"
left="6"
top="1"
diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml
index cff7b51ce8..530e191952 100644
--- a/indra/newview/skins/default/xui/en/panel_notes.xml
+++ b/indra/newview/skins/default/xui/en/panel_notes.xml
@@ -112,58 +112,125 @@
name="notes_buttons_panel"
auto_resize="false"
width="313">
- <button
- follows="bottom|left"
- height="23"
- label="Add Friend"
- layout="topleft"
- left="2"
- mouse_opaque="false"
- name="add_friend"
- tool_tip="Offer friendship to the Resident"
- top="5"
- width="80" />
- <button
- follows="bottom|left"
- height="23"
- label="IM"
- layout="topleft"
- name="im"
- tool_tip="Open instant message session"
- top="5"
- left_pad="3"
- width="45" />
- <button
- follows="bottom|left"
- height="23"
- label="Call"
- layout="topleft"
- name="call"
- tool_tip="Call this Resident"
- left_pad="3"
- top="5"
- width="46" />
- <button
- enabled="false"
- follows="bottom|left"
- height="23"
- label="Map"
- layout="topleft"
- name="show_on_map_btn"
- tool_tip="Show the Resident on the map"
- top="5"
- left_pad="3"
- width="45" />
- <button
- follows="bottom|left"
- height="23"
- label="Teleport"
- layout="topleft"
- name="teleport"
- tool_tip="Offer teleport"
- left_pad="3"
- top="5"
- width="80" />
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ name="bottom_bar_ls"
+ left="2"
+ orientation="horizontal"
+ top_pad="5"
+ width="309">
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ name="add_friend_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="118">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Add Friend"
+ layout="topleft"
+ left="1"
+ mouse_opaque="false"
+ name="add_friend"
+ tool_tip="Offer friendship to the Resident"
+ top="0"
+ width="117" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="im_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="22">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="IM"
+ layout="topleft"
+ name="im"
+ tool_tip="Open instant message session"
+ top="0"
+ left="1"
+ width="21" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="call_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="52">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Call"
+ layout="topleft"
+ name="call"
+ tool_tip="Call this Resident"
+ left="1"
+ top="0"
+ use_ellipses="true"
+ width="51" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="show_on_map_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="46">
+ <button
+ enabled="false"
+ follows="bottom|left|right"
+ height="23"
+ label="Map"
+ layout="topleft"
+ name="show_on_map_btn"
+ tool_tip="Show the Resident on the map"
+ top="0"
+ left="1"
+ width="45" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="teleport_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="81">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ name="teleport"
+ tool_tip="Offer teleport"
+ left="1"
+ top="0"
+ width="80" />
+ </layout_panel>
+ </layout_stack>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
index e6714af943..1cbdecab9d 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -71,7 +71,7 @@
top="1"
width="30" />
<text
- follows="top|right"
+ follows="top|left|right"
font="SansSerifHugeBold"
height="26"
layout="topleft"
@@ -108,7 +108,7 @@
width="31" />
<panel
bevel_style="none"
- follows="top|right"
+ follows="top|left|right"
height="37"
layout="topleft"
left_pad="5"
@@ -494,39 +494,72 @@ It is calculated as border_size + 2*UIResizeBarOverlap
top_pad="2"
name="save_revert_button_bar"
width="300">
- <button
- follows="bottom|left"
- height="23"
- label="Save"
- left="0"
- layout="topleft"
- name="save_btn"
- top="0"
- width="155" />
- <button
- follows="bottom|left"
- height="23"
- name="save_flyout_btn"
- label=""
- layout="topleft"
- left_pad="-20"
- tab_stop="false"
- top="0"
- image_selected="SegmentedBtn_Right_Selected_Press"
- image_unselected="SegmentedBtn_Right_Off"
- image_pressed="SegmentedBtn_Right_Press"
- image_pressed_selected="SegmentedBtn_Right_Selected_Press"
- image_overlay="Arrow_Small_Up"
- width="20"/>
- <button
- follows="bottom|left|right"
- height="23"
- left_pad="12"
- label="Undo Changes"
- layout="topleft"
- name="revert_btn"
- top="0"
- tool_tip="Revert to last saved version"
- width="147" />
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ mouse_opaque="false"
+ name="button_bar_ls"
+ left="0"
+ orientation="horizontal"
+ top="0"
+ width="313">
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ mouse_opaque="false"
+ name="save_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="156">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Save"
+ left="1"
+ layout="topleft"
+ name="save_btn"
+ top="0"
+ width="155" />
+ <button
+ follows="bottom|right"
+ height="23"
+ name="save_flyout_btn"
+ label=""
+ layout="topleft"
+ left_pad="-20"
+ tab_stop="false"
+ top="0"
+ image_selected="SegmentedBtn_Right_Selected_Press"
+ image_unselected="SegmentedBtn_Right_Off"
+ image_pressed="SegmentedBtn_Right_Press"
+ image_pressed_selected="SegmentedBtn_Right_Selected_Press"
+ image_overlay="Arrow_Small_Up"
+ width="20"/>
+ </layout_panel>
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ mouse_opaque="false"
+ name="revert_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="147">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ left="0"
+ label="Undo Changes"
+ layout="topleft"
+ name="revert_btn"
+ top="0"
+ tool_tip="Revert to last saved version"
+ width="147" />
+ </layout_panel>
+ </layout_stack>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
index 82b69ba8dc..88c82313dd 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -67,36 +67,70 @@
visible="true"
name="bottom_panel"
width="310">
- <button
- follows="bottom|left"
- height="23"
- label="Save As"
- left="0"
- layout="topleft"
- name="save_btn"
- top_pad="0"
- width="155" />
- <button
- follows="bottom|left"
- height="23"
- name="save_flyout_btn"
- label=""
- layout="topleft"
- left_pad="-20"
- tab_stop="false"
- image_selected="SegmentedBtn_Right_Selected_Press"
- image_unselected="SegmentedBtn_Right_Off"
- image_pressed="SegmentedBtn_Right_Press"
- image_pressed_selected="SegmentedBtn_Right_Selected_Press"
- image_overlay="Arrow_Small_Up"
- width="20"/>
- <button
- follows="bottom|left|right"
- height="23"
- label="Wear"
- layout="topleft"
- name="wear_btn"
- left_pad="3"
- width="152" />
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ mouse_opaque="false"
+ name="bottom_panel_ls"
+ left="0"
+ orientation="horizontal"
+ top="0"
+ width="313">
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ mouse_opaque="false"
+ name="save_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="156">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Save As"
+ left="1"
+ layout="topleft"
+ name="save_btn"
+ top="0"
+ width="155" />
+ <button
+ follows="bottom|right"
+ height="23"
+ name="save_flyout_btn"
+ label=""
+ layout="topleft"
+ left_pad="-20"
+ tab_stop="false"
+ image_selected="SegmentedBtn_Right_Selected_Press"
+ image_unselected="SegmentedBtn_Right_Off"
+ image_pressed="SegmentedBtn_Right_Press"
+ image_pressed_selected="SegmentedBtn_Right_Selected_Press"
+ image_overlay="Arrow_Small_Up"
+ width="20"/>
+ </layout_panel>
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ mouse_opaque="false"
+ name="wear_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="152">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Wear"
+ layout="topleft"
+ name="wear_btn"
+ left="0"
+ top="0"
+ width="152" />
+ </layout_panel>
+ </layout_stack>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 7cd0d5b5f0..059283ce09 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -143,7 +143,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
function="People.addFriend" />
</button>
<icon
- follows="bottom|left"
+ follows="bottom|left|right"
height="25"
image_name="Toolbar_Right_Off"
layout="topleft"
@@ -222,6 +222,96 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
name="bottom_panel"
top_pad="0"
width="313">
+
+ <layout_stack
+ animate="false"
+ border_size="0"
+ follows="left|right|bottom"
+ height="25"
+ layout="topleft"
+ orientation="horizontal"
+ top_pad="1"
+ left="0"
+ name="bottom_panel"
+ width="305">
+ <layout_panel
+ auto_resize="false"
+ height="25"
+ layout="topleft"
+ name="options_gear_btn_panel"
+ width="32">
+ <button
+ follows="bottom|left"
+ tool_tip="Show additional options"
+ height="25"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
+ layout="topleft"
+ left="0"
+ name="friends_viewsort_btn"
+ top="0"
+ width="31" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="25"
+ layout="topleft"
+ name="add_btn_panel"
+ width="32">
+ <button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left="0"
+ name="add_btn"
+ tool_tip="Offer friendship to a Resident"
+ top="0"
+ width="31" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="true"
+ height="25"
+ layout="topleft"
+ name="dummy_panel"
+ width="212">
+ <icon
+ follows="bottom|left|right"
+ height="25"
+ image_name="Toolbar_Middle_Off"
+ layout="topleft"
+ left="0"
+ top="0"
+ name="dummy_icon"
+ width="211" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="25"
+ layout="topleft"
+ name="trash_btn_panel"
+ width="31">
+ <dnd_button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Right_Over"
+ image_overlay="TrashItem_Off"
+ image_selected="Toolbar_Right_Selected"
+ image_unselected="Toolbar_Right_Off"
+ left="0"
+ layout="topleft"
+ name="trash_btn"
+ tool_tip="Remove selected person from your Friends list"
+ top="0"
+ width="31"/>
+ </layout_panel>
+ </layout_stack><!--
+
<button
follows="bottom|left"
tool_tip="Options"
@@ -248,7 +338,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
tool_tip="Offer friendship to a Resident"
width="31" />
<icon
- follows="bottom|left"
+ follows="bottom|left|right"
height="25"
image_name="Toolbar_Middle_Off"
layout="topleft"
@@ -268,7 +358,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
name="del_btn"
tool_tip="Remove selected person from your Friends list"
width="31" />
- </panel>
+ --></panel>
<text
follows="all"
height="450"
@@ -353,7 +443,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
tool_tip="Activate selected group"
width="31" />
<icon
- follows="bottom|left"
+ follows="bottom|left|right"
height="25"
image_name="Toolbar_Right_Off"
layout="topleft"
@@ -427,7 +517,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
function="People.addFriend" />
</button>
<icon
- follows="bottom|left"
+ follows="bottom|left|right"
height="25"
image_name="Toolbar_Right_Off"
layout="topleft"
@@ -439,85 +529,210 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
</panel>
</tab_container>
<panel
- follows="bottom|left"
+ follows="bottom|left|right"
height="23"
layout="topleft"
left="8"
top_pad="4"
name="button_bar"
width="313">
- <button
- follows="bottom|left"
- height="23"
- label="Profile"
- layout="topleft"
- name="view_profile_btn"
- tool_tip="Show picture, groups, and other Residents information"
- top="0"
- width="67" />
- <button
- follows="bottom|left"
- left_pad="3"
- height="23"
- label="IM"
- layout="topleft"
- name="im_btn"
- tool_tip="Open instant message session"
- width="40" />
- <button
- follows="bottom|left"
- left_pad="3"
- height="23"
- label="Call"
- layout="topleft"
- name="call_btn"
- tool_tip="Call this Resident"
- width="51" />
- <button
- follows="bottom|left"
- left_pad="3"
- height="23"
- label="Share"
- layout="topleft"
- name="share_btn"
- tool_tip="Share an inventory item"
- width="65" />
- <button
- follows="bottom|left"
- left_pad="3"
- height="23"
- label="Teleport"
- layout="topleft"
- name="teleport_btn"
- tool_tip="Offer teleport"
- width="76" />
- <button
- follows="bottom|left"
- left="0"
- top_delta="0"
- height="23"
- label="Group Profile"
- layout="topleft"
- name="group_info_btn"
- tool_tip="Show group information"
- width="107" />
- <button
- follows="bottom|left"
- left_pad="3"
- height="23"
- label="Group Chat"
- layout="topleft"
- name="chat_btn"
- tool_tip="Open chat session"
- width="100" />
- <button
- follows="bottom|left"
- left_pad="3"
- height="23"
- label="Group Call"
- layout="topleft"
- name="group_call_btn"
- tool_tip="Call this group"
- width="95" />
+
+<!--********************************Profile; IM; Call, Share, Teleport********************************-->
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ name="bottom_bar_ls"
+ left="0"
+ orientation="horizontal"
+ top_pad="0"
+ width="313">
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ name="view_profile_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="68">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Profile"
+ layout="topleft"
+ left="1"
+ name="view_profile_btn"
+ tool_tip="Show picture, groups, and other Residents information"
+ top="0"
+ width="67" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="chat_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="41">
+ <button
+ follows="bottom|left|right"
+ left="1"
+ height="23"
+ label="IM"
+ layout="topleft"
+ name="im_btn"
+ tool_tip="Open instant message session"
+ top="0"
+ width="40" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="chat_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="52">
+ <button
+ follows="bottom|left|right"
+ left="1"
+ height="23"
+ label="Call"
+ layout="topleft"
+ name="call_btn"
+ tool_tip="Call this Resident"
+ top="0"
+ width="51" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="chat_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="66">
+ <button
+ follows="bottom|left|right"
+ left="1"
+ height="23"
+ label="Share"
+ layout="topleft"
+ name="share_btn"
+ tool_tip="Share an inventory item"
+ top="0"
+ width="65" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="chat_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="77">
+ <button
+ follows="bottom|left|right"
+ left="1"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ name="teleport_btn"
+ tool_tip="Offer teleport"
+ top="0"
+ width="76" />
+ </layout_panel>
+ </layout_stack>
+
+<!--********************************Group Profile; Group Chat; Group Call buttons************************-->
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ mouse_opaque="false"
+ name="bottom_bar_ls1"
+ left="0"
+ orientation="horizontal"
+ top="0"
+ width="313">
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ mouse_opaque="false"
+ name="group_info_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="108">
+ <button
+ follows="bottom|left|right"
+ left="1"
+ height="23"
+ label="Group Profile"
+ layout="topleft"
+ mouse_opaque="false"
+ name="group_info_btn"
+ tool_tip="Show group information"
+ top="0"
+ width="107" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ mouse_opaque="false"
+ name="chat_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="101">
+ <button
+ follows="bottom|left|right"
+ left="1"
+ height="23"
+ label="Group Chat"
+ layout="topleft"
+ mouse_opaque="false"
+ name="chat_btn"
+ tool_tip="Open chat session"
+ top="0"
+ width="100" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ mouse_opaque="false"
+ name="group_call_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="96">
+ <button
+ follows="bottom|left|right"
+ left="1"
+ height="23"
+ label="Group Call"
+ layout="topleft"
+ mouse_opaque="false"
+ name="group_call_btn"
+ tool_tip="Call this group"
+ top="0"
+ width="95" />
+ </layout_panel>
+ </layout_stack>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml
index 95c8cb301d..0496c86215 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml
@@ -11,7 +11,7 @@
top="0"
width="333">
<button
- follows="top|right"
+ follows="top|left"
height="24"
image_hover_unselected="BackButton_Over"
image_pressed="BackButton_Press"
@@ -121,30 +121,73 @@
top_pad="5"
left="8"
name="buttons">
- <button
- follows="bottom|left"
- height="23"
- label="Teleport"
- layout="topleft"
- left="0"
- name="teleport_btn"
- top="0"
- width="101" />
- <button
- follows="bottom|left"
- height="23"
- label="Map"
- layout="topleft"
- left_pad="3"
- name="show_on_map_btn"
- width="100" />
- <button
- follows="bottom|left"
- height="23"
- label="Edit"
- layout="topleft"
- name="edit_btn"
- left_pad="3"
- width="101" />
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ name="layout_stack1"
+ left="0"
+ orientation="horizontal"
+ top_pad="0"
+ width="312">
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ name="layout_panel1"
+ user_resize="false"
+ auto_resize="true"
+ width="101">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ name="teleport_btn"
+ top="0"
+ width="101" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="show_on_map_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="100">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Map"
+ layout="topleft"
+ name="show_on_map_btn"
+ top_pad="0"
+ width="100" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="edit_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="101">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Edit"
+ layout="topleft"
+ name="edit_btn"
+ top_pad="0"
+ width="101" />
+ </layout_panel>
+ </layout_stack>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index a815cdf7f0..647be28a62 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -78,93 +78,166 @@ bg_opaque_color="DkGray2"
bevel_style="none"
enabled="false"
auto_resize="false"
- follows="bottom"
+ follows="bottom|left|right"
left="1"
height="27"
label="bottom_panel"
- layout="topleft"
+ layout="bottom"
name="edit_panel"
top_pad="-2"
width="313">
- <button
- enabled="false"
- follows="bottom|left"
- height="18"
- image_selected="OptionsMenu_Press"
- image_unselected="OptionsMenu_Off"
- image_disabled="OptionsMenu_Disabled"
- layout="topleft"
- left="10"
- name="gear_menu_btn"
- top="9"
- width="18" />
- <button
- follows="bottom|left"
- height="18"
- image_disabled="AddItem_Disabled"
- image_selected="AddItem_Press"
- image_unselected="AddItem_Off"
- layout="topleft"
- left_pad="15"
- name="new_btn"
- tool_tip="Create a new pick or classified at the current location"
- top="9"
- width="18" />
- <button
- follows="bottom|right"
- height="18"
- image_disabled="TrashItem_Disabled"
- image_selected="TrashItem_Press"
- image_unselected="TrashItem_Off"
- layout="topleft"
- name="trash_btn"
- right="-10"
- top="9"
- width="18" />
- </panel>
- <panel
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ name="edit_panel_ls"
+ left="10"
+ orientation="horizontal"
+ top_pad="0"
+ width="293">
+
+ <layout_panel
+ follows="bottom|left"
+ height="18"
+ layout="bottomleft"
+ left="0"
+ name="gear_menu_btn"
+ user_resize="false"
+ auto_resize="true"
+ width="51">
+ <button
+ enabled="false"
+ follows="bottom|left"
+ height="18"
+ image_selected="OptionsMenu_Press"
+ image_unselected="OptionsMenu_Off"
+ image_disabled="OptionsMenu_Disabled"
+ layout="topleft"
+ left="0"
+ name="gear_menu_btn"
+ top_pad="0"
+ width="18" />
+ <button
+ follows="bottom|left"
+ height="18"
+ image_disabled="AddItem_Disabled"
+ image_selected="AddItem_Press"
+ image_unselected="AddItem_Off"
+ layout="topleft"
+ left_pad="15"
+ name="new_btn"
+ tool_tip="Create a new pick or classified at the current location"
+ width="18" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|right"
+ height="18"
+ layout="bottomleft"
+ name="trash_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="18">
+ <button
+ follows="bottom|right"
+ height="18"
+ image_disabled="TrashItem_Disabled"
+ image_selected="TrashItem_Press"
+ image_unselected="TrashItem_Off"
+ layout="topleft"
+ name="trash_btn"
+ top="0"
+ width="18" />
+ </layout_panel>
+
+ </layout_stack>
+ </panel>
+
+ <panel
bg_opaque_color="DkGray"
background_visible="true"
background_opaque="true"
+ follows="bottom|left|right"
layout="topleft"
left="0"
height="40"
- top="502"
name="buttons_cucks"
width="313">
- <button
- enabled="false"
- follows="bottom|left"
- height="23"
- label="Info"
- layout="topleft"
- left="2"
- name="info_btn"
- tab_stop="false"
- tool_tip="Show pick information"
- top="5"
- width="95" />
- <button
- enabled="false"
- follows="bottom|left"
- height="23"
- label="Teleport"
- layout="topleft"
- left_pad="3"
- name="teleport_btn"
- tab_stop="false"
- tool_tip="Teleport to the corresponding area"
- width="117" />
- <button
- enabled="false"
- follows="bottom|left"
- height="23"
- label="Map"
- layout="topleft"
- left_pad="3"
- name="show_on_map_btn"
- tab_stop="false"
- tool_tip="Show the corresponding area on the World Map"
- width="90" />
- </panel>
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="28"
+ layout="topleft"
+ left="2"
+ name="buttons_cucks_ls"
+ orientation="horizontal"
+ top="0"
+ width="313">
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="28"
+ layout="topleft"
+ left="0"
+ name="info_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ top="0"
+ width="95">
+ <button
+ enabled="false"
+ follows="top|left|right"
+ height="23"
+ label="Info"
+ layout="topleft"
+ name="info_btn"
+ tab_stop="false"
+ tool_tip="Show pick information"
+ width="95" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="28"
+ layout="bottomleft"
+ left_pad="2"
+ name="teleport_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="117">
+ <button
+ enabled="false"
+ follows="top|left|right"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ name="teleport_btn"
+ tab_stop="false"
+ tool_tip="Teleport to the corresponding area"
+ width="117" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="28"
+ layout="bottomleft"
+ name="show_on_map_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ left_pad="2"
+ width="90">
+ <button
+ enabled="false"
+ follows="top|left|right"
+ height="23"
+ label="Map"
+ layout="topleft"
+ name="show_on_map_btn"
+ tab_stop="false"
+ tool_tip="Show the corresponding area on the World Map"
+ width="88" />
+ </layout_panel>
+ </layout_stack>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index c6e93af50a..01d1e48ba1 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -154,7 +154,7 @@
translate="false"
value="Parcel_DamageNo_Dark" />
<button
- follows="top|right"
+ follows="top|left"
height="24"
image_hover_unselected="BackButton_Over"
image_pressed="BackButton_Press"
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index 638e190e8f..21314703b0 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -68,83 +68,297 @@ background_visible="true"
visible="false"
width="315" />
<panel
+ follows="bottom|left|right"
height="23"
layout="topleft"
left="4"
name="button_panel"
width="315">
- <button
- follows="bottom|left"
- height="23"
- label="Teleport"
- layout="topleft"
- left="5"
- name="teleport_btn"
- tool_tip="Teleport to the selected area"
- top="1"
- width="108" />
- <button
- follows="bottom|left"
- height="23"
- label="Map"
- layout="topleft"
- left_pad="3"
- name="map_btn"
- tool_tip="Show the corresponding area on the World Map"
- width="85" />
- <button
- follows="bottom|left"
- height="23"
- label="Edit"
- layout="topleft"
- left_pad="3"
- name="edit_btn"
- tool_tip="Edit landmark information"
- width="83" />
- <button
- follows="bottom|right"
- height="23"
- label="▼"
- layout="topleft"
- name="overflow_btn"
- tool_tip="Show additional options"
- left_pad="3"
- width="23" />
- <button
- follows="bottom|left"
- height="23"
- label="Save"
- layout="topleft"
- name="save_btn"
- left="5"
- top_pad="-23"
- width="152" />
- <button
- follows="bottom|right"
- height="23"
- label="Cancel"
- layout="topleft"
- name="cancel_btn"
- left_pad="3"
- width="153" />
- <button
- follows="bottom|right"
- height="23"
- label="Close"
- layout="topleft"
- name="close_btn"
- right="-10"
- top="1"
- width="60" />
- <button
- follows="bottom|left"
- height="23"
- label="Profile"
- layout="topleft"
- name="profile_btn"
- right="-1"
- tool_tip="Show place profile"
- top="1"
- width="111" />
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ mouse_opaque="false"
+ name="bottom_bar_ls0"
+ left="4"
+ orientation="horizontal"
+ top="0"
+ width="315">
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ mouse_opaque="false"
+ name="lp1"
+ user_resize="false"
+ auto_resize="true"
+ width="193">
+
+ <!--*********************** Teleport, Map buttons ***********************-->
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ mouse_opaque="false"
+ name="bottom_bar_ls1"
+ left="0"
+ orientation="horizontal"
+ top="0"
+ width="193">
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ mouse_opaque="false"
+ name="teleport_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="109">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ left="1"
+ name="teleport_btn"
+ tool_tip="Teleport to the selected area"
+ top="0"
+ width="108" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ mouse_opaque="false"
+ name="chat_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="86">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Map"
+ layout="topleft"
+ left="1"
+ name="map_btn"
+ tool_tip="Show the corresponding area on the World Map"
+ top="0"
+ width="85" />
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="0"
+ mouse_opaque="false"
+ name="lp2"
+ user_resize="false"
+ auto_resize="true"
+ width="116">
+
+ <!--*********************** Edit, Options buttons ***********************-->
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ mouse_opaque="false"
+ name="bottom_bar_ls3"
+ left="0"
+ orientation="horizontal"
+ top="0"
+ width="120">
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="0"
+ mouse_opaque="false"
+ name="edit_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="84">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Edit"
+ layout="topleft"
+ left="1"
+ mouse_opaque="false"
+ name="edit_btn"
+ tool_tip="Edit landmark information"
+ top="0"
+ width="83" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="0"
+ mouse_opaque="false"
+ name="overflow_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="24">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="▼"
+ layout="topleft"
+ mouse_opaque="false"
+ name="overflow_btn"
+ tool_tip="Show additional options"
+ top="0"
+ left="1"
+ width="23" />
+ </layout_panel>
+ </layout_stack>
+
+ <!--*********************** Profile button ***********************-->
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ mouse_opaque="false"
+ name="bottom_bar_ls3"
+ left="0"
+ orientation="horizontal"
+ top="0"
+ width="120">
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ mouse_opaque="false"
+ name="profile_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="112">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Profile"
+ layout="topleft"
+ mouse_opaque="false"
+ name="profile_btn"
+ left="1"
+ tool_tip="Show place profile"
+ top="0"
+ width="111" />
+ </layout_panel>
+ </layout_stack>
+
+ <!--*********************** Close button ***********************-->
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ mouse_opaque="false"
+ name="bottom_bar_close_ls3"
+ left="0"
+ orientation="horizontal"
+ top="0"
+ width="120">
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ mouse_opaque="false"
+ name="close_btn_lp"
+ top="0"
+ user_resize="false"
+ auto_resize="true"
+ width="61">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Close"
+ layout="topleft"
+ mouse_opaque="false"
+ name="close_btn"
+ left="1"
+ top="0"
+ width="60" />
+ </layout_panel>
+ </layout_stack>
+
+
+ </layout_panel>
+ </layout_stack>
+
+<!--*********************** Save, Cancel buttons ***********************-->
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ mouse_opaque="false"
+ name="bottom_bar_ls2"
+ left="4"
+ orientation="horizontal"
+ top="0"
+ width="313">
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ mouse_opaque="false"
+ name="save_btn_lp"
+ top="0"
+ user_resize="false"
+ auto_resize="true"
+ width="153">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Save"
+ layout="topleft"
+ mouse_opaque="false"
+ name="save_btn"
+ left="1"
+ top_pad="0"
+ width="152"/>
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ mouse_opaque="false"
+ name="cancel_btn_lp"
+ top="0"
+ user_resize="false"
+ auto_resize="true"
+ width="154">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ mouse_opaque="false"
+ name="cancel_btn"
+ left="1"
+ top="0"
+ width="153" />
+ </layout_panel>
+ </layout_stack>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index e41b80baf2..88d7e68894 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -305,73 +305,132 @@
</scroll_container>
</layout_panel>
<layout_panel
- follows="bottom|left"
+ follows="bottom|left"
height="30"
layout="topleft"
name="profile_buttons_panel"
auto_resize="false"
width="317">
- <button
- follows="bottom|left"
- height="23"
- label="Add Friend"
- layout="topleft"
- left="2"
- mouse_opaque="false"
- name="add_friend"
- pad_left="1"
- pad_right="1"
- tool_tip="Offer friendship to the Resident"
- top="5"
- use_ellipses="true"
- width="117" />
- <button
- follows="bottom|left"
- height="23"
- label="IM"
- layout="topleft"
- name="im"
- tool_tip="Open instant message session"
- top="5"
- left_pad="1"
- width="21" />
- <button
- follows="bottom|left"
- height="23"
- label="Call"
- layout="topleft"
- name="call"
- tool_tip="Call this Resident"
- left_pad="1"
- pad_left="1"
- pad_right="1"
- top="5"
- use_ellipses="true"
- width="51" />
- <button
- follows="bottom|left"
- height="23"
- label="Teleport"
- layout="topleft"
- name="teleport"
- tool_tip="Offer teleport"
- left_pad="1"
- pad_left="1"
- pad_right="1"
- top="5"
- use_ellipses="true"
- width="92" />
- <button
- follows="bottom|right"
- height="23"
- label="▼"
- layout="topleft"
- name="overflow_btn"
- tool_tip="Pay money to or share inventory with the Resident"
- right="-1"
- top="5"
- width="23" />
- </layout_panel>
+
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ name="bottom_bar_ls"
+ left="0"
+ orientation="horizontal"
+ top_pad="5"
+ width="317">
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ name="add_friend_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="118">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Add Friend"
+ layout="topleft"
+ left="1"
+ mouse_opaque="false"
+ name="add_friend"
+ tool_tip="Offer friendship to the Resident"
+ top="0"
+ width="117" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="im_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="22">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="IM"
+ layout="topleft"
+ name="im"
+ tool_tip="Open instant message session"
+ top="0"
+ left="1"
+ width="21" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="call_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="52">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Call"
+ layout="topleft"
+ name="call"
+ tool_tip="Call this Resident"
+ left="1"
+ top="0"
+ use_ellipses="true"
+ width="51" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="chat_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="93">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ name="teleport"
+ tool_tip="Offer teleport"
+ left="1"
+ top="0"
+ use_ellipses="true"
+ width="92" />
+ </layout_panel>
+
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ name="overflow_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="27">
+ <button
+ follows="bottom|left|right"
+ height="23"
+ label="▼"
+ layout="topleft"
+ name="overflow_btn"
+ tool_tip="Pay money to or share inventory with the Resident"
+ left="1"
+ top="0"
+ width="23" />
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
<layout_panel
follows="bottom|left"
height="30"
diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml
index d9030fc0d6..41c7b95c9f 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml
@@ -17,7 +17,7 @@
Offline
</string>
<button
- follows="top|right"
+ follows="top|left"
height="24"
image_hover_unselected="BackButton_Over"
image_pressed="BackButton_Press"
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml
index 60c2e0830c..557b04d281 100644
--- a/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml
+++ b/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml
@@ -9,7 +9,7 @@
left="0"
name="sidetray_tab_panel">
<text
- follows="left|top"
+ follows="left|top|right"
font="SansSerifHuge"
height="16"
layout="topleft"
@@ -22,15 +22,28 @@
<button
follows="right|top"
height="16"
- image_selected="Icon_Dock_Press"
- image_unselected="Icon_Dock_Foreground"
- image_disabled="Icon_Dock_Press"
+ image_selected="Sidebar_Icon_Undock_Press"
+ image_unselected="Sidebar_Icon_Undock_Foreground"
+ image_disabled="Sidebar_Icon_Undock_Press"
+ layout="topleft"
+ name="undock"
+ top="10"
+ right="-28"
+ width="16"
+ tool_tip="Undock" />
+ <button
+ follows="right|top"
+ height="16"
+ image_selected="Sidebar_Icon_Dock_Press"
+ image_unselected="Sidebar_Icon_Dock_Foreground"
+ image_disabled="Sidebar_Icon_Dock_Press"
layout="topleft"
name="dock"
top="10"
right="-28"
width="16"
- tool_tip="Dock/Undock tab" />
+ tool_tip="Dock"
+ visible="false" />
<button
follows="right|top"
height="16"
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
index b48c5d1f8a..bf09836e87 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
@@ -171,7 +171,7 @@
top="1"
width="31" />
<icon
- follows="bottom|left"
+ follows="bottom|left|right"
height="25"
image_name="Toolbar_Right_Off"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
index d38ad8c5f8..c89e1dc215 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
@@ -56,6 +56,7 @@
left_pad="5"
right="-3"
name="profile_btn"
+ tab_stop="false"
tool_tip="Show item info"
top="1"
visible="false"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index 02ab0ffee5..c1c0f07304 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -65,7 +65,7 @@ width="333">
text_color="EmphasisColor"
width="300"
height="10"
- follows="top|left"
+ follows="top|left|right"
layout="topleft"
left="35"
top="3"
@@ -81,14 +81,14 @@ width="333">
top="15"
use_ellipses="true"
width="230"
- follows="top|left"
+ follows="top|left|right"
word_wrap="false"
mouse_opaque="false"
name="currentlook_name">
MyOutfit With a really Long Name like MOOSE
</text>
<button
- follows="left|top"
+ follows="top|right"
height="28"
image_overlay="Edit_Wrench"
label=""
@@ -99,7 +99,7 @@ width="333">
top="3"
width="28" />
<loading_indicator
- follows="left|top"
+ follows="top|right"
height="24"
layout="topleft"
left="268"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index 6c9acae35e..f3c6895cee 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -31,77 +31,122 @@
height="545"
width="330" />
<panel
+ follows="bottom|left|right"
height="25"
layout="topleft"
name="button_panel"
left="9"
top_pad="-2"
width="313">
- <button
- enabled="true"
- follows="bottom|left"
- height="23"
- label="Profile"
- layout="topleft"
- left="0"
- name="info_btn"
- tool_tip="Show object profile"
- top="0"
- width="102" />
- <button
- enabled="true"
- follows="bottom|left"
- height="23"
- label="Share"
- layout="topleft"
- left="105"
- name="share_btn"
- tool_tip="Share an inventory item"
- top="0"
- width="102" />
- <button
- enabled="true"
- follows="bottom|left"
- height="23"
- label="Shop"
- layout="topleft"
- left="210"
- name="shop_btn"
- tool_tip="Open Marketplace webpage"
- top="0"
- width="102" />
- <button
- enabled="false"
- follows="bottom|left"
- height="23"
- label="Wear"
- layout="topleft"
- left="210"
- name="wear_btn"
- tool_tip="Wear seleceted outfit"
- top="0"
- width="102" />
- <button
- enabled="false"
- follows="bottom|left"
- height="23"
- label="Play"
- layout="topleft"
- name="play_btn"
- left="210"
- top="0"
- width="102" />
- <button
- enabled="false"
- follows="bottom|left"
- height="23"
- label="Teleport"
- layout="topleft"
- left="210"
- name="teleport_btn"
- tool_tip="Teleport to the selected area"
- top="0"
- width="102" />
+ <layout_stack
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ mouse_opaque="false"
+ name="button_panel_ls"
+ left="0"
+ orientation="horizontal"
+ top="0"
+ width="313">
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left="0"
+ mouse_opaque="false"
+ name="info_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="103">
+ <button
+ enabled="true"
+ follows="bottom|left|right"
+ height="23"
+ label="Profile"
+ layout="topleft"
+ left="1"
+ name="info_btn"
+ tool_tip="Show object profile"
+ top="0"
+ width="102" />
+ </layout_panel>
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ mouse_opaque="false"
+ name="share_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="102">
+ <button
+ enabled="true"
+ follows="bottom|left|right"
+ height="23"
+ label="Share"
+ layout="topleft"
+ left="0"
+ name="share_btn"
+ tool_tip="Share an inventory item"
+ top="0"
+ width="102" />
+ </layout_panel>
+ <layout_panel
+ follows="bottom|left|right"
+ height="23"
+ layout="bottomleft"
+ left_pad="3"
+ mouse_opaque="false"
+ name="shop_btn_lp"
+ user_resize="false"
+ auto_resize="true"
+ width="102">
+ <button
+ enabled="true"
+ follows="bottom|left|right"
+ height="23"
+ label="Shop"
+ layout="topleft"
+ left="0"
+ name="shop_btn"
+ tool_tip="Open Marketplace webpage"
+ top="0"
+ width="102" />
+ <button
+ enabled="false"
+ follows="bottom|left|right"
+ height="23"
+ label="Wear"
+ layout="topleft"
+ left="0"
+ name="wear_btn"
+ tool_tip="Wear seleceted outfit"
+ top="0"
+ width="102" />
+ <button
+ enabled="false"
+ follows="bottom|left|right"
+ height="23"
+ label="Play"
+ layout="topleft"
+ name="play_btn"
+ left="0"
+ top="0"
+ width="102" />
+ <button
+ enabled="false"
+ follows="bottom|left|right"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ left="0"
+ name="teleport_btn"
+ tool_tip="Teleport to the selected area"
+ top="0"
+ width="102" />
+ </layout_panel>
+ </layout_stack>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index 49b252174c..4f923f411c 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ follows="all"
height="570"
layout="topleft"
name="item properties"
@@ -45,7 +46,7 @@
top="8"
width="18" />
<button
- follows="top|right"
+ follows="top|left"
height="24"
image_hover_unselected="BackButton_Over"
image_pressed="BackButton_Press"
@@ -69,14 +70,15 @@
value="Item Profile"
width="275" />
<text
- follows="top|left"
+ follows="top|left|right"
height="13"
layout="topleft"
left="45"
name="origin"
text_color="LtGray_50"
+ use_ellipses="true"
value="(Inventory)"
- width="150" />
+ width="275" />
<panel
follows="all"
height="493"
@@ -234,7 +236,7 @@ top_pad="10"
<text
type="string"
length="1"
- follows="left|top"
+ follows="left|top|right"
height="23"
layout="topleft"
left_delta="78"
@@ -244,7 +246,7 @@ top_pad="10"
</text>
<panel
border="false"
- follows="left|top"
+ follows="left|top|right"
layout="topleft"
mouse_opaque="false"
name="perms_inv"