From 29896d26c2ace6fb4db513c9d660e89168a736fc Mon Sep 17 00:00:00 2001
From: Xiaohong Bao <bao@lindenlab.com>
Date: Thu, 3 Jun 2010 14:08:22 -0600
Subject: EXT-7630: FIXED: turn on http texture fetching by default.

---
 indra/newview/app_settings/settings.xml | 2 +-
 indra/newview/lltexturefetch.cpp        | 7 ++++++-
 indra/newview/llviewerregion.cpp        | 5 +++++
 indra/newview/llviewerregion.h          | 2 ++
 4 files changed, 14 insertions(+), 2 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c0be54a105..6cebbb6bfc 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3851,7 +3851,7 @@
       <key>Type</key>
       <string>Boolean</string>
       <key>Value</key>
-      <integer>0</integer>
+      <integer>1</integer>
     </map>
     <key>InBandwidth</key>
     <map>
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index cf3bce2ec1..74b7f123d8 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -753,17 +753,22 @@ bool LLTextureFetchWorker::doWork(S32 param)
 
 			if (region)
 			{
-				std::string http_url = region->getCapability("GetTexture");
+				std::string http_url = region->getHttpUrl() ;
 				if (!http_url.empty())
 				{
 					mUrl = http_url + "/?texture_id=" + mID.asString().c_str();
 					mWriteToCacheState = CAN_WRITE ; //because this texture has a fixed texture id.
 				}
+				else
+				{
+					mCanUseHTTP = false ;
+				}
 			}
 			else
 			{
 				// This will happen if not logged in or if a region deoes not have HTTP Texture enabled
 				//llwarns << "Region not found for host: " << mHost << llendl;
+				mCanUseHTTP = false;
 			}
 		}
 		if (mCanUseHTTP && !mUrl.empty())
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index c48668df9a..da240cedbb 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -216,6 +216,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
 	mColoName("unknown"),
 	mProductSKU("unknown"),
 	mProductName("unknown"),
+	mHttpUrl(""),
 	mCacheLoaded(FALSE),
 	mCacheEntriesCount(0),
 	mCacheID(),
@@ -1555,6 +1556,10 @@ void LLViewerRegion::setCapability(const std::string& name, const std::string& u
 	else
 	{
 		mCapabilities[name] = url;
+		if(name == "GetTexture")
+		{
+			mHttpUrl = url ;
+		}
 	}
 }
 
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 5c4d5a61fd..a9e7ef771c 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -291,6 +291,7 @@ public:
 	friend std::ostream& operator<<(std::ostream &s, const LLViewerRegion &region);
     /// implements LLCapabilityProvider
     virtual std::string getDescription() const;
+	std::string getHttpUrl() const { return mHttpUrl ;}
 
 	LLSpatialPartition* getSpatialPartition(U32 type);
 public:
@@ -383,6 +384,7 @@ private:
 	std::string mColoName;
 	std::string mProductSKU;
 	std::string mProductName;
+	std::string mHttpUrl ;
 	
 	
 	// Maps local ids to cache entries.
-- 
cgit v1.2.3


From 2caa710a46d3baa1e6a884961f1ff756d35ef5df Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Thu, 3 Jun 2010 20:06:25 -0400
Subject: VWR-19699 WIP Correct operations for wear and replace on wearables

Resident-submitted patch, cleaned up so it matches style and compiles/builds
well. Appears to work for stated goals but will need some more UI work to
ensure consistency.

WIP checkin, will be code reviewed before pushing.
---
 indra/newview/llappearancemgr.cpp                  |  33 +++++-
 indra/newview/llinventorybridge.cpp                | 112 +--------------------
 indra/newview/llinventorybridge.h                  |   2 -
 indra/newview/llinventorymodel.cpp                 |   3 +-
 indra/newview/lltooldraganddrop.cpp                |  19 +---
 indra/newview/llviewerinventory.cpp                |   2 +-
 indra/newview/llviewerinventory.h                  |   6 ++
 .../skins/default/xui/en/menu_inventory.xml        |   8 ++
 8 files changed, 51 insertions(+), 134 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index e6f363028a..5071b1c14a 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -656,15 +656,40 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up
 {
 	if (item_id_to_wear.isNull()) return false;
 
-	//only the item from a user's inventory is allowed
-	if (!gInventory.isObjectDescendentOf(item_id_to_wear, gInventory.getRootFolderID())) return false;
-
 	LLViewerInventoryItem* item_to_wear = gInventory.getItem(item_id_to_wear);
 	if (!item_to_wear) return false;
 
+	if (!item_to_wear->isFinished())
+	{
+		LLNotificationsUtil::add("CannotWearInfoNotComplete");
+		return false;
+	}
+	else if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getLibraryRootFolderID()))
+	{
+		LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(replace);
+		copy_inventory_item(gAgent.getID(), item_to_wear->getPermissions().getOwner(), item_to_wear->getUUID(), LLUUID::null, std::string(),cb);
+		return false;
+	} 
+	else if (!gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getRootFolderID()))
+	{
+		return false; // not in library and not in agent's inventory
+	}
+	else if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH)))
+	{
+		LLNotificationsUtil::add("CannotWearTrash");
+	}
+
 	switch (item_to_wear->getType())
 	{
 	case LLAssetType::AT_CLOTHING:
+		if (replace && gAgentWearables.areWearablesLoaded())
+		{
+			S32 wearable_count = gAgentWearables.getWearableCount(item_to_wear->getWearableType());
+			if (wearable_count != 0)
+			{
+				removeCOFItemLinks(gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), wearable_count-1), false);
+			}
+		}
 	case LLAssetType::AT_BODYPART:
 		// Don't wear anything until initial wearables are loaded, can
 		// destroy clothing items.
@@ -676,7 +701,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up
 
 		// Remove the existing wearables of the same type.
 		// Remove existing body parts anyway because we must not be able to wear e.g. two skins.
-		if (replace || item_to_wear->getType() == LLAssetType::AT_BODYPART)
+		if (item_to_wear->getType() == LLAssetType::AT_BODYPART)
 		{
 			removeCOFLinksOfType(item_to_wear->getWearableType(), false);
 		}
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index b7495f7dbe..827688ec29 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -103,7 +103,6 @@ void dec_busy_count()
 }
 
 // Function declarations
-void wear_add_inventory_item_on_avatar(LLInventoryItem* item);
 void remove_inventory_category_from_avatar(LLInventoryCategory* category);
 void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id);
 bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*);
@@ -4295,33 +4294,6 @@ LLWearableBridge::LLWearableBridge(LLInventoryPanel* inventory,
 	mInvType = inv_type;
 }
 
-// *NOTE: hack to get from avatar inventory to avatar
-void wear_inventory_item_on_avatar( LLInventoryItem* item )
-{
-	if(item)
-	{
-		lldebugs << "wear_inventory_item_on_avatar( " << item->getName()
-				 << " )" << llendl;
-
-		LLAppearanceMgr::getInstance()->wearItemOnAvatar(item->getUUID(), true, false);
-	}
-}
-
-void wear_add_inventory_item_on_avatar( LLInventoryItem* item )
-{
-	if(item)
-	{
-		lldebugs << "wear_add_inventory_item_on_avatar( " << item->getName()
-				 << " )" << llendl;
-
-		LLWearableList::instance().getAsset(item->getAssetUUID(),
-											item->getName(),
-											item->getType(),
-											LLWearableBridge::onWearAddOnAvatarArrived,
-											new LLUUID(item->getUUID()));
-	}
-}
-
 void remove_inventory_category_from_avatar( LLInventoryCategory* category )
 {
 	if(!category) return;
@@ -4637,21 +4609,7 @@ void LLWearableBridge::wearOnAvatar()
 	LLViewerInventoryItem* item = getItem();
 	if(item)
 	{
-		if(!isAgentInventory())
-		{
-			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
-			copy_inventory_item(
-				gAgent.getID(),
-				item->getPermissions().getOwner(),
-				item->getUUID(),
-				LLUUID::null,
-				std::string(),
-				cb);
-		}
-		else
-		{
-			wear_inventory_item_on_avatar(item);
-		}
+		LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, true);
 	}
 }
 
@@ -4668,21 +4626,7 @@ void LLWearableBridge::wearAddOnAvatar()
 	LLViewerInventoryItem* item = getItem();
 	if(item)
 	{
-		if(!isAgentInventory())
-		{
-			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
-			copy_inventory_item(
-				gAgent.getID(),
-				item->getPermissions().getOwner(),
-				item->getUUID(),
-				LLUUID::null,
-				std::string(),
-				cb);
-		}
-		else
-		{
-			wear_add_inventory_item_on_avatar(item);
-		}
+		LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, false);
 	}
 }
 
@@ -5207,41 +5151,7 @@ class LLWearableBridgeAction: public LLInvFVBridgeAction
 public:
 	virtual void doIt()
 	{
-		if(isItemInTrash())
-		{
-			LLNotificationsUtil::add("CannotWearTrash");
-		}
-		else if(isAgentInventory())
-		{
-			if(!get_is_item_worn(mUUID))
-			{
-				wearOnAvatar();
-			}
-		}
-		else
-		{
-			// must be in the inventory library. copy it to our inventory
-			// and put it on right away.
-			LLViewerInventoryItem* item = getItem();
-			if(item && item->isFinished())
-			{
-				LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
-				copy_inventory_item(
-					gAgent.getID(),
-					item->getPermissions().getOwner(),
-					item->getUUID(),
-					LLUUID::null,
-					std::string(),
-					cb);
-			}
-			else if(item)
-			{
-				// *TODO: We should fetch the item details, and then do
-				// the operation above.
-				LLNotificationsUtil::add("CannotWearInfoNotComplete");
-			}
-		}
-		LLInvFVBridgeAction::doIt();
+		wearOnAvatar();
 	}
 	virtual ~LLWearableBridgeAction(){}
 protected:
@@ -5280,21 +5190,7 @@ void LLWearableBridgeAction::wearOnAvatar()
 	LLViewerInventoryItem* item = getItem();
 	if(item)
 	{
-		if(!isAgentInventory())
-		{
-			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
-			copy_inventory_item(
-				gAgent.getID(),
-				item->getPermissions().getOwner(),
-				item->getUUID(),
-				LLUUID::null,
-				std::string(),
-				cb);
-		}
-		else
-		{
-			wear_inventory_item_on_avatar(item);
-		}
+		LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, true);
 	}
 }
 
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 59c1f3d6fb..dcf0487250 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -592,8 +592,6 @@ public:
 		U32 flags = 0x00) const;
 };
 
-void wear_inventory_item_on_avatar(LLInventoryItem* item);
-
 void rez_attachment(LLViewerInventoryItem* item, 
 					LLViewerJointAttachment* attachment);
 
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 2e1c5238d3..6fc5804a48 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -35,6 +35,7 @@
 
 #include "llagent.h"
 #include "llagentwearables.h"
+#include "llappearancemgr.h"
 #include "llinventorypanel.h"
 #include "llinventorybridge.h"
 #include "llinventoryfunctions.h"
@@ -2561,7 +2562,7 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
 		{
 			LLViewerInventoryItem* wearable_item;
 			wearable_item = gInventory.getItem(wearable_ids[i]);
-			wear_inventory_item_on_avatar(wearable_item);
+			LLAppearanceMgr::instance().wearItemOnAvatar(wearable_item->getUUID(), true, true);
 		}
 	}
 
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index bc77ac5fd1..c862c02b82 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -1878,24 +1878,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(
 				LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");
 				return ACCEPT_NO;
 			}
-
-			if (mSource == SOURCE_LIBRARY)
-			{
-				// create item based on that one, and put it on if that
-				// was a success.
-				LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
-				copy_inventory_item(
-					gAgent.getID(),
-					item->getPermissions().getOwner(),
-					item->getUUID(),
-					LLUUID::null,
-					std::string(),
-					cb);
-			}
-			else
-			{
-				wear_inventory_item_on_avatar( item );
-			}
+			LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(),true, !(mask & MASK_CONTROL));
 		}
 		return ACCEPT_YES_MULTI;
 	}
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index d745356dcd..face7124c2 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -875,7 +875,7 @@ void WearOnAvatarCallback::fire(const LLUUID& inv_item)
 	LLViewerInventoryItem *item = gInventory.getItem(inv_item);
 	if (item)
 	{
-		wear_inventory_item_on_avatar(item);
+		LLAppearanceMgr::instance().wearItemOnAvatar(inv_item, true, mReplace);
 	}
 }
 
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 8ab7c9710d..d0d3ad693e 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -243,7 +243,13 @@ public:
 
 class WearOnAvatarCallback : public LLInventoryCallback
 {
+public:
+	WearOnAvatarCallback(bool do_replace = false) : mReplace(do_replace) {}
+	
 	void fire(const LLUUID& inv_item);
+
+protected:
+	bool mReplace;
 };
 
 class ModifiedCOFCallback : public LLInventoryCallback
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 11459ad0e6..221457ac1f 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -661,6 +661,14 @@
          function="Inventory.DoToSelected"
          parameter="wear" />
     </menu_item_call>
+    <menu_item_call
+     label="Add"
+     layout="topleft"
+     name="Wearable Add">
+        <menu_item_call.on_click
+         function="Inventory.DoToSelected"
+         parameter="wear_add" />
+    </menu_item_call>
     <menu_item_call
      label="Take Off"
      layout="topleft"
-- 
cgit v1.2.3


From 47beb6dc9c4f7c1557536f8116cc98b8bbc24629 Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Thu, 3 Jun 2010 21:09:49 -0400
Subject: AVP-44 WIP Multi-wearables architecture

One step closer to full support of multi-wearables architecture

code will be reviewed before pushing.
---
 indra/newview/llappearancemgr.cpp | 21 ++++++++++----
 indra/newview/llviewermenu.cpp    |  5 ++--
 indra/newview/llvoavatarself.cpp  | 60 +++++++++++++++++++++++----------------
 indra/newview/llwearable.cpp      |  2 +-
 4 files changed, 54 insertions(+), 34 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 5071b1c14a..9da47c9214 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -682,14 +682,15 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up
 	switch (item_to_wear->getType())
 	{
 	case LLAssetType::AT_CLOTHING:
-		if (replace && gAgentWearables.areWearablesLoaded())
+		if (gAgentWearables.areWearablesLoaded())
 		{
 			S32 wearable_count = gAgentWearables.getWearableCount(item_to_wear->getWearableType());
-			if (wearable_count != 0)
+			if ((replace && wearable_count != 0) ||
+				(wearable_count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE) )
 			{
 				removeCOFItemLinks(gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), wearable_count-1), false);
 			}
-		}
+		} 
 	case LLAssetType::AT_BODYPART:
 		// Don't wear anything until initial wearables are loaded, can
 		// destroy clothing items.
@@ -1584,6 +1585,7 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update
 								  item_array,
 								  LLInventoryModel::EXCLUDE_TRASH);
 	bool linked_already = false;
+	U32 count = 0;
 	for (S32 i=0; i<item_array.count(); i++)
 	{
 		// Are these links to the same object?
@@ -1601,15 +1603,22 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update
 		}
 		// Are these links to different items of the same body part
 		// type? If so, new item will replace old.
-		// TODO: MULTI-WEARABLE: check for wearable limit for clothing types
-		else if (is_body_part && (vitem->isWearableType()) && (vitem->getWearableType() == wearable_type))
+		else if ((vitem->isWearableType()) && (vitem->getWearableType() == wearable_type))
 		{
-			if (inv_item->getIsLinkType()  && (vitem->getWearableType() == wearable_type))
+			if (is_body_part && inv_item->getIsLinkType()  && (vitem->getWearableType() == wearable_type))
+			{
+				gInventory.purgeObject(inv_item->getUUID());
+			}
+			++count;
+
+			// MULTI-WEARABLES: make sure we don't go over MAX_CLOTHING_PER_TYPE
+			if (count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE)
 			{
 				gInventory.purgeObject(inv_item->getUUID());
 			}
 		}
 	}
+
 	if (linked_already)
 	{
 		if (do_update)
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index a1b909c609..23fb97a358 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -7497,8 +7497,9 @@ class LLEditTakeOff : public view_listener_t
 			LLWearableType::EType type = LLWearableType::typeNameToType(clothing);
 			if (type >= LLWearableType::WT_SHAPE && type < LLWearableType::WT_COUNT)
 			{
-				// MULTI-WEARABLES
-				LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(gAgentWearables.getWearableInventoryItem(type,0));
+				// MULTI-WEARABLES: assuming user wanted to remove top shirt.
+				U32 wearable_index = gAgentWearables.getWearableCount(type) - 1;
+				LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(gAgentWearables.getWearableInventoryItem(type,wearable_index));
 				LLWearableBridge::removeItemFromAvatar(item);
 			}
 				
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 462c442954..af042b4e3e 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -1975,37 +1975,47 @@ BOOL LLVOAvatarSelf::canGrabBakedTexture(EBakedTextureIndex baked_index) const
 		 ++iter)
 	{
 		const ETextureIndex t_index = (*iter);
-		lldebugs << "Checking index " << (U32) t_index << llendl;
-		// MULTI-WEARABLE: old method. replace.
-		const LLUUID& texture_id = getTEImage( t_index )->getID();
-		if (texture_id != IMG_DEFAULT_AVATAR)
-		{
-			// Search inventory for this texture.
-			LLViewerInventoryCategory::cat_array_t cats;
-			LLViewerInventoryItem::item_array_t items;
-			LLAssetIDMatches asset_id_matches(texture_id);
-			gInventory.collectDescendentsIf(LLUUID::null,
-											cats,
-											items,
-											LLInventoryModel::INCLUDE_TRASH,
-											asset_id_matches);
-
-			BOOL can_grab = FALSE;
-			lldebugs << "item count for asset " << texture_id << ": " << items.count() << llendl;
-			if (items.count())
+		LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(t_index);
+		U32 count = gAgentWearables.getWearableCount(wearable_type);
+		lldebugs << "Checking index " << (U32) t_index << " count: " << count << llendl;
+		
+		for (U32 wearable_index = 0; wearable_index < count; ++wearable_index)
+		{
+			LLWearable *wearable = gAgentWearables.getWearable(wearable_type, wearable_index);
+			if (wearable)
 			{
-				// search for full permissions version
-				for (S32 i = 0; i < items.count(); i++)
+				const LLLocalTextureObject *texture = wearable->getLocalTextureObject((S32)t_index);
+				const LLUUID& texture_id = texture->getID();
+				if (texture_id != IMG_DEFAULT_AVATAR)
 				{
-					LLViewerInventoryItem* itemp = items[i];
-                                        if (itemp->getIsFullPerm())
+					// Search inventory for this texture.
+					LLViewerInventoryCategory::cat_array_t cats;
+					LLViewerInventoryItem::item_array_t items;
+					LLAssetIDMatches asset_id_matches(texture_id);
+					gInventory.collectDescendentsIf(LLUUID::null,
+													cats,
+													items,
+													LLInventoryModel::INCLUDE_TRASH,
+													asset_id_matches);
+
+					BOOL can_grab = FALSE;
+					lldebugs << "item count for asset " << texture_id << ": " << items.count() << llendl;
+					if (items.count())
 					{
-						can_grab = TRUE;
-						break;
+						// search for full permissions version
+						for (S32 i = 0; i < items.count(); i++)
+						{
+							LLViewerInventoryItem* itemp = items[i];
+												if (itemp->getIsFullPerm())
+							{
+								can_grab = TRUE;
+								break;
+							}
+						}
 					}
+					if (!can_grab) return FALSE;
 				}
 			}
-			if (!can_grab) return FALSE;
 		}
 	}
 
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index 9e9b46473e..121e691710 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -656,7 +656,7 @@ void LLWearable::writeToAvatar()
 				image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te);
 			}
 			LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE );
-			// MULTI-WEARABLE: replace hard-coded 0
+			// MULTI-WEARABLE: assume index 0 will be used when writing to avatar. TODO: eliminate the need for this.
 			gAgentAvatarp->setLocalTextureTE(te, image, 0);
 		}
 	}
-- 
cgit v1.2.3


From e1189d0e2ee47539edc68c3532e0a5ce64d5dcd1 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Fri, 4 Jun 2010 13:29:25 +0300
Subject: EXT-7368 FIXED Implemented new "empty_accordion_text" textbox to show
 help text when there are no visible tabs in accordion.

* Textbox always fit whole accordion.
* This text is updated with search_term (in link to open Search floater) when new filter substring is passed to accordion.
* Accordion is notified by its tabs when their visibility is changed.

Reviewed by Vadim Savchuk at https://codereview.productengine.com/secondlife/r/486/

--HG--
branch : product-engine
---
 indra/llui/llaccordionctrl.cpp                     | 66 +++++++++++++++++++++-
 indra/llui/llaccordionctrl.h                       | 13 +++++
 indra/llui/llaccordionctrltab.cpp                  |  7 +++
 indra/llui/llaccordionctrltab.h                    |  5 ++
 indra/newview/lloutfitslist.cpp                    |  2 +
 indra/newview/llpanelpeople.cpp                    |  2 +
 .../skins/default/xui/en/panel_outfits_list.xml    |  1 +
 .../skins/default/xui/en/widgets/accordion.xml     | 15 +++++
 8 files changed, 110 insertions(+), 1 deletion(-)
 create mode 100644 indra/newview/skins/default/xui/en/widgets/accordion.xml

(limited to 'indra')

diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp
index 8e0245c451..5f866c49e6 100644
--- a/indra/llui/llaccordionctrl.cpp
+++ b/indra/llui/llaccordionctrl.cpp
@@ -66,8 +66,11 @@ LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params)
  , mAutoScrolling( false )
  , mAutoScrollRate( 0.f )
  , mSelectedTab( NULL )
+ , mNoVisibleTabsHelpText(NULL)
 {
-  mSingleExpansion = params.single_expansion;
+	initNoTabsWidget(params.empty_accordion_text);
+
+	mSingleExpansion = params.single_expansion;
 	if(mFitParent && !mSingleExpansion)
 	{
 		llinfos << "fit_parent works best when combined with single_expansion" << llendl;
@@ -78,7 +81,10 @@ LLAccordionCtrl::LLAccordionCtrl() : LLPanel()
  , mAutoScrolling( false )
  , mAutoScrollRate( 0.f )
  , mSelectedTab( NULL )
+ , mNoVisibleTabsHelpText(NULL)
 {
+	initNoTabsWidget(LLTextBox::Params());
+
 	mSingleExpansion = false;
 	mFitParent = false;
 	LLUICtrlFactory::getInstance()->buildPanel(this, "accordion_parent.xml");	
@@ -168,6 +174,8 @@ BOOL LLAccordionCtrl::postBuild()
 		}
 	}
 
+	updateNoTabsHelpTextVisibility();
+
 	return TRUE;
 }
 
@@ -187,8 +195,15 @@ void LLAccordionCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
 	rcLocal.mRight = rcLocal.mLeft + width;
 	rcLocal.mTop = rcLocal.mBottom + height;
 
+	// get textbox a chance to reshape its content
+	mNoVisibleTabsHelpText->reshape(width, height, called_from_parent);
+
 	setRect(rcLocal);
 
+	// assume that help text is always fit accordion.
+	// necessary text paddings can be set via h_pad and v_pad
+	mNoVisibleTabsHelpText->setRect(getLocalRect());
+
 	arrange();
 }
 
@@ -359,6 +374,31 @@ void LLAccordionCtrl::removeCollapsibleCtrl(LLView* view)
 	}
 }
 
+void	LLAccordionCtrl::initNoTabsWidget(const LLTextBox::Params& tb_params)
+{
+	LLTextBox::Params tp = tb_params;
+	tp.rect(getLocalRect());
+	mNoVisibleTabsOrigString = tp.initial_value().asString();
+	mNoVisibleTabsHelpText = LLUICtrlFactory::create<LLTextBox>(tp, this);
+}
+
+void	LLAccordionCtrl::updateNoTabsHelpTextVisibility()
+{
+	bool visible_exists = false;
+	std::vector<LLAccordionCtrlTab*>::const_iterator it = mAccordionTabs.begin();
+	const std::vector<LLAccordionCtrlTab*>::const_iterator it_end = mAccordionTabs.end();
+	for (; it != it_end; ++it)
+	{
+		if ((*it)->getVisible())
+		{
+			visible_exists = true;
+			break;
+		}
+	}
+
+	mNoVisibleTabsHelpText->setVisible(!visible_exists);
+}
+
 void	LLAccordionCtrl::arrangeSinge()
 {
 	S32 panel_left = BORDER_MARGIN;	  // Margin from left side of Splitter
@@ -737,6 +777,20 @@ S32	LLAccordionCtrl::notifyParent(const LLSD& info)
 		}
 		return 1;
 	}
+	else if (info.has("child_visibility_change"))
+	{
+		BOOL new_visibility = info["child_visibility_change"];
+		if (new_visibility)
+		{
+			// there is at least one visible tab
+			mNoVisibleTabsHelpText->setVisible(FALSE);
+		}
+		else
+		{
+			// it could be the latest visible tab, check all of them
+			updateNoTabsHelpTextVisibility();
+		}
+	}
 	return LLPanel::notifyParent(info);
 }
 void	LLAccordionCtrl::reset		()
@@ -745,6 +799,16 @@ void	LLAccordionCtrl::reset		()
 		mScrollbar->setDocPos(0);
 }
 
+void	LLAccordionCtrl::setFilterSubString(const std::string& filter_string)
+{
+	LLStringUtil::format_map_t args;
+	args["[SEARCH_TERM]"] = LLURI::escape(filter_string);
+	std::string text = mNoVisibleTabsOrigString;
+	LLStringUtil::format(text, args);
+
+	mNoVisibleTabsHelpText->setValue(text);
+}
+
 S32 LLAccordionCtrl::calcExpandedTabHeight(S32 tab_index /* = 0 */, S32 available_height /* = 0 */)
 {
 	if(tab_index < 0)
diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h
index a029201c90..2f483eafb2 100644
--- a/indra/llui/llaccordionctrl.h
+++ b/indra/llui/llaccordionctrl.h
@@ -34,6 +34,7 @@
 #define LL_ACCORDIONCTRL_H
 
 #include "llpanel.h"
+#include "lltextbox.h"
 #include "llscrollbar.h"
 
 #include <vector>
@@ -64,10 +65,12 @@ public:
 								accordion tabs are responsible for scrolling their content.
 								*NOTE fit_parent works best when combined with single_expansion.
 								Accordion view should implement getRequiredRect() and provide valid height*/
+		Optional<LLTextBox::Params>	empty_accordion_text;
 
 		Params()
 			: single_expansion("single_expansion",false)
 			, fit_parent("fit_parent", false)
+			, empty_accordion_text("empty_accordion_text")
 		{};
 	};
 
@@ -105,7 +108,15 @@ public:
 
 	void	reset		();
 
+	/**
+	 * Sets filter substring as a search_term for help text when there are no any visible tabs.
+	 */
+	void	setFilterSubString(const std::string& filter_string);
+
 private:
+	void	initNoTabsWidget(const LLTextBox::Params& tb_params);
+	void	updateNoTabsHelpTextVisibility();
+
 	void	arrangeSinge();
 	void	arrangeMultiple();
 
@@ -131,6 +142,8 @@ private:
 	bool			mAutoScrolling;
 	F32				mAutoScrollRate;
 	LLAccordionCtrlTab* mSelectedTab;
+	LLTextBox*		mNoVisibleTabsHelpText;
+	std::string		mNoVisibleTabsOrigString;
 };
 
 
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index 83e67980a3..83fcc77f2a 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -409,6 +409,13 @@ void LLAccordionCtrlTab::changeOpenClose(bool is_open)
 	}
 }
 
+void LLAccordionCtrlTab::handleVisibilityChange(BOOL new_visibility)
+{
+	LLUICtrl::handleVisibilityChange(new_visibility);
+
+	notifyParent(LLSD().with("child_visibility_change", new_visibility));
+}
+
 BOOL LLAccordionCtrlTab::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	if(mCollapsible && mHeaderVisible && mCanOpenClose)
diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h
index 83a9024a74..be8b464b8e 100644
--- a/indra/llui/llaccordionctrltab.h
+++ b/indra/llui/llaccordionctrltab.h
@@ -154,6 +154,11 @@ public:
 	// Call reshape after changing size
 	virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
 
+	/**
+	 * Raises notifyParent event with "child_visibility_change" = new_visibility
+	 */
+	void handleVisibilityChange(BOOL new_visibility);
+
 	// Changes expand/collapse state and triggers expand/collapse callbacks
 	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
 
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 77db280487..a4ae957c76 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -500,6 +500,8 @@ void LLOutfitsList::onFilteredWearableItemsListRefresh(LLUICtrl* ctrl)
 
 void LLOutfitsList::applyFilter(const std::string& new_filter_substring)
 {
+	mAccordion->setFilterSubString(new_filter_substring);
+
 	for (outfits_map_t::iterator
 			 iter = mOutfitsMap.begin(),
 			 iter_end = mOutfitsMap.end();
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 0a4af00f78..f16d1d8fda 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -1450,6 +1450,8 @@ void LLPanelPeople::showFriendsAccordionsIfNeeded()
 		LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");
 		accordion->arrange();
 
+		// *TODO: new empty_accordion_text attribute was implemented in accordion (EXT-7368).
+		// this code should be refactored to use it
 		// keep help text in a synchronization with accordions visibility.
 		updateFriendListHelpText();
 	}
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
index 5cf94c25d7..5c9ae51a48 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
@@ -14,6 +14,7 @@
      background_visible="true"
      bg_alpha_color="DkGray2"
      bg_opaque_color="DkGray2"
+     empty_accordion_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]."
      follows="all"
      height="400"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/widgets/accordion.xml b/indra/newview/skins/default/xui/en/widgets/accordion.xml
new file mode 100644
index 0000000000..b817ba56ca
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/accordion.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<accordion
+ height="100"
+ name="accordion"
+ width="200">
+    <empty_accordion_text
+     follows="all"
+     height="100"
+     h_pad="10"
+     name="no_visible_items_msg"
+     value="There are no visible content here."
+     v_pad="15"
+     width="200"
+     wrap="true "/>
+</accordion>
-- 
cgit v1.2.3


From 9345f01d4b61f857ed540cf725c8cd0ee1b0ef24 Mon Sep 17 00:00:00 2001
From: Yuri Chebotarev <ychebotarev@productengine.com>
Date: Fri, 4 Jun 2010 13:57:19 +0300
Subject: EXT-7547 FIX update allowing padding according to sidebar state

reviewed by Mike Antipov at https://codereview.productengine.com/secondlife/r/492/

--HG--
branch : product-engine
---
 indra/newview/llimfloater.cpp | 39 +++++++++++++++++++++++++++++++++++----
 indra/newview/llimfloater.h   |  4 ++++
 indra/newview/llsidetray.cpp  |  3 +++
 indra/newview/llsidetray.h    |  4 ++++
 4 files changed, 46 insertions(+), 4 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 3aa9d75bc0..967f38bfd2 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -60,8 +60,14 @@
 #include "llinventorymodel.h"
 #include "llrootview.h"
 #include "llspeakers.h"
+#include "llsidetray.h"
 
 
+static const S32 RECT_PADDING_NOT_INIT = -1;
+static const S32 RECT_PADDING_NEED_RECALC = -2;
+
+S32 LLIMFloater::sAllowedRectRightPadding = RECT_PADDING_NOT_INIT;
+
 LLIMFloater::LLIMFloater(const LLUUID& session_id)
   : LLTransientDockableFloater(NULL, true, session_id),
 	mControlPanel(NULL),
@@ -444,19 +450,44 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 	return floater;
 }
 
+//static
+bool LLIMFloater::resetAllowedRectPadding(const LLSD& newvalue)
+{
+	//reset allowed rect right padding if "SidebarCameraMovement" option 
+	//or sidebar state changed
+	sAllowedRectRightPadding = RECT_PADDING_NEED_RECALC ;
+	return true;
+}
+
 void LLIMFloater::getAllowedRect(LLRect& rect)
 {
+	if (sAllowedRectRightPadding == RECT_PADDING_NOT_INIT) //wasn't initialized
+	{
+		gSavedSettings.getControl("SidebarCameraMovement")->getSignal()->connect(boost::bind(&LLIMFloater::resetAllowedRectPadding, _2));
+
+		LLSideTray*	side_bar = LLSideTray::getInstance();
+		side_bar->getCollapseSignal().connect(boost::bind(&LLIMFloater::resetAllowedRectPadding, _2));
+		sAllowedRectRightPadding = RECT_PADDING_NEED_RECALC;
+	}
+
 	rect = gViewerWindow->getWorldViewRectScaled();
-	static S32 right_padding = 0;
-	if (right_padding == 0)
+	if (sAllowedRectRightPadding == RECT_PADDING_NEED_RECALC) //recalc allowed rect right padding
 	{
 		LLPanel* side_bar_tabs =
 				gViewerWindow->getRootView()->getChild<LLPanel> (
 						"side_bar_tabs");
-		right_padding = side_bar_tabs->getRect().getWidth();
+		sAllowedRectRightPadding = side_bar_tabs->getRect().getWidth();
 		LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs);
+
+		if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE)
+		{
+			LLSideTray*	side_bar = LLSideTray::getInstance();
+
+			if (side_bar->getVisible() && !side_bar->getCollapsed())
+				sAllowedRectRightPadding += side_bar->getRect().getWidth();
+		}
 	}
-	rect.mRight -= right_padding;
+	rect.mRight -= sAllowedRectRightPadding;
 }
 
 void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index fef178e3a2..f1e68a2b3d 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -155,6 +155,10 @@ private:
 
 	static void closeHiddenIMToasts();
 
+	static bool resetAllowedRectPadding(const LLSD& newvalue);
+	//need to keep this static for performance issues
+	static S32 sAllowedRectRightPadding;
+
 	static void confirmLeaveCallCallback(const LLSD& notification, const LLSD& response);
 
 	LLPanelChatControlPanel* mControlPanel;
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 3c97f01887..9406f80b75 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -469,6 +469,9 @@ void LLSideTray::reflectCollapseChange()
 	}
 
 	gFloaterView->refresh();
+	
+	LLSD new_value = mCollapsed;
+	mCollapseSignal(this,new_value);
 }
 
 void LLSideTray::arrange()
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index e8fdee9430..e176ff5aff 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -159,6 +159,8 @@ public:
 	
 	void		updateSidetrayVisibility();
 
+	commit_signal_t& getCollapseSignal() { return mCollapseSignal; }
+
 protected:
 	LLSideTrayTab* getTab		(const std::string& name);
 
@@ -187,6 +189,8 @@ private:
 	child_vector_t					mTabs;
 	LLSideTrayTab*					mActiveTab;	
 	
+	commit_signal_t					mCollapseSignal;
+
 	LLButton*						mCollapseButton;
 	bool							mCollapsed;
 	
-- 
cgit v1.2.3


From f99a601dbe7d783b8bd80e0791a222ce51bd7dc6 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Fri, 4 Jun 2010 14:58:48 +0300
Subject: EXT-7485 FIXED Provided update of 'save as' button status and save
 outfit panel status. 1 published LLCOFObserver as LLOutfitObserver(moved from
 llpaneloutfitedit.cpp to lloutfitobserver.h) 2 decoupled outfit edit panel
 and observer by replacing pointer to panel with signals and made observer as
 singleton 3 moved call of LLAppearanceMgr::getInstance()->updateIsDirty()
 from outfit edit panel to observer(discussed with IB) 4 modified updating of
 combo button state on outfit panel using LLOutfitObserver 5 modified refresh
 of outfit name and status on outfit change event using LLOutfitObserver 6
 removed unnecessary LLWatchForOutfitRenameObserver that caused excessive
 updates of outfit panel status name

--HG--
branch : product-engine
---
 indra/newview/CMakeLists.txt              |   2 +
 indra/newview/lloutfitobserver.cpp        | 125 ++++++++++++++++++++++++++++++
 indra/newview/lloutfitobserver.h          |  82 ++++++++++++++++++++
 indra/newview/llpaneloutfitedit.cpp       | 106 ++-----------------------
 indra/newview/llpaneloutfitedit.h         |   3 +-
 indra/newview/llpaneloutfitsinventory.cpp |  10 ++-
 indra/newview/llpaneloutfitsinventory.h   |   2 +-
 indra/newview/llsaveoutfitcombobtn.cpp    |   1 +
 indra/newview/llsidepanelappearance.cpp   |  28 +------
 indra/newview/llsidepanelappearance.h     |   4 -
 10 files changed, 230 insertions(+), 133 deletions(-)
 create mode 100644 indra/newview/lloutfitobserver.cpp
 create mode 100644 indra/newview/lloutfitobserver.h

(limited to 'indra')

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 7dbe650625..3b1c49edd3 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -306,6 +306,7 @@ set(viewer_SOURCE_FILES
     llnotificationstorage.cpp
     llnotificationtiphandler.cpp
     lloutfitslist.cpp
+    lloutfitobserver.cpp
     lloutputmonitorctrl.cpp
     llpanelavatar.cpp
     llpanelavatartag.cpp
@@ -822,6 +823,7 @@ set(viewer_HEADER_FILES
     llnotificationmanager.h
     llnotificationstorage.h
     lloutfitslist.h
+    lloutfitobserver.h
     lloutputmonitorctrl.h
     llpanelavatar.h
     llpanelavatartag.h
diff --git a/indra/newview/lloutfitobserver.cpp b/indra/newview/lloutfitobserver.cpp
new file mode 100644
index 0000000000..848b595613
--- /dev/null
+++ b/indra/newview/lloutfitobserver.cpp
@@ -0,0 +1,125 @@
+/**
+ * @file lloutfitobserver.cpp
+ * @brief Outfit observer facade.
+ *
+ * $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 "llappearancemgr.h"
+#include "lloutfitobserver.h"
+#include "llinventorymodel.h"
+#include "llviewerinventory.h"
+
+LLOutfitObserver::LLOutfitObserver() :
+	mCOFLastVersion(LLViewerInventoryCategory::VERSION_UNKNOWN)
+{
+	gInventory.addObserver(this);
+}
+
+LLOutfitObserver::~LLOutfitObserver()
+{
+	if (gInventory.containsObserver(this))
+	{
+		gInventory.removeObserver(this);
+	}
+}
+
+void LLOutfitObserver::changed(U32 mask)
+{
+	if (!gInventory.isInventoryUsable())
+		return;
+
+	bool panel_updated = checkCOF();
+
+	if (!panel_updated)
+	{
+		checkBaseOutfit();
+	}
+}
+
+// static
+S32 LLOutfitObserver::getCategoryVersion(const LLUUID& cat_id)
+{
+	LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
+	if (!cat)
+		return LLViewerInventoryCategory::VERSION_UNKNOWN;
+
+	return cat->getVersion();
+}
+
+bool LLOutfitObserver::checkCOF()
+{
+	LLUUID cof = LLAppearanceMgr::getInstance()->getCOF();
+	if (cof.isNull())
+		return false;
+
+	S32 cof_version = getCategoryVersion(cof);
+
+	if (cof_version == mCOFLastVersion)
+		return false;
+
+	mCOFLastVersion = cof_version;
+
+	LLAppearanceMgr::getInstance()->updateIsDirty();
+	mCOFChanged();
+
+	return true;
+}
+
+void LLOutfitObserver::checkBaseOutfit()
+{
+	LLUUID baseoutfit_id =
+			LLAppearanceMgr::getInstance()->getBaseOutfitUUID();
+
+	if (baseoutfit_id == mBaseOutfitId)
+	{
+		if (baseoutfit_id.isNull())
+			return;
+
+		const S32 baseoutfit_ver = getCategoryVersion(baseoutfit_id);
+
+		if (baseoutfit_ver == mBaseOutfitLastVersion)
+			return;
+	}
+	else
+	{
+		mBaseOutfitId = baseoutfit_id;
+		mBOFReplaced();
+
+		if (baseoutfit_id.isNull())
+			return;
+
+		mBaseOutfitLastVersion = getCategoryVersion(mBaseOutfitId);
+	}
+
+	LLAppearanceMgr& app_mgr = LLAppearanceMgr::instance();
+	app_mgr.updateIsDirty();
+	mBOFChanged();
+}
diff --git a/indra/newview/lloutfitobserver.h b/indra/newview/lloutfitobserver.h
new file mode 100644
index 0000000000..4cb40ead15
--- /dev/null
+++ b/indra/newview/lloutfitobserver.h
@@ -0,0 +1,82 @@
+/**
+ * @file lloutfitobserver.h
+ * @brief Outfit observer facade.
+ *
+ * $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 LL_OUTFITOBSERVER_H
+#define LL_OUTFITOBSERVER_H
+
+#include "llsingleton.h"
+
+/**
+ * Outfit observer facade that provides simple possibility to subscribe on
+ * BOF(base outfit) replaced, BOF changed, COF(current outfit) changed events.
+ */
+class LLOutfitObserver: public LLInventoryObserver, public LLSingleton<LLOutfitObserver>
+{
+public:
+	virtual ~LLOutfitObserver();
+
+	friend class LLSingleton<LLOutfitObserver>;
+
+	virtual void changed(U32 mask);
+
+	typedef boost::signals2::signal<void (void)> signal_t;
+
+	void addBOFReplacedCallback(const signal_t::slot_type& cb) { mBOFReplaced.connect(cb); }
+
+	void addBOFChangedCallback(const signal_t::slot_type& cb) { mBOFChanged.connect(cb); }
+
+	void addCOFChangedCallback(const signal_t::slot_type& cb) { mCOFChanged.connect(cb); }
+
+protected:
+	LLOutfitObserver();
+
+	/** Get a version of an inventory category specified by its UUID */
+	static S32 getCategoryVersion(const LLUUID& cat_id);
+
+	bool checkCOF();
+
+	void checkBaseOutfit();
+
+	//last version number of a COF category
+	S32 mCOFLastVersion;
+
+	LLUUID mBaseOutfitId;
+
+	S32 mBaseOutfitLastVersion;
+
+private:
+	signal_t mBOFReplaced;
+	signal_t mBOFChanged;
+	signal_t mCOFChanged;
+};
+
+#endif /* LL_OUTFITOBSERVER_H */
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 4982e98f8e..ea7410502d 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -39,6 +39,7 @@
 #include "llagentcamera.h"
 #include "llagentwearables.h"
 #include "llappearancemgr.h"
+#include "lloutfitobserver.h"
 #include "llcofwearables.h"
 #include "llfilteredwearablelist.h"
 #include "llinventory.h"
@@ -143,100 +144,6 @@ private:
 	}
 };
 
-class LLCOFObserver : public LLInventoryObserver
-{
-public:
-	LLCOFObserver(LLPanelOutfitEdit *panel) : mPanel(panel), 
-		mCOFLastVersion(LLViewerInventoryCategory::VERSION_UNKNOWN)
-	{
-		gInventory.addObserver(this);
-	}
-
-	virtual ~LLCOFObserver()
-	{
-		if (gInventory.containsObserver(this))
-		{
-			gInventory.removeObserver(this);
-		}
-	}
-	
-	virtual void changed(U32 mask)
-	{
-		if (!gInventory.isInventoryUsable()) return;
-	
-		bool panel_updated = checkCOF();
-
-		if (!panel_updated)
-		{
-			checkBaseOutfit();
-		}
-	}
-
-protected:
-
-	/** Get a version of an inventory category specified by its UUID */
-	static S32 getCategoryVersion(const LLUUID& cat_id)
-	{
-		LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
-		if (!cat) return LLViewerInventoryCategory::VERSION_UNKNOWN;
-
-		return cat->getVersion();
-	}
-
-	bool checkCOF()
-	{
-		LLUUID cof = LLAppearanceMgr::getInstance()->getCOF();
-		if (cof.isNull()) return false;
-
-		S32 cof_version = getCategoryVersion(cof);
-
-		if (cof_version == mCOFLastVersion) return false;
-		
-		mCOFLastVersion = cof_version;
-
-		mPanel->update();
-
-		return true;
-	}
-
-	void checkBaseOutfit()
-	{
-		LLUUID baseoutfit_id = LLAppearanceMgr::getInstance()->getBaseOutfitUUID();
-
-		if (baseoutfit_id == mBaseOutfitId)
-		{
-			if (baseoutfit_id.isNull()) return;
-
-			const S32 baseoutfit_ver = getCategoryVersion(baseoutfit_id);
-
-			if (baseoutfit_ver == mBaseOutfitLastVersion) return;
-		}
-		else
-		{
-			mBaseOutfitId = baseoutfit_id;
-			mPanel->updateCurrentOutfitName();
-
-			if (baseoutfit_id.isNull()) return;
-
-			mBaseOutfitLastVersion = getCategoryVersion(mBaseOutfitId);
-		}
-
-		mPanel->updateVerbs();
-	}
-	
-
-
-
-	LLPanelOutfitEdit *mPanel;
-
-	//last version number of a COF category
-	S32 mCOFLastVersion;
-
-	LLUUID  mBaseOutfitId;
-
-	S32 mBaseOutfitLastVersion;
-};
-
 class LLCOFDragAndDropObserver : public LLInventoryAddItemByAssetObserver
 {
 public:
@@ -277,7 +184,6 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()
 	mSearchFilter(NULL),
 	mCOFWearables(NULL),
 	mInventoryItemsPanel(NULL),
-	mCOFObserver(NULL),
 	mGearMenu(NULL),
 	mCOFDragAndDropObserver(NULL),
 	mInitialized(false),
@@ -288,7 +194,11 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()
 	mSavedFolderState = new LLSaveFolderState();
 	mSavedFolderState->setApply(FALSE);
 	
-	mCOFObserver = new LLCOFObserver(this);
+
+	LLOutfitObserver& observer = LLOutfitObserver::instance();
+	observer.addBOFReplacedCallback(boost::bind(&LLPanelOutfitEdit::updateCurrentOutfitName, this));
+	observer.addBOFChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this));
+	observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitEdit::update, this));
 	
 	mLookItemTypes.reserve(NUM_LOOK_ITEM_TYPES);
 	for (U32 i = 0; i < NUM_LOOK_ITEM_TYPES; i++)
@@ -303,7 +213,6 @@ LLPanelOutfitEdit::~LLPanelOutfitEdit()
 {
 	delete mSavedFolderState;
 
-	delete mCOFObserver;
 	delete mCOFDragAndDropObserver;
 
 	delete mWearableListMaskCollector;
@@ -756,9 +665,6 @@ void LLPanelOutfitEdit::updateCurrentOutfitName()
 //private
 void LLPanelOutfitEdit::updateVerbs()
 {
-	//*TODO implement better handling of COF dirtiness
-	LLAppearanceMgr::getInstance()->updateIsDirty();
-
 	bool outfit_is_dirty = LLAppearanceMgr::getInstance()->isOutfitDirty();
 	bool has_baseoutfit = LLAppearanceMgr::getInstance()->getBaseOutfitUUID().notNull();
 
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
index 802386c573..24ecf75c18 100644
--- a/indra/newview/llpaneloutfitedit.h
+++ b/indra/newview/llpaneloutfitedit.h
@@ -49,7 +49,7 @@ class LLButton;
 class LLCOFWearables;
 class LLTextBox;
 class LLInventoryCategory;
-class LLCOFObserver;
+class LLOutfitObserver;
 class LLCOFDragAndDropObserver;
 class LLInventoryPanel;
 class LLSaveFolderState;
@@ -153,7 +153,6 @@ private:
 	LLInventoryItemsList* 			mWearableItemsList;
 	LLPanel*						mWearableItemsPanel;
 
-	LLCOFObserver*	mCOFObserver;
 	LLCOFDragAndDropObserver* mCOFDragAndDropObserver;
 
 	std::vector<LLLookItemType> mLookItemTypes;
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index 5f67f3d989..8836672f91 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -50,6 +50,7 @@
 #include "lllineeditor.h"
 #include "llmodaldialog.h"
 #include "llnotificationsutil.h"
+#include "lloutfitobserver.h"
 #include "lloutfitslist.h"
 #include "llsaveoutfitcombobtn.h"
 #include "llsidepanelappearance.h"
@@ -204,6 +205,10 @@ LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
 	mSavedFolderState = new LLSaveFolderState();
 	mSavedFolderState->setApply(FALSE);
 	gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoaded, this));
+
+	LLOutfitObserver& observer = LLOutfitObserver::instance();
+	observer.addBOFChangedCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this));
+	observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this));
 }
 
 LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
@@ -522,7 +527,7 @@ void LLPanelOutfitsInventory::updateListCommands()
 	mListCommands->childSetEnabled("trash_btn", trash_enabled);
 	mListCommands->childSetEnabled("wear_btn", wear_enabled);
 	mListCommands->childSetVisible("wear_btn", wear_enabled);
-	mSaveComboBtn->setSaveBtnEnabled(make_outfit_enabled);
+	mSaveComboBtn->setMenuItemEnabled("save_outfit", make_outfit_enabled);
 }
 
 void LLPanelOutfitsInventory::showGearMenu()
@@ -665,7 +670,7 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
 	}
 	if (command_name == "make_outfit")
 	{
-		return TRUE;
+		return LLAppearanceMgr::getInstance()->isOutfitDirty();
 	}
    
 	if (command_name == "edit" || 
@@ -789,6 +794,7 @@ void LLPanelOutfitsInventory::onWearablesLoaded()
 	setWearablesLoading(false);
 }
 
+// static
 LLSidepanelAppearance* LLPanelOutfitsInventory::getAppearanceSP()
 {
 	static LLSidepanelAppearance* panel_appearance =
diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h
index aff7839bcc..d58ae554b0 100644
--- a/indra/newview/llpaneloutfitsinventory.h
+++ b/indra/newview/llpaneloutfitsinventory.h
@@ -75,7 +75,7 @@ public:
 	void setParent(LLSidepanelAppearance *parent);
 
 	LLFolderView* getRootFolder();
-	LLSidepanelAppearance* getAppearanceSP();
+	static LLSidepanelAppearance* getAppearanceSP();
 
 	static LLPanelOutfitsInventory* findInstance();
 
diff --git a/indra/newview/llsaveoutfitcombobtn.cpp b/indra/newview/llsaveoutfitcombobtn.cpp
index b9b577084b..9518b0cbb3 100644
--- a/indra/newview/llsaveoutfitcombobtn.cpp
+++ b/indra/newview/llsaveoutfitcombobtn.cpp
@@ -34,6 +34,7 @@
 
 #include "llappearancemgr.h"
 #include "llpaneloutfitsinventory.h"
+#include "llsidepanelappearance.h"
 #include "llsaveoutfitcombobtn.h"
 #include "llviewermenu.h"
 
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index b66789448f..ef7286b7b4 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -42,6 +42,7 @@
 #include "llfloaterreg.h"
 #include "llfloaterworldmap.h"
 #include "llfoldervieweventlistener.h"
+#include "lloutfitobserver.h"
 #include "llpaneleditwearable.h"
 #include "llpaneloutfitsinventory.h"
 #include "llsidetray.h"
@@ -73,26 +74,6 @@ private:
 	LLSidepanelAppearance *mPanel;
 };
 
-class LLWatchForOutfitRenameObserver : public LLInventoryObserver
-{
-public:
-	LLWatchForOutfitRenameObserver(LLSidepanelAppearance *panel) :
-		mPanel(panel)
-	{}
-	virtual void changed(U32 mask);
-	
-private:
-	LLSidepanelAppearance *mPanel;
-};
-
-void LLWatchForOutfitRenameObserver::changed(U32 mask)
-{
-	if (mask & LABEL)
-	{
-		mPanel->refreshCurrentOutfitName();
-	}
-}
-
 LLSidepanelAppearance::LLSidepanelAppearance() :
 	LLPanel(),
 	mFilterSubString(LLStringUtil::null),
@@ -101,12 +82,13 @@ LLSidepanelAppearance::LLSidepanelAppearance() :
 	mCurrOutfitPanel(NULL),
 	mOpened(false)
 {
+	LLOutfitObserver& outfit_observer =  LLOutfitObserver::instance();
+	outfit_observer.addBOFChangedCallback(boost::bind(&LLSidepanelAppearance::refreshCurrentOutfitName, this, ""));
+	outfit_observer.addCOFChangedCallback(boost::bind(&LLSidepanelAppearance::refreshCurrentOutfitName, this, ""));
 }
 
 LLSidepanelAppearance::~LLSidepanelAppearance()
 {
-	gInventory.removeObserver(mOutfitRenameWatcher);
-	delete mOutfitRenameWatcher;
 }
 
 // virtual
@@ -160,8 +142,6 @@ BOOL LLSidepanelAppearance::postBuild()
 	
 	mCurrOutfitPanel = getChild<LLPanel>("panel_currentlook");
 
-	mOutfitRenameWatcher = new LLWatchForOutfitRenameObserver(this);
-	gInventory.addObserver(mOutfitRenameWatcher);
 
 	setVisibleCallback(boost::bind(&LLSidepanelAppearance::onVisibilityChange,this,_2));
 
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index 30022ae375..812d6362ef 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -40,7 +40,6 @@
 
 class LLFilterEditor;
 class LLCurrentlyWornFetchObserver;
-class LLWatchForOutfitRenameObserver;
 class LLPanelEditWearable;
 class LLWearable;
 class LLPanelOutfitsInventory;
@@ -97,9 +96,6 @@ private:
 	// Used to make sure the user's inventory is in memory.
 	LLCurrentlyWornFetchObserver* mFetchWorn;
 
-	// Used to update title when currently worn outfit gets renamed.
-	LLWatchForOutfitRenameObserver* mOutfitRenameWatcher;
-
 	// Search string for filtering landmarks and teleport
 	// history locations
 	std::string					mFilterSubString;
-- 
cgit v1.2.3


From 5e05d94f1379c5971a036dfe3468d067c3cfdbc5 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Fri, 4 Jun 2010 15:41:04 +0300
Subject: EXT-7548 FIXED Reset control variable for "Build" & "Map" buttons on
 destroy.

Reviewed by Vadim Savchuk at https://codereview.productengine.com/secondlife/r/517/

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp | 2 ++
 1 file changed, 2 insertions(+)

(limited to 'indra')

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 7a3eddf7a6..41f5fe64a1 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -203,7 +203,9 @@ LLBottomTray::~LLBottomTray()
 	// override effect of save_visibility=true.
 	// this attribute is necessary to button.initial_callback=Button.SetFloaterToggle works properly:
 	//		i.g when floater changes its visibility - button changes its toggle state.
+	getChild<LLUICtrl>("build_btn")->setControlValue(false);
 	getChild<LLUICtrl>("search_btn")->setControlValue(false);
+	getChild<LLUICtrl>("world_map_btn")->setControlValue(false);
 }
 
 // *TODO Vadim: why void* ?
-- 
cgit v1.2.3


From caeeebe86a73486288e31751cde3b4989def379f Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Fri, 4 Jun 2010 15:49:59 +0300
Subject: EXT-7607 FIXED added 2px gap between a texture label and a texture
 preview area for all texture pickers

Reviewed by Vadim Savchuk at https://codereview.productengine.com/secondlife/r/509/

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/widgets/color_swatch.xml   | 3 ++-
 indra/newview/skins/default/xui/en/widgets/texture_picker.xml | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/skins/default/xui/en/widgets/color_swatch.xml b/indra/newview/skins/default/xui/en/widgets/color_swatch.xml
index dfd301a770..48b987d7e8 100644
--- a/indra/newview/skins/default/xui/en/widgets/color_swatch.xml
+++ b/indra/newview/skins/default/xui/en/widgets/color_swatch.xml
@@ -4,5 +4,6 @@
               name="color_swatch">
   <color_swatch.caption_text name="caption"
                              halign="center"
-                             follows="left|right|bottom"/>
+                             follows="left|right|bottom"
+                             v_pad="2"/>
 </color_swatch>
diff --git a/indra/newview/skins/default/xui/en/widgets/texture_picker.xml b/indra/newview/skins/default/xui/en/widgets/texture_picker.xml
index 33c3475eb2..757f0f49d1 100644
--- a/indra/newview/skins/default/xui/en/widgets/texture_picker.xml
+++ b/indra/newview/skins/default/xui/en/widgets/texture_picker.xml
@@ -3,7 +3,8 @@
   <multiselect_text font="SansSerifSmall"/>
   <caption_text text="Multiple" 
                 halign="center" 
-                font="SansSerifSmall"/>
+                font="SansSerifSmall"
+                v_pad="2"/>
   <border bevel_style="in"/>
 </texture_picker>
 
-- 
cgit v1.2.3


From f954936d600c24d5263ee100d3808503b34fc6fc Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Fri, 4 Jun 2010 15:53:07 +0300
Subject: EXT-7575 FIXED appended attachment location after name in
 parenthesis.

Reviewed by Neal Orman at https://codereview.productengine.com/secondlife/r/514

--HG--
branch : product-engine
---
 indra/newview/llcofwearables.cpp      |  2 +-
 indra/newview/llinventoryitemslist.h  |  6 ++++--
 indra/newview/llwearableitemslist.cpp | 26 ++++++++++++++++++++++++++
 indra/newview/llwearableitemslist.h   | 15 +++++++++++++++
 4 files changed, 46 insertions(+), 3 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp
index 7ac3d14c72..05046aca5a 100644
--- a/indra/newview/llcofwearables.cpp
+++ b/indra/newview/llcofwearables.cpp
@@ -427,7 +427,7 @@ LLPanelDeletableWearableListItem* LLCOFWearables::buildAttachemntListItem(LLView
 	llassert(item);
 	if (!item) return NULL;
 
-	LLPanelDeletableWearableListItem* item_panel = LLPanelDeletableWearableListItem::create(item);
+	LLPanelAttachmentListItem* item_panel = LLPanelAttachmentListItem::create(item);
 	if (!item_panel) return NULL;
 
 	//setting callbacks
diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h
index 0dd6f53be7..2c60d38cb5 100644
--- a/indra/newview/llinventoryitemslist.h
+++ b/indra/newview/llinventoryitemslist.h
@@ -177,7 +177,10 @@ protected:
 	void setIconImage(const LLUIImagePtr& image);
 
 	/** Set item title - inventory item name usually */
-	void setTitle(const std::string& title, const std::string& highlit_text);
+	virtual void setTitle(const std::string& title, const std::string& highlit_text);
+
+
+	LLViewerInventoryItem* mItem;
 
 	// force not showing link icon on item's icon
 	bool mForceNoLinksOnIcons;
@@ -196,7 +199,6 @@ private:
 	/** reshape remaining widgets */
 	void reshapeMiddleWidgets();
 
-	LLViewerInventoryItem* mItem;
 
 	LLIconCtrl*		mIconCtrl;
 	LLTextBox*		mTitleCtrl;
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index ba1d0b727d..edee30c2ed 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -42,6 +42,7 @@
 #include "llmenugl.h" // for LLContextMenu
 #include "lltransutil.h"
 #include "llviewerattachmenu.h"
+#include "llvoavatarself.h"
 
 class LLFindOutfitItems : public LLInventoryCollectFunctor
 {
@@ -258,6 +259,31 @@ BOOL LLPanelDeletableWearableListItem::postBuild()
 }
 
 
+// static
+LLPanelAttachmentListItem* LLPanelAttachmentListItem::create(LLViewerInventoryItem* item)
+{
+	LLPanelAttachmentListItem* list_item = NULL;
+	if(item)
+	{
+		list_item = new LLPanelAttachmentListItem(item);
+		list_item->init();
+	}
+	return list_item;
+}
+
+void LLPanelAttachmentListItem::setTitle(const std::string& title, const std::string& highlit_text)
+{
+	std::string title_joint = title;
+
+	if (mItem && isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(mItem->getLinkedUUID()))
+	{
+		std::string joint = LLTrans::getString(gAgentAvatarp->getAttachedPointName(mItem->getLinkedUUID()));
+		title_joint = title + " (" + joint + ")";
+	}
+
+	LLPanelDeletableWearableListItem::setTitle(title_joint, highlit_text);
+}
+
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h
index 2fdb8f0ab8..f03336186c 100644
--- a/indra/newview/llwearableitemslist.h
+++ b/indra/newview/llwearableitemslist.h
@@ -116,6 +116,21 @@ protected:
 	/*virtual*/ void init();
 };
 
+/** Outfit list item for an attachment */
+class LLPanelAttachmentListItem : public LLPanelDeletableWearableListItem
+{
+	LOG_CLASS(LLPanelAttachmentListItem);
+public:
+	static LLPanelAttachmentListItem* create(LLViewerInventoryItem* item);
+	virtual ~LLPanelAttachmentListItem() {};
+
+	/** Set item title. Joint name is added to the title in parenthesis */
+	/*virtual*/ void setTitle(const std::string& title, const std::string& highlit_text);
+
+protected:
+	LLPanelAttachmentListItem(LLViewerInventoryItem* item) : LLPanelDeletableWearableListItem(item) {};
+};
+
 /**
  * @class LLPanelClothingListItem
  *
-- 
cgit v1.2.3


From 9343389313f9d4895b5826bfc68d7998763254e7 Mon Sep 17 00:00:00 2001
From: Paul Guslisty <pguslisty@productengine.com>
Date: Fri, 4 Jun 2010 17:44:28 +0300
Subject: EXT-7595 FIXED Add empty space above button bar with 'Add more...'
 button in Add Wearables panel

- Decreased accordion height

Reviewed by Neal Orman at https://codereview.productengine.com/secondlife/r/512/

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_cof_wearables.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'indra')

diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
index 5f34c24bca..83040a745b 100644
--- a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
+++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
@@ -11,7 +11,7 @@
     <accordion
      fit_parent="true"
      follows="all"
-     height="200"
+     height="198"
      layout="topleft"
      left="0"
      single_expansion="true"
-- 
cgit v1.2.3


From bca161ca899064d7a758a4a19efe2957605d0378 Mon Sep 17 00:00:00 2001
From: Paul Guslisty <pguslisty@productengine.com>
Date: Fri, 4 Jun 2010 17:45:07 +0300
Subject: EXT-7596 FIXED Reworked filters 'My Appearance' and 'Add Wearaples'
 panel corresponding with spec

- Changed label and font of filter's label in 'Add Wearables' panel
- Added magnifier icon to the filters of 'My Appearance' and 'Add Wearables' panels

Reviewed by Mike Antipov at https://codereview.productengine.com/secondlife/r/515/

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_outfit_edit.xml    | 5 ++---
 indra/newview/skins/default/xui/en/sidepanel_appearance.xml | 1 +
 2 files changed, 3 insertions(+), 3 deletions(-)

(limited to 'indra')

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 769f9b7bbf..40f60d50fb 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -256,15 +256,14 @@ It is calculated as border_size + 2*UIResizeBarOverlap
 		             background_image="TextField_Search_Off"
 		             enabled="true"
 		             follows="left|right|top"
-		             font="SansSerif"
-		             label="Filter"
+		             label="Filter Inventory Wearables"
 		             layout="topleft"
 		             left="5"
 		             width="290"
 		             height="25"
 		             name="look_item_filter"
+		             search_button_visible="true"
 		             text_color="black"
-		             text_pad_left="25"
 		             visible="true"/>
                     
                 </layout_panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index 3d7b0b7edc..ae08a13793 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -111,6 +111,7 @@ width="333">
    label="Filter Outfits"
    max_length="300"
    name="Filter"
+   search_button_visible="true"
    top_pad="10"
    width="303" />
    <panel
-- 
cgit v1.2.3


From 206745402589974237802d5394e76f2885c3f0df Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Fri, 4 Jun 2010 18:29:39 +0300
Subject: EXT-7641 FIXED removed a button bar from Edit Wearable panel

Reviewed by Neal Orman at https://codereview.productengine.com/secondlife/r/521/

--HG--
branch : product-engine
---
 .../skins/default/xui/en/panel_edit_wearable.xml   | 92 ++++------------------
 1 file changed, 17 insertions(+), 75 deletions(-)

(limited to 'indra')

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 67ff71cef1..8604f42e75 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
@@ -235,7 +235,7 @@ left="0"
 	 </panel>
 	 <panel
 		 follows="all"
-		 height="408"
+		 height="433"
 		 layout="topleft"
 		 left="0"
 		 name="edit_subpanel_container"
@@ -246,7 +246,7 @@ left="0"
 		 <panel
 			 filename="panel_edit_shape.xml"
 			 follows="all"
-			 height="408"
+			 height="433"
 			 layout="topleft"
 			 left="0"
 			 name="edit_shape_panel"
@@ -256,7 +256,7 @@ left="0"
 		 <panel
 			 filename="panel_edit_skin.xml"
 			 follows="all"
-			 height="400"
+			 height="425"
 			 layout="topleft"
 			 left="0"
 			 name="edit_skin_panel"
@@ -266,7 +266,7 @@ left="0"
 		 <panel
 			 filename="panel_edit_hair.xml"
 			 follows="all"
-			 height="400"
+			 height="425"
 			 layout="topleft"
 			 left="0"
 			 name="edit_hair_panel"
@@ -276,7 +276,7 @@ left="0"
 		 <panel
 			 filename="panel_edit_eyes.xml"
 			 follows="all"
-			 height="400"
+			 height="425"
 			 layout="topleft"
 			 left="0"
 			 name="edit_eyes_panel"
@@ -286,7 +286,7 @@ left="0"
 		 <panel
 			 filename="panel_edit_shirt.xml"
 			 follows="all"
-			 height="400"
+			 height="425"
 			 layout="topleft"
 			 left="0"
 			 name="edit_shirt_panel"
@@ -296,7 +296,7 @@ left="0"
 		 <panel
 			 filename="panel_edit_pants.xml"
 			 follows="all"
-			 height="400"
+			 height="425"
 			 layout="topleft"
 			 left="0"
 			 name="edit_pants_panel"
@@ -306,7 +306,7 @@ left="0"
 		 <panel
 			 filename="panel_edit_shoes.xml"
 			 follows="all"
-			 height="400"
+			 height="425"
 			 layout="topleft"
 			 left="0"
 			 name="edit_shoes_panel"
@@ -316,7 +316,7 @@ left="0"
 		 <panel
 			 filename="panel_edit_socks.xml"
 			 follows="all"
-			 height="400"
+			 height="425"
 			 layout="topleft"
 			 left="0"
 			 name="edit_socks_panel"
@@ -326,7 +326,7 @@ left="0"
 		 <panel
 			 filename="panel_edit_jacket.xml"
 			 follows="all"
-			 height="400"
+			 height="425"
 			 layout="topleft"
 			 left="0"
 			 name="edit_jacket_panel"
@@ -336,7 +336,7 @@ left="0"
 		 <panel
 			 filename="panel_edit_skirt.xml"
 			 follows="all"
-			 height="400"
+			 height="425"
 			 layout="topleft"
 			 left="0"
 			 name="edit_skirt_panel"
@@ -346,7 +346,7 @@ left="0"
 		 <panel
 			 filename="panel_edit_gloves.xml"
 			 follows="all"
-			 height="400"
+			 height="425"
 			 layout="topleft"
 			 left="0"
 			 name="edit_gloves_panel"
@@ -356,7 +356,7 @@ left="0"
 		 <panel
 			 filename="panel_edit_undershirt.xml"
 			 follows="all"
-			 height="400"
+			 height="425"
 			 layout="topleft"
 			 left="0"
 			 name="edit_undershirt_panel"
@@ -366,7 +366,7 @@ left="0"
 		 <panel
 			 filename="panel_edit_underpants.xml"
 			 follows="all"
-			 height="400"
+			 height="425"
 			 layout="topleft"
 			 left="0"
 			 name="edit_underpants_panel"
@@ -376,7 +376,7 @@ left="0"
 		 <panel
 			 filename="panel_edit_alpha.xml"
 			 follows="all"
-			 height="400"
+			 height="425"
 			 layout="topleft"
 			 left="0"
 			 name="edit_alpha_panel"
@@ -386,7 +386,7 @@ left="0"
 		 <panel
 			 filename="panel_edit_tattoo.xml"
 			 follows="all"
-			 height="400"
+			 height="425"
 			 layout="topleft"
 			 left="0"
 			 name="edit_tattoo_panel"
@@ -394,65 +394,7 @@ left="0"
 			 visible="false"
 			 width="333" />
 	 </panel>
-     <panel
-        follows="bottom|left|right"
-        height="25"
-        label="gear_buttom_panel"
-        layout="topleft"
-        left="0"
-        name="gear_buttom_panel"
-        top_pad="0"
-        width="333">
-        <button
-            follows="bottom|left"
-            tool_tip="Options"
-            height="25"
-            image_hover_unselected="Toolbar_Left_Over"
-            image_disabled="OptionsMenu_Disabled"
-            image_overlay="OptionsMenu_Off"
-            image_selected="Toolbar_Left_Selected"
-            image_unselected="Toolbar_Left_Off"
-            layout="topleft"
-            left="10"
-            name="friends_viewsort_btn"
-            top="0"
-            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"
-            image_disabled="AddItem_Disabled"
-            layout="topleft"
-            left_pad="1"
-            name="add_btn"
-            tool_tip="TODO"
-            width="31" />
-        <icon
-            follows="bottom|left|right"
-            height="25"
-            image_name="Toolbar_Middle_Off"
-            layout="topleft"
-            left_pad="1"
-            name="dummy_right_icon"
-            width="218" >
-        </icon>
-        <button
-            follows="bottom|right"
-            height="25"
-            image_hover_unselected="Toolbar_Right_Over"
-            image_overlay="TrashItem_Off"
-            image_selected="Toolbar_Right_Selected"
-            image_unselected="Toolbar_Right_Off"
-            image_disabled="TrashItem_Disabled"
-            layout="topleft"
-            left_pad="1"
-            name="del_btn"
-            tool_tip="TODO"
-            width="31" />
-     </panel>
+
 	 <panel
 		 follows="bottom|left|right"
 		 height="23"
-- 
cgit v1.2.3


From 37392b4b776705b9a0953bda241d351539a2bec9 Mon Sep 17 00:00:00 2001
From: Richard Nelson <none@none>
Date: Fri, 4 Jun 2010 09:15:44 -0700
Subject: removed duplicate winmm entry for debug builds

---
 indra/newview/viewer_manifest.py | 1 -
 1 file changed, 1 deletion(-)

(limited to 'indra')

diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 2a966f4adf..668e21c253 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -349,7 +349,6 @@ class WindowsManifest(ViewerManifest):
                 self.path("qtwebkitd4.dll")
                 self.path("qtxmlpatternsd4.dll")
                 self.path("ssleay32.dll")
-                self.path("winmm.dll")
 
                 # For WebKit/Qt plugin runtimes (image format plugins)
                 if self.prefix(src="imageformats", dst="imageformats"):
-- 
cgit v1.2.3


From 6a660f868a139bb386d5980aa2ceda04d6ae2598 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Fri, 4 Jun 2010 19:40:53 +0300
Subject: EXT-6886 FIXED Resized buttons to fix truncations. - Increased "About
 Land" button width and moved it below parcel icons. - Increased
 "Region/Estate" button width (also truncated text in multiple langs). -
 Increased advanced place info accordion minimal height to avoid vertical
 scrolling inside tabs (in all tabs except "For Sale"). - Decreased "Estate"
 and "For Sale" panels height to avoid extra free space.

Reviewed by Paul Guslisty https://codereview.productengine.com/secondlife/r/503/

--HG--
branch : product-engine
---
 .../skins/default/xui/en/panel_place_profile.xml   | 35 ++++++++++++----------
 1 file changed, 20 insertions(+), 15 deletions(-)

(limited to 'indra')

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 57ac79686d..c6ac7ac862 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -2,7 +2,7 @@
 <panel
  background_visible="true"
  follows="all"
- height="570"
+ height="610"
  layout="topleft"
  left="0"
  min_height="350"
@@ -166,7 +166,7 @@
     <scroll_container
      color="DkGray2"
      follows="all"
-     height="532"
+     height="572"
      layout="topleft"
      left="9"
      name="place_scroll"
@@ -176,7 +176,7 @@
         <panel
          bg_alpha_color="DkGray2"
          follows="left|top|right"
-         height="540"
+         height="580"
          layout="topleft"
          left="0"
          min_height="300"
@@ -322,21 +322,22 @@
             <accordion
              fit_parent="true"
              follows="all"
-             height="223"
+             height="268"
              layout="topleft"
              single_expansion="true"
              left="0"
              name="advanced_info_accordion"
-             top_pad="10"
+             top_pad="5"
              width="313">
                 <accordion_tab
-                 height="170"
+                 fit_panel="false"
+                 height="175"
                  layout="topleft"
                  name="parcel_characteristics_tab"
                  title="Parcel">
                     <panel
                      follows="all"
-                     height="160"
+                     height="175"
                      layout="topleft"
                      left="0"
                      name="parcel_characteristics_panel"
@@ -533,8 +534,8 @@
                          name="about_land_btn"
                          right="-5"
                          tab_stop="false"
-                         top="138"
-                         width="90">
+                         top_pad="2"
+                         width="140">
                             <click_callback
                              function="Floater.Show"
                              parameter="about_land" />
@@ -543,7 +544,8 @@
                 </accordion_tab>
                 <accordion_tab
                  expanded="false"
-                 height="150"
+                 fit_panel="false"
+                 height="125"
                  layout="topleft"
                  name="region_information_tab"
                  title="Region">
@@ -662,7 +664,8 @@
                          name="region_info_btn"
                          right="-5"
                          tab_stop="false"
-                         width="105">
+                         top_pad="2"
+                         width="180">
                             <click_callback
                              function="Floater.Show"
                              parameter="region_info" />
@@ -671,13 +674,14 @@
                 </accordion_tab>
                 <accordion_tab
                  expanded="false"
-                 height="190"
+                 fit_panel="false"
+                 height="180"
                  layout="topleft"
                  name="estate_information_tab"
                  title="Estate">
                     <panel
                      follows="all"
-                     height="189"
+                     height="180"
                      layout="topleft"
                      left="0"
                      name="estate_information_panel"
@@ -760,13 +764,14 @@
                 </accordion_tab>
                 <accordion_tab
                  expanded="false"
-                 height="320"
+                 fit_panel="false"
+                 height="290"
                  layout="topleft"
                  name="sales_tab"
                  title="For Sale">
                     <panel
                      follows="all"
-                     height="300"
+                     height="290"
                      layout="topleft"
                      left="0"
                      name="sales_panel"
-- 
cgit v1.2.3


From 65f8d1822d058aee1902238e298f760368b724f6 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Fri, 4 Jun 2010 20:21:07 +0300
Subject: EXT-7511 FIXED Resolved problem with cropping of item selection
 bottom

Problem reproduced for items which had divider at the bottom. It was caused by non-optimal placement of divider
in item. To fix this, "top" attribute of divider was changed, and when done so it turned out that increase of items
height from implementation of this task was not necessary, so rolled back these changes in xml and code. Also added some padding between flatlists items to avoid cropping of top part of item selection because of divider.

Reviewed by Neal Orman at https://codereview.productengine.com/secondlife/r/502/

--HG--
branch : product-engine
---
 indra/newview/llcofwearables.cpp                   |  8 +------
 .../default/xui/en/panel_body_parts_list_item.xml  | 16 ++++++-------
 .../default/xui/en/panel_clothing_list_item.xml    | 26 +++++++++++-----------
 .../skins/default/xui/en/panel_cof_wearables.xml   |  3 +++
 .../xui/en/panel_deletable_wearable_list_item.xml  |  8 +++----
 .../xui/en/panel_dummy_clothing_list_item.xml      |  8 +++----
 6 files changed, 33 insertions(+), 36 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp
index 05046aca5a..916d53da3c 100644
--- a/indra/newview/llcofwearables.cpp
+++ b/indra/newview/llcofwearables.cpp
@@ -387,13 +387,7 @@ LLPanelClothingListItem* LLCOFWearables::buildClothingListItem(LLViewerInventory
 	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
-	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);
-	}
+	item_panel->childSetVisible("wearable_type_separator_icon", last);
 
 	return item_panel;
 }
diff --git a/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml
index a0bbc8f2ee..4e5f594ffe 100644
--- a/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  follows="top|right|left"
- height="25"
+ height="23"
  layout="topleft"
  left="0"
  name="wearable_item"
@@ -45,7 +45,7 @@
      use_ellipses="true"
      name="item_name"
      text_color="white"
-     top="4"
+     top="5"
      value="..."
      width="359" />
     <panel
@@ -74,10 +74,10 @@
      name="btn_edit_panel"
      layout="topleft"
      follows="top|right"
-     top="0"
+     top="1"
      left_pad="3"
-     height="24"
-     width="27"
+     height="23"
+     width="26"
      tab_stop="false">
          <button 
           name="btn_edit"
@@ -86,8 +86,8 @@
           image_overlay="Edit_Wrench"
           top="0"
           left="0"
-          height="24"
-          width="24"
+          height="23"
+          width="23"
           tab_stop="false" />
       </panel>
     <icon
@@ -97,7 +97,7 @@
      layout="bottomleft"
      left="0"
      name="wearable_type_separator_icon"
-     top="3"
+     top="0"
      visible="true"
      width="380"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml
index e41141f6bd..5d81aebbd5 100644
--- a/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml
@@ -33,7 +33,7 @@
      follows="top|left"
      image_unselected="Toast_CloseBtn"
      image_selected="Toast_CloseBtn"
-     top="2"
+     top="3"
      left="0"
      height="18"
      width="18"
@@ -56,7 +56,7 @@
      use_ellipses="true"
      name="item_name"
      text_color="white"
-     top="4"
+     top="5"
      value="..."
      width="359" />
     <button 
@@ -64,20 +64,20 @@
      layout="topleft"
      follows="top|right"
      image_overlay="UpArrow_Off"
-     top="0"
+     top="1"
      left="0"
-     height="24"
-     width="24"
+     height="23"
+     width="23"
      tab_stop="false" />
     <button 
      name="btn_move_down"
      layout="topleft"
      follows="top|right"
      image_overlay="DownArrow_Off"
-     top="0"
+     top="1"
      left_pad="3"
-     height="24"
-     width="24"
+     height="23"
+     width="23"
      tab_stop="false" />
     <panel
      background_visible="false"
@@ -107,18 +107,18 @@
      follows="top|right"
      top="0"
      left_pad="3"
-     height="24"
-     width="27"
+     height="23"
+     width="26"
      tab_stop="false">
         <button 
          name="btn_edit"
          layout="topleft"
          follows="top|right"
          image_overlay="Edit_Wrench"
-         top="0"
+         top="1"
          left="0"
-         height="24"
-         width="24"
+         height="23"
+         width="23"
          tab_stop="false" />
       </panel>
     <icon
diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
index 83040a745b..d36c2a4e6f 100644
--- a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
+++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
@@ -28,6 +28,7 @@
              allow_select="true"
              follows="all"
              height="10"
+             item_pad="2"
              layout="topleft"
              left="0"
              multi_select="true"
@@ -43,6 +44,7 @@
              allow_select="true"
              follows="all"
              height="10"
+             item_pad="2"
              layout="topleft"
              left="0"
              multi_select="true"
@@ -58,6 +60,7 @@
              allow_select="true"
              follows="all"
              height="10"
+             item_pad="2"
              layout="topleft"
              left="0"
              multi_select="true"
diff --git a/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml
index b006d125ee..45031859f1 100644
--- a/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  follows="top|right|left"
- height="25"
+ height="23"
  layout="topleft"
  left="0"
  name="deletable_wearable_item"
@@ -33,7 +33,7 @@
      follows="top|left"
      image_unselected="Toast_CloseBtn"
      image_selected="Toast_CloseBtn"
-     top="2"
+     top="3"
      left="0"
      height="18"
      width="18"
@@ -56,7 +56,7 @@
      use_ellipses="true"
      name="item_name"
      text_color="white"
-     top="4"
+     top="5"
      value="..."
      width="359" />
     <icon
@@ -66,7 +66,7 @@
      layout="bottomleft"
      left="0"
      name="wearable_type_separator_icon"
-     top="3"
+     top="0"
      visible="true"
      width="380"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml
index 6c43635d49..20652df918 100644
--- a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  follows="top|right|left"
- height="25"
+ height="23"
  layout="topleft"
  left="0"
  name="dummy_clothing_item"
@@ -56,8 +56,8 @@
      image_overlay="AddItem_Off"
      top="0"
      left="0"
-     height="24"
-     width="24"
+     height="23"
+     width="23"
      tab_stop="false" />
     <icon
      follows="left|right|top"
@@ -66,7 +66,7 @@
      layout="bottomleft"
      left="0"
      name="wearable_type_separator_icon"
-     top="3"
+     top="0"
      visible="true"
      width="380"/>
 </panel>
-- 
cgit v1.2.3


From d1751df1cc5d9bf853f29555de94faec1912e19f Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Fri, 4 Jun 2010 21:52:38 +0300
Subject: EXT-7610 FIXED Added sorting outfit tabs by name (case insensitive).

Reviewed by Neal Orman at https://codereview.productengine.com/secondlife/r/523/.

--HG--
branch : product-engine
---
 indra/llui/llaccordionctrl.cpp    | 13 +++++++++++++
 indra/llui/llaccordionctrl.h      | 35 ++++++++++++++++++++++++++++++++++-
 indra/llui/llaccordionctrltab.cpp |  2 +-
 indra/llui/llaccordionctrltab.h   |  2 +-
 indra/newview/lloutfitslist.cpp   | 17 ++++++++++++++++-
 indra/newview/lloutfitslist.h     | 18 +++++++++++++++++-
 6 files changed, 82 insertions(+), 5 deletions(-)

(limited to 'indra')

diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp
index 5f866c49e6..6bf1347514 100644
--- a/indra/llui/llaccordionctrl.cpp
+++ b/indra/llui/llaccordionctrl.cpp
@@ -66,6 +66,7 @@ LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params)
  , mAutoScrolling( false )
  , mAutoScrollRate( 0.f )
  , mSelectedTab( NULL )
+ , mTabComparator( NULL )
  , mNoVisibleTabsHelpText(NULL)
 {
 	initNoTabsWidget(params.empty_accordion_text);
@@ -799,6 +800,18 @@ void	LLAccordionCtrl::reset		()
 		mScrollbar->setDocPos(0);
 }
 
+void LLAccordionCtrl::sort()
+{
+	if (!mTabComparator)
+	{
+		llwarns << "No comparator specified for sorting accordion tabs." << llendl;
+		return;
+	}
+
+	std::sort(mAccordionTabs.begin(), mAccordionTabs.end(), LLComparatorAdaptor(*mTabComparator));
+	arrange();
+}
+
 void	LLAccordionCtrl::setFilterSubString(const std::string& filter_string)
 {
 	LLStringUtil::format_map_t args;
diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h
index 2f483eafb2..fc6f2d896c 100644
--- a/indra/llui/llaccordionctrl.h
+++ b/indra/llui/llaccordionctrl.h
@@ -57,6 +57,19 @@ private:
 
 
 public:
+	/**
+	 * Abstract comparator for accordion tabs.
+	 */
+	class LLTabComparator
+	{
+	public:
+		LLTabComparator() {};
+		virtual ~LLTabComparator() {};
+
+		/** Returns true if tab1 < tab2, false otherwise */
+		virtual bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const = 0;
+	};
+
 	struct Params 
 		: public LLInitParam::Block<Params, LLPanel::Params>
 	{
@@ -108,6 +121,9 @@ public:
 
 	void	reset		();
 
+	void	setComparator(const LLTabComparator* comp) { mTabComparator = comp; }
+	void	sort();
+
 	/**
 	 * Sets filter substring as a search_term for help text when there are no any visible tabs.
 	 */
@@ -134,6 +150,21 @@ private:
 
 	BOOL	autoScroll				(S32 x, S32 y);
 
+	/**
+	 * An adaptor for LLTabComparator
+	 */
+	struct LLComparatorAdaptor
+	{
+		LLComparatorAdaptor(const LLTabComparator& comparator) : mComparator(comparator) {};
+
+		bool operator()(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2)
+		{
+			return mComparator.compare(tab1, tab2);
+		}
+
+		const LLTabComparator& mComparator;
+	};
+
 private:
 	LLRect			mInnerRect;
 	LLScrollbar*	mScrollbar;
@@ -141,9 +172,11 @@ private:
 	bool			mFitParent;
 	bool			mAutoScrolling;
 	F32				mAutoScrollRate;
-	LLAccordionCtrlTab* mSelectedTab;
 	LLTextBox*		mNoVisibleTabsHelpText;
 	std::string		mNoVisibleTabsOrigString;
+
+	LLAccordionCtrlTab*		mSelectedTab;
+	const LLTabComparator*	mTabComparator;
 };
 
 
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index 83fcc77f2a..1bc8086a27 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -473,7 +473,7 @@ void LLAccordionCtrlTab::setAccordionView(LLView* panel)
 	addChild(panel,0);
 }
 
-std::string LLAccordionCtrlTab::getTitle()
+std::string LLAccordionCtrlTab::getTitle() const
 {
 	LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);
 	if (header)
diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h
index be8b464b8e..82e0234bfc 100644
--- a/indra/llui/llaccordionctrltab.h
+++ b/indra/llui/llaccordionctrltab.h
@@ -115,7 +115,7 @@ public:
 	void		setAccordionView(LLView* panel);
 	LLView*		getAccordionView() { return mContainerPanel; };
 
-	std::string getTitle();
+	std::string getTitle() const;
 
 	// Set text and highlight substring in LLAccordionCtrlTabHeader
 	void setTitle(const std::string& title, const std::string& hl = LLStringUtil::null);
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index a4ae957c76..e20b2e26be 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -53,6 +53,20 @@
 
 static bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y);
 
+static const LLOutfitTabNameComparator OUTFIT_TAB_NAME_COMPARATOR;
+
+/*virtual*/
+bool LLOutfitTabNameComparator::compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const
+{
+	std::string name1 = tab1->getTitle();
+	std::string name2 = tab2->getTitle();
+
+	LLStringUtil::toUpper(name1);
+	LLStringUtil::toUpper(name2);
+
+	return name1 < name2;
+}
+
 //////////////////////////////////////////////////////////////////////////
 
 class OutfitContextMenu : public LLListContextMenu
@@ -158,6 +172,7 @@ LLOutfitsList::~LLOutfitsList()
 BOOL LLOutfitsList::postBuild()
 {
 	mAccordion = getChild<LLAccordionCtrl>("outfits_accordion");
+	mAccordion->setComparator(&OUTFIT_TAB_NAME_COMPARATOR);
 
 	return TRUE;
 }
@@ -328,7 +343,7 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
 		updateOutfitTab(*items_iter);
 	}
 
-	mAccordion->arrange();
+	mAccordion->sort();
 }
 
 void LLOutfitsList::onSelectionChange(LLUICtrl* ctrl)
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index 44f6ec908b..bb516446d2 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -32,17 +32,33 @@
 #ifndef LL_LLOUTFITSLIST_H
 #define LL_LLOUTFITSLIST_H
 
+#include "llaccordionctrl.h"
 #include "llpanel.h"
 
 // newview
 #include "llinventorymodel.h"
 #include "llinventoryobserver.h"
 
-class LLAccordionCtrl;
 class LLAccordionCtrlTab;
 class LLWearableItemsList;
 class LLListContextMenu;
 
+/**
+ * @class LLOutfitTabNameComparator
+ *
+ * Comparator of outfit tabs.
+ */
+class LLOutfitTabNameComparator : public LLAccordionCtrl::LLTabComparator
+{
+	LOG_CLASS(LLOutfitTabNameComparator);
+
+public:
+	LLOutfitTabNameComparator() {};
+	virtual ~LLOutfitTabNameComparator() {};
+
+	/*virtual*/ bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const;
+};
+
 /**
  * @class LLOutfitsList
  *
-- 
cgit v1.2.3


From 05d7addde73511d303f9203d0dc007ebb2e5b299 Mon Sep 17 00:00:00 2001
From: Richard Nelson <none@none>
Date: Fri, 4 Jun 2010 12:24:40 -0700
Subject: made LLStringUtil::null const

---
 indra/llcommon/llstring.h        | 4 ++--
 indra/newview/llnamelistctrl.cpp | 4 ++--
 indra/newview/llnamelistctrl.h   | 4 ++--
 3 files changed, 6 insertions(+), 6 deletions(-)

(limited to 'indra')

diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index ad8f8632a2..8071c8aa2d 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -249,7 +249,7 @@ public:
 	/////////////////////////////////////////////////////////////////////////////////////////
 	// Static Utility functions that operate on std::strings
 
-	static std::basic_string<T> null;
+	static const std::basic_string<T> null;
 	
 	typedef std::map<LLFormatMapString, LLFormatMapString> format_map_t;
 	LL_COMMON_API static void getTokens(const std::basic_string<T>& instr, std::vector<std::basic_string<T> >& tokens, const std::basic_string<T>& delims);
@@ -371,7 +371,7 @@ private:
 	LL_COMMON_API static size_type getSubstitution(const std::basic_string<T>& instr, size_type& start, std::vector<std::basic_string<T> >& tokens);
 };
 
-template<class T> std::basic_string<T> LLStringUtilBase<T>::null;
+template<class T> const std::basic_string<T> LLStringUtilBase<T>::null;
 template<class T> std::string LLStringUtilBase<T>::sLocale;
 
 typedef LLStringUtilBase<char> LLStringUtil;
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index d605d4430e..d09f729943 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -72,7 +72,7 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)
 
 // public
 void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
-								 BOOL enabled, std::string& suffix)
+								 BOOL enabled, const std::string& suffix)
 {
 	//llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl;
 
@@ -268,7 +268,7 @@ LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition p
 LLScrollListItem* LLNameListCtrl::addNameItemRow(
 	const LLNameListCtrl::NameItem& name_item,
 	EAddPosition pos,
-	std::string& suffix)
+	const std::string& suffix)
 {
 	LLUUID id = name_item.value().asUUID();
 	LLNameListItem* item = NULL;
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index 1c26ee5db4..ee71db7540 100644
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -90,11 +90,11 @@ public:
 	// Add a user to the list by name.  It will be added, the name 
 	// requested from the cache, and updated as necessary.
 	void addNameItem(const LLUUID& agent_id, EAddPosition pos = ADD_BOTTOM,
-					 BOOL enabled = TRUE, std::string& suffix = LLStringUtil::null);
+					 BOOL enabled = TRUE, const std::string& suffix = LLStringUtil::null);
 	void addNameItem(NameItem& item, EAddPosition pos = ADD_BOTTOM);
 
 	/*virtual*/ LLScrollListItem* addElement(const LLSD& element, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL);
-	LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, std::string& suffix = LLStringUtil::null);
+	LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, const std::string& suffix = LLStringUtil::null);
 
 	// Add a user to the list by name.  It will be added, the name 
 	// requested from the cache, and updated as necessary.
-- 
cgit v1.2.3


From c393383f4463f40e4574968c0b440c51022be7b9 Mon Sep 17 00:00:00 2001
From: Leyla Farazha <leyla@lindenlab.com>
Date: Fri, 4 Jun 2010 13:22:00 -0700
Subject: EXT-7502 Save as option while modifiying a body part doesn't prompt
 for name, and just saves changes. reviewed by Nyx

---
 indra/newview/llpaneleditwearable.cpp              | 24 ++++++++++++++++++++++
 indra/newview/llpaneleditwearable.h                |  2 ++
 .../newview/skins/default/xui/en/notifications.xml | 23 +++++++++++++++++++++
 3 files changed, 49 insertions(+)

(limited to 'indra')

diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index 36f2d05fab..527a432a80 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -51,6 +51,7 @@
 #include "llagentwearables.h"
 #include "llscrollingpanelparam.h"
 #include "llradiogroup.h"
+#include "llnotificationsutil.h"
 
 #include "llcolorswatch.h"
 #include "lltexturectrl.h"
@@ -623,6 +624,7 @@ BOOL LLPanelEditWearable::postBuild()
 	mDescTitle = getChild<LLTextBox>("description_text");
 
 	getChild<LLRadioGroup>("sex_radio")->setCommitCallback(boost::bind(&LLPanelEditWearable::onCommitSexChange, this));
+	getChild<LLButton>("save_as_button")->setCommitCallback(boost::bind(&LLPanelEditWearable::onSaveAsButtonClicked, this));
 
 	// The following panels will be shown/hidden based on what wearable we're editing
 	// body parts
@@ -701,6 +703,28 @@ void LLPanelEditWearable::onRevertButtonClicked(void* userdata)
 	panel->revertChanges();
 }
 
+void LLPanelEditWearable::onSaveAsButtonClicked()
+{
+	LLSD args;
+	args["DESC"] = mTextEditor->getText();
+
+	LLNotificationsUtil::add("SaveWearableAs", args, LLSD(), boost::bind(&LLPanelEditWearable::saveAsCallback, this, _1, _2));
+}
+
+void LLPanelEditWearable::saveAsCallback(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+	if (0 == option)
+	{
+		std::string wearable_name = response["message"].asString();
+		LLStringUtil::trim(wearable_name);
+		if( !wearable_name.empty() )
+		{
+			mTextEditor->setText(wearable_name);
+			saveChanges();
+		}
+	}
+}
 
 void LLPanelEditWearable::onCommitSexChange()
 {
diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h
index b6b8c0c781..00883f65eb 100644
--- a/indra/newview/llpaneleditwearable.h
+++ b/indra/newview/llpaneleditwearable.h
@@ -72,6 +72,8 @@ public:
 
 	static void			onRevertButtonClicked(void* userdata);
 	void				onCommitSexChange();
+	void				onSaveAsButtonClicked();
+	void				saveAsCallback(const LLSD& notification, const LLSD& response);
 
 
 private:
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 5ead756d20..9af358eff3 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -2068,6 +2068,29 @@ Would you be my friend?
     </form>
   </notification>
 
+  <notification
+ icon="alertmodal.tga"
+ label="Save Wearable"
+ name="SaveWearableAs"
+ type="alertmodal">
+    Save item to my inventory as:
+    <form name="form">
+      <input name="message" type="text">
+        [DESC] (new)
+      </input>
+      <button
+       default="true"
+       index="0"
+       name="Offer"
+       text="OK"/>
+      <button
+       index="1"
+       name="Cancel"
+       text="Cancel"/>
+    </form>
+  </notification>
+
+
   <notification
    icon="alertmodal.tga"
    label="Rename Outfit"
-- 
cgit v1.2.3


From 591e309897704cdc9084c2f8613b6c74f5c8a4e6 Mon Sep 17 00:00:00 2001
From: Eli Linden <eli@lindenlab.com>
Date: Fri, 4 Jun 2010 14:00:15 -0700
Subject: EXT-7545 FIX remove untranslatable strings; add translate="false" to
 en xui

---
 indra/newview/skins/default/xui/da/floater_buy_land.xml   |  3 ---
 indra/newview/skins/default/xui/de/floater_buy_land.xml   |  3 ---
 .../newview/skins/default/xui/de/panel_landmark_info.xml  |  3 ---
 .../newview/skins/default/xui/de/panel_place_profile.xml  | 15 ---------------
 indra/newview/skins/default/xui/en/floater_buy_land.xml   |  3 +++
 .../newview/skins/default/xui/en/panel_landmark_info.xml  |  3 +++
 .../newview/skins/default/xui/en/panel_place_profile.xml  | 15 +++++++++++++++
 indra/newview/skins/default/xui/es/floater_buy_land.xml   |  3 ---
 indra/newview/skins/default/xui/fr/floater_buy_land.xml   |  3 ---
 .../newview/skins/default/xui/fr/panel_landmark_info.xml  |  3 ---
 .../newview/skins/default/xui/fr/panel_place_profile.xml  | 15 ---------------
 indra/newview/skins/default/xui/it/floater_buy_land.xml   |  3 ---
 indra/newview/skins/default/xui/ja/floater_buy_land.xml   |  3 ---
 .../newview/skins/default/xui/ja/panel_landmark_info.xml  |  3 ---
 .../newview/skins/default/xui/ja/panel_place_profile.xml  | 15 ---------------
 indra/newview/skins/default/xui/pl/floater_buy_land.xml   |  3 ---
 indra/newview/skins/default/xui/pt/floater_buy_land.xml   |  3 ---
 17 files changed, 21 insertions(+), 78 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/skins/default/xui/da/floater_buy_land.xml b/indra/newview/skins/default/xui/da/floater_buy_land.xml
index 970491b41f..f6ee78fa6d 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_land.xml
@@ -126,9 +126,6 @@ gennemført.
 	<floater.string name="no_parcel_selected">
 		(intet parcel er valgt)
 	</floater.string>
-	<floater.string name="icon_PG" value="Parcel_PG_Dark"/>
-	<floater.string name="icon_M" value="Parcel_M_Dark"/>
-	<floater.string name="icon_R" value="Parcel_R_Dark"/>
 	<text name="region_name_label">
 		Region:
 	</text>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_land.xml b/indra/newview/skins/default/xui/de/floater_buy_land.xml
index 5708a3f80a..5369155cf9 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_land.xml
@@ -124,9 +124,6 @@ unterstützt [AMOUNT2] Objekte
 	<floater.string name="no_parcel_selected">
 		(keine Parzelle ausgewählt)
 	</floater.string>
-	<floater.string name="icon_PG" value="Parcel_PG_Dark"/>
-	<floater.string name="icon_M" value="Parcel_M_Dark"/>
-	<floater.string name="icon_R" value="Parcel_R_Dark"/>
 	<text name="region_name_label">
 		Region:
 	</text>
diff --git a/indra/newview/skins/default/xui/de/panel_landmark_info.xml b/indra/newview/skins/default/xui/de/panel_landmark_info.xml
index 9cef7b6d35..10cf34c170 100644
--- a/indra/newview/skins/default/xui/de/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/de/panel_landmark_info.xml
@@ -18,9 +18,6 @@
 	<string name="acquired_date">
 		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
 	</string>
-	<string name="icon_PG" value="parcel_drk_PG"/>
-	<string name="icon_M" value="parcel_drk_M"/>
-	<string name="icon_R" value="parcel_drk_R"/>
 	<button name="back_btn" tool_tip="Hinten"/>
 	<text name="title" value="Ortsprofil"/>
 	<scroll_container name="place_scroll">
diff --git a/indra/newview/skins/default/xui/de/panel_place_profile.xml b/indra/newview/skins/default/xui/de/panel_place_profile.xml
index ed1421aa60..9d1a582b7c 100644
--- a/indra/newview/skins/default/xui/de/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_place_profile.xml
@@ -41,21 +41,6 @@
 	<string name="acquired_date">
 		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
 	</string>
-	<string name="icon_PG" value="parcel_drk_PG"/>
-	<string name="icon_M" value="parcel_drk_M"/>
-	<string name="icon_R" value="parcel_drk_R"/>
-	<string name="icon_Voice" value="parcel_drk_Voice"/>
-	<string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/>
-	<string name="icon_Fly" value="parcel_drk_Fly"/>
-	<string name="icon_FlyNo" value="parcel_drk_FlyNo"/>
-	<string name="icon_Push" value="parcel_drk_Push"/>
-	<string name="icon_PushNo" value="parcel_drk_PushNo"/>
-	<string name="icon_Build" value="parcel_drk_Build"/>
-	<string name="icon_BuildNo" value="parcel_drk_BuildNo"/>
-	<string name="icon_Scripts" value="parcel_drk_Scripts"/>
-	<string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/>
-	<string name="icon_Damage" value="parcel_drk_Damage"/>
-	<string name="icon_DamageNo" value="parcel_drk_DamageNo"/>
 	<button name="back_btn" tool_tip="Hinten"/>
 	<text name="title" value="Ortsprofil"/>
 	<scroll_container name="place_scroll">
diff --git a/indra/newview/skins/default/xui/en/floater_buy_land.xml b/indra/newview/skins/default/xui/en/floater_buy_land.xml
index df44b61632..acaa508792 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml
@@ -174,12 +174,15 @@ supports [AMOUNT2] objects
     </floater.string>
     <floater.string
      name="icon_PG"
+     translate="false"
      value="Parcel_PG_Dark"/>
     <floater.string
      name="icon_M"
+     translate="false"
      value="Parcel_M_Dark"/>
     <floater.string
      name="icon_R"
+     translate="false"
      value="Parcel_R_Dark"/>
     <text
      type="string"
diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
index 25674a1a39..bb73360e0b 100644
--- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -46,12 +46,15 @@
     <!-- Texture names for rating icons -->
     <string
      name="icon_PG"
+     translate="false"
      value="Parcel_PG_Dark" />
     <string
      name="icon_M"
+     translate="false"
      value="Parcel_M_Dark" />
     <string
      name="icon_R"
+     translate="false"
      value="Parcel_R_Dark" />
     <button
      follows="top|right"
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 57ac79686d..c9e41edd5a 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -95,48 +95,63 @@
     <!-- Texture names for parcel permissions icons -->
     <string
      name="icon_PG"
+     translate="false"
      value="Parcel_PG_Dark" />
     <string
      name="icon_M"
+     translate="false"
      value="Parcel_M_Dark" />
     <string
      name="icon_R"
+     translate="false"
      value="Parcel_R_Dark" />
     <string
      name="icon_Voice"
+     translate="false"
      value="Parcel_Voice_Dark" />
     <string
      name="icon_VoiceNo"
+     translate="false"
      value="Parcel_VoiceNo_Dark" />
     <string
      name="icon_Fly"
+     translate="false"
      value="Parcel_Fly_Dark" />
     <string
      name="icon_FlyNo"
+     translate="false"
      value="Parcel_FlyNo_Dark" />
     <string
      name="icon_Push"
+     translate="false"
      value="Parcel_Push_Dark" />
     <string
      name="icon_PushNo"
+     translate="false"
      value="Parcel_PushNo_Dark" />
     <string
      name="icon_Build"
+     translate="false"
      value="Parcel_Build_Dark" />
     <string
      name="icon_BuildNo"
+     translate="false"
      value="Parcel_BuildNo_Dark" />
     <string
      name="icon_Scripts"
+     translate="false"
      value="Parcel_Scripts_Dark" />
     <string
      name="icon_ScriptsNo"
+     translate="false"
      value="Parcel_ScriptsNo_Dark" />
     <string
      name="icon_Damage"
+     translate="false"
      value="Parcel_Damage_Dark" />
     <string
      name="icon_DamageNo"
+     translate="false"
      value="Parcel_DamageNo_Dark" />
     <button
      follows="top|right"
diff --git a/indra/newview/skins/default/xui/es/floater_buy_land.xml b/indra/newview/skins/default/xui/es/floater_buy_land.xml
index a40f65d5d0..74243a4d06 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_land.xml
@@ -126,9 +126,6 @@ para cubrir esta parcela.
 	<floater.string name="no_parcel_selected">
 		(No se ha seleccionado una parcela)
 	</floater.string>
-	<floater.string name="icon_PG" value="Parcel_PG_Dark"/>
-	<floater.string name="icon_M" value="Parcel_M_Dark"/>
-	<floater.string name="icon_R" value="Parcel_R_Dark"/>
 	<text name="region_name_label">
 		Región:
 	</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_land.xml b/indra/newview/skins/default/xui/fr/floater_buy_land.xml
index 7c9a31a4c3..b7f8f36f81 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_land.xml
@@ -124,9 +124,6 @@ prend en charge [AMOUNT2] objets
 	<floater.string name="no_parcel_selected">
 		(aucune parcelle sélectionnée)
 	</floater.string>
-	<floater.string name="icon_PG" value="Parcel_PG_Dark"/>
-	<floater.string name="icon_M" value="Parcel_M_Dark"/>
-	<floater.string name="icon_R" value="Parcel_R_Dark"/>
 	<text name="region_name_label">
 		Région :
 	</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_landmark_info.xml b/indra/newview/skins/default/xui/fr/panel_landmark_info.xml
index 4001616034..bd29bd676c 100644
--- a/indra/newview/skins/default/xui/fr/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/fr/panel_landmark_info.xml
@@ -18,9 +18,6 @@
 	<string name="acquired_date">
 		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
 	</string>
-	<string name="icon_PG" value="parcel_drk_PG"/>
-	<string name="icon_M" value="parcel_drk_M"/>
-	<string name="icon_R" value="parcel_drk_R"/>
 	<button name="back_btn" tool_tip="Précédent"/>
 	<text name="title" value="Profil du lieu"/>
 	<scroll_container name="place_scroll">
diff --git a/indra/newview/skins/default/xui/fr/panel_place_profile.xml b/indra/newview/skins/default/xui/fr/panel_place_profile.xml
index 598e94166e..731e045019 100644
--- a/indra/newview/skins/default/xui/fr/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_place_profile.xml
@@ -41,21 +41,6 @@
 	<string name="acquired_date">
 		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
 	</string>
-	<string name="icon_PG" value="parcel_drk_PG"/>
-	<string name="icon_M" value="parcel_drk_M"/>
-	<string name="icon_R" value="parcel_drk_R"/>
-	<string name="icon_Voice" value="parcel_drk_Voice"/>
-	<string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/>
-	<string name="icon_Fly" value="parcel_drk_Fly"/>
-	<string name="icon_FlyNo" value="parcel_drk_FlyNo"/>
-	<string name="icon_Push" value="parcel_drk_Push"/>
-	<string name="icon_PushNo" value="parcel_drk_PushNo"/>
-	<string name="icon_Build" value="parcel_drk_Build"/>
-	<string name="icon_BuildNo" value="parcel_drk_BuildNo"/>
-	<string name="icon_Scripts" value="parcel_drk_Scripts"/>
-	<string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/>
-	<string name="icon_Damage" value="parcel_drk_Damage"/>
-	<string name="icon_DamageNo" value="parcel_drk_DamageNo"/>
 	<button name="back_btn" tool_tip="Précédent"/>
 	<text name="title" value="Profil du lieu"/>
 	<scroll_container name="place_scroll">
diff --git a/indra/newview/skins/default/xui/it/floater_buy_land.xml b/indra/newview/skins/default/xui/it/floater_buy_land.xml
index 2e78168209..f3b30f7048 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_land.xml
@@ -124,9 +124,6 @@ consente [AMOUNT2] oggetti
 	<floater.string name="no_parcel_selected">
 		(nessun terreno selezionato)
 	</floater.string>
-	<floater.string name="icon_PG" value="Parcel_PG_Dark"/>
-	<floater.string name="icon_M" value="Parcel_M_Dark"/>
-	<floater.string name="icon_R" value="Parcel_R_Dark"/>
 	<text name="region_name_label">
 		Regione:
 	</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_land.xml b/indra/newview/skins/default/xui/ja/floater_buy_land.xml
index a274e25326..34f9d38de1 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_land.xml
@@ -124,9 +124,6 @@
 	<floater.string name="no_parcel_selected">
 		(区画が選定されていません)
 	</floater.string>
-	<floater.string name="icon_PG" value="Parcel_PG_Dark"/>
-	<floater.string name="icon_M" value="Parcel_M_Dark"/>
-	<floater.string name="icon_R" value="Parcel_R_Dark"/>
 	<text name="region_name_label">
 		地域:
 	</text>
diff --git a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
index 87477c2651..7fca66f90f 100644
--- a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
@@ -18,9 +18,6 @@
 	<string name="acquired_date">
 		[year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
 	</string>
-	<string name="icon_PG" value="parcel_drk_PG"/>
-	<string name="icon_M" value="parcel_drk_M"/>
-	<string name="icon_R" value="parcel_drk_R"/>
 	<button name="back_btn" tool_tip="戻る"/>
 	<text name="title" value="場所のプロフィール"/>
 	<scroll_container name="place_scroll">
diff --git a/indra/newview/skins/default/xui/ja/panel_place_profile.xml b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
index 9de04f0d6a..b897e1d748 100644
--- a/indra/newview/skins/default/xui/ja/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
@@ -41,21 +41,6 @@
 	<string name="acquired_date">
 		[year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
 	</string>
-	<string name="icon_PG" value="parcel_drk_PG"/>
-	<string name="icon_M" value="parcel_drk_M"/>
-	<string name="icon_R" value="parcel_drk_R"/>
-	<string name="icon_Voice" value="parcel_drk_Voice"/>
-	<string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/>
-	<string name="icon_Fly" value="parcel_drk_Fly"/>
-	<string name="icon_FlyNo" value="parcel_drk_FlyNo"/>
-	<string name="icon_Push" value="parcel_drk_Push"/>
-	<string name="icon_PushNo" value="parcel_drk_PushNo"/>
-	<string name="icon_Build" value="parcel_drk_Build"/>
-	<string name="icon_BuildNo" value="parcel_drk_BuildNo"/>
-	<string name="icon_Scripts" value="parcel_drk_Scripts"/>
-	<string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/>
-	<string name="icon_Damage" value="parcel_drk_Damage"/>
-	<string name="icon_DamageNo" value="parcel_drk_DamageNo"/>
 	<button name="back_btn" tool_tip="戻る"/>
 	<text name="title" value="場所のプロフィール"/>
 	<scroll_container name="place_scroll">
diff --git a/indra/newview/skins/default/xui/pl/floater_buy_land.xml b/indra/newview/skins/default/xui/pl/floater_buy_land.xml
index 3d01129d9b..7b4f459b4e 100644
--- a/indra/newview/skins/default/xui/pl/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/pl/floater_buy_land.xml
@@ -125,9 +125,6 @@ używanie Posiadłości żeby sfinalizować ten zakup.
 	<floater.string name="no_parcel_selected">
 		(Posiadłość nie została wybrana)
 	</floater.string>
-	<floater.string name="icon_PG" value="Parcel_PG_Dark"/>
-	<floater.string name="icon_M" value="Parcel_M_Dark"/>
-	<floater.string name="icon_R" value="Parcel_R_Dark"/>
 	<text name="region_name_label">
 		Region:
 	</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_land.xml b/indra/newview/skins/default/xui/pt/floater_buy_land.xml
index 73b483acf2..5c5ee3b7a0 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_land.xml
@@ -124,9 +124,6 @@ contribuídas para cobrir este lote antes da aquisição se completar.
 	<floater.string name="no_parcel_selected">
 		(nenhum lote selecionado)
 	</floater.string>
-	<floater.string name="icon_PG" value="Parcel_PG_Dark"/>
-	<floater.string name="icon_M" value="Parcel_M_Dark"/>
-	<floater.string name="icon_R" value="Parcel_R_Dark"/>
 	<text name="region_name_label">
 		Região:
 	</text>
-- 
cgit v1.2.3


From 46e1253ee11cd2aca41314ec4e9c053bddd7a0b4 Mon Sep 17 00:00:00 2001
From: Richard Nelson <none@none>
Date: Fri, 4 Jun 2010 14:25:51 -0700
Subject: DEV-50015 FIX Implement changes to the Buy L$ button in the top bar
 of the viewer reviewed by Mani

---
 indra/llui/lltextbase.cpp                          |  11 ++-----
 indra/newview/llstatusbar.cpp                      |  17 ++++++-----
 indra/newview/skins/default/textures/textures.xml  |   2 +-
 .../skins/default/textures/widgets/buy_off.png     | Bin 54754 -> 399 bytes
 .../skins/default/textures/widgets/buy_over.png    | Bin 54772 -> 415 bytes
 .../skins/default/textures/widgets/buy_press.png   | Bin 54861 -> 461 bytes
 .../skins/default/xui/en/panel_status_bar.xml      |  34 ++++++++++++---------
 7 files changed, 33 insertions(+), 31 deletions(-)

(limited to 'indra')

diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 55dbf50fd7..d86709c448 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1101,7 +1101,7 @@ S32 LLTextBase::getLeftOffset(S32 width)
 	case LLFontGL::LEFT:
 		return mHPad;
 	case LLFontGL::HCENTER:
-		return mHPad + (mVisibleTextRect.getWidth() - width - mHPad) / 2;
+		return mHPad + llmax(0, (mVisibleTextRect.getWidth() - width - mHPad) / 2);
 	case LLFontGL::RIGHT:
 		return mVisibleTextRect.getWidth() - width;
 	default:
@@ -1207,11 +1207,6 @@ void LLTextBase::reflow()
 			// grow line height as necessary based on reported height of this segment
 			line_height = llmax(line_height, segment_height);
 			remaining_pixels -= segment_width;
-			if (remaining_pixels < 0)
-			{
-				// getNumChars() and getDimensions() should return consistent results
-				remaining_pixels = 0;
-			}
 
 			seg_offset += character_count;
 
@@ -1893,7 +1888,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,
 {
 	// Figure out which line we're nearest to.
 	LLRect visible_region = getVisibleDocumentRect();
-
+	
 	// binary search for line that starts before local_y
 	line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), local_y - mVisibleTextRect.mBottom + visible_region.mBottom, compare_bottom());
 
@@ -1903,7 +1898,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,
 	}
 	
 	S32 pos = getLength();
-	S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft;
+	S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft - visible_region.mLeft;
 
 	segment_set_t::iterator line_seg_iter;
 	S32 line_seg_offset;
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 5628205dd4..ac419d8dc7 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -394,18 +394,21 @@ void LLStatusBar::setBalance(S32 balance)
 {
 	std::string money_str = LLResMgr::getInstance()->getMonetaryString( balance );
 
-	LLButton* btn_buy_currency = getChild<LLButton>("buycurrency");
+	LLTextBox* balance_box = getChild<LLTextBox>("balance");
 	LLStringUtil::format_map_t string_args;
 	string_args["[AMT]"] = llformat("%s", money_str.c_str());
 	std::string label_str = getString("buycurrencylabel", string_args);
-	btn_buy_currency->setLabel(label_str);
+	balance_box->setValue(label_str);
 
-	// Resize the balance button so that the label fits it, and the button expands to the left.
-	// *TODO: LLButton should have an option where to expand.
+	// Resize the L$ balance background to be wide enough for your balance plus the buy button
 	{
-		S32 saved_right = btn_buy_currency->getRect().mRight;
-		btn_buy_currency->autoResize();
-		btn_buy_currency->translate(saved_right - btn_buy_currency->getRect().mRight, 0);
+		const S32 HPAD = 24;
+		LLRect balance_rect = balance_box->getTextBoundingRect();
+		LLRect buy_rect = getChildView("buyL")->getRect();
+		LLView* balance_bg_view = getChildView("balance_bg");
+		LLRect balance_bg_rect = balance_bg_view->getRect();
+		balance_bg_rect.mLeft = balance_bg_rect.mRight - (buy_rect.getWidth() + balance_rect.getWidth() + HPAD);
+		balance_bg_view->setShape(balance_bg_rect);
 	}
 
 	if (mBalance && (fabs((F32)(mBalance - balance)) > gSavedSettings.getF32("UISndMoneyChangeThreshold")))
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 93c805f724..1a05dbacd2 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -667,7 +667,7 @@ with the same filename but different name
   <texture name="Progress_11" file_name="icons/Progress_11.png" preload="true" />
   <texture name="Progress_12" file_name="icons/Progress_12.png" preload="true" />
 
-  <texture name="bevel_background" file_name="widgets/bevel_background.png" preload="true" scale.left="12" scale.top="15" scale.right="120" scale.bottom="2"/>
+  <texture name="bevel_background" file_name="widgets/bevel_background.png" preload="true" scale.left="12" scale.top="15" scale.right="108" scale.bottom="2"/>
   <texture name="buy_off" file_name="widgets/buy_off.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
   <texture name="buy_over" file_name="widgets/buy_over.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
   <texture name="buy_press" file_name="widgets/buy_press.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
diff --git a/indra/newview/skins/default/textures/widgets/buy_off.png b/indra/newview/skins/default/textures/widgets/buy_off.png
index 961ad071d4..ee5979046f 100644
Binary files a/indra/newview/skins/default/textures/widgets/buy_off.png and b/indra/newview/skins/default/textures/widgets/buy_off.png differ
diff --git a/indra/newview/skins/default/textures/widgets/buy_over.png b/indra/newview/skins/default/textures/widgets/buy_over.png
index 0be19f8a31..93adb68c86 100644
Binary files a/indra/newview/skins/default/textures/widgets/buy_over.png and b/indra/newview/skins/default/textures/widgets/buy_over.png differ
diff --git a/indra/newview/skins/default/textures/widgets/buy_press.png b/indra/newview/skins/default/textures/widgets/buy_press.png
index d6f587464d..3f442d6eaa 100644
Binary files a/indra/newview/skins/default/textures/widgets/buy_press.png and b/indra/newview/skins/default/textures/widgets/buy_press.png differ
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 008aa1acc0..43513e1ab6 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -41,32 +41,35 @@
      name="buycurrencylabel">
         L$ [AMT]
     </panel.string>
-    <button
+  <panel
+    height="18"
+    left="-315"
+    width="95"
+    top="1"
+    follows="right|top" 
+    name="balance_bg" 
+    bg_visible="true"
+    background_opaque="true" 
+    bg_opaque_image="bevel_background">
+    <text
      auto_resize="true"
      halign="center"
-	 enabled="false"
      font="SansSerifSmall"
-     follows="right|top"
-     image_overlay=""
-     image_selected="bevel_background"
-     image_unselected="bevel_background"
-     image_pressed="bevel_background"
+     follows="all"
      height="18"
-     right="-275"
-     label_shadow="false"
-     name="buycurrency"
-     label_color_disabled="ButtonLabelColor"
-     image_color_disabled="White"
+     left="0" 
+     name="balance"
      tool_tip="My Balance"
-     pad_left="12"
-     pad_right="12" 
+     v_pad="4"
      top="0"
+     wrap="false" 
+     value="L$20" 
      width="40" />
     <button
      auto_resize="true"
      halign="center"
      font="SansSerifSmall"
-     follows="right|top"
+     follows="right|top|bottom"
      image_hover_unselected="buy_over"
      image_unselected="buy_off"
      image_pressed="buy_press"
@@ -81,6 +84,7 @@
      tool_tip="Click to buy more L$"
      top="0"
      width="55" />
+  </panel>
     <text
      type="string"
      font="SansSerifSmall"
-- 
cgit v1.2.3


From 58f008dd1440af3082f0ed1e324cd03b7ee72d43 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Fri, 4 Jun 2010 14:30:54 -0700
Subject: Fix for EXT-7571 (Camera is left in object view mode after leaving
 "edit appearance" mode)

Call gAgentCamera.resetView() when exiting appearance/outfit editing mode.
---
 indra/newview/llsidepanelappearance.cpp | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index b66789448f..872939c209 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -209,7 +209,7 @@ void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility)
 	{
 		if ((mOutfitEdit && mOutfitEdit->getVisible()) || (mEditWearable && mEditWearable->getVisible()))
 		{
-			if (!gAgentCamera.cameraCustomizeAvatar())
+			if (!gAgentCamera.cameraCustomizeAvatar() && gSavedSettings.getBOOL("AppearanceCameraMovement"))
 			{
 				gAgentCamera.changeCameraToCustomizeAvatar();
 			}
@@ -217,9 +217,10 @@ void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility)
 	}
 	else
 	{
-		if (gAgentCamera.cameraCustomizeAvatar())
+		if (gAgentCamera.cameraCustomizeAvatar() && gSavedSettings.getBOOL("AppearanceCameraMovement"))
 		{
 			gAgentCamera.changeCameraToDefault();
+			gAgentCamera.resetView();
 		}
 	}
 }
@@ -345,6 +346,7 @@ void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible, BOOL disable_cam
 	else if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") )
 	{
 		gAgentCamera.changeCameraToDefault();
+		gAgentCamera.resetView();
 	}
 }
 
@@ -384,6 +386,7 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we
 		if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") )
 		{
 			gAgentCamera.changeCameraToDefault();
+			gAgentCamera.resetView();
 		}
 	}
 }
-- 
cgit v1.2.3


From 244321e70cf341ca0542a9963d9e1e68cafca8d5 Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Fri, 4 Jun 2010 17:34:46 -0400
Subject: AVP-44 VWR-19699 FIX Multi-wearables and wearable replacement logic

Cleaned up a few things upon code review.

Code reviewed by vir for this checkin as well as following previous commits:
a801af3728ee
af42810b946c
---
 indra/newview/llappearancemgr.cpp | 15 +++++----------
 indra/newview/llviewermenu.cpp    |  4 +++-
 2 files changed, 8 insertions(+), 11 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 9da47c9214..a899926938 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -659,12 +659,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up
 	LLViewerInventoryItem* item_to_wear = gInventory.getItem(item_id_to_wear);
 	if (!item_to_wear) return false;
 
-	if (!item_to_wear->isFinished())
-	{
-		LLNotificationsUtil::add("CannotWearInfoNotComplete");
-		return false;
-	}
-	else if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getLibraryRootFolderID()))
+	if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getLibraryRootFolderID()))
 	{
 		LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(replace);
 		copy_inventory_item(gAgent.getID(), item_to_wear->getPermissions().getOwner(), item_to_wear->getUUID(), LLUUID::null, std::string(),cb);
@@ -677,6 +672,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up
 	else if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH)))
 	{
 		LLNotificationsUtil::add("CannotWearTrash");
+		return false;
 	}
 
 	switch (item_to_wear->getType())
@@ -1605,15 +1601,14 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update
 		// type? If so, new item will replace old.
 		else if ((vitem->isWearableType()) && (vitem->getWearableType() == wearable_type))
 		{
+			++count;
 			if (is_body_part && inv_item->getIsLinkType()  && (vitem->getWearableType() == wearable_type))
 			{
 				gInventory.purgeObject(inv_item->getUUID());
 			}
-			++count;
-
-			// MULTI-WEARABLES: make sure we don't go over MAX_CLOTHING_PER_TYPE
-			if (count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE)
+			else if (count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE)
 			{
+				// MULTI-WEARABLES: make sure we don't go over MAX_CLOTHING_PER_TYPE
 				gInventory.purgeObject(inv_item->getUUID());
 			}
 		}
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 23fb97a358..2c7ae539ce 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -7495,7 +7495,9 @@ class LLEditTakeOff : public view_listener_t
 		else
 		{
 			LLWearableType::EType type = LLWearableType::typeNameToType(clothing);
-			if (type >= LLWearableType::WT_SHAPE && type < LLWearableType::WT_COUNT)
+			if (type >= LLWearableType::WT_SHAPE 
+				&& type < LLWearableType::WT_COUNT
+				&& (gAgentWearables.getWearableCount(type) > 0))
 			{
 				// MULTI-WEARABLES: assuming user wanted to remove top shirt.
 				U32 wearable_index = gAgentWearables.getWearableCount(type) - 1;
-- 
cgit v1.2.3


From 92b104f4168588985b4c9c66d24e8f67f2b6e49e Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Fri, 4 Jun 2010 18:43:13 -0400
Subject: VWR-19699 Correct "wear" and "add" behavior

added "add" menu item to clothing right-click menus and corrected
"wear" to mean "replace top wearable of this type"

reviewed by Richard
---
 indra/newview/llwearableitemslist.cpp                          | 4 +++-
 indra/newview/skins/default/xui/en/menu_wearable_list_item.xml | 7 +++++++
 2 files changed, 10 insertions(+), 1 deletion(-)

(limited to 'indra')

diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index ba1d0b727d..6c4774ba5a 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -508,11 +508,13 @@ LLContextMenu* LLWearableItemsList::ContextMenu::createMenu()
 	const uuid_vec_t& ids = mUUIDs;		// selected items IDs
 	LLUUID selected_id = ids.front();	// ID of the first selected item
 
-	functor_t wear = boost::bind(&LLAppearanceMgr::wearItemOnAvatar, LLAppearanceMgr::getInstance(), _1, true, false);
+	functor_t wear = boost::bind(&LLAppearanceMgr::wearItemOnAvatar, LLAppearanceMgr::getInstance(), _1, true, true);
+	functor_t add = boost::bind(&LLAppearanceMgr::wearItemOnAvatar, LLAppearanceMgr::getInstance(), _1, true, false);
 	functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1);
 
 	// Register handlers common for all wearable types.
 	registrar.add("Wearable.Wear", boost::bind(handleMultiple, wear, ids));
+	registrar.add("Wearable.Add", boost::bind(handleMultiple, add, ids));
 	registrar.add("Wearable.Edit", boost::bind(handleMultiple, LLAgentWearables::editWearable, ids));
 	registrar.add("Wearable.CreateNew", boost::bind(createNewWearable, selected_id));
 	registrar.add("Wearable.ShowOriginal", boost::bind(show_item_original, selected_id));
diff --git a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml
index e645702f93..fa5ca60a19 100644
--- a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml
+++ b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml
@@ -8,6 +8,13 @@
         <on_click
          function="Wearable.Wear" />
     </menu_item_call>
+    <menu_item_call
+     label="Add"
+     layout="topleft"
+     name="wear_add">
+        <on_click
+         function="Wearable.Add" />
+    </menu_item_call>
     <menu_item_call
      label="Take Off / Detach"
      layout="topleft"
-- 
cgit v1.2.3


From 3dfcde7e248dbc4349f8afd5709062fb6a328696 Mon Sep 17 00:00:00 2001
From: Xiaohong Bao <bao@lindenlab.com>
Date: Fri, 4 Jun 2010 17:13:04 -0600
Subject: EXT-7452: FIXED: gray squares on the world map (nothing to do with
 map server)

---
 indra/newview/skins/default/textures/map_infohub.tga | Bin 0 -> 1068 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 indra/newview/skins/default/textures/map_infohub.tga

(limited to 'indra')

diff --git a/indra/newview/skins/default/textures/map_infohub.tga b/indra/newview/skins/default/textures/map_infohub.tga
new file mode 100644
index 0000000000..d0134fa5fe
Binary files /dev/null and b/indra/newview/skins/default/textures/map_infohub.tga differ
-- 
cgit v1.2.3


From e133f8b7d5ef114b2b4df73c024cb14668b55d4b Mon Sep 17 00:00:00 2001
From: Richard Nelson <none@none>
Date: Fri, 4 Jun 2010 16:14:30 -0700
Subject: EXT-7492 FIX Invalid previews are loaded for body parts in the
 Appearance SP reviewed by Nyx

---
 indra/newview/llpaneleditwearable.cpp   | 14 ++++++++++----
 indra/newview/llpaneleditwearable.h     |  3 ++-
 indra/newview/llscrollingpanelparam.cpp |  6 +++---
 indra/newview/llscrollingpanelparam.h   |  3 ++-
 indra/newview/lltoolmorph.cpp           | 30 ++++++++----------------------
 indra/newview/lltoolmorph.h             |  5 ++++-
 indra/newview/llviewervisualparam.cpp   |  2 --
 indra/newview/llviewervisualparam.h     |  2 --
 8 files changed, 29 insertions(+), 36 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index 6a84886e3b..a1a9300ec2 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -1015,8 +1015,14 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show)
 			// storage for ordered list of visual params
 			value_map_t sorted_params;
 			getSortedParams(sorted_params, edit_group);
-	
-			buildParamList(panel_list, sorted_params, tab);
+
+			LLJoint* jointp = gAgentAvatarp->getJoint( subpart_entry->mTargetJoint );
+			if (!jointp)
+			{
+				jointp = gAgentAvatarp->getJoint("mHead");
+			}
+
+			buildParamList(panel_list, sorted_params, tab, jointp);
 	
 			updateScrollingPanelUI();
 		}
@@ -1253,7 +1259,7 @@ void LLPanelEditWearable::getSortedParams(value_map_t &sorted_params, const std:
 	}
 }
 
-void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab)
+void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab, LLJoint* jointp)
 {
 	// sorted_params is sorted according to magnitude of effect from
 	// least to greatest.  Adding to the front of the child list
@@ -1267,7 +1273,7 @@ void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value
 		{
 			LLPanel::Params p;
 			p.name("LLScrollingPanelParam");
-			LLScrollingPanelParam* panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable());
+			LLScrollingPanelParam* panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable(), jointp);
 			height = panel_list->addPanel( panel_param );
 		}
 	}
diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h
index 1ee150621a..54f729fa7a 100644
--- a/indra/newview/llpaneleditwearable.h
+++ b/indra/newview/llpaneleditwearable.h
@@ -48,6 +48,7 @@ class LLViewerVisualParam;
 class LLVisualParamHint;
 class LLViewerJointMesh;
 class LLAccordionCtrlTab;
+class LLJoint;
 
 class LLPanelEditWearable : public LLPanel
 {
@@ -83,7 +84,7 @@ private:
 	void				updateScrollingPanelUI();
 	LLPanel*			getPanel(LLWearableType::EType type);
 	void				getSortedParams(value_map_t &sorted_params, const std::string &edit_group);
-	void				buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab);
+	void				buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab, LLJoint* jointp);
 	// update bottom bar buttons ("Save", "Revert", etc)
 	void				updateVerbs();
 
diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp
index 242af6981c..6f5238f0a1 100644
--- a/indra/newview/llscrollingpanelparam.cpp
+++ b/indra/newview/llscrollingpanelparam.cpp
@@ -56,7 +56,7 @@ const S32 LLScrollingPanelParam::PARAM_HINT_HEIGHT = 128;
 S32 LLScrollingPanelParam::sUpdateDelayFrames = 0;
 
 LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_params,
-											  LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable )
+											  LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp )
 	: LLScrollingPanel( panel_params ),
 	  mParam(param),
 	  mAllowModify(allow_modify),
@@ -73,9 +73,9 @@ LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_param
 	F32 min_weight = param->getMinWeight();
 	F32 max_weight = param->getMaxWeight();
 
-	mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable,  min_weight);
+	mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable,  min_weight, jointp);
 	pos_x = getChild<LLViewBorder>("right_border")->getRect().mLeft + left_border->getBorderWidth();
-	mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable, max_weight );
+	mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable, max_weight, jointp );
 	
 	mHintMin->setAllowsUpdates( FALSE );
 	mHintMax->setAllowsUpdates( FALSE );
diff --git a/indra/newview/llscrollingpanelparam.h b/indra/newview/llscrollingpanelparam.h
index fe4ce07166..3cdfd188a8 100644
--- a/indra/newview/llscrollingpanelparam.h
+++ b/indra/newview/llscrollingpanelparam.h
@@ -42,12 +42,13 @@ class LLViewerVisualParam;
 class LLWearable;
 class LLVisualParamHint;
 class LLViewerVisualParam;
+class LLJoint;
 
 class LLScrollingPanelParam : public LLScrollingPanel
 {
 public:
 	LLScrollingPanelParam( const LLPanel::Params& panel_params,
-						   LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable );
+						   LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp );
 	virtual ~LLScrollingPanelParam();
 
 	virtual void		draw();
diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp
index c1dc1de5e5..8996157258 100644
--- a/indra/newview/lltoolmorph.cpp
+++ b/indra/newview/lltoolmorph.cpp
@@ -79,7 +79,8 @@ LLVisualParamHint::LLVisualParamHint(
 	LLViewerJointMesh *mesh, 
 	LLViewerVisualParam *param,
 	LLWearable *wearable,
-	F32 param_weight)
+	F32 param_weight,
+	LLJoint* jointp)
 	:
 	LLViewerDynamicTexture(width, height, 3, LLViewerDynamicTexture::ORDER_MIDDLE, TRUE ),
 	mNeedsUpdate( TRUE ),
@@ -91,12 +92,12 @@ LLVisualParamHint::LLVisualParamHint(
 	mAllowsUpdates( TRUE ),
 	mDelayFrames( 0 ),
 	mRect( pos_x, pos_y + height, pos_x + width, pos_y ),
-	mLastParamWeight(0.f)
+	mLastParamWeight(0.f),
+	mCamTargetJoint(jointp)
 {
 	LLVisualParamHint::sInstances.insert( this );
 	mBackgroundp = LLUI::getUIImage("avatar_thumb_bkgrnd.j2c");
 
-
 	llassert(width != 0);
 	llassert(height != 0);
 }
@@ -196,21 +197,6 @@ BOOL LLVisualParamHint::render()
 	mNeedsUpdate = FALSE;
 	mIsVisible = TRUE;
 
-	LLViewerJointMesh* cam_target_joint = NULL;
-	const std::string& cam_target_mesh_name = mVisualParam->getCameraTargetName();
-	if( !cam_target_mesh_name.empty() )
-	{
-		cam_target_joint = (LLViewerJointMesh*)gAgentAvatarp->getJoint( cam_target_mesh_name );
-	}
-	if( !cam_target_joint )
-	{
-		cam_target_joint = (LLViewerJointMesh*)gMorphView->getCameraTargetJoint();
-	}
-	if( !cam_target_joint )
-	{
-		cam_target_joint = (LLViewerJointMesh*)gAgentAvatarp->getJoint("mHead");
-	}
-
 	LLQuaternion avatar_rotation;
 	LLJoint* root_joint = gAgentAvatarp->getRootJoint();
 	if( root_joint )
@@ -218,7 +204,7 @@ BOOL LLVisualParamHint::render()
 		avatar_rotation = root_joint->getWorldRotation();
 	}
 
-	LLVector3 target_joint_pos = cam_target_joint->getWorldPosition();
+	LLVector3 target_joint_pos = mCamTargetJoint->getWorldPosition();
 
 	LLVector3 target_offset( 0, 0, mVisualParam->getCameraElevation() );
 	LLVector3 target_pos = target_joint_pos + (target_offset * avatar_rotation);
@@ -234,9 +220,9 @@ BOOL LLVisualParamHint::render()
 	
 	LLViewerCamera::getInstance()->setAspect((F32)mFullWidth / (F32)mFullHeight);
 	LLViewerCamera::getInstance()->setOriginAndLookAt(
-		camera_pos,		// camera
-		LLVector3(0.f, 0.f, 1.f),						// up
-		target_pos );	// point of interest
+		camera_pos,			// camera
+		LLVector3::z_axis,	// up
+		target_pos );		// point of interest
 
 	LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE);
 
diff --git a/indra/newview/lltoolmorph.h b/indra/newview/lltoolmorph.h
index 3bffefaa55..cbab5e765f 100644
--- a/indra/newview/lltoolmorph.h
+++ b/indra/newview/lltoolmorph.h
@@ -47,6 +47,7 @@
 class LLViewerJointMesh;
 class LLPolyMesh;
 class LLViewerObject;
+class LLJoint;
 
 //-----------------------------------------------------------------------------
 // LLVisualParamHint
@@ -63,7 +64,8 @@ public:
 		LLViewerJointMesh *mesh, 
 		LLViewerVisualParam *param,
 		LLWearable *wearable,
-		F32 param_weight);	
+		F32 param_weight, 
+		LLJoint* jointp);	
 
 	/*virtual*/ S8 getType() const ;
 
@@ -96,6 +98,7 @@ protected:
 	S32						mDelayFrames;		// updates are blocked for this many frames
 	LLRect					mRect;
 	F32						mLastParamWeight;
+	LLJoint*				mCamTargetJoint;	// joint to target with preview camera
 
 	LLUIImagePtr mBackgroundp;
 
diff --git a/indra/newview/llviewervisualparam.cpp b/indra/newview/llviewervisualparam.cpp
index 422e530dc6..1dc09a64ac 100644
--- a/indra/newview/llviewervisualparam.cpp
+++ b/indra/newview/llviewervisualparam.cpp
@@ -99,8 +99,6 @@ BOOL LLViewerVisualParamInfo::parseXml(LLXmlTreeNode *node)
 	node->getFastAttributeF32( camera_angle_string, mCamAngle );	// in degrees
 	static LLStdStringHandle camera_elevation_string = LLXmlTree::addAttributeString("camera_elevation");
 	node->getFastAttributeF32( camera_elevation_string, mCamElevation );
-	static LLStdStringHandle camera_target_string = LLXmlTree::addAttributeString("camera_target");
-	node->getFastAttributeString( camera_target_string, mCamTargetName );
 
 	mCamAngle += 180;
 
diff --git a/indra/newview/llviewervisualparam.h b/indra/newview/llviewervisualparam.h
index 1a3975eb99..f38c01fa6c 100644
--- a/indra/newview/llviewervisualparam.h
+++ b/indra/newview/llviewervisualparam.h
@@ -60,7 +60,6 @@ protected:
 	F32			mCamDist;
 	F32			mCamAngle;		// degrees
 	F32			mCamElevation;
-	std::string	mCamTargetName;
 	F32			mEditGroupDisplayOrder;
 	BOOL		mShowSimple;	// show edit controls when in "simple ui" mode?
 	F32			mSimpleMin;		// when in simple UI, apply this minimum, range 0.f to 100.f
@@ -104,7 +103,6 @@ public:
 	F32					getCameraDistance()	const	{ return getInfo()->mCamDist; } 
 	F32					getCameraAngle() const		{ return getInfo()->mCamAngle; }  // degrees
 	F32					getCameraElevation() const	{ return getInfo()->mCamElevation; } 
-	const std::string&	getCameraTargetName() const { return getInfo()->mCamTargetName; }
 	
 	BOOL				getShowSimple() const		{ return getInfo()->mShowSimple; }
 	F32					getSimpleMin() const		{ return getInfo()->mSimpleMin; }
-- 
cgit v1.2.3


From 4c0624b04e73f53040179d3688b0234ca84830cb Mon Sep 17 00:00:00 2001
From: Xiaohong Bao <bao@lindenlab.com>
Date: Fri, 4 Jun 2010 22:26:39 -0600
Subject: EXT-7500: PARTIAL FIXED: Texture Jamming problems with http texture
 off

---
 indra/newview/llviewertexture.cpp | 30 +++++++++++++++++++++++-------
 1 file changed, 23 insertions(+), 7 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index d8a9ce9374..7e779986df 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1447,8 +1447,14 @@ void LLViewerFetchedTexture::setKnownDrawSize(S32 width, S32 height)
 //virtual
 void LLViewerFetchedTexture::processTextureStats()
 {
-	if(mFullyLoaded)//already loaded
+	if(mFullyLoaded)
 	{
+		if(mDesiredDiscardLevel <= mMinDesiredDiscardLevel)//already loaded
+		{
+			return ;
+		}
+		mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ;
+		mFullyLoaded = FALSE ;
 		return ;
 	}
 
@@ -1482,6 +1488,7 @@ void LLViewerFetchedTexture::processTextureStats()
 			mDesiredDiscardLevel = (S8)llmin(log((F32)mFullWidth / mKnownDrawWidth) / log_2, 
 					                             log((F32)mFullHeight / mKnownDrawHeight) / log_2) ;
 			mDesiredDiscardLevel = 	llclamp(mDesiredDiscardLevel, (S8)0, (S8)getMaxDiscardLevel()) ;
+			mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ;
 		}
 		mKnownDrawSizeChanged = FALSE ;
 		
@@ -1514,7 +1521,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
 	}
 	if(mFullyLoaded && !mForceToSaveRawImage)//already loaded for static texture
 	{
-		return -4.0f ; //alreay fetched
+		return -1.0f ; //alreay fetched
 	}
 
 	S32 cur_discard = getCurrentDiscardLevelForFetching();
@@ -1528,16 +1535,16 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
 	}
 	else if(mDesiredDiscardLevel >= cur_discard && cur_discard > -1)
 	{
-		priority = -1.0f ;
+		priority = -2.0f ;
 	}
 	else if(mCachedRawDiscardLevel > -1 && mDesiredDiscardLevel >= mCachedRawDiscardLevel)
 	{
-		priority = -1.0f;
+		priority = -3.0f;
 	}
 	else if (mDesiredDiscardLevel > getMaxDiscardLevel())
 	{
 		// Don't decode anything we don't need
-		priority = -1.0f;
+		priority = -4.0f;
 	}
 	else if ((mBoostLevel == LLViewerTexture::BOOST_UI || mBoostLevel == LLViewerTexture::BOOST_ICON) && !have_all_data)
 	{
@@ -1551,9 +1558,14 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
 			// Always want high boosted images
 			priority = 1.f;
 		}
+		else if(mForceToSaveRawImage)
+		{
+			//force to fetch the raw image.
+			priority = 1.f;
+		}
 		else
 		{
-			priority = -1.f; //stop fetching
+			priority = -5.f; //stop fetching
 		}
 	}
 	else if (cur_discard < 0)
@@ -1569,7 +1581,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
 	else if ((mMinDiscardLevel > 0) && (cur_discard <= mMinDiscardLevel))
 	{
 		// larger mips are corrupted
-		priority = -3.0f;
+		priority = -6.0f;
 	}
 	else
 	{
@@ -2052,10 +2064,13 @@ bool LLViewerFetchedTexture::doLoadedCallbacks()
 	bool run_raw_callbacks = false;
 	bool need_readback = false;
 
+	mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1;
 	for(callback_list_t::iterator iter = mLoadedCallbackList.begin();
 		iter != mLoadedCallbackList.end(); )
 	{
 		LLLoadedCallbackEntry *entryp = *iter++;
+		mMinDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel, (S8)entryp->mDesiredDiscard) ;
+
 		if (entryp->mNeedsImageRaw)
 		{
 			if (mNeedsAux)
@@ -2187,6 +2202,7 @@ bool LLViewerFetchedTexture::doLoadedCallbacks()
 	if (mLoadedCallbackList.empty())
 	{
 		gTextureList.mCallbackList.erase(this);
+		mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1;
 	}
 
 	// Done with any raw image data at this point (will be re-created if we still have callbacks)
-- 
cgit v1.2.3