1. simon_linden
  2. viewer-rabbit

Commits

dessie linden  committed bb498bf Merge

Merged from viewer-public

  • Participants
  • Parent commits 4e7f8a8, baf1f1f
  • Branches default

Comments (0)

Files changed (39)

File indra/llcommon/llerror.cpp

View file
 		
 		std::string class_name = className(site.mClassInfo);
 		std::string function_name = functionName(site.mFunction);
+#if LL_LINUX
+		// gross, but typeid comparison seems to always fail here with gcc4.1
+		if (0 != strcmp(site.mClassInfo.name(), typeid(NoClassInfo).name()))
+#else
 		if (site.mClassInfo != typeid(NoClassInfo))
+#endif // LL_LINUX
 		{
 			function_name = class_name + "::" + function_name;
 		}
 	#if LL_WINDOWS
 		// DevStudio: __FUNCTION__ already includes the full class name
 	#else
+                #if LL_LINUX
+		// gross, but typeid comparison seems to always fail here with gcc4.1
+		if (0 != strcmp(site.mClassInfo.name(), typeid(NoClassInfo).name()))
+                #else
 		if (site.mClassInfo != typeid(NoClassInfo))
+                #endif // LL_LINUX
 		{
 			prefix << className(site.mClassInfo) << "::";
 		}

File indra/llcommon/llerror.h

View file
 		{ return s; }
 		// used to indicate the end of a message
 		
-	class NoClassInfo { };
+	class LL_COMMON_API NoClassInfo { };
 		// used to indicate no class info known for logging
 
    //LLCallStacks keeps track of call stacks and output the call stacks to log file

File indra/llcommon/tests/llerror_test.cpp

View file
 		// output order
 	void ErrorTestObject::test<10>()
 	{
-#if LL_LINUX
-        skip("Fails on Linux, see comments");
-// on Linux:
-// [error, 10] fail: 'order is time type location function message: expected
-// '1947-07-08T03:04:05Z INFO: llcommon/tests/llerror_test.cpp(268) :
-// writeReturningLocationAndFunction: apple' actual
-// '1947-07-08T03:04:05Z INFO: llcommon/tests/llerror_test.cpp(268) :
-// LLError::NoClassInfo::writeReturningLocationAndFunction: apple''
-#endif
 		LLError::setPrintLocation(true);
 		LLError::setTimeFunction(roswell);
 		mRecorder.setWantsTime(true);

File indra/newview/CMakeLists.txt

View file
     llpanelteleporthistory.cpp
     llpaneltiptoast.cpp
     llpanelvoiceeffect.cpp
+    llpaneltopinfobar.cpp
     llpanelvolume.cpp
     llpanelvolumepulldown.cpp
     llparcelselection.cpp
     llpanelteleporthistory.h
     llpaneltiptoast.h
     llpanelvoiceeffect.h
+    llpaneltopinfobar.h
     llpanelvolume.h
     llpanelvolumepulldown.h
     llparcelselection.h

File indra/newview/app_settings/settings.xml

View file
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>ShowMiniLocationPanel</key>
+    <map>
+      <key>Comment</key>
+      <string>Show/Hide Mini-Location Panel</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>SidebarCameraMovement</key>
     <map>
       <key>Comment</key>

File indra/newview/llappviewer.cpp

View file
 	
 	LLViewerMedia::initClass();
 
-	LLStringOps::setupWeekDaysNames(LLTrans::getString("dateTimeWeekdaysNames"));
-	LLStringOps::setupWeekDaysShortNames(LLTrans::getString("dateTimeWeekdaysShortNames"));
-	LLStringOps::setupMonthNames(LLTrans::getString("dateTimeMonthNames"));
-	LLStringOps::setupMonthShortNames(LLTrans::getString("dateTimeMonthShortNames"));
-	LLStringOps::setupDayFormat(LLTrans::getString("dateTimeDayFormat"));
-
-	LLStringOps::sAM = LLTrans::getString("dateTimeAM");
-	LLStringOps::sPM = LLTrans::getString("dateTimePM");
+	//EXT-7013 - On windows for some locale (Japanese) standard 
+	//datetime formatting functions didn't support some parameters such as "weekday".
+	std::string language = LLControlGroup::getInstance(sGlobalSettingsName)->getString("Language");
+	if(language == "ja")
+	{
+		LLStringOps::setupWeekDaysNames(LLTrans::getString("dateTimeWeekdaysNames"));
+		LLStringOps::setupWeekDaysShortNames(LLTrans::getString("dateTimeWeekdaysShortNames"));
+		LLStringOps::setupMonthNames(LLTrans::getString("dateTimeMonthNames"));
+		LLStringOps::setupMonthShortNames(LLTrans::getString("dateTimeMonthShortNames"));
+		LLStringOps::setupDayFormat(LLTrans::getString("dateTimeDayFormat"));
+
+		LLStringOps::sAM = LLTrans::getString("dateTimeAM");
+		LLStringOps::sPM = LLTrans::getString("dateTimePM");
+	}
 
 	return true;
 }

File indra/newview/llcofwearables.cpp

View file
 	item_panel->childSetAction("btn_edit", mCOFCallbacks.mEditWearable);
 	
 	//turning on gray separator line for the last item in the items group of the same wearable type
-	item_panel->childSetVisible("wearable_type_separator_panel", last);
+	if (last)
+	{
+		LLRect rect = item_panel->getRect();
+		item_panel->reshape(rect.getWidth(), rect.getHeight() +
+		item_panel->getChild<LLView>("wearable_type_separator_icon")->getRect().getHeight());
+		item_panel->childSetVisible("wearable_type_separator_icon", true);
+	}
 
 	return item_panel;
 }

File indra/newview/llfloaterpreference.cpp

View file
 	if (can_choose_maturity)
 	{		
 		// if they're not adult or a god, they shouldn't see the adult selection, so delete it
-		if (!gAgent.isAdult() && !gAgent.isGodlike())
+		if (!gAgent.isAdult() && !gAgent.isGodlikeWithoutAdminMenuFakery())
 		{
 			// we're going to remove the adult entry from the combo
 			LLScrollListCtrl* maturity_list = maturity_combo->findChild<LLScrollListCtrl>("ComboBox");

File indra/newview/llinventorybridge.cpp

View file
 LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const
 {
 	U8 font = LLFontGL::NORMAL;
+	const LLViewerInventoryItem* item = getItem();
 
 	if (get_is_item_worn(mUUID))
 	{
 		// llinfos << "BOLD" << llendl;
 		font |= LLFontGL::BOLD;
 	}
-
-	const LLViewerInventoryItem* item = getItem();
-	if (item && item->getIsLinkType())
+	else if(item && item->getIsLinkType())
 	{
 		font |= LLFontGL::ITALIC;
 	}
+
 	return (LLFontGL::StyleFlags)font;
 }
 
 		      get_is_item_worn(mUUID) ? "detach" : "attach");
 }
 
-LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const
-{
-	U8 font = LLFontGL::NORMAL;
-
-	if(get_is_item_worn( mUUID ) )
-	{
-		font |= LLFontGL::BOLD;
-	}
-
-	LLInventoryItem* item = getItem();
-	if (item && item->getIsLinkType())
-	{
-		font |= LLFontGL::ITALIC;
-	}
-
-	return (LLFontGL::StyleFlags)font;
-}
-
 std::string LLObjectBridge::getLabelSuffix() const
 {
 	if (get_is_item_worn(mUUID))

File indra/newview/llinventorybridge.h

View file
 	virtual LLUIImagePtr	getIcon() const;
 	virtual void			performAction(LLInventoryModel* model, std::string action);
 	virtual void			openItem();
-	virtual LLFontGL::StyleFlags getLabelStyle() const;
 	virtual std::string getLabelSuffix() const;
 	virtual void			buildContextMenu(LLMenuGL& menu, U32 flags);
 	virtual BOOL renameItem(const std::string& new_name);

File indra/newview/llinventoryfunctions.cpp

View file
 		}
 	}
 
-	// go ahead and do the normal remove if no 'last calling
-	// cards' are being removed.
 	LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
 	if (cat)
 	{

File indra/newview/llinventoryitemslist.cpp

View file
 	setIconCtrl(getChild<LLIconCtrl>("item_icon"));
 	setTitleCtrl(getChild<LLTextBox>("item_name"));
 
-	mIconImage = LLInventoryIcon::getIcon(mItem->getType(), mItem->getInventoryType(), mItem->getIsLinkType(), mItem->getFlags(), FALSE);
+	BOOL show_links = mForceNoLinksOnIcons ? FALSE : mItem->getIsLinkType();
+	mIconImage = LLInventoryIcon::getIcon(mItem->getType(), mItem->getInventoryType(), show_links, mItem->getFlags(), FALSE);
 
 	setNeedsRefresh(true);
 
 , mLeftWidgetsWidth(0)
 , mRightWidgetsWidth(0)
 , mNeedsRefresh(false)
+, mForceNoLinksOnIcons(false)
 {
 }
 

File indra/newview/llinventoryitemslist.h

View file
 	/** Set item title - inventory item name usually */
 	void setTitle(const std::string& title, const std::string& highlit_text);
 
+	// force not showing link icon on item's icon
+	bool mForceNoLinksOnIcons;
+
 private:
 
 	/** reshape left side widgets

File indra/newview/llnavigationbar.cpp

View file
 #include "lllandmarkactions.h"
 #include "lllocationhistory.h"
 #include "lllocationinputctrl.h"
+#include "llpaneltopinfobar.h"
 #include "llteleporthistory.h"
 #include "llsearchcombobox.h"
 #include "llsidetray.h"
 void LLNavigationBar::handleLoginComplete()
 {
 	LLTeleportHistory::getInstance()->handleLoginComplete();
+	LLPanelTopInfoBar::instance().handleLoginComplete();
 	mCmbLocation->handleLoginComplete();
 }
 

File indra/newview/llpaneleditwearable.cpp

View file
 	LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName);
 	if (color_swatch_ctrl)
 	{
-		color_swatch_ctrl->setOriginal(self->getWearable()->getClothesColor(entry->mTextureIndex));
+		// Can't get the color from the wearable here, since the wearable may not be set when this is called.
+		color_swatch_ctrl->setOriginal(LLColor4::white);
 	}
 }
 
 	configureAlphaCheckbox(LLVOAvatarDefines::TEX_EYES_ALPHA, "eye alpha texture invisible");
 	configureAlphaCheckbox(LLVOAvatarDefines::TEX_HAIR_ALPHA, "hair alpha texture invisible");
 
+	// configure tab expanded callbacks
+	for (U32 type_index = 0; type_index < (U32)LLWearableType::WT_COUNT; ++type_index)
+	{
+		LLWearableType::EType type = (LLWearableType::EType) type_index;
+		const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
+		if (!wearable_entry)
+		{
+			llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl;
+			continue;
+		}
+		U8 num_subparts = wearable_entry->mSubparts.size();
+	
+		for (U8 index = 0; index < num_subparts; ++index)
+		{
+			// dive into data structures to get the panel we need
+			ESubpart subpart_e = wearable_entry->mSubparts[index];
+			const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
+	
+			if (!subpart_entry)
+			{
+				llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl;
+				continue;
+			}
+	
+			const std::string accordion_tab = subpart_entry->mAccordionTab;
+	
+			LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
+	
+			if (!tab)
+			{
+				llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl;
+				continue;
+			}
+	
+			// initialize callback to ensure camera view changes appropriately.
+			tab->setDropDownStateChangedCallback(boost::bind(&LLPanelEditWearable::onTabExpandedCollapsed,this,_2,index));
+		}
+
+		// initialize texture and color picker controls
+		for_each_picker_ctrl_entry <LLColorSwatchCtrl> (getPanel(type), type, boost::bind(init_color_swatch_ctrl, this, _1, _2));
+		for_each_picker_ctrl_entry <LLTextureCtrl>     (getPanel(type), type, boost::bind(init_texture_ctrl, this, _1, _2));
+	}
+
 	return TRUE;
 }
 
 	showWearable(mWearablePtr, FALSE);
 	mWearablePtr = wearable;
 	showWearable(mWearablePtr, TRUE);
+}
 
-	initializePanel();
-}
 
 //static 
 void LLPanelEditWearable::onRevertButtonClicked(void* userdata)
 	std::string title;
 	std::string description_title;
 
-	const LLEditWearableDictionary::WearableEntry *entry = LLEditWearableDictionary::getInstance()->getWearable(type);
-	if (!entry)
+	const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
+	if (!wearable_entry)
 	{
 		llwarns << "called LLPanelEditWearable::showWearable with an invalid wearable type! (" << type << ")" << llendl;
 		return;
 	}
 
 	targetPanel = getPanel(type);
-	title = getString(entry->mTitle);
-	description_title = getString(entry->mDescTitle);
-
-	targetPanel->setVisible(show);
-	if (show)
-	{
-		mPanelTitle->setText(title);
-		mDescTitle->setText(description_title);
-	}
+	title = getString(wearable_entry->mTitle);
+	description_title = getString(wearable_entry->mDescTitle);
 
 	// Update picker controls state
 	for_each_picker_ctrl_entry <LLColorSwatchCtrl> (targetPanel, type, boost::bind(set_enabled_color_swatch_ctrl, show, _1, _2));
 	for_each_picker_ctrl_entry <LLTextureCtrl>     (targetPanel, type, boost::bind(set_enabled_texture_ctrl, show, _1, _2));
 
-	showDefaultSubpart();
+	targetPanel->setVisible(show);
+	toggleTypeSpecificControls(type);
+
+	if (show)
+	{
+		mPanelTitle->setText(title);
+		mDescTitle->setText(description_title);
+		
+		// set name
+		mTextEditor->setText(wearable->getName());
+
+		updatePanelPickerControls(type);
+		updateTypeSpecificControls(type);
+
+		// clear and rebuild visual param list
+		U8 num_subparts = wearable_entry->mSubparts.size();
+	
+		for (U8 index = 0; index < num_subparts; ++index)
+		{
+			// dive into data structures to get the panel we need
+			ESubpart subpart_e = wearable_entry->mSubparts[index];
+			const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
+	
+			if (!subpart_entry)
+			{
+				llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl;
+				continue;
+			}
+	
+			const std::string scrolling_panel = subpart_entry->mParamList;
+			const std::string accordion_tab = subpart_entry->mAccordionTab;
+	
+			LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
+			LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
+	
+			if (!panel_list)
+			{
+				llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl;
+				continue;
+			}
+	
+			if (!tab)
+			{
+				llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl;
+				continue;
+			}
+	
+			// what edit group do we want to extract params for?
+			const std::string edit_group = subpart_entry->mEditGroup;
+	
+			// storage for ordered list of visual params
+			value_map_t sorted_params;
+			getSortedParams(sorted_params, edit_group);
+	
+			buildParamList(panel_list, sorted_params, tab);
+	
+			updateScrollingPanelUI();
+		}
+		showDefaultSubpart();
+
+		updateVerbs();
+	}
 }
 
 void LLPanelEditWearable::showDefaultSubpart()
 	updateScrollingPanelUI();
 }
 
-void LLPanelEditWearable::initializePanel()
-{
-	if (!mWearablePtr)
-	{
-		// cannot initialize with a null reference.
-		return;
-	}
-
-	LLWearableType::EType type = mWearablePtr->getType();
-
-	// set name
-	mTextEditor->setText(mWearablePtr->getName());
-
-	// toggle wearable type-specific controls
-	toggleTypeSpecificControls(type);
-
-	// clear and rebuild visual param list
-	const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
-	if (!wearable_entry)
-	{
-		llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl;
-		return;
-	}
-	U8 num_subparts = wearable_entry->mSubparts.size();
-
-	for (U8 index = 0; index < num_subparts; ++index)
-	{
-		// dive into data structures to get the panel we need
-		ESubpart subpart_e = wearable_entry->mSubparts[index];
-		const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
-
-		if (!subpart_entry)
-		{
-			llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl;
-			continue;
-		}
-
-		const std::string scrolling_panel = subpart_entry->mParamList;
-		const std::string accordion_tab = subpart_entry->mAccordionTab;
-
-		LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
-		LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
-
-		if (!panel_list)
-		{
-			llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl;
-			continue;
-		}
-
-		if (!tab)
-		{
-			llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl;
-			continue;
-		}
-
-		// what edit group do we want to extract params for?
-		const std::string edit_group = subpart_entry->mEditGroup;
-
-		// initialize callback to ensure camera view changes appropriately.
-		tab->setDropDownStateChangedCallback(boost::bind(&LLPanelEditWearable::onTabExpandedCollapsed,this,_2,index));
-
-		// storage for ordered list of visual params
-		value_map_t sorted_params;
-		getSortedParams(sorted_params, edit_group);
-
-		buildParamList(panel_list, sorted_params, tab);
-
-		updateScrollingPanelUI();
-	}
-
-	// initialize texture and color picker controls
-	for_each_picker_ctrl_entry <LLColorSwatchCtrl> (getPanel(type), type, boost::bind(init_color_swatch_ctrl, this, _1, _2));
-	for_each_picker_ctrl_entry <LLTextureCtrl>     (getPanel(type), type, boost::bind(init_texture_ctrl, this, _1, _2));
-
-	showDefaultSubpart();
-	updateVerbs();
-
-	if (getWearable())
-	{
-		LLWearableType::EType type = getWearable()->getType();
-		updatePanelPickerControls(type);
-		updateTypeSpecificControls(type);
-	}
-}
-
 void LLPanelEditWearable::toggleTypeSpecificControls(LLWearableType::EType type)
 {
 	// Toggle controls specific to shape editing panel.

File indra/newview/llpaneleditwearable.h

View file
 	typedef std::map<F32, LLViewerVisualParam*> value_map_t;
 
 	void				showWearable(LLWearable* wearable, BOOL show);
-	void				initializePanel();
 	void				updateScrollingPanelUI();
 	LLPanel*			getPanel(LLWearableType::EType type);
 	void				getSortedParams(value_map_t &sorted_params, const std::string &edit_group);

File indra/newview/llpaneltopinfobar.cpp

View file
+/**
+ * @file llpaneltopinfobar.cpp
+ * @brief Coordinates and Parcel Settings information panel definition
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpaneltopinfobar.h"
+
+#include "llagent.h"
+#include "llagentui.h"
+#include "lllocationinputctrl.h"
+#include "llnotificationsutil.h"
+#include "llparcel.h"
+#include "llsidetray.h"
+#include "llstatusbar.h"
+#include "llviewercontrol.h"
+#include "llviewermenu.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+
+class LLPanelTopInfoBar::LLParcelChangeObserver : public LLParcelObserver
+{
+public:
+	LLParcelChangeObserver(LLPanelTopInfoBar* topInfoBar) : mTopInfoBar(topInfoBar) {}
+
+private:
+	/*virtual*/ void changed()
+	{
+		if (mTopInfoBar)
+		{
+			mTopInfoBar->updateParcelIcons();
+		}
+	}
+
+	LLPanelTopInfoBar* mTopInfoBar;
+};
+
+LLPanelTopInfoBar::LLPanelTopInfoBar(): mParcelChangedObserver(0)
+{
+	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_topinfo_bar.xml");
+}
+
+LLPanelTopInfoBar::~LLPanelTopInfoBar()
+{
+	if (mParcelChangedObserver)
+	{
+		LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangedObserver);
+		delete mParcelChangedObserver;
+	}
+
+	if (mParcelPropsCtrlConnection.connected())
+	{
+		mParcelPropsCtrlConnection.disconnect();
+	}
+
+	if (mParcelMgrConnection.connected())
+	{
+		mParcelMgrConnection.disconnect();
+	}
+
+	if (mShowCoordsCtrlConnection.connected())
+	{
+		mShowCoordsCtrlConnection.disconnect();
+	}
+}
+
+void LLPanelTopInfoBar::initParcelIcons()
+{
+	mParcelIcon[VOICE_ICON] = getChild<LLIconCtrl>("voice_icon");
+	mParcelIcon[FLY_ICON] = getChild<LLIconCtrl>("fly_icon");
+	mParcelIcon[PUSH_ICON] = getChild<LLIconCtrl>("push_icon");
+	mParcelIcon[BUILD_ICON] = getChild<LLIconCtrl>("build_icon");
+	mParcelIcon[SCRIPTS_ICON] = getChild<LLIconCtrl>("scripts_icon");
+	mParcelIcon[DAMAGE_ICON] = getChild<LLIconCtrl>("damage_icon");
+
+	mParcelIcon[VOICE_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, VOICE_ICON));
+	mParcelIcon[FLY_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, FLY_ICON));
+	mParcelIcon[PUSH_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, PUSH_ICON));
+	mParcelIcon[BUILD_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, BUILD_ICON));
+	mParcelIcon[SCRIPTS_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, SCRIPTS_ICON));
+	mParcelIcon[DAMAGE_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, DAMAGE_ICON));
+
+	mDamageText->setText(LLStringExplicit("100%"));
+}
+
+void LLPanelTopInfoBar::handleLoginComplete()
+{
+	// An agent parcel update hasn't occurred yet, so
+	// we have to manually set location and the icons.
+	update();
+}
+
+BOOL LLPanelTopInfoBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+	show_navbar_context_menu(this, x, y);
+	return TRUE;
+}
+
+BOOL LLPanelTopInfoBar::postBuild()
+{
+	mInfoBtn = getChild<LLButton>("place_info_btn");
+	mInfoBtn->setClickedCallback(boost::bind(&LLPanelTopInfoBar::onInfoButtonClicked, this));
+
+	mParcelInfoText = getChild<LLTextBox>("parcel_info_text");
+	mDamageText = getChild<LLTextBox>("damage_text");
+
+	initParcelIcons();
+
+	mParcelChangedObserver = new LLParcelChangeObserver(this);
+	LLViewerParcelMgr::getInstance()->addObserver(mParcelChangedObserver);
+
+	// Connecting signal for updating parcel icons on "Show Parcel Properties" setting change.
+	LLControlVariable* ctrl = gSavedSettings.getControl("NavBarShowParcelProperties").get();
+	if (ctrl)
+	{
+		mParcelPropsCtrlConnection = ctrl->getSignal()->connect(boost::bind(&LLPanelTopInfoBar::updateParcelIcons, this));
+	}
+
+	// Connecting signal for updating parcel text on "Show Coordinates" setting change.
+	ctrl = gSavedSettings.getControl("NavBarShowCoordinates").get();
+	if (ctrl)
+	{
+		mShowCoordsCtrlConnection = ctrl->getSignal()->connect(boost::bind(&LLPanelTopInfoBar::onNavBarShowParcelPropertiesCtrlChanged, this));
+	}
+
+	mParcelMgrConnection = LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(
+			boost::bind(&LLPanelTopInfoBar::onAgentParcelChange, this));
+
+	return TRUE;
+}
+
+void LLPanelTopInfoBar::onNavBarShowParcelPropertiesCtrlChanged()
+{
+	std::string new_text;
+
+	// don't need to have separate show_coords variable; if user requested the coords to be shown
+	// they will be added during the next call to the draw() method.
+	buildLocationString(new_text, false);
+	setParcelInfoText(new_text);
+}
+
+void LLPanelTopInfoBar::draw()
+{
+	updateParcelInfoText();
+	updateHealth();
+
+	LLPanel::draw();
+}
+
+void LLPanelTopInfoBar::buildLocationString(std::string& loc_str, bool show_coords)
+{
+	LLAgentUI::ELocationFormat format =
+		(show_coords ? LLAgentUI::LOCATION_FORMAT_FULL : LLAgentUI::LOCATION_FORMAT_NO_COORDS);
+
+	if (!LLAgentUI::buildLocationString(loc_str, format))
+	{
+		loc_str = "???";
+	}
+}
+
+void LLPanelTopInfoBar::setParcelInfoText(const std::string& new_text)
+{
+	const LLFontGL* font = mParcelInfoText->getDefaultFont();
+	S32 new_text_width = font->getWidth(new_text);
+
+	mParcelInfoText->setText(new_text);
+
+	LLRect rect = mParcelInfoText->getRect();
+	rect.setOriginAndSize(rect.mLeft, rect.mBottom, new_text_width, rect.getHeight());
+
+	mParcelInfoText->reshape(rect.getWidth(), rect.getHeight(), TRUE);
+	mParcelInfoText->setRect(rect);
+	layoutParcelIcons();
+}
+
+void LLPanelTopInfoBar::update()
+{
+	std::string new_text;
+
+	// don't need to have separate show_coords variable; if user requested the coords to be shown
+	// they will be added during the next call to the draw() method.
+	buildLocationString(new_text, false);
+	setParcelInfoText(new_text);
+
+	updateParcelIcons();
+}
+
+void LLPanelTopInfoBar::updateParcelInfoText()
+{
+	static LLUICachedControl<bool> show_coords("NavBarShowCoordinates", false);
+
+	if (show_coords)
+	{
+		std::string new_text;
+
+		buildLocationString(new_text, show_coords);
+		setParcelInfoText(new_text);
+	}
+}
+
+void LLPanelTopInfoBar::updateParcelIcons()
+{
+	LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance();
+
+	LLViewerRegion* agent_region = gAgent.getRegion();
+	LLParcel* agent_parcel = vpm->getAgentParcel();
+	if (!agent_region || !agent_parcel)
+		return;
+
+	if (gSavedSettings.getBOOL("NavBarShowParcelProperties"))
+	{
+		LLParcel* current_parcel;
+		LLViewerRegion* selection_region = vpm->getSelectionRegion();
+		LLParcel* selected_parcel = vpm->getParcelSelection()->getParcel();
+
+		// If agent is in selected parcel we use its properties because
+		// they are updated more often by LLViewerParcelMgr than agent parcel properties.
+		// See LLViewerParcelMgr::processParcelProperties().
+		// This is needed to reflect parcel restrictions changes without having to leave
+		// the parcel and then enter it again. See EXT-2987
+		if (selected_parcel && selected_parcel->getLocalID() == agent_parcel->getLocalID()
+				&& selection_region == agent_region)
+		{
+			current_parcel = selected_parcel;
+		}
+		else
+		{
+			current_parcel = agent_parcel;
+		}
+
+		bool allow_voice	= vpm->allowAgentVoice(agent_region, current_parcel);
+		bool allow_fly		= vpm->allowAgentFly(agent_region, current_parcel);
+		bool allow_push		= vpm->allowAgentPush(agent_region, current_parcel);
+		bool allow_build	= vpm->allowAgentBuild(current_parcel); // true when anyone is allowed to build. See EXT-4610.
+		bool allow_scripts	= vpm->allowAgentScripts(agent_region, current_parcel);
+		bool allow_damage	= vpm->allowAgentDamage(agent_region, current_parcel);
+
+		// Most icons are "block this ability"
+		mParcelIcon[VOICE_ICON]->setVisible(   !allow_voice );
+		mParcelIcon[FLY_ICON]->setVisible(     !allow_fly );
+		mParcelIcon[PUSH_ICON]->setVisible(    !allow_push );
+		mParcelIcon[BUILD_ICON]->setVisible(   !allow_build );
+		mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
+		mParcelIcon[DAMAGE_ICON]->setVisible(  allow_damage );
+		mDamageText->setVisible(allow_damage);
+
+		layoutParcelIcons();
+	}
+	else
+	{
+		for (S32 i = 0; i < ICON_COUNT; ++i)
+		{
+			mParcelIcon[i]->setVisible(false);
+		}
+		mDamageText->setVisible(false);
+	}
+}
+
+void LLPanelTopInfoBar::updateHealth()
+{
+	static LLUICachedControl<bool> show_icons("NavBarShowParcelProperties", false);
+
+	// *FIXME: Status bar owns health information, should be in agent
+	if (show_icons && gStatusBar)
+	{
+		static S32 last_health = -1;
+		S32 health = gStatusBar->getHealth();
+		if (health != last_health)
+		{
+			std::string text = llformat("%d%%", health);
+			mDamageText->setText(text);
+			last_health = health;
+		}
+	}
+}
+
+void LLPanelTopInfoBar::layoutParcelIcons()
+{
+	// TODO: remove hard-coded values and read them as xml parameters
+	static const int FIRST_ICON_HPAD = 32;
+	static const int LAST_ICON_HPAD = 11;
+
+	S32 left = mParcelInfoText->getRect().mRight + FIRST_ICON_HPAD;
+
+	left = layoutWidget(mDamageText, left);
+
+	for (int i = ICON_COUNT - 1; i >= 0; --i)
+	{
+		left = layoutWidget(mParcelIcon[i], left);
+	}
+
+	LLRect rect = getRect();
+	rect.set(rect.mLeft, rect.mTop, left + LAST_ICON_HPAD, rect.mBottom);
+	setRect(rect);
+}
+
+S32 LLPanelTopInfoBar::layoutWidget(LLUICtrl* ctrl, S32 left)
+{
+	// TODO: remove hard-coded values and read them as xml parameters
+	static const int ICON_HPAD = 2;
+
+	if (ctrl->getVisible())
+	{
+		LLRect rect = ctrl->getRect();
+		rect.mRight = left + rect.getWidth();
+		rect.mLeft = left;
+
+		ctrl->setRect(rect);
+		left += rect.getWidth() + ICON_HPAD;
+	}
+
+	return left;
+}
+
+void LLPanelTopInfoBar::onParcelIconClick(EParcelIcon icon)
+{
+	switch (icon)
+	{
+	case VOICE_ICON:
+		LLNotificationsUtil::add("NoVoice");
+		break;
+	case FLY_ICON:
+		LLNotificationsUtil::add("NoFly");
+		break;
+	case PUSH_ICON:
+		LLNotificationsUtil::add("PushRestricted");
+		break;
+	case BUILD_ICON:
+		LLNotificationsUtil::add("NoBuild");
+		break;
+	case SCRIPTS_ICON:
+	{
+		LLViewerRegion* region = gAgent.getRegion();
+		if(region && region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS)
+		{
+			LLNotificationsUtil::add("ScriptsStopped");
+		}
+		else if(region && region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS)
+		{
+			LLNotificationsUtil::add("ScriptsNotRunning");
+		}
+		else
+		{
+			LLNotificationsUtil::add("NoOutsideScripts");
+		}
+		break;
+	}
+	case DAMAGE_ICON:
+		LLNotificationsUtil::add("NotSafe");
+		break;
+	case ICON_COUNT:
+		break;
+	// no default to get compiler warning when a new icon gets added
+	}
+}
+
+void LLPanelTopInfoBar::onAgentParcelChange()
+{
+	update();
+}
+
+void LLPanelTopInfoBar::onInfoButtonClicked()
+{
+	LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent"));
+}

File indra/newview/llpaneltopinfobar.h

View file
+/**
+ * @file llpaneltopinfobar.h
+ * @brief Coordinates and Parcel Settings information panel definition
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LLPANELTOPINFOBAR_H_
+#define LLPANELTOPINFOBAR_H_
+
+#include "llpanel.h"
+
+class LLButton;
+class LLTextBox;
+class LLIconCtrl;
+class LLParcelChangeObserver;
+
+class LLPanelTopInfoBar : public LLPanel, public LLSingleton<LLPanelTopInfoBar>
+{
+	LOG_CLASS(LLPanelTopInfoBar);
+
+public:
+	LLPanelTopInfoBar();
+	~LLPanelTopInfoBar();
+
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void draw();
+
+	/**
+	 * Updates location and parcel icons on login complete
+	 */
+	void handleLoginComplete();
+
+private:
+	class LLParcelChangeObserver;
+
+	friend class LLParcelChangeObserver;
+
+	enum EParcelIcon
+	{
+		VOICE_ICON = 0,
+		FLY_ICON,
+		PUSH_ICON,
+		BUILD_ICON,
+		SCRIPTS_ICON,
+		DAMAGE_ICON,
+		ICON_COUNT
+	};
+
+	/**
+	 * Initializes parcel icons controls. Called from the constructor.
+	 */
+	void initParcelIcons();
+
+	BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+
+	/**
+	 * Handles clicks on the parcel icons.
+	 */
+	void onParcelIconClick(EParcelIcon icon);
+
+	/**
+	 * Handles clicks on the info buttons.
+	 */
+	void onInfoButtonClicked();
+
+	/**
+	 * Called when agent changes the parcel.
+	 */
+	void onAgentParcelChange();
+
+	/**
+	 * Called when user checks/unchecks Show Coordinates menu item.
+	 */
+	void onNavBarShowParcelPropertiesCtrlChanged();
+
+	/**
+	 * Shorthand to call updateParcelInfoText() and updateParcelIcons().
+	 */
+	void update();
+
+	/**
+	 * Updates parcel info text (mParcelInfoText).
+	 */
+	void updateParcelInfoText();
+
+	/**
+	 * Updates parcel icons (mParcelIcon[]).
+	 */
+	void updateParcelIcons();
+
+	/**
+	 * Updates health information (mDamageText).
+	 */
+	void updateHealth();
+
+	/**
+	 * Lays out all parcel icons starting from right edge of the mParcelInfoText + 11px
+	 * (see screenshots in EXT-5808 for details).
+	 */
+	void layoutParcelIcons();
+
+	/**
+	 * Lays out a widget. Widget's rect mLeft becomes equal to the 'left' argument.
+	 */
+	S32 layoutWidget(LLUICtrl* ctrl, S32 left);
+
+	/**
+	 * Generates location string and returns it in the loc_str parameter.
+	 */
+	void buildLocationString(std::string& loc_str, bool show_coords);
+
+	/**
+	 * Sets new value to the mParcelInfoText and updates the size of the top bar.
+	 */
+	void setParcelInfoText(const std::string& new_text);
+
+	LLButton* 				mInfoBtn;
+	LLTextBox* 				mParcelInfoText;
+	LLTextBox* 				mDamageText;
+	LLIconCtrl*				mParcelIcon[ICON_COUNT];
+	LLParcelChangeObserver*	mParcelChangedObserver;
+
+	boost::signals2::connection	mParcelPropsCtrlConnection;
+	boost::signals2::connection	mShowCoordsCtrlConnection;
+	boost::signals2::connection	mParcelMgrConnection;
+};
+
+#endif /* LLPANELTOPINFOBAR_H_ */

File indra/newview/llviewercontrol.cpp

View file
 #include "llfloatertools.h"
 #include "llpaneloutfitsinventory.h"
 #include "llpanellogin.h"
+#include "llpaneltopinfobar.h"
 
 #ifdef TOGGLE_HACKED_GODLIKE_VIEWER
 BOOL 				gHackGodmode = FALSE;
 	return true;
 }
 
+bool toggle_show_mini_location_panel(const LLSD& newvalue)
+{
+	LLPanelTopInfoBar::getInstance()->setVisible(newvalue.asBoolean());
+	return true;
+}
+
 bool toggle_show_object_render_cost(const LLSD& newvalue)
 {
 	LLFloaterTools::sShowObjectCost = newvalue.asBoolean();
 	gSavedSettings.getControl("AgentPause")->getSignal()->connect(boost::bind(&toggle_agent_pause, _2));
 	gSavedSettings.getControl("ShowNavbarNavigationPanel")->getSignal()->connect(boost::bind(&toggle_show_navigation_panel, _2));
 	gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2));
+	gSavedSettings.getControl("ShowMiniLocationPanel")->getSignal()->connect(boost::bind(&toggle_show_mini_location_panel, _2));
 	gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2));
 	gSavedSettings.getControl("ForceShowGrid")->getSignal()->connect(boost::bind(&handleForceShowGrid, _2));
 }

File indra/newview/llviewerwindow.cpp

View file
 
 #include "llnearbychat.h"
 #include "llviewerwindowlistener.h"
+#include "llpaneltopinfobar.h"
 
 #if LL_WINDOWS
 #include <tchar.h> // For Unicode conversion methods
 		navbar->showFavoritesPanel(FALSE);
 	}
 
+	// Top Info bar
+	LLPanel* topinfo_bar_container = getRootView()->getChild<LLPanel>("topinfo_bar_container");
+	LLPanelTopInfoBar* topinfo_bar = LLPanelTopInfoBar::getInstance();
+
+	topinfo_bar->setShape(topinfo_bar_container->getLocalRect());
+
+	topinfo_bar_container->addChild(topinfo_bar);
+	topinfo_bar_container->setVisible(TRUE);
+
+	if (!gSavedSettings.getBOOL("ShowMiniLocationPanel"))
+	{
+		topinfo_bar->setVisible(FALSE);
+	}
+
 	if ( gHUDView == NULL )
 	{
 		LLRect hud_rect = full_window;

File indra/newview/llwearableitemslist.cpp

View file
 LLPanelWearableListItem::LLPanelWearableListItem(LLViewerInventoryItem* item)
 : LLPanelInventoryListItemBase(item)
 {
+	// icons should not be shown for this type of items (EXT-7511)
+	mForceNoLinksOnIcons = true;
 }
 
 //////////////////////////////////////////////////////////////////////////
 	addWidgetToRightSide("btn_move_up");
 	addWidgetToRightSide("btn_move_down");
 	addWidgetToRightSide("btn_lock");
-	addWidgetToRightSide("btn_edit");
+	addWidgetToRightSide("btn_edit_panel");
 
 	setWidgetsVisible(false);
 	reshapeWidgets();
 	LLPanelInventoryListItemBase::postBuild();
 
 	addWidgetToRightSide("btn_lock");
-	addWidgetToRightSide("btn_edit");
+	addWidgetToRightSide("btn_edit_panel");
 
 	return TRUE;
 }

File indra/newview/llwearableitemslist.h

View file
 
 	inline void setShowMoveDownButton(bool show) { setShowWidget("btn_move_down", show); }
 	inline void setShowLockButton(bool show) { setShowWidget("btn_lock", show); }
-	inline void setShowEditButton(bool show) { setShowWidget("btn_edit", show); }
+	inline void setShowEditButton(bool show) { setShowWidget("btn_edit_panel", show); }
 
 
 protected:
 	* Make button visible during mouse over event.
 	*/
 	inline void setShowLockButton(bool show) { setShowWidget("btn_lock", show); }
-	inline void setShowEditButton(bool show) { setShowWidget("btn_edit", show); }
+	inline void setShowEditButton(bool show) { setShowWidget("btn_edit_panel", show); }
 
 protected:
 	LLPanelBodyPartsListItem(LLViewerInventoryItem* item);

File indra/newview/skins/default/textures/textures.xml

View file
   <texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" />
   <texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" />
 
+  <texture name="Wearables_Divider" file_name="windows/Wearables_Divider.png" preload="false" />
+
   <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png"  preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
   <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
 

File indra/newview/skins/default/textures/windows/Wearables_Divider.png

Added
New image

File indra/newview/skins/default/xui/en/floater_world_map.xml

View file
      width="90">
         Land Sale
     </text>
+        <icon
+     color="0.5 0.25 1 1"
+     follows="top|right"
+     height="16"
+     image_name="legend.tga"
+     layout="topleft"
+     mouse_opaque="true"
+     name="square2"
+     left="20"
+     top_pad="2"
+     width="16" />
+    <text
+     type="string"
+     length="1"
+     follows="top|right"
+     height="16"
+     layout="topleft"
+     left_pad="0"
+     name="auction_label"
+     top_delta="3"
+     width="170">
+        land auction
+    </text>
     <icon
      color="1 1 0.25 1"
      follows="top|right"
      layout="topleft"
      mouse_opaque="true"
      name="square2"
-     left="41"
-     top_pad="-2"
+     left="20"
+     top_pad="-5"
      width="16" />
     <text
      type="string"
      width="100">
        by owner
     </text>
-        <icon
-     color="0.5 0.25 1 1"
-     follows="top|right"
-     height="16"
-     image_name="legend.tga"
-     layout="topleft"
-     mouse_opaque="true"
-     name="square2"
-     left="41"
-     top_pad="-3"
-     width="16" />
-    <text
-     type="string"
-     length="1"
-     follows="top|right"
-     height="16"
-     layout="topleft"
-     left_pad="0"
-     name="auction_label"
-     top_delta="3"
-     width="170">
-        land auction
-    </text>
 
     <button
      follows="top|right"

File indra/newview/skins/default/xui/en/main_view.xml

View file
                    mouse_opaque="false"
                 name="hud container"
                    width="500">
+            <panel auto_resize="false"
+                   follows="left|top"
+                   height="19"
+                   left="0"
+                   mouse_opaque="false"
+                   name="topinfo_bar_container"
+                   tab_stop="false"
+                   top="0"
+                   user_resize="false"
+                   visible="false"
+                   width="1024"/>
               <panel follows="right|top|bottom"
                      height="500"
                      mouse_opaque="false"

File indra/newview/skins/default/xui/en/menu_hide_navbar.xml

View file
          label="Show Navigation Bar"
          layout="topleft"
          name="ShowNavbarNavigationPanel">
-           <menu_item_check.on_click
+           <on_click
              function="ToggleControl"
              parameter="ShowNavbarNavigationPanel" /> 
-             <menu_item_check.on_check
+             <on_check
              function="CheckControl"
              parameter="ShowNavbarNavigationPanel" />
     </menu_item_check>
          label="Show Favorites Bar"
          layout="topleft"
          name="ShowNavbarFavoritesPanel">
-           <menu_item_check.on_click
+           <on_click
              function="ToggleControl"
              parameter="ShowNavbarFavoritesPanel" /> 
-             <menu_item_check.on_check
+             <on_check
              function="CheckControl"
              parameter="ShowNavbarFavoritesPanel" />
     </menu_item_check>
+    <menu_item_check
+         label="Show Mini-Location Bar"
+         layout="topleft"
+         name="ShowMiniLocationPanel">
+           <on_click
+             function="ToggleControl"
+             parameter="ShowMiniLocationPanel" />
+             <on_check
+             function="CheckControl"
+             parameter="ShowMiniLocationPanel" />
+    </menu_item_check>
 </menu>

File indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml

View file
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  follows="top|right|left"
- height="23"
+ height="25"
  layout="topleft"
  left="0"
  name="wearable_item"
  width="380">
     <icon
      follows="top|right|left"
-     height="23"
+     height="22"
      image_name="ListItem_Over"
      layout="topleft"
      left="0"
      name="hovered_icon"
-     top="0"
+     top="1"
      visible="false"
      width="380" />
     <icon
-     height="23"
+     height="22"
      follows="top|right|left"
      image_name="ListItem_Select"
      layout="topleft"
      left="0"
      name="selected_icon"
-     top="0"
+     top="1"
      visible="false"
      width="380" />
     <icon
      name="btn_lock"
      layout="topleft"
      follows="top|right"
-     image_name="Locked_Icon"
      top="0"
      left="0"
      height="23"
          width="9"
          tab_stop="false" />
     </panel>
-    <button 
-     name="btn_edit"
+    <panel
+     background_visible="false"
+     name="btn_edit_panel"
      layout="topleft"
      follows="top|right"
-     image_overlay="Edit_Wrench"
      top="0"
      left_pad="3"
-     height="23"
-     width="23"
-     tab_stop="false" />
-    <panel
-     background_visible="true"
-     bg_alpha_color="0.4 0.4 0.4 1.0"
-     bottom="0"
+     height="24"
+     width="27"
+     tab_stop="false">
+         <button 
+          name="btn_edit"
+          layout="topleft"
+          follows="top|right"
+          image_overlay="Edit_Wrench"
+          top="0"
+          left="0"
+          height="24"
+          width="24"
+          tab_stop="false" />
+      </panel>
+    <icon
      follows="left|right|top"
-     height="1"
+     height="3"
+     image_name="Wearables_Divider"
      layout="bottomleft"
      left="0"
-     name="wearable_type_separator_panel"
+     name="wearable_type_separator_icon"
+     top="3"
+     visible="true"
      width="380"/>
 </panel>

File indra/newview/skins/default/xui/en/panel_clothing_list_item.xml

View file
  width="380">
     <icon
      follows="top|right|left"
-     height="23"
+     height="22"
      image_name="ListItem_Over"
      layout="topleft"
      left="0"
      name="hovered_icon"
-     top="0"
+     top="1"
      visible="false"
      width="380" />
     <icon
-     height="23"
+     height="22"
      follows="top|right|left"
      image_name="ListItem_Select"
      layout="topleft"
      left="0"
      name="selected_icon"
-     top="0"
+     top="1"
      visible="false"
      width="380" />
     <button 
      follows="top|left"
      image_unselected="Toast_CloseBtn"
      image_selected="Toast_CloseBtn"
-     top="0"
+     top="2"
      left="0"
-     height="20"
-     width="20"
+     height="18"
+     width="18"
      tab_stop="false" />
     <icon
      height="16"
      image_overlay="UpArrow_Off"
      top="0"
      left="0"
-     height="23"
-     width="23"
+     height="24"
+     width="24"
      tab_stop="false" />
     <button 
      name="btn_move_down"
      image_overlay="DownArrow_Off"
      top="0"
      left_pad="3"
-     height="23"
-     width="23"
+     height="24"
+     width="24"
      tab_stop="false" />
     <panel
      background_visible="false"
      name="btn_lock"
      layout="topleft"
      follows="top|right"
-     image_name="Locked_Icon"
      top="0"
      left="0"
      height="23"
          width="9"
          tab_stop="false" />
     </panel>
-    <button 
-     name="btn_edit"
+    <panel
+     background_visible="false"
+     name="btn_edit_panel"
      layout="topleft"
      follows="top|right"
-     image_overlay="Edit_Wrench"
      top="0"
      left_pad="3"
-     height="23"
-     width="23"
-     tab_stop="false" />
-    <panel
-     background_visible="true"
-     bg_alpha_color="0.4 0.4 0.4 1.0"
-     bottom="0"
+     height="24"
+     width="27"
+     tab_stop="false">
+        <button 
+         name="btn_edit"
+         layout="topleft"
+         follows="top|right"
+         image_overlay="Edit_Wrench"
+         top="0"
+         left="0"
+         height="24"
+         width="24"
+         tab_stop="false" />
+      </panel>
+    <icon
      follows="left|right|top"
-     height="1"
+     height="3"
+     image_name="Wearables_Divider"
      layout="bottomleft"
      left="0"
-     name="wearable_type_separator_panel"
+     name="wearable_type_separator_icon"
+     top="0"
      visible="false"
      width="380"/>
 </panel>

File indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml

View file
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  follows="top|right|left"
- height="23"
+ height="25"
  layout="topleft"
  left="0"
  name="deletable_wearable_item"
  width="380">
     <icon
      follows="top|right|left"
-     height="20"
+     height="22"
      image_name="ListItem_Over"
      layout="topleft"
      left="0"
      name="hovered_icon"
-     top="0"
+     top="1"
      visible="false"
      width="380" />
     <icon
-     height="20"
+     height="22"
      follows="top|right|left"
      image_name="ListItem_Select"
      layout="topleft"
      left="0"
      name="selected_icon"
-     top="0"
+     top="1"
      visible="false"
      width="380" />
     <button 
      follows="top|left"
      image_unselected="Toast_CloseBtn"
      image_selected="Toast_CloseBtn"
-     top="0"
+     top="2"
      left="0"
-     height="20"
-     width="20"
+     height="18"
+     width="18"
      tab_stop="false" />
     <icon
      height="16"
      top="4"
      value="..."
      width="359" />
-    <panel
-     background_visible="true"
-     bg_alpha_color="0.4 0.4 0.4 1.0"
-     bottom="0"
+    <icon
      follows="left|right|top"
-     height="1"
+     height="3"
+     image_name="Wearables_Divider"
      layout="bottomleft"
      left="0"
-     name="wearable_type_separator_panel"
+     name="wearable_type_separator_icon"
+     top="3"
      visible="true"
      width="380"/>
 </panel>

File indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml

View file
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  follows="top|right|left"
- height="23"
+ height="25"
  layout="topleft"
  left="0"
  name="dummy_clothing_item"
  width="380">
     <icon
      follows="top|right|left"
-     height="23"
+     height="22"
      image_name="ListItem_Over"
      layout="topleft"
      left="0"
      name="hovered_icon"
-     top="0"
+     top="1"
      visible="false"
      width="380" />
     <icon
-     height="23"
+     height="22"
      follows="top|right|left"
      image_name="ListItem_Select"
      layout="topleft"
      left="0"
      name="selected_icon"
-     top="0"
+     top="1"
      visible="false"
      width="380" />
     <icon
      image_overlay="AddItem_Off"
      top="0"
      left="0"
-     height="23"
-     width="23"
+     height="24"
+     width="24"
      tab_stop="false" />
-    <panel
-     background_visible="true"
-     bg_alpha_color="0.4 0.4 0.4 1.0"
-     bottom="0"
+    <icon
      follows="left|right|top"
-     height="1"
+     height="3"
+     image_name="Wearables_Divider"
      layout="bottomleft"
      left="0"
-     name="wearable_type_separator_panel"
+     name="wearable_type_separator_icon"
+     top="3"
+     visible="true"
      width="380"/>
 </panel>

File indra/newview/skins/default/xui/en/panel_edit_alpha.xml

View file
       name="avatar_alpha_color_panel"
       top="0"
       width="313" >
-       <texture_picker
-        can_apply_immediately="true"
-        default_image_name="Default"
-        follows="left|top"
-        height="100"
-        label="Lower Alpha"
-        layout="topleft"
-        left="30"
-        name="Lower Alpha"
-        tool_tip="Click to choose a picture"
-        top="10"
-        width="94" >
-         <texture_picker.commit_callback
-             function="TexturePicker.Commit" />
-       </texture_picker>
        <check_box
         control_name="LowerAlphaTextureInvisible"
         follows="left"
         height="16"
         layout="topleft"
-        left_pad="6"
+        left="5"
         name="lower alpha texture invisible"
-        top_delta="4"
+        top="10"
         width="16" />
        <texture_picker
         can_apply_immediately="true"
         default_image_name="Default"
         follows="left|top"
-        height="100"
-        label="Upper Alpha"
+        height="115"
+        label="Lower Alpha"
         layout="topleft"
-        left_pad="20"
-        name="Upper Alpha"
+        left_pad="5"
+        name="Lower Alpha"
         tool_tip="Click to choose a picture"
         top="10"
-        width="94">
+        width="115" >
          <texture_picker.commit_callback
              function="TexturePicker.Commit" />
        </texture_picker>
+
        <check_box
         control_name="UpperAlphaTextureInvisible"
         follows="left"
         height="16"
         layout="topleft"
-        left_pad="6"
+        left_pad="20"
         name="upper alpha texture invisible"
-        top_delta="4"
+        top="10"
         width="16" />
        <texture_picker
         can_apply_immediately="true"
         default_image_name="Default"
         follows="left|top"
-        height="100"
-        label="Head Alpha"
+        height="115"
+        label="Upper Alpha"
         layout="topleft"
-        left="30"
-        name="Head Alpha"
+        left_pad="5"
+        name="Upper Alpha"
         tool_tip="Click to choose a picture"
-        top="120"
-        width="94" >
+        top="10"
+        width="115">
          <texture_picker.commit_callback
              function="TexturePicker.Commit" />
        </texture_picker>
+
        <check_box
         control_name="HeadAlphaTextureInvisible"
         follows="left"
         height="16"
         layout="topleft"
-        left_pad="6"
+        left="5"
         name="head alpha texture invisible"
-        top_delta="4"
+        top_pad="15"
         width="16" />
        <texture_picker
         can_apply_immediately="true"
         default_image_name="Default"
         follows="left|top"
-        height="100"
-        label="Eye Alpha"
+        height="115"
+        label="Head Alpha"
         layout="topleft"
-        left_pad="20"
-        name="Eye Alpha"
+        left_pad="5"
+        name="Head Alpha"
         tool_tip="Click to choose a picture"
-        top="120"
-        width="94" >
+        top_delta="0"
+        width="115" >
          <texture_picker.commit_callback
              function="TexturePicker.Commit" />
        </texture_picker>
+
        <check_box
         control_name="Eye AlphaTextureInvisible"
         follows="left"
         height="16"
         layout="topleft"
-        left_pad="6"
+        left_pad="20"
         name="eye alpha texture invisible"
-        top_delta="4"
+        top_delta="0"
         width="16" />
        <texture_picker
         can_apply_immediately="true"
         default_image_name="Default"
         follows="left|top"
-        height="100"
+        height="115"
+        label="Eye Alpha"
+        layout="topleft"
+        left_pad="5"
+        name="Eye Alpha"
+        tool_tip="Click to choose a picture"
+        top_delta="0"
+        width="115" >
+         <texture_picker.commit_callback
+             function="TexturePicker.Commit" />
+       </texture_picker>
+
+       <check_box
+        control_name="HairAlphaTextureInvisible"
+        follows="left"
+        height="16"
+        layout="topleft"
+        left="5"
+        name="hair alpha texture invisible"
+        top_pad="15"
+        width="16" />
+       <texture_picker
+        can_apply_immediately="true"
+        default_image_name="Default"
+        follows="left|top"
+        height="115"
         label="Hair Alpha"
         layout="topleft"
         left="30"