summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/contributions.txt4
-rw-r--r--indra/cmake/APR.cmake2
-rw-r--r--indra/cmake/Copy3rdPartyLibs.cmake1
-rw-r--r--indra/cmake/ViewerMiscLibs.cmake1
-rw-r--r--indra/llui/llfloater.cpp38
-rw-r--r--indra/llui/llfloater.h4
-rw-r--r--indra/llui/lllayoutstack.cpp16
-rw-r--r--indra/llui/lllayoutstack.h5
-rw-r--r--indra/newview/installers/windows/installer_template.nsi2
-rw-r--r--indra/newview/llagentwearables.cpp13
-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/llnearbychatbar.cpp36
-rw-r--r--indra/newview/llnearbychatbar.h3
-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/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/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_side_bar_tab.xml6
-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
-rw-r--r--indra/newview/viewer_manifest.py1
-rw-r--r--install.xml19
59 files changed, 2608 insertions, 863 deletions
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 4ab7284b72..6edb727682 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -120,6 +120,8 @@ Angus Boyd
VWR-592
Ann Congrejo
CT-193
+Ardy Lay
+ VWR-19499
Argent Stonecutter
VWR-68
Armin Weatherwax
@@ -699,6 +701,8 @@ Whoops Babii
VWR-8298
Wilton Lundquist
VWR-7682
+Zai Lynch
+ VWR-19505
Zarkonnen Decosta
VWR-253
Zi Ree
diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake
index 180504d286..b6f1e06edd 100644
--- a/indra/cmake/APR.cmake
+++ b/indra/cmake/APR.cmake
@@ -56,7 +56,7 @@ else (STANDALONE)
if (LINUX)
if (VIEWER)
- list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} uuid)
+ list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES})
endif (VIEWER)
list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} rt)
endif (LINUX)
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 2dd296bf12..a756770881 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -232,7 +232,6 @@ elseif(LINUX)
libssl.so
libstacktrace.so
libtcmalloc.so
- libuuid.so.1
libssl.so.0.9.7
)
diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake
index 32c4bc81df..5710360de2 100644
--- a/indra/cmake/ViewerMiscLibs.cmake
+++ b/indra/cmake/ViewerMiscLibs.cmake
@@ -2,7 +2,6 @@
include(Prebuilt)
if (NOT STANDALONE)
- use_prebuilt_binary(libuuid)
use_prebuilt_binary(vivox)
use_prebuilt_binary(fontconfig)
endif(NOT STANDALONE)
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index e1203971ea..ff90806271 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -519,6 +519,36 @@ void LLFloater::storeDockStateControl()
}
}
+LLRect LLFloater::getSavedRect() const
+{
+ LLRect rect;
+
+ if (mRectControl.size() > 1)
+ {
+ rect = LLUI::sSettingGroups["floater"]->getRect(mRectControl);
+ }
+
+ return rect;
+}
+
+bool LLFloater::hasSavedRect() const
+{
+ return !getSavedRect().isEmpty();
+}
+
+// static
+std::string LLFloater::getControlName(const std::string& name, const LLSD& key)
+{
+ std::string ctrl_name = name;
+
+ // Add the key to the control name if appropriate.
+ if (key.isString() && !key.asString().empty())
+ {
+ ctrl_name += "_" + key.asString();
+ }
+
+ return ctrl_name;
+}
void LLFloater::setVisible( BOOL visible )
{
@@ -2664,18 +2694,20 @@ void LLFloater::setInstanceName(const std::string& name)
mInstanceName = name;
if (!mInstanceName.empty())
{
+ std::string ctrl_name = getControlName(mInstanceName, mKey);
+
// save_rect and save_visibility only apply to registered floaters
if (!mRectControl.empty())
{
- mRectControl = LLFloaterReg::declareRectControl(mInstanceName);
+ mRectControl = LLFloaterReg::declareRectControl(ctrl_name);
}
if (!mVisibilityControl.empty())
{
- mVisibilityControl = LLFloaterReg::declareVisibilityControl(mInstanceName);
+ mVisibilityControl = LLFloaterReg::declareVisibilityControl(ctrl_name);
}
if(!mDocStateControl.empty())
{
- mDocStateControl = LLFloaterReg::declareDockStateControl(mInstanceName);
+ mDocStateControl = LLFloaterReg::declareDockStateControl(ctrl_name);
}
}
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 5e482cbac3..ed1f0715af 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -203,6 +203,10 @@ public:
BOOL isResizable() const { return mResizable; }
void setResizeLimits( S32 min_width, S32 min_height );
void getResizeLimits( S32* min_width, S32* min_height ) { *min_width = mMinWidth; *min_height = mMinHeight; }
+ LLRect getSavedRect() const;
+ bool hasSavedRect() const;
+
+ static std::string getControlName(const std::string& name, const LLSD& key);
bool isMinimizeable() const{ return mCanMinimize; }
bool isCloseable() const{ return mCanClose; }
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 5cc9add1e2..0ff7557ead 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -368,6 +368,22 @@ S32 LLLayoutStack::getDefaultWidth(S32 cur_width)
return cur_width;
}
+void LLLayoutStack::movePanel(LLPanel* panel_to_move, LLPanel* target_panel, bool move_to_front)
+{
+ LayoutPanel* embedded_panel_to_move = findEmbeddedPanel(panel_to_move);
+ LayoutPanel* embedded_target_panel = move_to_front ? *mPanels.begin() : findEmbeddedPanel(target_panel);
+
+ if (!embedded_panel_to_move || !embedded_target_panel || embedded_panel_to_move == embedded_target_panel)
+ {
+ llwarns << "One of the panels was not found in stack or NULL was passed instead of valid panel" << llendl;
+ return;
+ }
+ e_panel_list_t::iterator it = std::find(mPanels.begin(), mPanels.end(), embedded_panel_to_move);
+ mPanels.erase(it);
+ it = move_to_front ? mPanels.begin() : std::find(mPanels.begin(), mPanels.end(), embedded_target_panel);
+ mPanels.insert(it, embedded_panel_to_move);
+}
+
void LLLayoutStack::addPanel(LLPanel* panel, S32 min_width, S32 min_height, S32 max_width, S32 max_height, BOOL auto_resize, BOOL user_resize, EAnimate animate, S32 index)
{
// panel starts off invisible (collapsed)
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index cd59ee3966..6fcc8e2ac3 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -72,6 +72,11 @@ public:
void removePanel(LLPanel* panel);
void collapsePanel(LLPanel* panel, BOOL collapsed = TRUE);
S32 getNumPanels() { return mPanels.size(); }
+ /**
+ * Moves panel_to_move before target_panel inside layout stack (both panels should already be there).
+ * If move_to_front is true target_panel is ignored and panel_to_move is moved to the beginning of mPanels
+ */
+ void movePanel(LLPanel* panel_to_move, LLPanel* target_panel, bool move_to_front = false);
void updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize);
void setPanelUserResize(const std::string& panel_name, BOOL user_resize);
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/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/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/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/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/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_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/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"
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 08ba8c13b1..c447a977f0 100644
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -922,7 +922,6 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libcrypto.so.0.9.7")
self.path("libexpat.so.1")
self.path("libssl.so.0.9.7")
- self.path("libuuid.so.1")
self.path("libSDL-1.2.so.0")
self.path("libELFIO.so")
self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3")
diff --git a/install.xml b/install.xml
index a47a732d56..3d90c4eed2 100644
--- a/install.xml
+++ b/install.xml
@@ -891,25 +891,6 @@ anguage Infrstructure (CLI) international standard</string>
</map>
</map>
</map>
- <key>libuuid</key>
- <map>
- <key>copyright</key>
- <string>Copyright (C) 2007 Free Software Foundation, Inc. &lt;http://fsf.org/&gt;</string>
- <key>description</key>
- <string>Generates UUIDs under Linux. Originally a part of the ext2fs filesystem. Also see lluuid.cpp for all platforms. Part of the e2fsprogs package.</string>
- <key>license</key>
- <string>lgpl</string>
- <key>packages</key>
- <map>
- <key>linux</key>
- <map>
- <key>md5sum</key>
- <string>91b194aed4b38bc23493b198009a8c6a</string>
- <key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libuuid-linux-20090417.tar.bz2</uri>
- </map>
- </map>
- </map>
<key>libxml</key>
<map>
<key>license</key>