diff options
Diffstat (limited to 'indra/newview')
97 files changed, 1289 insertions, 1166 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 8ad52784d3..94a2ca16f4 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1132,7 +1132,7 @@        <key>Type</key>        <string>U32</string>        <key>Value</key> -      <integer>500</integer> +      <integer>512</integer>      </map>      <key>CacheValidateCounter</key>      <map> @@ -4545,6 +4545,17 @@      <key>Value</key>      <integer>1</integer>    </map> +  <key>MediaPerformanceManagerDebug</key> +  <map> +    <key>Comment</key> +    <string>Whether to show debug data for the media performance manager in the nearby media list.</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>0</integer> +  </map>    <key>MemoryLogFrequency</key>          <map>          <key>Comment</key> @@ -5369,7 +5380,7 @@        <key>Type</key>        <string>F32</string>        <key>Value</key> -      <real>0.0</real> +      <real>1.0</real>      </map>      <key>PluginInstancesLow</key>      <map> @@ -5385,24 +5396,24 @@      <key>PluginInstancesNormal</key>      <map>        <key>Comment</key> -      <string>Limit on the number of inworld media plugins that will run at "normal" priority</string> +      <string>Limit on the number of inworld media plugins that will run at "normal" or higher priority</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key>        <string>U32</string>        <key>Value</key> -      <integer>4</integer> +      <integer>2</integer>      </map>      <key>PluginInstancesTotal</key>      <map>        <key>Comment</key> -      <string>Hard limit on the number of plugins that will be instantiated at once</string> +      <string>Hard limit on the number of plugins that will be instantiated at once for inworld media</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key>        <string>U32</string>        <key>Value</key> -      <integer>16</integer> +      <integer>8</integer>      </map>      <key>PrecachingDelay</key>      <map> @@ -6304,7 +6315,7 @@      <real>1.0</real>    </map> -  <key>RenderHighlightEnable</key> +  <key>RenderHoverGlowEnable</key>    <map>      <key>Comment</key>      <string>Show glow effect when hovering on interactive objects.</string> @@ -6313,7 +6324,7 @@      <key>Type</key>      <string>Boolean</string>      <key>Value</key> -    <integer>1</integer> +    <integer>0</integer>    </map>    <key>RenderHighlightFadeTime</key> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index ca1688ad1f..1257cf9789 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -107,6 +107,7 @@  #include "llnavigationbar.h" //to show/hide navigation bar when changing mouse look state  #include "llagentui.h" +#include "llchannelmanager.h"  using namespace LLVOAvatarDefines; @@ -2166,6 +2167,7 @@ void LLAgent::setBusy()  	{  		gBusyMenu->setLabel(LLTrans::getString("AvatarSetNotBusy"));  	} +	LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(true);  }  //----------------------------------------------------------------------------- @@ -2179,6 +2181,7 @@ void LLAgent::clearBusy()  	{  		gBusyMenu->setLabel(LLTrans::getString("AvatarSetBusy"));  	} +	LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(false);  }  //----------------------------------------------------------------------------- diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 9b4986247f..6cb96d1336 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -35,10 +35,11 @@  #include "llagent.h"   #include "llagentwearables.h" +#include "llcallbacklist.h"  #include "llfloatercustomize.h"  #include "llfloaterinventory.h"  #include "llinventorybridge.h" -#include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "llinventorypanel.h"  #include "llnotify.h"  #include "llviewerregion.h" @@ -82,6 +83,28 @@ public:  protected:  	void processWearablesMessage(); +	void processContents(); +	static void onIdle(void *userdata); +}; + +class LLLibraryOutfitsFetch : public LLInventoryFetchDescendentsObserver +{ +public: +	enum ELibraryOutfitFetchStep { +		LOFS_FOLDER = 0, +		LOFS_OUTFITS, +		LOFS_CONTENTS +	}; +	LLLibraryOutfitsFetch() : mCurrFetchStep(LOFS_FOLDER), mOutfitsPopulated(false) {} +	~LLLibraryOutfitsFetch() {} +	virtual void done();	 +protected: +	void folderDone(void); +	void outfitsDone(void); +	void contentsDone(void); +	enum ELibraryOutfitFetchStep mCurrFetchStep; +	std::vector< std::pair< LLUUID, std::string > > mOutfits; +	bool mOutfitsPopulated;  };  LLAgentWearables gAgentWearables; @@ -903,6 +926,8 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs  			// will call done for us when everything is here.  			gInventory.addObserver(outfit);  		} +		 +		gAgentWearables.populateMyOutfitsFolder();  	}  } @@ -1261,7 +1286,7 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)  		LLFolderType::FT_OUTFIT,  		new_folder_name); -	LLAppearanceManager::shallowCopyCategory(LLAppearanceManager::getCOF(),folder_id, NULL); +	LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, NULL);  #if 0  // BAP - fix to go into rename state automatically after outfit is created.  	LLViewerInventoryCategory *parent_category = gInventory.getCategory(parent_id); @@ -1391,7 +1416,7 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem  			const LLUUID &item_id = getWearableItemID(type,i);  			popWearable(type,i);  			gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); -			LLAppearanceManager::removeItemLinks(item_id,false); +			LLAppearanceManager::instance().removeItemLinks(item_id,false);  			//queryWearableCache(); // moved below  			if (old_wearable) @@ -1408,7 +1433,7 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem  		const LLUUID &item_id = getWearableItemID(type,index);  		popWearable(type, index);  		gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); -		LLAppearanceManager::removeItemLinks(item_id,false); +		LLAppearanceManager::instance().removeItemLinks(item_id,false);  		//queryWearableCache(); // moved below @@ -2002,11 +2027,158 @@ void LLAgentWearables::updateServer()  	gAgent.sendAgentSetAppearance();  } +void LLAgentWearables::populateMyOutfitsFolder(void) +{	 +	LLLibraryOutfitsFetch* outfits = new LLLibraryOutfitsFetch(); +	 +	// What we do here is get the complete information on the items in +	// the inventory, and set up an observer that will wait for that to +	// happen. +	LLInventoryFetchDescendentsObserver::folder_ref_t folders; +	const LLUUID my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + +	folders.push_back(my_outfits_id); +	outfits->fetchDescendents(folders); +	if(outfits->isEverythingComplete()) +	{ +		// everything is already here - call done. +		outfits->done(); +	} +	else +	{ +		// it's all on it's way - add an observer, and the inventory +		// will call done for us when everything is here. +		gInventory.addObserver(outfits); +	} +} + +void LLLibraryOutfitsFetch::done() +{ +	switch (mCurrFetchStep){ +		case LOFS_FOLDER: +			mCurrFetchStep = LOFS_OUTFITS; +			folderDone(); +			break; +		case LOFS_OUTFITS: +			mCurrFetchStep = LOFS_CONTENTS; +			outfitsDone(); +			break; +		case LOFS_CONTENTS: +			// No longer need this observer hanging around. +			gInventory.removeObserver(this); +			contentsDone(); +			break; +		default: +			gInventory.removeObserver(this); +			delete this; +			return; +	} +	if (mOutfitsPopulated) +	{ +		delete this; +	} +} + +void LLLibraryOutfitsFetch::folderDone(void) +{ +	// Early out if we already have items in My Outfits. +	LLInventoryModel::cat_array_t cat_array; +	LLInventoryModel::item_array_t wearable_array; +	gInventory.collectDescendents(mCompleteFolders.front(), cat_array, wearable_array,  +								  LLInventoryModel::EXCLUDE_TRASH); +	if (cat_array.count() > 0 || wearable_array.count() > 0) +	{ +		mOutfitsPopulated = true; +		gInventory.removeObserver(this); +		return; +	} +	 +	// Get the UUID of the library's clothing folder +	const LLUUID library_clothing_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true); +	 +	mCompleteFolders.clear(); +	 +	// What we do here is get the complete information on the items in +	// the inventory, and set up an observer that will wait for that to +	// happen. +	LLInventoryFetchDescendentsObserver::folder_ref_t folders; +	folders.push_back(library_clothing_id); +	fetchDescendents(folders); +	if(isEverythingComplete()) +	{ +		// everything is already here - call done. +		outfitsDone(); +	} +} + +void LLLibraryOutfitsFetch::outfitsDone(void) +{ +	LLInventoryModel::cat_array_t cat_array; +	LLInventoryModel::item_array_t wearable_array; +	gInventory.collectDescendents(mCompleteFolders.front(), cat_array, wearable_array,  +								  LLInventoryModel::EXCLUDE_TRASH); +	 +	LLInventoryFetchDescendentsObserver::folder_ref_t folders; +	for(S32 i = 0; i < cat_array.count(); ++i) +	{ +		if (cat_array.get(i)->getName() != "More Outfits" && cat_array.get(i)->getName() != "Ruth"){ +			folders.push_back(cat_array.get(i)->getUUID()); +			mOutfits.push_back( std::make_pair(cat_array.get(i)->getUUID(), cat_array.get(i)->getName() )); +		} +	} +	mCompleteFolders.clear(); +	fetchDescendents(folders); +	if(isEverythingComplete()) +	{ +		// everything is already here - call done. +		contentsDone(); +	} +} + +void LLLibraryOutfitsFetch::contentsDone(void) +{ +	for(S32 i = 0; i < (S32)mOutfits.size(); ++i) +	{ +		// First, make a folder in the My Outfits directory. +		const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); +		LLUUID folder_id = gInventory.createNewCategory(parent_id, +														LLFolderType::FT_OUTFIT, +														mOutfits[i].second); +		 +		LLAppearanceManager::getInstance()->shallowCopyCategory(mOutfits[i].first, folder_id, NULL); +		gInventory.notifyObservers(); +	} +	mOutfitsPopulated = true; +} + +//-------------------------------------------------------------------- +// InitialWearablesFetch +//  +// This grabs contents from the COF and processes them. +// The processing is handled in idle(), i.e. outside of done(), +// to avoid gInventory.notifyObservers recursion. +//-------------------------------------------------------------------- + +// virtual  void LLInitialWearablesFetch::done()  { -	// No longer need this observer hanging around. +	// Delay processing the actual results of this so it's not handled within +	// gInventory.notifyObservers.  The results will be handled in the next +	// idle tick instead.  	gInventory.removeObserver(this); +	gIdleCallbacks.addFunction(onIdle, this); +} + +// static +void LLInitialWearablesFetch::onIdle(void *data) +{ +	gIdleCallbacks.deleteFunction(onIdle, data); +	LLInitialWearablesFetch *self = reinterpret_cast<LLInitialWearablesFetch*>(data); +	self->processContents(); +} +void LLInitialWearablesFetch::processContents() +{  	// Fetch the wearable items from the Current Outfit Folder  	LLInventoryModel::cat_array_t cat_array;  	LLInventoryModel::item_array_t wearable_array; @@ -2014,7 +2186,7 @@ void LLInitialWearablesFetch::done()  	gInventory.collectDescendentsIf(mCompleteFolders.front(), cat_array, wearable_array,   									LLInventoryModel::EXCLUDE_TRASH, is_wearable); -	LLAppearanceManager::setAttachmentInvLinkEnable(true); +	LLAppearanceManager::instance().setAttachmentInvLinkEnable(true);  	if (wearable_array.count() > 0)  	{  		LLAppearanceManager::instance().updateAppearanceFromCOF(); @@ -2023,7 +2195,7 @@ void LLInitialWearablesFetch::done()  	{  		processWearablesMessage();  		// Create links for attachments that may have arrived before the COF existed. -		LLAppearanceManager::linkRegisteredAttachments(); +		LLAppearanceManager::instance().linkRegisteredAttachments();  	}  	delete this;  } diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 9017c25fc6..8f3a16501e 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -169,9 +169,11 @@ public:  								  const LLDynamicArray<S32>& attachments_to_include,  								  BOOL rename_clothing); -	// Note:	wearables_to_include should be a list of EWearableType types -	//			attachments_to_include should be a list of attachment points  	LLUUID			makeNewOutfitLinks(const std::string& new_folder_name); +	 +	// Should only be called if we *know* we've never done so before, since users may +	// not want the Library outfits to stay in their quick outfit selector and can delete them. +	void			populateMyOutfitsFolder(void);  private:  	void			makeNewOutfitDone(S32 type, U32 index);  diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 0901289dac..80ac9e4085 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -32,18 +32,20 @@  #include "llviewerprecompiledheaders.h" +#include "llagent.h" +#include "llagentwearables.h"  #include "llappearancemgr.h" -#include "llinventorymodel.h" -#include "llnotifications.h" +#include "llfloatercustomize.h"  #include "llgesturemgr.h"  #include "llinventorybridge.h" -#include "llwearablelist.h" -#include "llagentwearables.h" -#include "llagent.h" +#include "llinventoryobserver.h" +#include "llnotifications.h" +#include "llpanelappearance.h" +#include "llsidetray.h"  #include "llvoavatar.h"  #include "llvoavatarself.h"  #include "llviewerregion.h" -#include "llfloatercustomize.h" +#include "llwearablelist.h"  class LLWearInventoryCategoryCallback : public LLInventoryCallback  { @@ -72,7 +74,7 @@ protected:  		// If the inventory callback manager goes away, we're shutting down, no longer want the callback.  		if( LLInventoryCallbackManager::is_instantiated() )  		{ -			LLAppearanceManager::wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); +			LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);  		}  		else  		{ @@ -171,7 +173,7 @@ void LLOutfitObserver::done()  	else  	{  		// Wear the inventory category. -		LLAppearanceManager::wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); +		LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);  	}  } @@ -251,7 +253,7 @@ public:  	virtual ~LLUpdateAppearanceOnDestroy()  	{ -		LLAppearanceManager::updateAppearanceFromCOF(); +		LLAppearanceManager::instance().updateAppearanceFromCOF();  	}  	/* virtual */ void fire(const LLUUID& inv_item) @@ -296,7 +298,7 @@ struct LLWearableHoldingPattern  	bool append;  }; -/* static */ void removeDuplicateItems(LLInventoryModel::item_array_t& items) +static void removeDuplicateItems(LLInventoryModel::item_array_t& items)  {  	LLInventoryModel::item_array_t new_items;  	std::set<LLUUID> items_seen; @@ -323,175 +325,44 @@ struct LLWearableHoldingPattern  	items = new_items;  } -void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventoryModel::item_array_t& src) +static void onWearableAssetFetch(LLWearable* wearable, void* data)  { -	LLInventoryModel::item_array_t new_dst; -	std::set<LLUUID> mark_inventory; - -	S32 inventory_dups = 0; +	LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; +	bool append = holder->append; -	for (LLInventoryModel::item_array_t::const_iterator src_pos = src.begin(); -		  src_pos != src.end(); -		  ++src_pos) -	{ -		LLUUID src_item_id = (*src_pos)->getLinkedUUID(); -		mark_inventory.insert(src_item_id); -	} - -	for (LLInventoryModel::item_array_t::const_iterator dst_pos = dst.begin(); -		  dst_pos != dst.end(); -		  ++dst_pos) +	if(wearable)  	{ -		LLUUID dst_item_id = (*dst_pos)->getLinkedUUID(); - -		if (mark_inventory.find(dst_item_id) == mark_inventory.end()) -		{ -			// Item is not already present in COF. -			new_dst.put(*dst_pos); -			mark_inventory.insert(dst_item_id); -		} -		else +		for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin(); +			 iter != holder->mFoundList.end(); ++iter)  		{ -			inventory_dups++; +			LLFoundData* data = *iter; +			if(wearable->getAssetID() == data->mAssetID) +			{ +				data->mWearable = wearable; +				break; +			}  		}  	} -	llinfos << "removeDups, original " << dst.count() << " final " << new_dst.count() -			<< " inventory dups " << inventory_dups << llendl; -	 -	dst = new_dst; +	holder->mResolved += 1; +	if(holder->mResolved >= (S32)holder->mFoundList.size()) +	{ +		LLAppearanceManager::instance().updateAgentWearables(holder, append); +	}  } -/* static */   LLUUID LLAppearanceManager::getCOF()  {  	return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);  }  // Update appearance from outfit folder. -/* static */   void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append)  {  	if (!proceed)  		return; - -#if 1  -	updateCOF(category,append); -#else -	if (append) -	{ -		updateCOFFromCategory(category, append); // append is true - add non-duplicates to COF. -	} -	else -	{ -		LLViewerInventoryCategory* catp = gInventory.getCategory(category); -		if (catp->getPreferredType() == LLFolderType::FT_NONE || -			LLFolderType::lookupIsEnsembleType(catp->getPreferredType())) -		{ -			updateCOFFromCategory(category, append);  // append is false - rebuild COF. -		} -		else if (catp->getPreferredType() == LLFolderType::FT_OUTFIT) -		{ -			rebuildCOFFromOutfit(category); -		} -	} -#endif -} - -// Append to current COF contents by recursively traversing a folder. -/* static */  -void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool append) -{ -		// BAP consolidate into one "get all 3 types of descendents" function, use both places. -	LLInventoryModel::item_array_t wear_items; -	LLInventoryModel::item_array_t obj_items; -	LLInventoryModel::item_array_t gest_items; -	bool follow_folder_links = false; -	getUserDescendents(category, wear_items, obj_items, gest_items, follow_folder_links); - -	// Find all the wearables that are in the category's subtree.	 -	lldebugs << "appendCOFFromCategory()" << llendl; -	if( !wear_items.count() && !obj_items.count() && !gest_items.count()) -	{ -		LLNotifications::instance().add("CouldNotPutOnOutfit"); -		return; -	} -		 -	const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); -	// Processes that take time should show the busy cursor -	//inc_busy_count(); -		 -	LLInventoryModel::cat_array_t cof_cats; -	LLInventoryModel::item_array_t cof_items; -	gInventory.collectDescendents(current_outfit_id, cof_cats, cof_items, -								  LLInventoryModel::EXCLUDE_TRASH); -	// Remove duplicates -	if (append) -	{ -		removeDuplicateItems(wear_items, cof_items); -		removeDuplicateItems(obj_items, cof_items); -		removeDuplicateItems(gest_items, cof_items); -	} - -	S32 total_links = gest_items.count() + wear_items.count() + obj_items.count(); - -	if (!append && total_links > 0) -	{ -		purgeCOFBeforeRebuild(category); -	} - -	LLPointer<LLUpdateAppearanceOnDestroy> link_waiter = new LLUpdateAppearanceOnDestroy; -	 -	// Link all gestures in this folder -	if (gest_items.count() > 0) -	{ -		llinfos << "Linking " << gest_items.count() << " gestures" << llendl; -		for (S32 i = 0; i < gest_items.count(); ++i) -		{ -			const LLInventoryItem* gest_item = gest_items.get(i).get(); -			link_inventory_item(gAgent.getID(), gest_item->getLinkedUUID(), current_outfit_id, -								gest_item->getName(), -								LLAssetType::AT_LINK, link_waiter); -		} -	} - -	// Link all wearables -	if(wear_items.count() > 0) -	{ -		llinfos << "Linking " << wear_items.count() << " wearables" << llendl; -		for(S32 i = 0; i < wear_items.count(); ++i) -		{ -			// Populate the current outfit folder with links to the newly added wearables -			const LLInventoryItem* wear_item = wear_items.get(i).get(); -			link_inventory_item(gAgent.getID(),  -								wear_item->getLinkedUUID(), // If this item is a link, then we'll use the linked item's UUID. -								current_outfit_id,  -								wear_item->getName(), -								LLAssetType::AT_LINK,  -								link_waiter); -		} -	} - -	// Link all attachments. -	if( obj_items.count() > 0 ) -	{ -		llinfos << "Linking " << obj_items.count() << " attachments" << llendl; -		LLVOAvatar* avatar = gAgent.getAvatarObject(); -		if( avatar ) -		{ -			for(S32 i = 0; i < obj_items.count(); ++i) -			{ -				const LLInventoryItem* obj_item = obj_items.get(i).get(); -				link_inventory_item(gAgent.getID(),  -									obj_item->getLinkedUUID(), // If this item is a link, then we'll use the linked item's UUID. -									current_outfit_id,  -									obj_item->getName(), -									LLAssetType::AT_LINK, link_waiter); -			} -		} -	} +	LLAppearanceManager::instance().updateCOF(category,append);  } -/* static */   void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,  											  LLPointer<LLInventoryCallback> cb)  { @@ -535,7 +406,8 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID  		}  	}  } -/* static */ void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links) + +void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links)  {  	LLInventoryModel::cat_array_t cats;  	LLInventoryModel::item_array_t items; @@ -552,7 +424,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID  // Keep the last N wearables of each type.  For viewer 2.0, N is 1 for  // both body parts and clothing items. -/* static */ void LLAppearanceManager::filterWearableItems( +void LLAppearanceManager::filterWearableItems(  	LLInventoryModel::item_array_t& items, S32 max_per_type)  {  	// Divvy items into arrays by wearable type. @@ -583,8 +455,8 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID  }  // Create links to all listed items. -/* static */ void LLAppearanceManager::linkAll(const LLUUID& category, -											   LLInventoryModel::item_array_t& items, +void LLAppearanceManager::linkAll(const LLUUID& category, +								  LLInventoryModel::item_array_t& items,  											   LLPointer<LLInventoryCallback> cb)  {  	for (S32 i=0; i<items.count(); i++) @@ -599,7 +471,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID  	}  } -/* static */ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append) +void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)  {  	const LLUUID cof = getCOF(); @@ -656,145 +528,17 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID  	{  		link_inventory_item(gAgent.getID(), category, cof, catp->getName(),  							LLAssetType::AT_LINK_FOLDER, link_waiter); -	} -							   -} - -/* static */  -bool LLAppearanceManager::isMandatoryWearableType(EWearableType type) -{ -	return (type==WT_SHAPE) || (type==WT_SKIN) || (type== WT_HAIR) || (type==WT_EYES); -} -// For mandatory body parts. -/* static */  -void LLAppearanceManager::checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found) -{ -	LLInventoryModel::cat_array_t new_cats; -	LLInventoryModel::item_array_t new_items; -	gInventory.collectDescendents(category, new_cats, new_items, -								  LLInventoryModel::EXCLUDE_TRASH); -	std::set<EWearableType> wt_types_found; -	for (S32 i = 0; i < new_items.count(); ++i) -	{ -		LLViewerInventoryItem *itemp = new_items.get(i); -		if (itemp->isWearableType()) -		{ -			EWearableType type = itemp->getWearableType(); -			if (isMandatoryWearableType(type)) -			{ -				types_found.insert(type); -			} -		} -	} -} - -// Remove everything from the COF that we safely can before replacing -// with contents of new category.  This means preserving any mandatory -// body parts that aren't present in the new category, and getting rid -// of everything else. -/* static */  -void LLAppearanceManager::purgeCOFBeforeRebuild(const LLUUID& category) -{ -	// See which mandatory body types are present in the new category. -	std::set<EWearableType> wt_types_found; -	checkMandatoryWearableTypes(category,wt_types_found); -	 -	LLInventoryModel::cat_array_t cof_cats; -	LLInventoryModel::item_array_t cof_items; -	gInventory.collectDescendents(getCOF(), cof_cats, cof_items, -								  LLInventoryModel::EXCLUDE_TRASH); -	for (S32 i = 0; i < cof_items.count(); ++i) -	{ -		LLViewerInventoryItem *itemp = cof_items.get(i); -		if (itemp->isWearableType()) +		// Update the current outfit name of the appearance sidepanel. +		LLPanelAppearance* panel_appearance = dynamic_cast<LLPanelAppearance *>(LLSideTray::getInstance()->getPanel("panel_appearance")); +		if (panel_appearance)  		{ -			EWearableType type = itemp->getWearableType(); -			if (!isMandatoryWearableType(type) || (wt_types_found.find(type) != wt_types_found.end())) -			{ -				// Not mandatory or supplied by the new category - OK to delete -				gInventory.purgeObject(cof_items.get(i)->getUUID()); -			} -		} -		else -		{ -			// Not a wearable - always purge -			gInventory.purgeObject(cof_items.get(i)->getUUID()); +			panel_appearance->refreshCurrentLookName(catp->getName());  		}  	} -	gInventory.notifyObservers(); -} - -// Replace COF contents from a given outfit folder. -/* static */  -void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category) -{ -	lldebugs << "rebuildCOFFromOutfit()" << llendl; - -	dumpCat(category,"start, source outfit"); -	dumpCat(getCOF(),"start, COF"); - -	// Find all the wearables that are in the category's subtree.	 -	LLInventoryModel::item_array_t items; -	getCOFValidDescendents(category, items); - -	if( items.count() == 0) -	{ -		LLNotifications::instance().add("CouldNotPutOnOutfit"); -		return; -	} - -	// Processes that take time should show the busy cursor -	//inc_busy_count(); - -	//dumpCat(current_outfit_id,"COF before remove:"); - -	//dumpCat(current_outfit_id,"COF after remove:"); - -	purgeCOFBeforeRebuild(category); -	 -	LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy; -	LLUUID current_outfit_id = getCOF(); -	LLAppearanceManager::shallowCopyCategory(category, current_outfit_id, link_waiter); - -	//dumpCat(current_outfit_id,"COF after shallow copy:"); - -	// Create a link to the outfit that we wore. -	LLViewerInventoryCategory* catp = gInventory.getCategory(category); -	if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) -	{ -		link_inventory_item(gAgent.getID(), category, current_outfit_id, catp->getName(), -							LLAssetType::AT_LINK_FOLDER, link_waiter); -	} -} - -/* static */ -void LLAppearanceManager::onWearableAssetFetch(LLWearable* wearable, void* data) -{ -	LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; -	bool append = holder->append; -	 -	if(wearable) -	{ -		for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin(); -			 iter != holder->mFoundList.end(); ++iter) -		{ -			LLFoundData* data = *iter; -			if(wearable->getAssetID() == data->mAssetID) -			{ -				data->mWearable = wearable; -				break; -			} -		} -	} -	holder->mResolved += 1; -	if(holder->mResolved >= (S32)holder->mFoundList.size()) -	{ -		LLAppearanceManager::updateAgentWearables(holder, append); -	} +							    } -/* static */  void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append)  {  	lldebugs << "updateAgentWearables()" << llendl; @@ -835,7 +579,6 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,  //	dec_busy_count();  } -/* static */   void LLAppearanceManager::updateAppearanceFromCOF()  {  	dumpCat(getCOF(),"COF, start"); @@ -903,7 +646,7 @@ void LLAppearanceManager::updateAppearanceFromCOF()  			LLWearableList::instance().getAsset(found->mAssetID,  												found->mName,  												found->mAssetType, -												LLAppearanceManager::onWearableAssetFetch, +												onWearableAssetFetch,  												(void*)holder);  		}  	} @@ -916,22 +659,6 @@ void LLAppearanceManager::updateAppearanceFromCOF()  	}  } -/* static */  -void LLAppearanceManager::getCOFValidDescendents(const LLUUID& category, -												 LLInventoryModel::item_array_t& items) -{ -	LLInventoryModel::cat_array_t cats; -	LLFindCOFValidItems is_cof_valid; -	bool follow_folder_links = false; -	gInventory.collectDescendentsIf(category, -									cats,  -									items,  -									LLInventoryModel::EXCLUDE_TRASH, -									is_cof_valid,  -									follow_folder_links); -} - -/* static */  void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category,  													LLInventoryModel::item_array_t& items,  													LLAssetType::EType type, @@ -947,7 +674,6 @@ void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category,  									follow_folder_links);  } -/* static */   void LLAppearanceManager::getUserDescendents(const LLUUID& category,   											 LLInventoryModel::item_array_t& wear_items,  											 LLInventoryModel::item_array_t& obj_items, @@ -1011,7 +737,6 @@ void LLAppearanceManager::wearInventoryCategory(LLInventoryCategory* category, b  }  // *NOTE: hack to get from avatar inventory to avatar -/* static */  void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* category, bool append )  {  	// Avoid unintentionally overwriting old wearables.  We have to do @@ -1023,7 +748,9 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca  	if( gFloaterCustomize )  	{ -		gFloaterCustomize->askToSaveIfDirty(boost::bind(LLAppearanceManager::changeOutfit, _1, category->getUUID(), append)); +		gFloaterCustomize->askToSaveIfDirty(boost::bind(&LLAppearanceManager::changeOutfit, +														&LLAppearanceManager::instance(), +														_1, category->getUUID(), append));  	}  	else  	{ @@ -1031,7 +758,6 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca  	}  } -/* static */  void LLAppearanceManager::wearOutfitByName(const std::string& name)  {  	llinfos << "Wearing category " << name << llendl; @@ -1084,8 +810,8 @@ bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventor  	return (a->isWearableType() && b->isWearableType() &&  			(a->getWearableType() == b->getWearableType()));  } -/* static */ -void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update ) + +void LLAppearanceManager::addItemLink( LLInventoryItem* item, bool do_update )  {  	LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item);  	if (!vitem) @@ -1138,8 +864,7 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )  	return;  } -/* static */ -void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update ) +void LLAppearanceManager::addEnsembleLink( LLInventoryCategory* cat, bool do_update )  {  #if SUPPORT_ENSEMBLES  	// BAP add check for already in COF. @@ -1153,7 +878,6 @@ void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update  #endif  } -/* static */  void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)  {  	LLInventoryModel::cat_array_t cat_array; @@ -1178,7 +902,6 @@ void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)  //#define DUMP_CAT_VERBOSE -/* static */  void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg)  {  	LLInventoryModel::cat_array_t cats; @@ -1200,7 +923,6 @@ void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg)  	llinfos << msg << " count " << items.count() << llendl;  } -/* static */  void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& items,  										const std::string& msg)  { @@ -1213,15 +935,19 @@ void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& it  	llinfos << llendl;  } +LLAppearanceManager::LLAppearanceManager(): +	mAttachmentInvLinkEnabled(false) +{ +} -std::set<LLUUID> LLAppearanceManager::sRegisteredAttachments; -bool LLAppearanceManager::sAttachmentInvLinkEnabled(false); +LLAppearanceManager::~LLAppearanceManager() +{ +} -/* static */  void LLAppearanceManager::setAttachmentInvLinkEnable(bool val)  {  	llinfos << "setAttachmentInvLinkEnable => " << (int) val << llendl; -	sAttachmentInvLinkEnabled = val; +	mAttachmentInvLinkEnabled = val;  }  void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg) @@ -1241,19 +967,18 @@ void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg)         llinfos << llendl;  } -/* static */  void LLAppearanceManager::registerAttachment(const LLUUID& item_id)  { -       sRegisteredAttachments.insert(item_id); -       //dumpAttachmentSet(sRegisteredAttachments,"after register:"); +       mRegisteredAttachments.insert(item_id); +       //dumpAttachmentSet(mRegisteredAttachments,"after register:"); -	   if (sAttachmentInvLinkEnabled) +	   if (mAttachmentInvLinkEnabled)  	   {  		   LLViewerInventoryItem *item = gInventory.getItem(item_id);  		   if (item)  		   {  			   //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:"); -			   LLAppearanceManager::wearItem(item,false);  // Add COF link for item. +			   LLAppearanceManager::addItemLink(item,false);  // Add COF link for item.  			   gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);  			   gInventory.notifyObservers();  		   } @@ -1264,13 +989,12 @@ void LLAppearanceManager::registerAttachment(const LLUUID& item_id)  	   }  } -/* static */  void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)  { -       sRegisteredAttachments.erase(item_id); -       //dumpAttachmentSet(sRegisteredAttachments,"after unregister:"); +       mRegisteredAttachments.erase(item_id); +       //dumpAttachmentSet(mRegisteredAttachments,"after unregister:"); -	   if (sAttachmentInvLinkEnabled) +	   if (mAttachmentInvLinkEnabled)  	   {  		   //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:");  		   LLAppearanceManager::removeItemLinks(item_id, false); @@ -1284,21 +1008,20 @@ void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)  	   }  } -/* static */  void LLAppearanceManager::linkRegisteredAttachments()  { -	for (std::set<LLUUID>::iterator it = sRegisteredAttachments.begin(); -		 it != sRegisteredAttachments.end(); +	for (std::set<LLUUID>::iterator it = mRegisteredAttachments.begin(); +		 it != mRegisteredAttachments.end();  		 ++it)  	{  		LLUUID item_id = *it;  		LLViewerInventoryItem *item = gInventory.getItem(item_id);  		if (item)  		{ -			wearItem(item, false); +			addItemLink(item, false);  			gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);  			gInventory.notifyObservers();  		}  	} -	sRegisteredAttachments.clear(); +	mRegisteredAttachments.clear();  } diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 7dea16b6cf..88d3320d1f 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -42,66 +42,71 @@ struct LLWearableHoldingPattern;  class LLAppearanceManager: public LLSingleton<LLAppearanceManager>  { +	friend class LLSingleton<LLAppearanceManager>; +	  public: -	static void updateAppearanceFromCOF(); -	static bool needToSaveCOF(); -	static void changeOutfit(bool proceed, const LLUUID& category, bool append); -	static void updateCOF(const LLUUID& category, bool append = false); -	static void updateCOFFromCategory(const LLUUID& category, bool append); -	static void rebuildCOFFromOutfit(const LLUUID& category); -	static void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append); -	static void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append); -	static void wearOutfitByName(const std::string& name); -	static void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, -									LLPointer<LLInventoryCallback> cb); +	void updateAppearanceFromCOF(); +	bool needToSaveCOF(); +	void updateCOF(const LLUUID& category, bool append = false); +	void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append); +	void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append); +	void wearOutfitByName(const std::string& name); +	void changeOutfit(bool proceed, const LLUUID& category, bool append);  	// Add COF link to individual item. -	static void wearItem(LLInventoryItem* item, bool do_update = true); +	void addItemLink(LLInventoryItem* item, bool do_update = true);  	// Add COF link to ensemble folder. -	static void wearEnsemble(LLInventoryCategory* item, bool do_update = true); -	static LLUUID getCOF(); +	void addEnsembleLink(LLInventoryCategory* item, bool do_update = true); + +	// Copy all items in a category. +	void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, +							 LLPointer<LLInventoryCallback> cb); + +	// Find the Current Outfit folder. +	LLUUID getCOF();  	// Remove COF entries -	static void removeItemLinks(const LLUUID& item_id, bool do_update = true); +	void removeItemLinks(const LLUUID& item_id, bool do_update = true); + +	void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);  	// For debugging - could be moved elsewhere. -	static void dumpCat(const LLUUID& cat_id, const std::string& msg); -	static void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg); -	static void unregisterAttachment(const LLUUID& item_id); -	static void registerAttachment(const LLUUID& item_id); -	static void setAttachmentInvLinkEnable(bool val); -	static void linkRegisteredAttachments(); +	void dumpCat(const LLUUID& cat_id, const std::string& msg); +	void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg); + +	// Attachment link management +	void unregisterAttachment(const LLUUID& item_id); +	void registerAttachment(const LLUUID& item_id); +	void setAttachmentInvLinkEnable(bool val); +	void linkRegisteredAttachments(); + +protected: +	LLAppearanceManager(); +	~LLAppearanceManager();  private: -	static void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type); -	static void linkAll(const LLUUID& category, + +	void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type); +	void linkAll(const LLUUID& category,  						LLInventoryModel::item_array_t& items,  						LLPointer<LLInventoryCallback> cb); -	static void getDescendentsOfAssetType(const LLUUID& category,  +	void getDescendentsOfAssetType(const LLUUID& category,   										  LLInventoryModel::item_array_t& items,  										  LLAssetType::EType type,  										  bool follow_folder_links); -	static void getCOFValidDescendents(const LLUUID& category,  -									   LLInventoryModel::item_array_t& items); -									    -	static void getUserDescendents(const LLUUID& category,  +	void getUserDescendents(const LLUUID& category,   								   LLInventoryModel::item_array_t& wear_items,  								   LLInventoryModel::item_array_t& obj_items,  								   LLInventoryModel::item_array_t& gest_items,  								   bool follow_folder_links); -	static void onWearableAssetFetch(LLWearable* wearable, void* data); -	static void updateAgentWearables(LLWearableHoldingPattern* holder, bool append); -	static bool isMandatoryWearableType(EWearableType type); -	static void checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found); -	static void purgeCOFBeforeRebuild(const LLUUID& category); -	static void purgeCategory(const LLUUID& category, bool keep_outfit_links); -	static std::set<LLUUID> sRegisteredAttachments; -	static bool sAttachmentInvLinkEnabled; +	void purgeCategory(const LLUUID& category, bool keep_outfit_links); +	std::set<LLUUID> mRegisteredAttachments; +	bool mAttachmentInvLinkEnabled;  };  #define SUPPORT_ENSEMBLES 0 diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 845a264327..f82d178089 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -89,6 +89,8 @@  #include "llvfsthread.h"  #include "llvolumemgr.h" +#include "llnotificationmanager.h" +  // Third party library includes  #include <boost/bind.hpp> @@ -2340,6 +2342,8 @@ bool LLAppViewer::initWindow()  		gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"),  		gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),  		FALSE, ignorePixelDepth); + +	LLNotificationsUI::LLNotificationManager::getInstance();  	if (gSavedSettings.getBOOL("WindowFullScreen"))  	{ diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 4d85ecb97c..38843c7221 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -40,7 +40,7 @@  #include "llfloaterbuycurrency.h"  #include "llfilepicker.h"  #include "llnotify.h" -#include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "llinventorypanel.h"  #include "llfloaterinventory.h"  #include "llpermissionsflags.h" diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index fd711b72b0..958dbf226a 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -317,11 +317,6 @@ BOOL LLBottomTray::postBuild()  	// Registering Chat Bar to receive Voice client status change notifications.  	gVoiceClient->addObserver(this); -	if (mChicletPanel && mToolbarStack && mNearbyChatBar) -	{ -		verifyChildControlsSizes(); -	} -  	return TRUE;  } @@ -340,35 +335,6 @@ void LLBottomTray::log(LLView* panel, const std::string& descr)  		;   } -void LLBottomTray::verifyChildControlsSizes() -{ -	LLRect rect = mChicletPanel->getRect(); -	/* -	if (rect.getWidth() < mChicletPanel->getMinWidth()) -	{ -		llwarns << "QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ: chiclet panel less then min" << llendl; -		mChicletPanel->reshape(mChicletPanel->getMinWidth(), rect.getHeight()); -	} -*/ -	rect = mNearbyChatBar->getRect(); -/* -	if (rect.getWidth() < mNearbyChatBar->getMinWidth()) -	{ -		llwarns << "WWWWWWWWWWWWWWWWWWWWWWWWWWWWW: near chat panel less then min" << llendl; -		mNearbyChatBar->reshape(mNearbyChatBar->getMinWidth(), rect.getHeight()); -	} -	else  -*/ -		if (rect.getWidth() > mNearbyChatBar->getMaxWidth()) -	{ -		llerrs << "WWWWWWWWWWWWWWWWWWWWWWWWWWWWW: near chat panel more then max width" << llendl; - -		rect.setLeftTopAndSize(rect.mLeft, rect.mTop, mNearbyChatBar->getMaxWidth(), rect.getHeight()); -		mNearbyChatBar->reshape(mNearbyChatBar->getMaxWidth(), rect.getHeight()); -		mNearbyChatBar->setRect(rect); -	} -} -  void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)  {  	static S32 debug_calling_number = 0; @@ -393,7 +359,6 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)  	if (mChicletPanel && mToolbarStack && mNearbyChatBar)  	{  		mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE); - 		verifyChildControlsSizes();  		// bottom tray is narrowed  		if (delta_width < 0) diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 974289d5e0..8989816bfe 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -101,8 +101,6 @@ private:  		, RS_RESIZABLE_BUTTONS			= /*RS_BUTTON_SNAPSHOT | */RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES  	}EResizeState; -	void updateResizeState(S32 new_width, S32 cur_width); -	void verifyChildControlsSizes();  	S32 processWidthDecreased(S32 delta_width);  	void processWidthIncreased(S32 delta_width);  	void log(LLView* panel, const std::string& descr); diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index e8812d87ee..0b10255c2f 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -51,7 +51,7 @@  #include "llagent.h"  #include "llbutton.h" -//#include "llinventory.h" +#include "llinventoryobserver.h"  #include "llinventorymodel.h"  #include "llnotify.h"  #include "llresmgr.h" diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp index 914435b640..3443d8b593 100644 --- a/indra/newview/llchannelmanager.cpp +++ b/indra/newview/llchannelmanager.cpp @@ -220,5 +220,12 @@ void LLChannelManager::removeChannelByID(const LLUUID id)  }  //-------------------------------------------------------------------------- - +void LLChannelManager::muteAllChannels(bool mute) +{ +	for (std::vector<ChannelElem>::iterator it = mChannelList.begin(); +			it != mChannelList.end(); it++) +	{ +		it->channel->setShowToasts(!mute); +	} +} diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h index b927d369cd..4b66a1ef89 100644 --- a/indra/newview/llchannelmanager.h +++ b/indra/newview/llchannelmanager.h @@ -102,6 +102,13 @@ public:  	// remove channel methods  	void	removeChannelByID(const LLUUID id); +	/** +	 * Manages toasts showing for all channels. +	 * +	 * @param mute Flag to disable/enable toasts showing. +	 */ +	void muteAllChannels(bool mute); +  private:  	LLScreenChannel* createChannel(LLChannelManager::Params& p); diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 9e290c8c04..4078fac4ec 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -797,13 +797,11 @@ LLChicletPanel::Params::Params()  	chiclet_padding = 3;  	scrolling_offset = 40; -/*  	if (!min_width.isProvided())  	{  		// min_width = 4 chiclets + 3 paddings  		min_width = 180 + 3*chiclet_padding;  	} -*/  };  LLChicletPanel::LLChicletPanel(const Params&p) diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp index 20dc4440c2..169a963d0d 100644 --- a/indra/newview/lldebugview.cpp +++ b/indra/newview/lldebugview.cpp @@ -79,7 +79,7 @@ void LLDebugView::init()  	r.set(150 - 25, rect.getHeight() - 50, rect.getWidth()/2 - 25, rect.getHeight() - 450); -	r.set(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f),  +	r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f),     									 (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));  	mFastTimerView = new LLFastTimerView(r);  	mFastTimerView->setFollowsTop(); @@ -87,7 +87,7 @@ void LLDebugView::init()  	mFastTimerView->setVisible(FALSE);			// start invisible  	addChild(mFastTimerView); -	r.set(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f),  +	r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f),   									 (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));  	LLMemoryView::Params mp;  	mp.name("memory"); diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 18135fc558..ae5be8cc7c 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -74,6 +74,7 @@ public:  		mName("(Loading...)"),  		mPosX(0),  		mPosY(0), +		mPosZ(0),  		mLoaded(false)   	{} @@ -101,6 +102,14 @@ public:  			requestNameAndPos();  		return mPosY;  	} + +	S32 getPosZ() +	{ +		if (!mLoaded) +			requestNameAndPos(); +		return mPosZ; +	} +  private:  	/**  	 * Requests landmark data from server. @@ -114,14 +123,15 @@ private:  		if(LLLandmarkActions::getLandmarkGlobalPos(mLandmarkID, g_pos))  		{  			LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(g_pos, -				boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, this, _1, _2, _3)); +				boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, this, _1, _2, _3, _4));  		}  	} -	void landmarkNameCallback(const std::string& name, S32 x, S32 y) +	void landmarkNameCallback(const std::string& name, S32 x, S32 y, S32 z)  	{  		mPosX = x;  		mPosY = y; +		mPosZ = z;  		mName = name;  		mLoaded = true;  	} @@ -130,6 +140,7 @@ private:  	std::string mName;  	S32 mPosX;  	S32 mPosY; +	S32 mPosZ;  	bool mLoaded;  }; @@ -151,7 +162,8 @@ public:  		if (!region_name.empty())  		{  			LLToolTip::Params params; -			params.message = llformat("%s\n%s (%d, %d)", getLabelSelected().c_str(), region_name.c_str(), mLandmarkInfoGetter.getPosX(), mLandmarkInfoGetter.getPosY()); +			params.message = llformat("%s\n%s (%d, %d, %d)", getLabelSelected().c_str(), region_name.c_str(),  +				mLandmarkInfoGetter.getPosX(), mLandmarkInfoGetter.getPosY(), mLandmarkInfoGetter.getPosZ());  			params.sticky_rect = calcScreenRect();  			LLToolTipMgr::instance().show(params);  		} @@ -901,7 +913,10 @@ void LLFavoritesBarCtrl::showDropDownMenu()  				menu->buildDrawLabels();  				menu->updateParent(LLMenuGL::sMenuContainer); -				menu->setButtonRect(mChevronRect, this); +				if (menu->getButtonRect().isEmpty()) +				{ +					menu->setButtonRect(mChevronRect, this); +				}  				LLMenuGL::showPopup(this, menu, getRect().getWidth() - menu->getRect().getWidth(), 0);  				return; diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index e90d13f9d5..20a324c67c 100644 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -35,6 +35,7 @@  #include "lluictrl.h" +#include "llinventoryobserver.h"  #include "llinventorymodel.h"  class LLFavoritesBarCtrl : public LLUICtrl, public LLInventoryObserver diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp index cefd7a3808..c8df6c6135 100644 --- a/indra/newview/llfloaterbuy.cpp +++ b/indra/newview/llfloaterbuy.cpp @@ -230,10 +230,6 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj,  		if (obj->getType() == LLAssetType::AT_CATEGORY)  			continue; -		// Skip root folders, so we know we have inventory items only -		if (obj->getType() == LLAssetType::AT_ROOT_CATEGORY)  -			continue; -  		// Skip the mysterious blank InventoryObject   		if (obj->getType() == LLAssetType::AT_NONE)  			continue; diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index 32802f6a20..a99d0c918d 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -187,10 +187,6 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,  		if (asset_type == LLAssetType::AT_CATEGORY)  			continue; -		// Skip root folders, so we know we have inventory items only -		if (asset_type == LLAssetType::AT_ROOT_CATEGORY)  -			continue; -  		LLInventoryItem* inv_item = (LLInventoryItem*)((LLInventoryObject*)(*it));  		inv_type = inv_item->getInventoryType(); @@ -286,7 +282,7 @@ void LLFloaterBuyContents::onClickBuy()  	// Put the items where we put new folders.  	LLUUID category_id; -	category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CATEGORY); +	category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_ROOT_INVENTORY);  	// *NOTE: doesn't work for multiple object buy, which UI does not  	// currently support sale info is used for verification only, if diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index ca0ba96a08..854d02873a 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -98,7 +98,7 @@ void LLFloaterGesture::done()  		// we load only gesture folder without childred.  		LLInventoryModel::cat_array_t* categories;  		LLInventoryModel::item_array_t* items; -		folder_ref_t unloaded_folders; +		LLInventoryFetchDescendentsObserver::folder_ref_t unloaded_folders;  		LL_DEBUGS("Gesture")<< "Get subdirs of Gesture Folder...." << LL_ENDL;  		gInventory.getDirectDescendentsOf(mGestureFolderID, categories, items);  		if (categories->empty()) diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h index 9d047bf1cf..e7819d2a03 100644 --- a/indra/newview/llfloatergesture.h +++ b/indra/newview/llfloatergesture.h @@ -39,6 +39,7 @@  #include "llfloater.h"  #include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "lldarray.h"  class LLScrollContainer; diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index 928126bff9..e0d4a59d9d 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -44,6 +44,7 @@  #include "llbutton.h"  #include "llcheckboxctrl.h"  #include "llavataractions.h" +#include "llinventoryobserver.h"  #include "llinventorymodel.h"  #include "lllineeditor.h"  //#include "llspinctrl.h" diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 3c3dfb760e..9854d2594b 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -422,10 +422,17 @@ void LLFloaterTools::refresh()  	LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount());  	childSetTextArg("prim_count", "[COUNT]", prim_count_string); +	// calculate selection rendering cost +	std::string prim_cost_string; +	LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost()); +	childSetTextArg("RenderingCost", "[COUNT]", prim_cost_string); + +  	// disable the object and prim counts if nothing selected  	bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();  	childSetEnabled("obj_count", have_selection);  	childSetEnabled("prim_count", have_selection); +	childSetEnabled("RenderingCost", have_selection);  	// Refresh child tabs  	mPanelPermissions->refresh(); @@ -556,6 +563,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)  	mBtnEdit	->setToggleState( edit_visible );  	mRadioGroupEdit->setVisible( edit_visible ); +	childSetVisible("RenderingCost", edit_visible || focus_visible || move_visible);  	if (mCheckSelectIndividual)  	{ @@ -964,6 +972,27 @@ void LLFloaterTools::onClickGridOptions()  	//floaterp->addDependentFloater(LLFloaterBuildOptions::getInstance(), FALSE);  } +S32 LLFloaterTools::calcRenderCost() +{ +	S32 cost = 0; +	for (LLObjectSelection::iterator selection_iter = LLSelectMgr::getInstance()->getSelection()->begin(); +		  selection_iter != LLSelectMgr::getInstance()->getSelection()->end(); +		  ++selection_iter) +	{ +		LLSelectNode *select_node = *selection_iter; +		if (select_node) +		{ +			LLVOVolume *viewer_volume = (LLVOVolume*)select_node->getObject(); +			if (viewer_volume) +			{ +				cost += viewer_volume->getRenderCost(); +			} +		} +	} + +	return cost; +} +  // static  void LLFloaterTools::setEditTool(void* tool_pointer)  { diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index a3e0cac034..05a88a31d3 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -121,6 +121,7 @@ private:  	static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response);  	static void setObjectType( LLPCode pcode );  	void onClickGridOptions(); +	S32 calcRenderCost();  public:  	LLButton		*mBtnFocus; diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 7d2eb98111..85847e5fce 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -51,6 +51,7 @@  #include "llfloaterreg.h"		// getTypedInstance()  #include "llfocusmgr.h"  #include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "lllandmarklist.h"  #include "lllineeditor.h"  #include "llregionhandle.h" diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 21458f83cd..4192c6a586 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -909,11 +909,7 @@ void LLFolderView::finishRenamingItem( void )  		mRenameItem->rename( mRenamer->getText() );  	} -	mRenamer->setCommitOnFocusLost( FALSE ); -	mRenamer->setFocus( FALSE ); -	mRenamer->setVisible( FALSE ); -	mRenamer->setCommitOnFocusLost( TRUE ); -	gFocusMgr.setTopCtrl( NULL ); +	gFocusMgr.setTopCtrl( NULL );	  	if( mRenameItem )  	{ diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h index 60ece75cea..473d0be912 100644 --- a/indra/newview/llfoldervieweventlistener.h +++ b/indra/newview/llfoldervieweventlistener.h @@ -34,6 +34,8 @@  #include "lldarray.h"	// JAMESDEBUG convert to std::vector  #include "llfoldertype.h"  #include "llfontgl.h"	// just for StyleFlags enum +#include "llinventorytype.h" +#include "llpermissionsflags.h"  #include "llpointer.h" diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 5db35d5f70..d39a17ca3b 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -38,7 +38,6 @@  #include "llfoldervieweventlistener.h"  #include "llinventorybridge.h"	// for LLItemBridge in LLInventorySort::operator()  #include "llinventoryfilter.h" -#include "llinventorymodel.h"	// *TODO: make it take a pointer to an inventory-model interface  #include "llviewercontrol.h"	// gSavedSettings  #include "llviewerwindow.h"		// Argh, only for setCursor() diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index 481b75cf73..ac060cef15 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -33,6 +33,7 @@  #include "llviewerprecompiledheaders.h"  #include "llinventory.h" +#include "llinventoryobserver.h"  #include "lltrans.h"  #include "llfriendcard.h" @@ -43,27 +44,24 @@  // Constants; -static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "Friends"; -static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "All"; +static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "InvFolder Friends"; +static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "InvFolder All";  // helper functions -/* -mantipov *NOTE: unable to use  -LLTrans::getString("InvFolder Friends"); or -LLTrans::getString("InvFolder FriendsAll"); -in next two functions to set localized folders' names because of there is a hack in the -LLFolderViewItem::refreshFromListener() method for protected asset types. -So, localized names will be got from the strings with "InvFolder LABEL_NAME" in the strings.xml -*/ -inline const std::string& get_friend_folder_name() +// NOTE: Usage of LLTrans::getString(); in next two functions to set localized +// folders' names is caused by a hack in the LLFolderViewItem::refreshFromListener() +// method for protected asset types. +// So, localized names will be got from the strings with "InvFolder LABEL_NAME" +// in the strings.xml +inline const std::string get_friend_folder_name()  { -	return INVENTORY_STRING_FRIENDS_SUBFOLDER; +	return LLTrans::getString(INVENTORY_STRING_FRIENDS_SUBFOLDER);  } -inline const std::string& get_friend_all_subfolder_name() +inline const std::string get_friend_all_subfolder_name()  { -	return INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER; +	return LLTrans::getString(INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER);  }  void move_from_to_arrays(LLInventoryModel::cat_array_t& from, LLInventoryModel::cat_array_t& to) @@ -80,15 +78,20 @@ const LLUUID& get_folder_uuid(const LLUUID& parentFolderUUID, LLInventoryCollect  	LLInventoryModel::cat_array_t cats;  	LLInventoryModel::item_array_t items; -	gInventory.collectDescendentsIf(parentFolderUUID, cats, items,  +	gInventory.collectDescendentsIf(parentFolderUUID, cats, items,  		LLInventoryModel::EXCLUDE_TRASH, matchFunctor); -	if (cats.count() == 1) +	S32 cats_count = cats.count(); + +	if (cats_count > 1)  	{ -		return cats.get(0)->getUUID(); +		LL_WARNS("LLFriendCardsManager") +			<< "There is more than one Friend card folder." +			<< "The first folder will be used." +			<< LL_ENDL;  	} -	return LLUUID::null; +	return (cats_count >= 1) ? cats.get(0)->getUUID() : LLUUID::null;  }  /** @@ -347,13 +350,8 @@ const LLUUID& LLFriendCardsManager::findFriendAllSubfolderUUIDImpl() const  	return findChildFolderUUID(friendFolderUUID, friendAllSubfolderName);  } -const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& folderLabel) const +const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const  { -	// mantipov *HACK: get localaized name in the same way like in the LLFolderViewItem::refreshFromListener() method. -	// be sure these both methods are synchronized. -	// see also get_friend_folder_name() and get_friend_all_subfolder_name() functions -	std::string localizedName = LLTrans::getString("InvFolder " + folderLabel); -  	LLNameCategoryCollector matchFolderFunctor(localizedName);  	return get_folder_uuid(parentFolderUUID, matchFolderFunctor); diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h index 98dc3153d0..b94d5ec2c0 100644 --- a/indra/newview/llfriendcard.h +++ b/indra/newview/llfriendcard.h @@ -120,7 +120,7 @@ private:  		return (mBuddyIDSet.end() != mBuddyIDSet.find(avatarID));  	} -	const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& folderLabel) const; +	const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const;  	const LLUUID& findFriendFolderUUIDImpl() const;  	const LLUUID& findFriendAllSubfolderUUIDImpl() const;  	const LLUUID& findFriendCardInventoryUUIDImpl(const LLUUID& avatarID); diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h index 7c3b742780..094ca13798 100644 --- a/indra/newview/llgesturemgr.h +++ b/indra/newview/llgesturemgr.h @@ -38,7 +38,7 @@  #include <vector>  #include "llassetstorage.h"	// LLAssetType -#include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "llsingleton.h"  #include "llviewerinventory.h" diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 1bc9297bba..d7be09efa9 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -892,7 +892,6 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,  			new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags);
  			break;
  		case LLAssetType::AT_CATEGORY:
 -		case LLAssetType::AT_ROOT_CATEGORY:
  			if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
  			{
  				// Create a link folder handler instead.
 @@ -1687,7 +1686,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  				// BAP - should skip if dup.
  				if (move_is_into_current_outfit)
  				{
 -					LLAppearanceManager::wearEnsemble(inv_cat);
 +					LLAppearanceManager::instance().addEnsembleLink(inv_cat);
  				}
  				else
  				{
 @@ -2044,7 +2043,7 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask)  				    mContentsCount)
  				{
  					gInventory.removeObserver(this);
 -					LLAppearanceManager::wearInventoryCategory(category, FALSE, TRUE);
 +					LLAppearanceManager::instance().wearInventoryCategory(category, FALSE, TRUE);
  					delete this;
  				}
  			}
 @@ -2089,7 +2088,7 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model  		if(!model) return;
  		LLViewerInventoryCategory* cat = getCategory();
  		if(!cat) return;
 -		LLAppearanceManager::wearEnsemble(cat,true);
 +		LLAppearanceManager::instance().addEnsembleLink(cat,true);
  		return;
  	}
  #endif
 @@ -2337,7 +2336,7 @@ void LLFolderBridge::pasteLinkFromClipboard()  			{
  				link_inventory_item(
  					gAgent.getID(),
 -					item->getUUID(),
 +					item->getLinkedUUID(),
  					parent_id,
  					item->getName(),
  					LLAssetType::AT_LINK,
 @@ -2404,7 +2403,7 @@ void LLFolderBridge::folderOptionsMenu()  		{
  			mItems.push_back(std::string("Wear As Ensemble"));
  		}
 -		mItems.push_back(std::string("Take Off Items"));
 +		mItems.push_back(std::string("Remove From Outfit"));
  	}
  	hide_context_entries(*mMenu, mItems, disabled_items);
  }
 @@ -2730,7 +2729,7 @@ void LLFolderBridge::modifyOutfit(BOOL append)  	// BAP - was:
  	// wear_inventory_category_on_avatar( cat, append );
 -	LLAppearanceManager::wearInventoryCategory( cat, FALSE, append );
 +	LLAppearanceManager::instance().wearInventoryCategory( cat, FALSE, append );
  }
  // helper stuff
 @@ -2847,10 +2846,6 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  		BOOL is_movable = TRUE;
  		switch( inv_item->getActualType() )
  		{
 -		case LLAssetType::AT_ROOT_CATEGORY:
 -			is_movable = FALSE;
 -			break;
 -
  		case LLAssetType::AT_CATEGORY:
  			is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType());
  			break;
 @@ -2953,16 +2948,16 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  				// BAP - should skip if dup.
  				if (move_is_into_current_outfit)
  				{
 -					LLAppearanceManager::wearItem(inv_item);
 +					LLAppearanceManager::instance().addItemLink(inv_item);
  				}
  				else
  				{
  					LLPointer<LLInventoryCallback> cb = NULL;
  					link_inventory_item(
  						gAgent.getID(),
 -						inv_item->getUUID(),
 +						inv_item->getLinkedUUID(),
  						mUUID,
 -						std::string(),
 +						inv_item->getName(),
  						LLAssetType::AT_LINK,
  						cb);
  				}
 @@ -3889,16 +3884,11 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model  			gMessageSystem->sendReliable( gAgent.getRegion()->getHost());
  		}
  		// this object might have been selected, so let the selection manager know it's gone now
 -		LLViewerObject *found_obj =
 -			gObjectList.findObject(item->getUUID());
 +		LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID());
  		if (found_obj)
  		{
  			LLSelectMgr::getInstance()->remove(found_obj);
  		}
 -		else
 -		{
 -			llwarns << "object not found - ignoring" << llendl;
 -		}
  	}
  	else LLItemBridge::performAction(folder, model, action);
  }
 @@ -4053,7 +4043,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		LLInventoryItem* item = getItem();
  		if (item && item->getIsLinkType())
  		{
 -			items.push_back(std::string("Goto Link"));
 +			items.push_back(std::string("Find Original"));
  		}
  		items.push_back(std::string("Properties"));
 @@ -4206,7 +4196,7 @@ void wear_inventory_item_on_avatar( LLInventoryItem* item )  		lldebugs << "wear_inventory_item_on_avatar( " << item->getName()
  				 << " )" << llendl;
 -		LLAppearanceManager::wearItem(item);
 +		LLAppearanceManager::instance().addItemLink(item);
  	}
  }
 @@ -4325,10 +4315,6 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_  				{
  					LLSelectMgr::getInstance()->remove(found_obj);
  				}
 -				else
 -				{
 -					llwarns << "object not found, ignoring" << llendl;
 -				}
  			}
  		}
 @@ -4493,7 +4479,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		if (item && item->getIsLinkType())
  		{
 -			items.push_back(std::string("Goto Link"));
 +			items.push_back(std::string("Find Original"));
  		}
  		items.push_back(std::string("Properties"));
 @@ -4771,7 +4757,7 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,  	}
  	// Find and remove this item from the COF.
 -	LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::getCOF());
 +	LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::instance().getCOF());
  	llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF.
  	for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();
  		 iter != items.end();
 @@ -5157,7 +5143,7 @@ void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	}
  	else
  	{
 -		items.push_back(std::string("Goto Link"));
 +		items.push_back(std::string("Find Original"));
  		items.push_back(std::string("Delete"));
  		if (!isItemRemovable())
  		{
 diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 3ffeb55d6c..4c7b0a0517 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -33,14 +33,16 @@  #ifndef LL_LLINVENTORYBRIDGE_H  #define LL_LLINVENTORYBRIDGE_H -#include "llfloaterproperties.h" -#include "llwearable.h" -#include "llviewercontrol.h"  #include "llcallingcard.h" -#include "llinventorymodel.h" +#include "llfloaterproperties.h"  #include "llfoldervieweventlistener.h" +#include "llinventorymodel.h" +#include "llinventoryobserver.h" +#include "llviewercontrol.h" +#include "llwearable.h"  class LLInventoryPanel; +class LLInventoryModel;  class LLMenuGL;  enum EInventoryIcon diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 4b0d524906..38a417f1a2 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -31,40 +31,25 @@   */  #include "llviewerprecompiledheaders.h" -  #include "llinventorymodel.h" -#include "llassetstorage.h" -#include "llcrc.h" -#include "lldir.h" -#include "llsys.h" -#include "llxfermanager.h" -#include "message.h" -  #include "llagent.h"  #include "llagentwearables.h" -#include "llfloater.h" -#include "llfocusmgr.h" -#include "llinventorybridge.h" -#include "llinventoryfunctions.h"  #include "llinventorypanel.h"  #include "llfloaterinventory.h" -#include "llviewerfoldertype.h" -#include "llviewerinventory.h" +#include "llinventorybridge.h" +#include "llinventoryfunctions.h" +#include "llinventoryobserver.h" +#include "llwindow.h" +#include "llviewercontrol.h" +#include "llpreview.h"   #include "llviewermessage.h" +#include "llviewerfoldertype.h"  #include "llviewerwindow.h" -#include "llviewerregion.h"  #include "llappviewer.h" -#include "lldbstrings.h" -#include "llviewerstats.h" -#include "llmutelist.h" -#include "llnotifications.h" +#include "llviewerregion.h"  #include "llcallbacklist.h" -#include "llpreview.h" -#include "llviewercontrol.h"  #include "llvoavatarself.h" -#include "llsdutil.h" -#include <deque>  //#define DIFF_INVENTORY_FILES  #ifdef DIFF_INVENTORY_FILES @@ -322,10 +307,10 @@ void LLInventoryModel::unlockDirectDescendentArrays(const LLUUID& cat_id)  // specifies 'type' as what it defaults to containing. The category is  // not necessarily only for that type. *NOTE: This will create a new  // inventory category on the fly if one does not exist. -const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bool create_folder) +const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bool create_folder, bool find_in_library)  { -	const LLUUID &rv = findCatUUID(t); -	if(rv.isNull() && isInventoryUsable() && create_folder) +	const LLUUID &rv = findCatUUID(t, find_in_library); +	if(rv.isNull() && isInventoryUsable() && (create_folder && !find_in_library))  	{  		const LLUUID &root_id = gInventory.getRootFolderID();  		if(root_id.notNull()) @@ -338,10 +323,10 @@ const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bo  // Internal method which looks for a category with the specified  // preferred type. Returns LLUUID::null if not found. -const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type) const +const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type, bool find_in_library) const  { -	const LLUUID &root_id = gInventory.getRootFolderID(); -	if(LLFolderType::FT_CATEGORY == preferred_type) +	const LLUUID &root_id = (find_in_library) ? gInventory.getLibraryRootFolderID() : gInventory.getRootFolderID(); +	if(LLFolderType::FT_ROOT_INVENTORY == preferred_type)  	{  		return root_id;  	} @@ -886,7 +871,8 @@ void LLInventoryModel::moveObject(const LLUUID& object_id, const LLUUID& cat_id)  // Delete a particular inventory object by ID.  void LLInventoryModel::deleteObject(const LLUUID& id)  { -	purgeLinkedObjects(id); +	// Disabling this; let users manually purge linked objects. +	// purgeLinkedObjects(id);  	lldebugs << "LLInventoryModel::deleteObject()" << llendl;  	LLPointer<LLInventoryObject> obj = getObject(id);  	if(obj) @@ -923,13 +909,14 @@ void LLInventoryModel::deleteObject(const LLUUID& id)  		}  		addChangedMask(LLInventoryObserver::REMOVE, id);  		obj = NULL; // delete obj +		gInventory.notifyObservers();  	}  }  // Delete a particular inventory item by ID, and remove it from the server.  void LLInventoryModel::purgeObject(const LLUUID &id)  { -	lldebugs << "LLInventoryModel::purgeObject()" << llendl; +	lldebugs << "LLInventoryModel::purgeObject() [ id: " << id << " ] " << llendl;  	LLPointer<LLInventoryObject> obj = getObject(id);  	if(obj)  	{ @@ -2463,7 +2450,7 @@ void LLInventoryModel::buildParentChildMap()  			{  				cat->setParent(findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND));  			} -			else if(LLFolderType::FT_CATEGORY == pref) +			else if(LLFolderType::FT_ROOT_INVENTORY == pref)  			{  				// it's the root  				cat->setParent(LLUUID::null); @@ -3343,7 +3330,7 @@ void LLInventoryModel::processInventoryDescendents(LLMessageSystem* msg,void**)  		// If the item has already been added (e.g. from link prefetch), then it doesn't need to be re-added.  		if (gInventory.getItem(titem->getUUID()))  		{ -			llinfos << "Skipping prefetched item [ Name: " << titem->getName() << " | Type: " << titem->getActualType() << " | ItemUUID: " << titem->getUUID() << " ] " << llendl; +			lldebugs << "Skipping prefetched item [ Name: " << titem->getName() << " | Type: " << titem->getActualType() << " | ItemUUID: " << titem->getUUID() << " ] " << llendl;  			continue;  		}  		gInventory.updateItem(titem); diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index bd64591194..aa4ffb392f 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -46,11 +46,6 @@  #include <string>  #include <vector> -// ! REFACTOR ! Remove llinventoryobservers.h and have other files that need it explicitly  -// include llinventoryobservers.h instead of llinventorymodel.h .  This will reduce dependency on -// llinventorymodel.h. -#include "llinventoryobserver.h"  -  class LLInventoryObserver;  class LLInventoryObject;  class LLInventoryItem; @@ -252,13 +247,12 @@ public:  	// findCategoryUUIDForType() returns the uuid of the category that  	// specifies 'type' as what it defaults to containing. The -	// category is not necessarily only for that type. *NOTE: This -	// will create a new inventory category on the fly if one does not -	// exist. - +	// category is not necessarily only for that type. *NOTE: If create_folder is true, this +	// will create a new inventory category on the fly if one does not exist. *NOTE: if find_in_library is +	// true it will search in the user's library folder instead of "My Inventory"  	// SDK: Added flag to specify whether the folder should be created if not found.  This fixes the horrible  	// multiple trash can bug. -	const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true); +	const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true, bool find_in_library = false);  	// Call this method when it's time to update everyone on a new  	// state, by default, the inventory model will not update @@ -409,7 +403,7 @@ protected:  	//   	// Internal method which looks for a category with the specified  	// preferred type. Returns LLUUID::null if not found - 	const LLUUID &findCatUUID(LLFolderType::EType preferred_type) const; + 	const LLUUID &findCatUUID(LLFolderType::EType preferred_type, bool find_in_library = false) const;  	// Empty the entire contents  	void empty(); diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 97f90ac845..3a8b8bdf9e 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -38,55 +38,16 @@  // Seraph TODO: Remove unnecessary headers
 -// library includes
  #include "llagent.h"
  #include "llagentwearables.h"
 -#include "llcallingcard.h"
 -#include "llfloaterreg.h"
 -#include "llsdserialize.h"
 -#include "llfiltereditor.h"
 -#include "llspinctrl.h"
 -#include "llui.h"
 -#include "message.h"
 -
 -// newview includes
  #include "llappearancemgr.h"
 -#include "llappviewer.h"
 -#include "llfirstuse.h"
 -#include "llfloaterchat.h"
 -#include "llfloatercustomize.h"
 -#include "llfocusmgr.h"
 -#include "llfolderview.h"
 -#include "llgesturemgr.h"
 -#include "lliconctrl.h"
 +#include "llfloaterreg.h"
  #include "llimview.h"
  #include "llinventorybridge.h"
 -#include "llinventoryclipboard.h"
 -#include "llinventorymodel.h"
 -#include "lllineeditor.h"
 -#include "llmenugl.h"
 -#include "llpreviewanim.h"
 -#include "llpreviewgesture.h"
 -#include "llpreviewnotecard.h"
 -#include "llpreviewscript.h"
 -#include "llpreviewsound.h"
 -#include "llpreviewtexture.h"
 -#include "llresmgr.h"
 -#include "llscrollbar.h"
  #include "llscrollcontainer.h"
 -#include "llselectmgr.h"
 -#include "lltabcontainer.h"
 -#include "lltooldraganddrop.h"
 -#include "lluictrlfactory.h"
  #include "llviewerfoldertype.h"
 -#include "llviewerinventory.h"
 -#include "llviewermessage.h"
 -#include "llviewerobjectlist.h"
 -#include "llviewerregion.h"
 -#include "llviewerwindow.h"
 -#include "llvoavatarself.h"
 -#include "llwearablelist.h"
  #include "llimfloater.h"
 +#include "llvoavatarself.h"
  static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel");
 @@ -303,7 +264,7 @@ void LLInventoryPanel::modelChanged(U32 mask)  		return;
  	}
 -	if(mask & LLInventoryObserver::LABEL)
 +	if (mask & LLInventoryObserver::LABEL)
  	{
  		handled = true;
  		// label change - empty out the display name for each object
 @@ -328,9 +289,15 @@ void LLInventoryPanel::modelChanged(U32 mask)  			}
  		}
  	}
 -	if((mask & (LLInventoryObserver::STRUCTURE
 -				| LLInventoryObserver::ADD
 -				| LLInventoryObserver::REMOVE)) != 0)
 +
 +	// We don't really care which of these masks the item is actually flagged with, since the masks
 +	// may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
 +	// Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
 +	// panel).  What's relevant is that the item and UI are probably out of sync and thus need to be
 +	// resynchronized.
 +	if (mask & (LLInventoryObserver::STRUCTURE |
 +				LLInventoryObserver::ADD |
 +				LLInventoryObserver::REMOVE))
  	{
  		handled = true;
  		// Record which folders are open by uuid.
 @@ -347,74 +314,56 @@ void LLInventoryPanel::modelChanged(U32 mask)  				LLInventoryObject* model_item = model->getObject(*id_it);
  				LLFolderViewItem* view_item = mFolders->getItemByID(*id_it);
 -				if (model_item)
 +				// Item exists in memory but a UI element hasn't been created for it.
 +				if (model_item && !view_item)
  				{
 -					if (!view_item)
 +					// Add the UI element for this item.
 +					buildNewViews(*id_it);
 +					// Select any newly created object that has the auto rename at top of folder root set.
 +					if(mFolders->getRoot()->needsAutoRename())
  					{
 -						// this object was just created, need to build a view for it
 -						if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD)
 -						{
 -							llwarns << *id_it << " is in model but not in view, but ADD flag not set" << llendl;
 -						}
 -						buildNewViews(*id_it);
 -						
 -						// select any newly created object
 -						// that has the auto rename at top of folder
 -						// root set
 -						if(mFolders->getRoot()->needsAutoRename())
 -						{
 -							setSelection(*id_it, FALSE);
 -						}
 +						setSelection(*id_it, FALSE);
  					}
 -					else
 -					{
 -						// this object was probably moved, check its parent
 -						if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE)
 -						{
 -							llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << " for model (Name :" << model_item->getName() << " )" << llendl;
 -						}
 +				}
 -						LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
 +				// This item already exists in both memory and UI.  It was probably moved
 +				// around in the panel's directory structure (i.e. reparented).
 +				if (model_item && view_item)
 +				{
 +					LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
 -						// added check against NULL for cases when Inventory panel contains startFolder.
 -						// in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself.
 -						// this check is a fix for bug EXT-1859.
 -						if (NULL != new_parent && view_item->getParentFolder() != new_parent)
 +					// Item has been moved.
 +					if (view_item->getParentFolder() != new_parent)
 +					{
 +						if (new_parent != NULL)
  						{
 +							// Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
  							view_item->getParentFolder()->extractItem(view_item);
  							view_item->addToFolder(new_parent, mFolders);
  						}
 -/*
 -						 on the other side in case Inventory Panel has content of the any folder
 -						 it is possible that item moved to some folder which is absent in current
 -						 Panel. For ex. removing item (via moving to trash).
 -						 In this case we need to check if new parent is other then inventory start folder
 -						 and simply remove its View from the hierarchy.
 -						 See details in EXT-2098.
 -*/
 -						// So, let check if item was moved into folder out of this Inventory Panel.
 -						else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID)
 -						{
 -							view_item->getParentFolder()->extractItem(view_item);
 -						}
 -					}
 -				}
 -				else
 -				{
 -					if (view_item)
 -					{
 -						if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE)
 +						else 
  						{
 -							llwarns << *id_it << " is not in model but in view, but REMOVE flag not set" << llendl;
 +							// Item is to be moved outside the panel's directory (e.g. moved to trash for a panel that 
 +							// doesn't include trash).  Just remove the item's UI.
 +							view_item->destroyView();
  						}
 -						// item in view but not model, need to delete view
 -						view_item->destroyView();
  					}
  					else
  					{
 -						llwarns << *id_it << "Item does not exist in either view or model, but notification triggered" << llendl;
 +						// Hmm, we got an ADD/REMOVE/STRUCTURE notification for this item but there's nothing to be done to it.
 +						llwarns << "Notification triggered for item that isn't changing.  "
 +								<< "Operation: ( mask: " << mask << " panel name: " << mStartFolderString << " ) "
 +								<< "Item: [ Name:" << model_item->getName() << " UUID: " << *id_it << " ]" << llendl;
 +						
  					}
  				}
 +
 +				// This item has been removed from memory, but its associated UI element still exists.
 +				if (!model_item && view_item)
 +				{
 +					// Remove the item's UI.
 +					view_item->destroyView();
 +				}
  			}
  		}
  	}
 @@ -697,7 +646,7 @@ void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_foc  {
  	// Don't select objects in COF (e.g. to prevent refocus when items are worn).
  	const LLInventoryObject *obj = gInventory.getObject(obj_id);
 -	if (obj && obj->getParentUUID() == LLAppearanceManager::getCOF())
 +	if (obj && obj->getParentUUID() == LLAppearanceManager::instance().getCOF())
  	{
  		return;
  	}
 diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp index d7eaad94f0..0acc67ff5a 100644 --- a/indra/newview/lljoystickbutton.cpp +++ b/indra/newview/lljoystickbutton.cpp @@ -134,15 +134,17 @@ void LLJoystick::updateSlop()  	return;  } -BOOL LLJoystick::pointInCircle(S32 x, S32 y) const  +bool LLJoystick::pointInCircle(S32 x, S32 y) const   {  -	//cnt is x and y coordinates of center of joystick circle, and also its radius, -	//because area is not just rectangular, it's a square! -	//Make sure to change method if this changes. -	int cnt = this->getLocalRect().mTop/2; -	if((x-cnt)*(x-cnt)+(y-cnt)*(y-cnt)<=cnt*cnt) +	if(this->getLocalRect().mTop!=this->getLocalRect().mRight) +	{ +		llwarns << "Joystick shape is not square"<<llendl;  		return TRUE; -	return FALSE; +	} +	//center is x and y coordinates of center of joystick circle, and also its radius +	int center = this->getLocalRect().mTop/2; +	bool in_circle = (x - center) * (x - center) + (y - center) * (y - center) <= center * center; +	return in_circle;  }  BOOL LLJoystick::handleMouseDown(S32 x, S32 y, MASK mask) @@ -150,7 +152,7 @@ BOOL LLJoystick::handleMouseDown(S32 x, S32 y, MASK mask)  	//llinfos << "joystick mouse down " << x << ", " << y << llendl;  	bool handles = false; -	if(handles = pointInCircle(x, y)) +	if(pointInCircle(x, y))  	{  		mLastMouse.set(x, y);  		mFirstMouse.set(x, y); diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h index 0465f78031..2b071a8999 100644 --- a/indra/newview/lljoystickbutton.h +++ b/indra/newview/lljoystickbutton.h @@ -79,7 +79,13 @@ public:  	static void		onBtnHeldDown(void *userdata);		// called by llbutton callback handler  	void            setInitialQuadrant(EJoystickQuadrant initial) { mInitialQuadrant = initial; }; -	BOOL			pointInCircle(S32 x, S32 y) const; +	/** +	 * Checks if click location is inside joystick circle. +	 * +	 * Image containing circle is square and this square has adherent points with joystick +	 * circle. Make sure to change method according to shape other than square.  +	 */ +	bool			pointInCircle(S32 x, S32 y) const;  	static std::string nameFromQuadrant(const EJoystickQuadrant quadrant);  	static EJoystickQuadrant quadrantFromName(const std::string& name); diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp index e0dc1b6f0f..003afafa87 100644 --- a/indra/newview/lllandmarkactions.cpp +++ b/indra/newview/lllandmarkactions.cpp @@ -324,7 +324,7 @@ void LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(const LLVector3d& gl  	{  		LLVector3 pos = sim_infop->getLocalPos(global_pos);  		std::string name = sim_infop->getName() ; -		cb(name, llround(pos.mV[VX]), llround(pos.mV[VY])); +		cb(name, llround(pos.mV[VX]), llround(pos.mV[VY]),llround(pos.mV[VZ]));  	}  	else  	{ @@ -368,7 +368,7 @@ void LLLandmarkActions::onRegionResponseNameAndCoords(region_name_and_coords_cal  	{  		LLVector3 local_pos = sim_infop->getLocalPos(global_pos);  		std::string name = sim_infop->getName() ; -		cb(name, llround(local_pos.mV[VX]), llround(local_pos.mV[VY])); +		cb(name, llround(local_pos.mV[VX]), llround(local_pos.mV[VY]), llround(local_pos.mV[VZ]));  	}  } diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h index 1c524c820c..c65b831f3e 100644 --- a/indra/newview/lllandmarkactions.h +++ b/indra/newview/lllandmarkactions.h @@ -43,7 +43,7 @@ class LLLandmarkActions  {  public:  	typedef boost::function<void(std::string& slurl)> slurl_callback_t; -	typedef boost::function<void(std::string& slurl, S32 x, S32 y)> region_name_and_coords_callback_t; +	typedef boost::function<void(std::string& slurl, S32 x, S32 y, S32 z)> region_name_and_coords_callback_t;  	/**  	 * @brief Fetches landmark LLViewerInventoryItems for the given landmark name.  diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 8fe317a292..7e35cfa04c 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -45,7 +45,7 @@  #include "lltooltip.h"  // newview includes -#include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "lllandmarkactions.h"  #include "lllandmarklist.h"  #include "lllocationhistory.h" diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 8f29f908e5..90c009887d 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -92,6 +92,7 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :  	mStretchToFill( true ),  	mMaintainAspectRatio ( true ),  	mHideLoading (false), +	mHidingInitialLoad (false),  	mDecoupleTextureSize ( false ),  	mTextureWidth ( 1024 ),  	mTextureHeight ( 1024 ) @@ -616,6 +617,11 @@ bool LLMediaCtrl::ensureMediaSourceExists()  			mMediaSource->setHomeURL(mHomePageUrl);  			mMediaSource->setVisible( getVisible() );  			mMediaSource->addObserver( this ); + +			if(mHideLoading) +			{ +				mHidingInitialLoad = true; +			}  		}  		else  		{ @@ -685,7 +691,13 @@ void LLMediaCtrl::draw()  	{  		setFrequentUpdates( false );  	}; - +	 +	if(mHidingInitialLoad) +	{ +		// If we're hiding loading, don't draw at all. +		return; +	} +	  	// alpha off for this  	LLGLSUIDefault gls_ui;  	LLGLDisable gls_alphaTest( GL_ALPHA_TEST ); @@ -865,19 +877,15 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)  		case MEDIA_EVENT_NAVIGATE_BEGIN:  		{  			LL_DEBUGS("Media") <<  "Media event:  MEDIA_EVENT_NAVIGATE_BEGIN, url is " << self->getNavigateURI() << LL_ENDL; -			if(mMediaSource && mHideLoading) -			{ -				mMediaSource->suspendUpdates(true); -			}  		};  		break;  		case MEDIA_EVENT_NAVIGATE_COMPLETE:  		{  			LL_DEBUGS("Media") <<  "Media event:  MEDIA_EVENT_NAVIGATE_COMPLETE, result string is: " << self->getNavigateResultString() << LL_ENDL; -			if(mMediaSource && mHideLoading) +			if(mHidingInitialLoad)  			{ -				mMediaSource->suspendUpdates(false); +				mHidingInitialLoad = false;  			}  		};  		break; diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 76ddc61ebf..f07513a3fd 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -188,6 +188,7 @@ public:  		bool mStretchToFill;  		bool mMaintainAspectRatio;  		bool mHideLoading; +		bool mHidingInitialLoad;  		bool mDecoupleTextureSize;  		S32 mTextureWidth;  		S32 mTextureHeight; diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 85db69174d..029019a8dc 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -203,5 +203,12 @@ void LLNearbyChat::getAllowedRect(LLRect& rect)  {  	rect = gViewerWindow->getWorldViewRectRaw();  } - +void LLNearbyChat::setMinimized	(BOOL minimize) +{ +	if(minimize && !isDocked()) +	{ +		setVisible(FALSE); +	} +	LLDockableFloater::setMinimized(minimize); +} diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index 3303c388af..1f4e57cf89 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -56,6 +56,7 @@ public:  	/*virtual*/ void	onOpen	(const LLSD& key);  	virtual void setRect		(const LLRect &rect); +	virtual void setMinimized	(BOOL minimize);  private:  	virtual void    applySavedVariables(); diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 333646d2c5..8fb4ea4211 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -252,19 +252,6 @@ bool LLNearbyChatBar::instanceExists()  void LLNearbyChatBar::draw()  { -// TODO: mantipov: remove -/* -	LLRect rect = getRect(); -	S32 max_width = getMaxWidth(); - -	if (rect.getWidth() > max_width) -	{ -		rect.setLeftTopAndSize(rect.mLeft, rect.mTop, max_width, rect.getHeight()); -		reshape(rect.getWidth(), rect.getHeight(), FALSE); -		setRect(rect); -	} -*/ -  	displaySpeakingIndicator();  	LLPanel::draw();  } diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp index fc6fb25644..26730e1f10 100644 --- a/indra/newview/llnotificationgrouphandler.cpp +++ b/indra/newview/llnotificationgrouphandler.cpp @@ -37,6 +37,7 @@  #include "llgroupactions.h"  #include "llviewercontrol.h"  #include "llviewerwindow.h" +#include "llnotificationmanager.h"  using namespace LLNotificationsUI; @@ -47,6 +48,9 @@ LLGroupHandler::LLGroupHandler(e_notification_type type, const LLSD& id)  	// Getting a Channel for our notifications  	mChannel = LLChannelManager::getInstance()->createNotificationChannel(); +	LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel); +	if(channel) +		channel->setOnRejectToastCallback(boost::bind(&LLGroupHandler::onRejectToast, this, _1));  }  //-------------------------------------------------------------------------- @@ -118,5 +122,15 @@ void LLGroupHandler::onDeleteToast(LLToast* toast)  }  //-------------------------------------------------------------------------- +void LLGroupHandler::onRejectToast(LLUUID& id) +{ +	LLNotificationPtr notification = LLNotifications::instance().find(id); + +	if (notification && LLNotificationManager::getInstance()->getHandlerForNotification(notification->getType()) == this) +	{ +		LLNotifications::instance().cancel(notification); +	} +} +//-------------------------------------------------------------------------- diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index 23998a0e5d..42cc7cacc2 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -209,6 +209,9 @@ public:  protected:  	virtual void onDeleteToast(LLToast* toast);  	virtual void initChannel(); + +	// own handlers +	void onRejectToast(LLUUID& id);  };  /** diff --git a/indra/newview/llpanelappearancetab.h b/indra/newview/llpanelappearancetab.h index 8a9ba66ec0..c2f8dbd074 100644 --- a/indra/newview/llpanelappearancetab.h +++ b/indra/newview/llpanelappearancetab.h @@ -53,12 +53,8 @@ public:  	bool isTabVisible(); // Check if parent TabContainer is visible. -	void setPanelAppearanceButtons(LLPanelAppearance* panel); -  protected: -	LLButton*				mWearBtn; -	LLButton*				mEditBtn;  	LLPanelAppearance*		mParent;  }; diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 3b54f1546e..2254684f21 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -41,6 +41,7 @@  #include "llimview.h"  #include "lltexteditor.h"  #include "lltexturectrl.h" +#include "lltoggleablemenu.h"  #include "lltooldraganddrop.h"  #include "llscrollcontainer.h"  #include "llavatariconctrl.h" @@ -333,8 +334,14 @@ BOOL LLPanelAvatarProfile::postBuild()  	childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIMButtonClick,this)),NULL);  	childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this)),NULL);  	childSetCommitCallback("teleport",(boost::bind(&LLPanelAvatarProfile::onTeleportButtonClick,this)),NULL); +	childSetCommitCallback("overflow_btn", boost::bind(&LLPanelAvatarProfile::onOverflowButtonClicked, this), NULL);  	childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this)),NULL); +	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; +	registrar.add("Profile.Pay",  boost::bind(&LLPanelAvatarProfile::pay, this)); + +	mProfileMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +  	LLTextureCtrl* pic = getChild<LLTextureCtrl>("2nd_life_pic");  	pic->setFallbackImageName("default_profile_picture.j2c"); @@ -513,6 +520,11 @@ void LLPanelAvatarProfile::fillAccountStatus(const LLAvatarData* avatar_data)  	childSetValue("acc_status_text", caption_text);  } +void LLPanelAvatarProfile::pay() +{ +	LLAvatarActions::pay(getAvatarId()); +} +  void LLPanelAvatarProfile::onUrlTextboxClicked(const std::string& url)  {  	LLWeb::loadURL(url); @@ -552,6 +564,23 @@ void LLPanelAvatarProfile::onShareButtonClick()  	//*TODO not implemented  } +void LLPanelAvatarProfile::onOverflowButtonClicked() +{ +	if (!mProfileMenu->toggleVisibility()) +		return; + +	LLView* btn = getChild<LLView>("overflow_btn"); + +	if (mProfileMenu->getButtonRect().isEmpty()) +	{ +		mProfileMenu->setButtonRect(btn); +	} +	mProfileMenu->updateParent(LLMenuGL::sMenuContainer); + +	LLRect rect = btn->getRect(); +	LLMenuGL::showPopup(this, mProfileMenu, rect.mRight, rect.mTop); +} +  //////////////////////////////////////////////////////////////////////////  //////////////////////////////////////////////////////////////////////////  ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h index ae0b8e9844..a0caf0c915 100644 --- a/indra/newview/llpanelavatar.h +++ b/indra/newview/llpanelavatar.h @@ -38,6 +38,7 @@  class LLComboBox;  class LLLineEditor; +class LLToggleableMenu;  enum EOnlineStatus  { @@ -160,12 +161,17 @@ protected:  	 * Fills Avatar's online status.  	 */  	virtual void fillOnlineStatus(const LLAvatarData* avatar_data); -	 +  	/**  	 * Fills account status.  	 */  	virtual void fillAccountStatus(const LLAvatarData* avatar_data); +	/** +	 * Opens "Pay Resident" dialog. +	 */ +	void pay(); +  	void onUrlTextboxClicked(const std::string& url);  	void onHomepageTextboxClicked();  	void onAddFriendButtonClick(); @@ -173,10 +179,12 @@ protected:  	void onCallButtonClick();  	void onTeleportButtonClick();  	void onShareButtonClick(); +	void onOverflowButtonClicked();  private: -	std::string mGroups; +	std::string 			mGroups; +	LLToggleableMenu*		mProfileMenu;  };  /** diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index 9cd949c9cc..00502341fc 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -43,6 +43,7 @@  #include "llparticipantlist.h"  #include "llimview.h"  #include "llvoicechannel.h" +#include "llsidetray.h"  void LLPanelChatControlPanel::onCallButtonClicked()  { @@ -158,7 +159,8 @@ void LLPanelIMControlPanel::onAddFriendButtonClicked()  void LLPanelIMControlPanel::onShareButtonClicked()  { -	// *TODO: Implement +	LLSD key; +	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);  }  void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id) diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 29e9baa6cf..fbc0f09c50 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -35,7 +35,8 @@  #define LL_LLPANELMAININVENTORY_H
  #include "llpanel.h"
 -#include "llinventorymodel.h"
 +#include "llinventoryobserver.h"
 +
  #include "llfolderview.h"
  class LLFolderViewItem;
 diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index ca87ebf5a2..709525d4e2 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -54,6 +54,7 @@  #include "llfriendcard.h"  #include "llgroupactions.h"  #include "llgrouplist.h" +#include "llinventoryobserver.h"  #include "llpanelpeoplemenus.h"  #include "llrecentpeople.h"  #include "llviewercontrol.h"		// for gSavedSettings @@ -447,6 +448,7 @@ LLPanelPeople::LLPanelPeople()  	mFriendListUpdater = new LLFriendListUpdater(boost::bind(&LLPanelPeople::updateFriendList,	this));  	mNearbyListUpdater = new LLNearbyListUpdater(boost::bind(&LLPanelPeople::updateNearbyList,	this));  	mRecentListUpdater = new LLRecentListUpdater(boost::bind(&LLPanelPeople::updateRecentList,	this)); +	mCommitCallbackRegistrar.add("People.addFriend", boost::bind(&LLPanelPeople::onAddFriendButtonClicked, this));  }  LLPanelPeople::~LLPanelPeople() @@ -546,7 +548,6 @@ BOOL LLPanelPeople::postBuild()  		boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _2, mOnlineFriendList));  	buttonSetAction("view_profile_btn",	boost::bind(&LLPanelPeople::onViewProfileButtonClicked,	this)); -	buttonSetAction("add_friend_btn",	boost::bind(&LLPanelPeople::onAddFriendButtonClicked,	this));  	buttonSetAction("group_info_btn",	boost::bind(&LLPanelPeople::onGroupInfoButtonClicked,	this));  	buttonSetAction("chat_btn",			boost::bind(&LLPanelPeople::onChatButtonClicked,		this));  	buttonSetAction("im_btn",			boost::bind(&LLPanelPeople::onImButtonClicked,			this)); @@ -706,7 +707,7 @@ void LLPanelPeople::updateButtons()  	bool nearby_tab_active	= (cur_tab == NEARBY_TAB_NAME);  	bool friends_tab_active = (cur_tab == FRIENDS_TAB_NAME);  	bool group_tab_active	= (cur_tab == GROUP_TAB_NAME); -	bool recent_tab_active	= (cur_tab == RECENT_TAB_NAME); +	//bool recent_tab_active	= (cur_tab == RECENT_TAB_NAME);  	LLUUID selected_id;  	std::vector<LLUUID> selected_uuids; @@ -716,7 +717,6 @@ void LLPanelPeople::updateButtons()  	buttonSetVisible("group_info_btn",		group_tab_active);  	buttonSetVisible("chat_btn",			group_tab_active); -	buttonSetVisible("add_friend_btn",		nearby_tab_active || recent_tab_active);  	buttonSetVisible("view_profile_btn",	!group_tab_active);  	buttonSetVisible("im_btn",				!group_tab_active);  	buttonSetVisible("call_btn",			!group_tab_active); @@ -749,7 +749,9 @@ void LLPanelPeople::updateButtons()  			is_friend = LLAvatarTracker::instance().getBuddyInfo(selected_id) != NULL;  		} -		childSetEnabled("add_friend_btn",	!is_friend); +		LLPanel* cur_panel = mTabContainer->getCurrentPanel(); +		if (cur_panel) +			cur_panel->childSetEnabled("add_friend_btn", !is_friend);  	}  	buttonSetEnabled("teleport_btn",		friends_tab_active && item_selected && isFriendOnline(selected_uuids.front())); diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 6905c7e546..04b4226f82 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -346,11 +346,18 @@ void LLPanelPicks::onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab)  void LLPanelPicks::onOverflowButtonClicked()  { -	LLRect rect; -	childGetRect(XML_BTN_OVERFLOW, rect); +	if (!mOverflowMenu->toggleVisibility()) +		return; + +	LLView* btn = getChild<LLView>(XML_BTN_OVERFLOW); +	if (mOverflowMenu->getButtonRect().isEmpty()) +	{ +		mOverflowMenu->setButtonRect(btn); +	}  	mOverflowMenu->updateParent(LLMenuGL::sMenuContainer); -	mOverflowMenu->setButtonRect(rect, this); + +	LLRect rect = btn->getRect();  	LLMenuGL::showPopup(this, mOverflowMenu, rect.mRight, rect.mTop);  } diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 61501cc1b1..0c7cc9af38 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -542,16 +542,16 @@ void LLPanelPlaceProfile::updateCovenantText(const std::string &text)  void LLPanelPlaceProfile::onForSaleBannerClick()  {  	LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance(); -	LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection(); +	LLParcel* parcel = mgr->getFloatingParcelSelection()->getParcel();  	LLViewerRegion* selected_region =  mgr->getSelectionRegion(); -	if(!hParcel.isNull() && selected_region) +	if(parcel && selected_region)  	{ -		if(hParcel->getParcel()->getLocalID() == mSelectedParcelID && +		if(parcel->getLocalID() == mSelectedParcelID &&  				mLastSelectedRegionID ==selected_region->getRegionID())  		{ -			if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0) +			if(parcel->getSalePrice() - gStatusBar->getBalance() > 0)  			{ -				LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice()); +				LLFloaterBuyCurrency::buyCurrency("Buying selected land ", parcel->getSalePrice());  			}  			else  			{ diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 3d0fba9426..eb10d97b37 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -601,9 +601,12 @@ void LLPanelPlaces::onOverflowButtonClicked()  	if (!menu->toggleVisibility())  		return; +	if (menu->getButtonRect().isEmpty()) +	{ +		menu->setButtonRect(mOverflowBtn); +	}  	menu->updateParent(LLMenuGL::sMenuContainer);  	LLRect rect = mOverflowBtn->getRect(); -	menu->setButtonRect(rect, this);  	LLMenuGL::showPopup(this, menu, rect.mRight, rect.mTop);  } diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h index 506c135ca6..3b9f7f9882 100644 --- a/indra/newview/llpreview.h +++ b/indra/newview/llpreview.h @@ -37,7 +37,7 @@  #include "llresizehandle.h"  #include "llpointer.h"  #include "lluuid.h" -#include "llinventorymodel.h"	// LLInventoryObserver +#include "llinventoryobserver.h"  #include <map>  class LLInventoryItem; diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index a00f580e32..28a409d3ee 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -41,7 +41,6 @@  #include "lliconctrl.h"  #include "llframetimer.h" -  class LLMessageSystem;  class LLTextEditor;  class LLButton; @@ -52,6 +51,7 @@ struct 	LLEntryAndEdCore;  class LLMenuBarGL;  class LLFloaterScriptSearch;  class LLKeywordToken; +class LLViewerInventoryItem;  // Inner, implementation class.  LLPreviewScript and LLLiveLSLEditor each own one of these.  class LLScriptEdCore : public LLPanel diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 9d2960fbed..a3efea7b7e 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -41,6 +41,7 @@  #include "llfloaterreg.h"
  #include "llgroupactions.h"
  #include "llinventorymodel.h"
 +#include "llinventoryobserver.h"
  #include "lllineeditor.h"
  #include "llradiogroup.h"
  #include "llviewercontrol.h"
 diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 70dc04f575..7711f3c733 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -673,6 +673,24 @@ LLPanel*	LLSideTray::showPanel		(const std::string& panel_name, const LLSD& para  	return NULL;  } +LLPanel*	LLSideTray::getPanel		(const std::string& panel_name) +{ +	child_vector_const_iter_t child_it; +	for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) +	{ +		LLView* view = (*child_it)->findChildView(panel_name,true); +		if(view) +		{ +			LLPanel* panel = dynamic_cast<LLPanel*>(view); +			if(panel) +			{ +				return panel; +			} +		} +	} +	return NULL; +} +  // *TODO: Eliminate magic constants.  static const S32	fake_offset = 132;  static const S32	fake_top_offset = 18; diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 8b30199c45..54652c1108 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -36,8 +36,8 @@  #include "llpanel.h"  #include "string" -class LLSideTrayTab;  class LLAccordionCtrl; +class LLSideTrayTab;  // added inheritance from LLDestroyClass<LLSideTray> to enable Side Tray perform necessary actions   // while disconnecting viewer in LLAppViewer::disconnectViewer(). @@ -97,6 +97,11 @@ public:      LLPanel*	showPanel		(const std::string& panel_name, const LLSD& params);  	/* +	 * get the panel (don't show it or do anything else with it) +	 */ +    LLPanel*	getPanel		(const std::string& panel_name); + +	/*       * collapse SideBar, hiding visible tab and moving tab buttons       * to the right corner of the screen       */ diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 696b0d9af1..d36ff1605e 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2633,10 +2633,10 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,  	}  	else  	{ -		LLAppearanceManager::wearOutfitByName(outfit_folder_name); +		LLAppearanceManager::instance().wearOutfitByName(outfit_folder_name);  	} -	LLAppearanceManager::wearOutfitByName(gestures); -	LLAppearanceManager::wearOutfitByName(COMMON_GESTURES_FOLDER); +	LLAppearanceManager::instance().wearOutfitByName(gestures); +	LLAppearanceManager::instance().wearOutfitByName(COMMON_GESTURES_FOLDER);  	// This is really misnamed -- it means we have started loading  	// an outfit/shape that will give the avatar a gender eventually. JC diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index 2fb6550107..eada387945 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -90,9 +90,9 @@ BOOL LLSysWellWindow::postBuild()  void LLSysWellWindow::setMinimized(BOOL minimize)  {  	// we don't show empty Message Well window -	if (!minimize) +	if (!minimize && isWindowEmpty())  	{ -		setVisible(!isWindowEmpty()); +		return;  	}  	LLDockableFloater::setMinimized(minimize); @@ -268,8 +268,11 @@ void LLSysWellWindow::toggleWindow()  	{  		setVisible(FALSE);  	} -	//set window in foreground -	setFocus(getVisible()); +	else if(!isDocked()) +	{ +		// bring to front undocked floater +		setVisible(TRUE); +	}  }  //--------------------------------------------------------------------------------- diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 9be342c424..c33c652935 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -834,9 +834,9 @@ bool LLTextureCache::updateTextureEntryList(const LLUUID& id, S32 bodysize)  			S32 idx = openAndReadEntry(id, entry, false);  			if (idx < 0)  			{ -				// TODO: change to llwarns -				llerrs << "Failed to open entry: " << id << llendl; -				removeFromCache(id); +				llwarns << "Failed to open entry: " << id << llendl;	 +				removeHeaderCacheEntry(id); +				LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());  				return false;  			}			  			else if (oldbodysize != entry.mBodySize) @@ -1002,7 +1002,7 @@ void LLTextureCache::closeHeaderEntriesFile()  void LLTextureCache::readEntriesHeader()  {  	// mHeaderEntriesInfo initializes to default values so safe not to read it -		llassert_always(mHeaderAPRFile == NULL); +	llassert_always(mHeaderAPRFile == NULL);  	if (LLAPRFile::isExist(mHeaderEntriesFileName, getLocalAPRFilePool()))  	{  		LLAPRFile::readEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo), @@ -1192,7 +1192,7 @@ void LLTextureCache::writeEntriesAndClose(const std::vector<Entry>& entries)  // Called from either the main thread or the worker thread  void LLTextureCache::readHeaderCache()  { -	LLMutexLock lock(&mHeaderMutex); +	mHeaderMutex.lock();  	mLRU.clear(); // always clear the LRU @@ -1212,28 +1212,29 @@ void LLTextureCache::readHeaderCache()  		if (num_entries)  		{  			U32 empty_entries = 0; -			typedef std::pair<U32, LLUUID> lru_data_t; +			typedef std::pair<U32, S32> lru_data_t;  			std::set<lru_data_t> lru; -			std::vector<LLUUID> purge_list; +			std::set<LLUUID> purge_list;  			for (U32 i=0; i<num_entries; i++)  			{  				Entry& entry = entries[i];  				const LLUUID& id = entry.mID;  				if (entry.mImageSize < 0)  				{ -					// This will be in the Free List, don't put it in the LRY +					// This will be in the Free List, don't put it in the LRU  					++empty_entries;  				}  				else  				{ -					lru.insert(std::make_pair(entry.mTime, id)); +					lru.insert(std::make_pair(entry.mTime, i));  					if (entry.mBodySize > 0)  					{  						if (entry.mBodySize > entry.mImageSize)  						{  							// Shouldn't happen, failsafe only  							llwarns << "Bad entry: " << i << ": " << id << ": BodySize: " << entry.mBodySize << llendl; -							purge_list.push_back(id); +							purge_list.insert(entry.mID); +							entry.mImageSize = -1; // empty/available  						}  					}  				} @@ -1243,22 +1244,31 @@ void LLTextureCache::readHeaderCache()  				// Special case: cache size was reduced, need to remove entries  				// Note: After we prune entries, we will call this again and create the LRU  				U32 entries_to_purge = (num_entries-empty_entries) - sCacheMaxEntries; +				llinfos << "Texture Cache Entries: " << num_entries << " Max: " << sCacheMaxEntries << " Empty: " << empty_entries << " Purging: " << entries_to_purge << llendl;  				if (entries_to_purge > 0)  				{  					for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)  					{ -						purge_list.push_back(iter->second); -						if (--entries_to_purge <= 0) -							break; +						S32 idx = iter->second; +						if (entries[idx].mImageSize >= 0) +						{ +							purge_list.insert(entries[idx].mID); +							entries[idx].mImageSize = -1; +							if (purge_list.size() >= entries_to_purge) +								break; +						}  					}  				} +				llassert_always(purge_list.size() >= entries_to_purge);  			}  			else  			{  				S32 lru_entries = (S32)((F32)sCacheMaxEntries * TEXTURE_CACHE_LRU_SIZE);  				for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)  				{ -					mLRU.insert(iter->second); +					S32 idx = iter->second; +					const LLUUID& id = entries[idx].mID; +					mLRU.insert(id);  // 					llinfos << "LRU: " << iter->first << " : " << iter->second << llendl;  					if (--lru_entries <= 0)  						break; @@ -1267,9 +1277,12 @@ void LLTextureCache::readHeaderCache()  			if (purge_list.size() > 0)  			{ -				for (std::vector<LLUUID>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter) +				for (std::set<LLUUID>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)  				{ -					removeFromCache(*iter); +					const LLUUID& id = *iter; +					bool res = removeHeaderCacheEntry(id); // sets entry size on disk to -1 +					llassert_always(res); +					LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());  				}  				// If we removed any entries, we need to rebuild the entries list,  				// write the header, and call this again @@ -1285,7 +1298,9 @@ void LLTextureCache::readHeaderCache()  				llassert_always(new_entries.size() <= sCacheMaxEntries);  				mHeaderEntriesInfo.mEntries = new_entries.size();  				writeEntriesAndClose(new_entries); +				mHeaderMutex.unlock(); // unlock the mutex before calling again  				readHeaderCache(); // repeat with new entries file +				mHeaderMutex.lock();  			}  			else  			{ @@ -1293,6 +1308,7 @@ void LLTextureCache::readHeaderCache()  			}  		}  	} +	mHeaderMutex.unlock();  }  ////////////////////////////////////////////////////////////////////////////// @@ -1307,6 +1323,7 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)  		for (S32 i=0; i<16; i++)  		{  			std::string dirname = mTexturesDirName + delem + subdirs[i]; +			llinfos << "Deleting files in directory: " << dirname << llendl;  			gDirUtilp->deleteFilesInDir(dirname,mask);  			if (purge_directories)  			{ @@ -1337,9 +1354,12 @@ void LLTextureCache::purgeTextures(bool validate)  		return;  	} -	// *FIX:Mani - watchdog off. -	LLAppViewer::instance()->pauseMainloopTimeout(); - +	if (!mThreaded) +	{ +		// *FIX:Mani - watchdog off. +		LLAppViewer::instance()->pauseMainloopTimeout(); +	} +	  	LLMutexLock lock(&mHeaderMutex);  	llinfos << "TEXTURE CACHE: Purging." << llendl; @@ -1486,7 +1506,7 @@ S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, S32& imagesize)  // Writes imagesize to the header, updates timestamp  S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, S32 imagesize)  { -	LLMutexLock lock(&mHeaderMutex); +	mHeaderMutex.lock();  	llassert_always(imagesize >= 0);  	Entry entry;  	S32 idx = openAndReadEntry(id, entry, true); @@ -1494,11 +1514,15 @@ S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, S32 imagesize)  	{  		entry.mImageSize = imagesize;  		writeEntryAndClose(idx, entry); +		mHeaderMutex.unlock();  	}  	else // retry  	{ +		mHeaderMutex.unlock();  		readHeaderCache(); // We couldn't write an entry, so refresh the LRU +		mHeaderMutex.lock();  		llassert_always(!mLRU.empty() || mHeaderEntriesInfo.mEntries < sCacheMaxEntries); +		mHeaderMutex.unlock();  		idx = setHeaderCacheEntry(id, imagesize); // assert above ensures no inf. recursion  	}  	return idx; @@ -1624,24 +1648,20 @@ void LLTextureCache::addCompleted(Responder* responder, bool success)  //////////////////////////////////////////////////////////////////////////////  // Called from MAIN thread (endWork()) - +// Ensure that mHeaderMutex is locked first!  bool LLTextureCache::removeHeaderCacheEntry(const LLUUID& id)  { -	if (!mReadOnly) +	Entry entry; +	S32 idx = openAndReadEntry(id, entry, false); +	if (idx >= 0)  	{ -		LLMutexLock lock(&mHeaderMutex); -		Entry entry; -		S32 idx = openAndReadEntry(id, entry, false); -		if (idx >= 0) -		{ -			entry.mImageSize = -1; -			entry.mBodySize = 0; -			writeEntryAndClose(idx, entry); -			mFreeList.insert(idx); -			mHeaderIDMap.erase(id); -			mTexturesSizeMap.erase(id); -			return true; -		} +		entry.mImageSize = -1; +		entry.mBodySize = 0; +		writeEntryAndClose(idx, entry); +		mFreeList.insert(idx); +		mHeaderIDMap.erase(id); +		mTexturesSizeMap.erase(id); +		return true;  	}  	return false;  } @@ -1651,6 +1671,7 @@ void LLTextureCache::removeFromCache(const LLUUID& id)  	//llwarns << "Removing texture from cache: " << id << llendl;  	if (!mReadOnly)  	{ +		LLMutexLock lock(&mHeaderMutex);  		removeHeaderCacheEntry(id);  		LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());  	} diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index de00ca8420..5f7c2f5080 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -48,7 +48,7 @@  #include "llfoldervieweventlistener.h"  #include "llinventory.h"  #include "llinventoryfunctions.h" -#include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "llinventorypanel.h"  #include "llfloaterinventory.h"  #include "lllineeditor.h" diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index c918f98895..6f3dabe5a7 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -524,6 +524,7 @@ void LLTextureFetchWorker::setDesiredDiscard(S32 discard, S32 size)  		mDesiredSize = size;  		prioritize = true;  	} +	mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE);  	if ((prioritize && mState == INIT) || mState == DONE)  	{  		mState = INIT; @@ -613,6 +614,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  		mCacheReadHandle = LLTextureCache::nullHandle();  		mCacheWriteHandle = LLTextureCache::nullHandle();  		mState = LOAD_FROM_TEXTURE_CACHE; +		mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE); // min desired size is TEXTURE_CACHE_ENTRY_SIZE  		LL_DEBUGS("Texture") << mID << ": Priority: " << llformat("%8.0f",mImagePriority)  							 << " Desired Discard: " << mDesiredDiscard << " Desired Size: " << mDesiredSize << LL_ENDL;  		// fall through @@ -681,7 +683,6 @@ bool LLTextureFetchWorker::doWork(S32 param)  	if (mState == CACHE_POST)  	{ -		mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE);  		mCachedSize = mFormattedImage.notNull() ? mFormattedImage->getDataSize() : 0;  		// Successfully loaded  		if ((mCachedSize >= mDesiredSize) || mHaveAllData) diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 903df21e78..ed2cedbd10 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -225,6 +225,7 @@ void LLToast::setVisible(BOOL show)  		{  			mTimer.start();  		} +		LLModalDialog::setFrontmost(FALSE);  	}  	LLPanel::setVisible(show);  	if(mPanel) diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 0c23947a8c..48b68e4292 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -128,6 +128,7 @@ mAddedDefaultBtn(false)  	// *TODO: magic numbers(???) - copied from llnotify.cpp(250)  	const S32 MAX_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE;  +	mTextBox->setMaxTextLength(MAX_LENGTH);  	mTextBox->setVisible(TRUE);  	mTextBox->setValue(notification->getMessage()); diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 959cb3f182..fbd86d0edf 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -2508,7 +2508,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(  		if(drop)  		{  		    BOOL append = ( (mask & MASK_SHIFT) ? TRUE : FALSE ); -			LLAppearanceManager::wearInventoryCategory(category, false, append); +			LLAppearanceManager::instance().wearInventoryCategory(category, false, append);  		}  		return ACCEPT_YES_MULTI;  	} @@ -2516,7 +2516,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(  	{  		if(drop)  		{ -			LLAppearanceManager::wearInventoryCategory(category, true, false); +			LLAppearanceManager::instance().wearInventoryCategory(category, true, false);  		}  		return ACCEPT_YES_MULTI;  	} diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index d49ea5109d..9c8fca3552 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -526,7 +526,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)  	}  	static LLCachedControl<bool> enable_highlight( -		gSavedSettings, "RenderHighlightEnable", false); +		gSavedSettings, "RenderHoverGlowEnable", false);  	LLDrawable* drawable = NULL;  	if (enable_highlight && show_highlight && object)  	{ diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index 1a61717658..407cc23d0d 100644 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -55,6 +55,7 @@  #include "llhudtext.h"  #include "llhudview.h"  #include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "lllandmarklist.h"  #include "llsky.h"  #include "llui.h" diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp index c974171c2c..b382ff6306 100644 --- a/indra/newview/llviewerassettype.cpp +++ b/indra/newview/llviewerassettype.cpp @@ -71,7 +71,6 @@ LLViewerAssetDictionary::LLViewerAssetDictionary()  	addEntry(LLViewerAssetType::AT_OBJECT, 				new ViewerAssetEntry(DAD_OBJECT));  	addEntry(LLViewerAssetType::AT_NOTECARD, 			new ViewerAssetEntry(DAD_NOTECARD));  	addEntry(LLViewerAssetType::AT_CATEGORY, 			new ViewerAssetEntry(DAD_CATEGORY)); -	addEntry(LLViewerAssetType::AT_ROOT_CATEGORY, 		new ViewerAssetEntry(DAD_ROOT_CATEGORY));  	addEntry(LLViewerAssetType::AT_LSL_TEXT, 			new ViewerAssetEntry(DAD_SCRIPT));  	addEntry(LLViewerAssetType::AT_LSL_BYTECODE, 		new ViewerAssetEntry(DAD_NONE));  	addEntry(LLViewerAssetType::AT_TEXTURE_TGA, 		new ViewerAssetEntry(DAD_NONE)); diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp index 384538364f..6aabcb11b8 100644 --- a/indra/newview/llviewerfoldertype.cpp +++ b/indra/newview/llviewerfoldertype.cpp @@ -109,8 +109,7 @@ LLViewerFolderDictionary::LLViewerFolderDictionary()  	addEntry(LLFolderType::FT_CLOTHING, 			new ViewerFolderEntry("Clothing",				"inv_folder_clothing.tga"));  	addEntry(LLFolderType::FT_OBJECT, 				new ViewerFolderEntry("Objects",				"inv_folder_object.tga"));  	addEntry(LLFolderType::FT_NOTECARD, 			new ViewerFolderEntry("Notecards",				"inv_folder_notecard.tga")); -	addEntry(LLFolderType::FT_CATEGORY, 			new ViewerFolderEntry("New Folder",				"inv_folder_plain_closed.tga")); -	addEntry(LLFolderType::FT_ROOT_CATEGORY, 		new ViewerFolderEntry("Inventory",				"")); +	addEntry(LLFolderType::FT_ROOT_INVENTORY, 		new ViewerFolderEntry("My Inventory",			""));  	addEntry(LLFolderType::FT_LSL_TEXT, 			new ViewerFolderEntry("Scripts",				"inv_folder_script.tga"));  	addEntry(LLFolderType::FT_BODYPART, 			new ViewerFolderEntry("Body Parts",				"inv_folder_bodypart.tga"));  	addEntry(LLFolderType::FT_TRASH, 				new ViewerFolderEntry("Trash",					"inv_folder_trash.tga")); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 251d7d4a13..3a7c54479b 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -32,6 +32,7 @@  #include "llviewerprecompiledheaders.h" +#include "llagent.h"  #include "llviewermedia.h"  #include "llviewermediafocus.h"  #include "llmimetypes.h" @@ -541,6 +542,16 @@ bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLView  		// The item with user focus always comes to the front of the list, period.  		return false;  	} +	else if(i1->isParcelMedia()) +	{ +		// The parcel media impl sorts above all other inworld media, unless one has focus. +		return true; +	} +	else if(i2->isParcelMedia()) +	{ +		// The parcel media impl sorts above all other inworld media, unless one has focus. +		return false; +	}  	else if(i1->getUsedInUI() && !i2->getUsedInUI())  	{  		// i1 is a UI element, i2 is not.  This makes i1 "less than" i2, so it sorts earlier in our list. @@ -551,16 +562,21 @@ bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLView  		// i2 is a UI element, i1 is not.  This makes i2 "less than" i1, so it sorts earlier in our list.  		return false;  	} -	else if(i1->isParcelMedia()) +	else if(i1->isPlayable() && !i2->isPlayable())  	{ -		// The parcel media impl sorts above all other inworld media, unless one has focus. +		// Playable items sort above ones that wouldn't play even if they got high enough priority  		return true;  	} -	else if(i2->isParcelMedia()) +	else if(!i1->isPlayable() && i2->isPlayable())  	{ -		// The parcel media impl sorts above all other inworld media, unless one has focus. +		// Playable items sort above ones that wouldn't play even if they got high enough priority  		return false;  	} +	else if(i1->getInterest() == i2->getInterest()) +	{ +		// Generally this will mean both objects have zero interest.  In this case, sort on distance. +		return (i1->getProximityDistance() < i2->getProximityDistance()); +	}  	else  	{  		// The object with the larger interest value should be earlier in the list, so we reverse the sense of the comparison here. @@ -568,6 +584,11 @@ bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLView  	}  } +static bool proximity_comparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2) +{ +	return (i1->getProximityDistance() < i2->getProximityDistance()); +} +  //////////////////////////////////////////////////////////////////////////////////////////  // static  void LLViewerMedia::updateMedia() @@ -593,12 +614,9 @@ void LLViewerMedia::updateMedia()  	int impl_count_total = 0;  	int impl_count_interest_low = 0;  	int impl_count_interest_normal = 0; -	int i = 0; - -#if 0	 -	LL_DEBUGS("PluginPriority") << "Sorted impls:" << llendl; -#endif - +	 +	std::vector<LLViewerMediaImpl*> proximity_order; +	  	U32 max_instances = gSavedSettings.getU32("PluginInstancesTotal");  	U32 max_normal = gSavedSettings.getU32("PluginInstancesNormal");  	U32 max_low = gSavedSettings.getU32("PluginInstancesLow"); @@ -629,10 +647,12 @@ void LLViewerMedia::updateMedia()  		else if(pimpl->hasFocus())  		{  			new_priority = LLPluginClassMedia::PRIORITY_HIGH; +			impl_count_interest_normal++;	// count this against the count of "normal" instances for priority purposes  		}  		else if(pimpl->getUsedInUI())  		{  			new_priority = LLPluginClassMedia::PRIORITY_NORMAL; +			impl_count_interest_normal++;  		}  		else  		{ @@ -640,7 +660,17 @@ void LLViewerMedia::updateMedia()  			// Heuristic -- if the media texture's approximate screen area is less than 1/4 of the native area of the texture,  			// turn it down to low instead of normal.  This may downsample for plugins that support it. -			bool media_is_small = pimpl->getInterest() < (pimpl->getApproximateTextureInterest() / 4); +			bool media_is_small = false; +			F64 approximate_interest = pimpl->getApproximateTextureInterest(); +			if(approximate_interest == 0.0f) +			{ +				// this media has no current size, which probably means it's not loaded. +				media_is_small = true; +			} +			else if(pimpl->getInterest() < (approximate_interest / 4)) +			{ +				media_is_small = true; +			}  			if(pimpl->getInterest() == 0.0f)  			{ @@ -678,7 +708,7 @@ void LLViewerMedia::updateMedia()  			}  		} -		if(new_priority != LLPluginClassMedia::PRIORITY_UNLOADED) +		if(!pimpl->getUsedInUI() && (new_priority != LLPluginClassMedia::PRIORITY_UNLOADED))  		{  			impl_count_total++;  		} @@ -692,23 +722,27 @@ void LLViewerMedia::updateMedia()  		}  		else  		{ -			// Other impls just get the same ordering as the priority list (for now). -			pimpl->mProximity = i; +			proximity_order.push_back(pimpl);  		} -#if 0		 -		LL_DEBUGS("PluginPriority") << "    " << pimpl  -			<< ", setting priority to " << new_priority -			<< (pimpl->hasFocus()?", HAS FOCUS":"")  -			<< (pimpl->getUsedInUI()?", is UI":"")  -			<< ", cpu " << pimpl->getCPUUsage()  -			<< ", interest " << pimpl->getInterest()  -			<< ", media url " << pimpl->getMediaURL() << llendl; -#endif -  		total_cpu += pimpl->getCPUUsage(); -		 -		i++; +	} +	 +	if(gSavedSettings.getBOOL("MediaPerformanceManagerDebug")) +	{ +		// Give impls the same ordering as the priority list +		// they're already in the right order for this. +	} +	else +	{ +		// Use a distance-based sort for proximity values.   +		std::stable_sort(proximity_order.begin(), proximity_order.end(), proximity_comparitor); +	} + +	// Transfer the proximity order to the proximity fields in the objects. +	for(int i = 0; i < (int)proximity_order.size(); i++) +	{ +		proximity_order[i]->mProximity = i;  	}  	LL_DEBUGS("PluginPriority") << "Total reported CPU usage is " << total_cpu << llendl; @@ -760,6 +794,7 @@ LLViewerMediaImpl::LLViewerMediaImpl(	  const LLUUID& texture_id,  	mIsDisabled(false),  	mIsParcelMedia(false),  	mProximity(-1), +	mProximityDistance(0.0f),  	mMimeTypeProbe(NULL),  	mIsUpdated(false)  {  @@ -1588,6 +1623,10 @@ void LLViewerMediaImpl::update()  		{  			// This media source should not be loaded.  		} +		else if(mPriority <= LLPluginClassMedia::PRIORITY_SLIDESHOW) +		{ +			// Don't load new instances that are at PRIORITY_SLIDESHOW or below.  They're just kept around to preserve state. +		}  		else if(mMimeTypeProbe != NULL)  		{  			// this media source is doing a MIME type probe -- don't try loading it again. @@ -1816,7 +1855,7 @@ bool LLViewerMediaImpl::isMediaPaused()  //////////////////////////////////////////////////////////////////////////////////////////  // -bool LLViewerMediaImpl::hasMedia() +bool LLViewerMediaImpl::hasMedia() const  {  	return mMediaSource != NULL;  } @@ -1851,6 +1890,31 @@ bool LLViewerMediaImpl::isForcedUnloaded() const  }  ////////////////////////////////////////////////////////////////////////////////////////// +// +bool LLViewerMediaImpl::isPlayable() const +{ +	if(isForcedUnloaded()) +	{ +		// All of the forced-unloaded criteria also imply not playable. +		return false; +	} +	 +	if(hasMedia()) +	{ +		// Anything that's already playing is, by definition, playable. +		return true; +	} +	 +	if(!mMediaURL.empty()) +	{ +		// If something has navigated the instance, it's ready to be played. +		return true; +	} +	 +	return false; +} + +//////////////////////////////////////////////////////////////////////////////////////////  void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent event)  {  	switch(event) @@ -2058,6 +2122,15 @@ void LLViewerMediaImpl::calculateInterest()  		mInterest = 0.0f;  	} +	// Calculate distance from the avatar, for use in the proximity calculation. +	mProximityDistance = 0.0f; +	if(!mObjectList.empty()) +	{ +		// Just use the first object in the list.  We could go through the list and find the closest object, but this should work well enough. +		LLVector3d global_delta = gAgent.getPositionGlobal() - (*mObjectList.begin())->getPositionGlobal(); +		mProximityDistance = global_delta.magVecSquared();  // use distance-squared because it's cheaper and sorts the same. +	} +	  	if(mNeedsMuteCheck)  	{  		// Check all objects this instance is associated with, and those objects' owners, against the mute list @@ -2094,7 +2167,13 @@ F64 LLViewerMediaImpl::getApproximateTextureInterest()  		result = mMediaSource->getFullWidth();  		result *= mMediaSource->getFullHeight();  	} -	 +	else +	{ +		// No media source is loaded -- all we have to go on is the texture size that has been set on the impl, if any. +		result = mMediaWidth; +		result *= mMediaHeight; +	} +  	return result;  } @@ -2135,7 +2214,7 @@ void LLViewerMediaImpl::setPriority(LLPluginClassMedia::EPriority priority)  {  	if(mPriority != priority)  	{ -		LL_INFOS("PluginPriority") +		LL_DEBUGS("PluginPriority")  			<< "changing priority of media id " << mTextureId  			<< " from " << LLPluginClassMedia::priorityToString(mPriority)  			<< " to " << LLPluginClassMedia::priorityToString(priority) diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 639aed4b8a..f4afce6c4c 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -194,7 +194,7 @@ public:  	bool isMediaPlaying();  	bool isMediaPaused(); -	bool hasMedia(); +	bool hasMedia() const;  	bool isMediaFailed() const { return mMediaSourceFailed; };  	void resetPreviousMediaState(); @@ -204,6 +204,9 @@ public:  	// returns true if this instance should not be loaded (disabled, muted object, crashed, etc.)  	bool isForcedUnloaded() const; +	// returns true if this instance could be playable based on autoplay setting, current load state, etc. +	bool isPlayable() const; +	  	void setIsParcelMedia(bool is_parcel_media) { mIsParcelMedia = is_parcel_media; };  	bool isParcelMedia() const { return mIsParcelMedia; }; @@ -267,6 +270,7 @@ public:  	F64 getInterest() const { return mInterest; };  	F64 getApproximateTextureInterest();  	S32 getProximity() const { return mProximity; }; +	F64 getProximityDistance() const { return mProximityDistance; };  	// Mark this object as being used in a UI panel instead of on a prim  	// This will be used as part of the interest sorting algorithm. @@ -336,6 +340,7 @@ public:  	bool mIsDisabled;  	bool mIsParcelMedia;  	S32 mProximity; +	F64 mProximityDistance;  	LLMimeDiscoveryResponder *mMimeTypeProbe;  private: diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 728fb7c616..68a9aaef75 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -3879,8 +3879,7 @@ void god_force_inv_owner_permissive(LLViewerObject* object,  	InventoryObjectList::const_iterator inv_end = inventory->end();  	for ( ; inv_it != inv_end; ++inv_it)  	{ -		if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY) -		   && ((*inv_it)->getType() != LLAssetType::AT_ROOT_CATEGORY)) +		if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY))  		{  			LLInventoryObject* obj = *inv_it;  			LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem((LLViewerInventoryItem*)obj); @@ -6424,13 +6423,13 @@ void handle_selected_texture_info(void*)  void handle_test_male(void*)  { -	LLAppearanceManager::wearOutfitByName("Male Shape & Outfit"); +	LLAppearanceManager::instance().wearOutfitByName("Male Shape & Outfit");  	//gGestureList.requestResetFromServer( TRUE );  }  void handle_test_female(void*)  { -	LLAppearanceManager::wearOutfitByName("Female Shape & Outfit"); +	LLAppearanceManager::instance().wearOutfitByName("Female Shape & Outfit");  	//gGestureList.requestResetFromServer( FALSE );  } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 200ecbc6d6..0153116887 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -89,6 +89,7 @@  #include "llhudeffecttrail.h"  #include "llhudmanager.h"  #include "llinventorymodel.h" +#include "llinventoryobserver.h"  #include "llinventorypanel.h"  #include "llfloaterinventory.h"  #include "llmenugl.h" @@ -4836,8 +4837,7 @@ void container_inventory_arrived(LLViewerObject* object,  		InventoryObjectList::const_iterator end = inventory->end();  		for ( ; it != end; ++it)  		{ -			if ((*it)->getType() != LLAssetType::AT_CATEGORY && -				(*it)->getType() != LLAssetType::AT_ROOT_CATEGORY) +			if ((*it)->getType() != LLAssetType::AT_CATEGORY)  			{  				LLInventoryObject* obj = (LLInventoryObject*)(*it);  				LLInventoryItem* item = (LLInventoryItem*)(obj); @@ -4872,8 +4872,7 @@ void container_inventory_arrived(LLViewerObject* object,  		// one actual object  		InventoryObjectList::iterator it = inventory->begin(); -		if ((*it)->getType() == LLAssetType::AT_CATEGORY || -			(*it)->getType() == LLAssetType::AT_ROOT_CATEGORY) +		if ((*it)->getType() == LLAssetType::AT_CATEGORY)  		{  			++it;  		} diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 85bc26c9c0..0d29efaedf 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -2121,10 +2121,11 @@ LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level)  	llassert_always(mGLTexturep.notNull()) ;  	llassert_always(discard_level >= 0);  	llassert_always(mComponents > 0); +  	if (mRawImage.notNull())  	{ -		llerrs << "called with existing mRawImage" << llendl; -		mRawImage = NULL; +		//mRawImage is in use by somebody else, do not delete it. +		return NULL ;  	}  	if(mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= discard_level) diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 0c5d813f45..7b35125b5b 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1015,7 +1015,10 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)  		}  		// SL-53351: Make sure we're not in mouselook when minimised, to prevent control issues -		gAgent.changeCameraToDefault(); +		if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) +		{ +			gAgent.changeCameraToDefault(); +		}  		send_agent_pause(); diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp index 999701ece1..6340189c93 100644 --- a/indra/newview/llvlcomposition.cpp +++ b/indra/newview/llvlcomposition.cpp @@ -287,17 +287,22 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y,  				min_dim /= 2;  			} -			mDetailTextures[i]->reloadRawImage(ddiscard) ; +			BOOL delete_raw = (mDetailTextures[i]->reloadRawImage(ddiscard) != NULL) ;  			if(mDetailTextures[i]->getRawImageLevel() != ddiscard)//raw iamge is not ready, will enter here again later.  			{ -				mDetailTextures[i]->destroyRawImage() ; +				if(delete_raw) +				{ +					mDetailTextures[i]->destroyRawImage() ; +				}  				lldebugs << "cached raw data for terrain detail texture is not ready yet: " << mDetailTextures[i]->getID() << llendl;  				return FALSE;  			}  			mRawImages[i] = mDetailTextures[i]->getRawImage() ; -			mDetailTextures[i]->destroyRawImage() ; - +			if(delete_raw) +			{ +				mDetailTextures[i]->destroyRawImage() ; +			}  			if (mDetailTextures[i]->getWidth(ddiscard) != BASE_SIZE ||  				mDetailTextures[i]->getHeight(ddiscard) != BASE_SIZE ||  				mDetailTextures[i]->getComponents() != 3) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 62ac8adad0..b6c1ee2f11 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -624,7 +624,6 @@ F32 LLVOAvatar::sGreyUpdateTime = 0.f;  // Helper functions  //-----------------------------------------------------------------------------  static F32 calc_bouncy_animation(F32 x); -static U32 calc_shame(const LLVOVolume* volume, std::set<LLUUID> &textures);  //-----------------------------------------------------------------------------  // LLVOAvatar() @@ -7637,9 +7636,17 @@ void LLVOAvatar::idleUpdateRenderCost()  		return;  	} -	U32 shame = 1; +	U32 shame = 0; -	std::set<LLUUID> textures; +	for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++) +	{ +		const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); +		ETextureIndex tex_index = baked_dict->mTextureIndex; +		if (isTextureVisible(tex_index)) +		{ +			shame +=20; +		} +	}  	for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();   		 iter != mAttachmentPoints.end(); @@ -7660,15 +7667,13 @@ void LLVOAvatar::idleUpdateRenderCost()  					const LLVOVolume* volume = drawable->getVOVolume();  					if (volume)  					{ -						shame += calc_shame(volume, textures); +						shame += volume->getRenderCost();  					}  				}  			}  		}  	} -	shame += textures.size() * 5; -  	setDebugText(llformat("%d", shame));  	F32 green = 1.f-llclamp(((F32) shame-1024.f)/1024.f, 0.f, 1.f);  	F32 red = llmin((F32) shame/1024.f, 1.f); @@ -7713,110 +7718,6 @@ const std::string LLVOAvatar::getBakedStatusForPrintout() const  } -U32 calc_shame(const LLVOVolume* volume, std::set<LLUUID> &textures) -{ -	if (!volume) -	{ -		return 0; -	} - -	U32 shame = 0; - -	U32 invisi = 0; -	U32 shiny = 0; -	U32 glow = 0; -	U32 alpha = 0; -	U32 flexi = 0; -	U32 animtex = 0; -	U32 particles = 0; -	U32 scale = 0; -	U32 bump = 0; -	U32 planar = 0; -	 -	if (volume->isFlexible()) -	{ -		flexi = 1; -	} -	if (volume->isParticleSource()) -	{ -		particles = 1; -	} - -	const LLVector3& sc = volume->getScale(); -	scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2]; - -	const LLDrawable* drawablep = volume->mDrawable; - -	if (volume->isSculpted()) -	{ -		const LLSculptParams *sculpt_params = (LLSculptParams *) volume->getParameterEntry(LLNetworkData::PARAMS_SCULPT); -		LLUUID sculpt_id = sculpt_params->getSculptTexture(); -		textures.insert(sculpt_id); -	} - -	for (S32 i = 0; i < drawablep->getNumFaces(); ++i) -	{ -		const LLFace* face = drawablep->getFace(i); -		const LLTextureEntry* te = face->getTextureEntry(); -		const LLViewerTexture* img = face->getTexture(); - -		textures.insert(img->getID()); - -		if (face->getPoolType() == LLDrawPool::POOL_ALPHA) -		{ -			alpha++; -		} -		else if (img->getPrimaryFormat() == GL_ALPHA) -		{ -			invisi = 1; -		} - -		if (te) -		{ -			if (te->getBumpmap()) -			{ -				bump = 1; -			} -			if (te->getShiny()) -			{ -				shiny = 1; -			} -			if (te->getGlow() > 0.f) -			{ -				glow = 1; -			} -			if (face->mTextureMatrix != NULL) -			{ -				animtex++; -			} -			if (te->getTexGen()) -			{ -				planar++; -			} -		} -	} - -	shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar; - -	LLViewerObject::const_child_list_t& child_list = volume->getChildren(); -	for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); -		 iter != child_list.end();  -		 ++iter) -	{ -		const LLViewerObject* child_objectp = *iter; -		const LLDrawable* child_drawablep = child_objectp->mDrawable; -		if (child_drawablep) -		{ -			const LLVOVolume* child_volumep = child_drawablep->getVOVolume(); -			if (child_volumep) -			{ -				shame += calc_shame(child_volumep, textures); -			} -		} -	} - -	return shame; -}  //virtual  S32 LLVOAvatar::getTexImageSize() const diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 185274d40d..711e9f90fc 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -487,18 +487,10 @@ BOOL LLVOAvatarSelf::buildMenus()  		}  		// add in requested order to pie menu, inserting separators as necessary -		S32 cur_pie_slice = 0;  		for (std::multimap<S32, S32>::iterator attach_it = attachment_pie_menu_map.begin();  			 attach_it != attachment_pie_menu_map.end(); ++attach_it)  		{ -			S32 requested_pie_slice = attach_it->first;  			S32 attach_index = attach_it->second; -			while (cur_pie_slice < requested_pie_slice) -			{ -				gAttachBodyPartPieMenus[group]->addSeparator(); -				gDetachBodyPartPieMenus[group]->addSeparator(); -				cur_pie_slice++; -			}  			LLViewerJointAttachment* attachment = get_if_there(mAttachmentPoints, attach_index, (LLViewerJointAttachment*)NULL);  			if (attachment) @@ -520,7 +512,6 @@ BOOL LLVOAvatarSelf::buildMenus()  				item_params.on_enable.parameter = attach_index;  				item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);  				gDetachBodyPartPieMenus[group]->addChild(item); -				cur_pie_slice++;  			}  		}  	} @@ -1039,7 +1030,7 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view  	if (attachment->isObjectAttached(viewer_object))  	{  		const LLUUID& attachment_id = viewer_object->getItemID(); -		LLAppearanceManager::registerAttachment(attachment_id); +		LLAppearanceManager::instance().registerAttachment(attachment_id);  	}  	return attachment; @@ -1078,7 +1069,7 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)  		}  		else  		{ -			LLAppearanceManager::unregisterAttachment(attachment_id); +			LLAppearanceManager::instance().unregisterAttachment(attachment_id);  		}  		return TRUE; @@ -1587,7 +1578,7 @@ void LLVOAvatarSelf::dumpLocalTextures() const  			llinfos << "LocTex " << name << ": Baked " << getTEImage(baked_equiv)->getID() << llendl;  #endif  		} -		else if (local_tex_obj->getImage() != NULL) +		else if (local_tex_obj && local_tex_obj->getImage() != NULL)  		{  			if (local_tex_obj->getImage()->getID() == IMG_DEFAULT_AVATAR)  			{ diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 2def905bbb..e5531a1497 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -2541,6 +2541,107 @@ const LLMatrix4 LLVOVolume::getRenderMatrix() const  	return mDrawable->getWorldMatrix();  } +U32 LLVOVolume::getRenderCost() const +{ +	U32 shame = 0; + +	U32 invisi = 0; +	U32 shiny = 0; +	U32 glow = 0; +	U32 alpha = 0; +	U32 flexi = 0; +	U32 animtex = 0; +	U32 particles = 0; +	U32 scale = 0; +	U32 bump = 0; +	U32 planar = 0; + +	if (isFlexible()) +	{ +		flexi = 1; +	} +	if (isParticleSource()) +	{ +		particles = 1; +	} + +	const LLVector3& sc = getScale(); +	scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2]; + +	const LLDrawable* drawablep = mDrawable; + +	if (isSculpted()) +	{ +		const LLSculptParams *sculpt_params = (LLSculptParams *) getParameterEntry(LLNetworkData::PARAMS_SCULPT); +		LLUUID sculpt_id = sculpt_params->getSculptTexture(); +		shame += 5; +	} + +	for (S32 i = 0; i < drawablep->getNumFaces(); ++i) +	{ +		const LLFace* face = drawablep->getFace(i); +		const LLTextureEntry* te = face->getTextureEntry(); +		const LLViewerTexture* img = face->getTexture(); + +		shame += 5; + +		if (face->getPoolType() == LLDrawPool::POOL_ALPHA) +		{ +			alpha++; +		} +		else if (img->getPrimaryFormat() == GL_ALPHA) +		{ +			invisi = 1; +		} + +		if (te) +		{ +			if (te->getBumpmap()) +			{ +				bump = 1; +			} +			if (te->getShiny()) +			{ +				shiny = 1; +			} +			if (te->getGlow() > 0.f) +			{ +				glow = 1; +			} +			if (face->mTextureMatrix != NULL) +			{ +				animtex++; +			} +			if (te->getTexGen()) +			{ +				planar++; +			} +		} +	} + +	shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar; + +	LLViewerObject::const_child_list_t& child_list = getChildren(); +	for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); +		 iter != child_list.end();  +		 ++iter) +	{ +		const LLViewerObject* child_objectp = *iter; +		const LLDrawable* child_drawablep = child_objectp->mDrawable; +		if (child_drawablep) +		{ +			const LLVOVolume* child_volumep = child_drawablep->getVOVolume(); +			if (child_volumep) +			{ +				shame += child_volumep->getRenderCost(); +			} +		} +	} + +	return shame; + +} +  //static  void LLVOVolume::preUpdateGeom()  { diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 10fc8865fc..fb543efc04 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -120,7 +120,7 @@ public:  	const LLMatrix4&	getRelativeXform() const				{ return mRelativeXform; }  	const LLMatrix3&	getRelativeXformInvTrans() const		{ return mRelativeXformInvTrans; }  	/*virtual*/	const LLMatrix4	getRenderMatrix() const; - +				U32 	getRenderCost() const;  	/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,   										  S32 face = -1,                        // which face to check, -1 = ALL_SIDES diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index c5c97e7649..e37dffd526 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -831,6 +831,7 @@ void LLWearable::addVisualParam(LLVisualParam *param)  	}  	param->setIsDummy(FALSE);  	mVisualParamIndexMap[param->getID()] = param; +	mSavedVisualParamMap[param->getID()] = param->getDefaultWeight();  }  void LLWearable::setVisualParams() @@ -933,11 +934,39 @@ void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL upload  void LLWearable::revertValues()  {  	//update saved settings so wearable is no longer dirty +	// non-driver params first  	for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++)  	{  		S32 id = iter->first;  		F32 value = iter->second; -		setVisualParamWeight(id, value, TRUE); +		LLVisualParam *param = getVisualParam(id); +		if(param &&  !dynamic_cast<LLDriverParam*>(param) ) +		{ +			setVisualParamWeight(id, value, TRUE); +		} +	} + +	//then driver params +	for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++) +	{ +		S32 id = iter->first; +		F32 value = iter->second; +		LLVisualParam *param = getVisualParam(id); +		if(param &&  dynamic_cast<LLDriverParam*>(param) ) +		{ +			setVisualParamWeight(id, value, TRUE); +		} +	} + +	// make sure that saved values are sane +	for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++) +	{ +		S32 id = iter->first; +		LLVisualParam *param = getVisualParam(id); +		if( param ) +		{ +			mSavedVisualParamMap[id] = param->getWeight(); +		}  	}  	syncImages(mSavedTEMap, mTEMap); diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml index 6c4f10e61e..9d2a811d9f 100644 --- a/indra/newview/skins/default/xui/en/floater_customize.xml +++ b/indra/newview/skins/default/xui/en/floater_customize.xml @@ -3383,6 +3383,16 @@ scratch and wear it.       bottom="536"       follows="right|bottom"       height="20" +     label="Make Outfit" +     label_selected="Make Outfit" +     layout="topleft" +     name="make_outfit_btn" +     right="-216" +     width="100" /> +    <button +     bottom="536" +     follows="right|bottom" +     height="20"       label="Cancel"       label_selected="Cancel"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index 8b6ab4e4d8..b65a49eaed 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -356,9 +356,9 @@           parameter="restore" />      </menu_item_call>      <menu_item_call -     label="Goto Link" +     label="Find Original"       layout="topleft" -     name="Goto Link"> +     name="Find Original">          <menu_item_call.on_click           function="Inventory.DoToSelected"           parameter="goto" /> @@ -434,9 +434,9 @@      <menu_item_separator       layout="topleft" />      <menu_item_call -     label="Take Off Items" +     label="Remove From Outfit"       layout="topleft" -     name="Take Off Items"> +     name="Remove From Outfit">          <menu_item_call.on_click           function="Inventory.DoToSelected"           parameter="removefromoutfit" /> diff --git a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml new file mode 100644 index 0000000000..7b52fecef7 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu + height="50" + layout="topleft" + mouse_opaque="false" + name="profile_overflow_menu" + width="120"> +    <menu_item_call +     label="Pay" +     layout="topleft" +     name="pay"> +        <menu_item_call.on_click +         function="Profile.Pay" /> +    </menu_item_call> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index e98a6d57bb..181994a1bd 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2572,10 +2572,10 @@               name="Hover Glow Objects">
                  <menu_item_check.on_check
                   function="CheckControl"
 -                 parameter="RenderHighlightEnable" />
 +                 parameter="RenderHoverGlowEnable" />
                  <menu_item_check.on_click
                   function="ToggleControl"
 -                 parameter="RenderHighlightEnable" />
 +                 parameter="RenderHoverGlowEnable" />
              </menu_item_check>
          </menu>
 diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index cb5ec15387..a9a02e8fc7 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -27,6 +27,7 @@       border_visible="false"       bottom="600"       follows="all" +	 hide_loading="true"       left="0"       name="login_html"       start_url="" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 9fac7d34f7..a370b450e9 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -107,7 +107,10 @@ background_visible="true"                   name="add_friend_btn"                   top_delta="0"                   tool_tip="Add selected resident to your friends List" -                 width="18" /> +                 width="18"> +               <commit_callback +                  function="People.addFriend" /> +             </button>              </panel>          </panel>          <panel @@ -325,7 +328,10 @@ background_visible="true"                   name="add_friend_btn"                   top_delta="0"                   tool_tip="Add selected resident to your friends List" -                 width="18" /> +                 width="18"> +                <commit_callback +                   function="People.addFriend" /> +              </button>              </panel>          </panel>      </tab_container> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index a6ca73d4b7..6bb937e3c6 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -66,11 +66,7 @@           label="Italiano (Italian) - Beta"           name="Italian"           value="it" /> -        <combo_box.item -         enabled="true" -         label="Magyar (Hungarian) - Beta" -         name="Hungarian" -         value="hu" /> +          <combo_box.item           enabled="true"           label="Nederlands (Dutch) - Beta" @@ -86,36 +82,16 @@           label="Portugués (Portuguese) - Beta"           name="Portugese"           value="pt" /> -        <combo_box.item -         enabled="true" -         label="Русский (Russian) - Beta" -         name="Russian" -         value="ru" /> -        <combo_box.item -         enabled="true" -         label="Türkçe (Turkish) - Beta" -         name="Turkish" -         value="tr" /> -        <combo_box.item -         enabled="true" -         label="Українська (Ukrainian) - Beta" -         name="Ukrainian" -         value="uk" /> -        <combo_box.item -         enabled="true" -         label="中文 (简体) (Chinese) - Beta" -         name="Chinese" -         value="zh" /> + + + +          <combo_box.item           enabled="true"           label="日本語 (Japanese) - Beta"           name="(Japanese)"           value="ja" /> -        <combo_box.item -         enabled="true" -         label="한국어 (Korean) - Beta" -         name="(Korean)" -         value="ko" /> +          <combo_box.item           enabled="true"           label="Test Language" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index 9cf0bd26d8..5cabae5fa0 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -169,12 +169,12 @@       decimal_digits="0"       follows="left|top"       height="15" -     increment="10" -     initial_value="50" +     increment="16" +     initial_value="512"       layout="topleft"       left_delta="150" -     max_val="1000" -     min_val="10" +     max_val="1024" +     min_val="32"       name="cache_size"       top_delta="-1"       width="180" /> diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml index 70c5d7b823..98025e28db 100644 --- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -77,10 +77,14 @@  		width="22"  		top="4">  	  <button +		  image_overlay="Arrow_Left_Off" +		  image_disabled="PushButton_Disabled" +		  image_disabled_selected="PushButton_Disabled" +		  image_selected="PushButton_Selected" +		  image_unselected="PushButton_Off" +		  hover_glow_amount="0.15"  		  auto_resize="false"  		  height="22" -		  image_selected="media_btn_back.png" -		  image_unselected="media_btn_back.png"  		  layout="topleft"  		  tool_tip="Step back"  		  width="22" @@ -96,37 +100,25 @@  		user_resize="false"  		layout="topleft"  		top="10" -		min_width="17" -		width="17"> +		min_width="22" +		width="22">  	  <button +		  image_overlay="Arrow_Right_Off" +		  image_disabled="PushButton_Disabled" +		  image_disabled_selected="PushButton_Disabled" +		  image_selected="PushButton_Selected" +		  image_unselected="PushButton_Off" +		  hover_glow_amount="0.15"  		  height="22" -		  image_selected="media_btn_forward.png" -		  image_unselected="media_btn_forward.png"  		  layout="topleft"  		  tool_tip="Step forward"  		  top_delta="0" -		  min_width="17" -		  width="17"> +		  min_width="22" +		  width="22">  		<button.commit_callback  			function="MediaCtrl.Forward" />  	  </button>  	</layout_panel> -	<!-- -		<panel -		height="22" -		layout="topleft" -		auto_resize="false" -		min_width="3" -		width="3"> -		<icon -		height="22" -		image_name="media_panel_divider.png" -		layout="topleft" -		top="0" -		min_width="3" -		width="3" /> -		</panel> -	-->  	<layout_panel  		name="home"  		auto_resize="false" @@ -136,11 +128,15 @@  		min_width="22"  		width="22">  	  <button -		  height="22" -		  image_selected="media_btn_home.png" -		  image_unselected="media_btn_home.png" +		  image_disabled="PushButton_Disabled" +		  image_disabled_selected="PushButton_Disabled" +		  image_overlay="Home_Off" +		  image_selected="PushButton_Selected" +		  image_unselected="PushButton_Off" +		  hover_glow_amount="0.15"  		  layout="topleft"  		  tool_tip="Home page" +		  height="22"  		  min_width="22"  		  width="22">  		<button.commit_callback @@ -155,10 +151,15 @@  		top="2"  		min_width="22"  		width="22"> +	  <!-- The stop button here is temporary artwork -->  	  <button +		  image_overlay="media_btn_stoploading.png" +		  image_disabled="PushButton_Disabled" +		  image_disabled_selected="PushButton_Disabled" +		  image_selected="PushButton_Selected" +		  image_unselected="PushButton_Off" +		  hover_glow_amount="0.15"  		  height="22" -		  image_selected="button_anim_stop.tga" -		  image_unselected="button_anim_stop.tga"  		  layout="topleft"  		  tool_tip="Stop media"  		  min_width="22" @@ -167,22 +168,6 @@  			function="MediaCtrl.Stop" />  	  </button>  	</layout_panel> -	<!-- -		<panel -		height="22" -		layout="topleft" -		auto_resize="false" -		min_width="3" -		width="3"> -		<icon -		height="22" -		image_name="media_panel_divider.png" -		layout="topleft" -		top="0" -		min_width="3" -		width="3" /> -		</panel> -	-->  	<layout_panel  		name="reload"  		auto_resize="false" @@ -193,8 +178,12 @@  		width="22">  	  <button  		  height="22" -		  image_selected="media_btn_reload.png" -		  image_unselected="media_btn_reload.png" +		  image_overlay="Refresh_Off" +		  image_disabled="PushButton_Disabled" +		  image_disabled_selected="PushButton_Disabled" +		  image_selected="PushButton_Selected" +		  image_unselected="PushButton_Off" +		  hover_glow_amount="0.15"  		  layout="topleft"  		  tool_tip="Reload"  		  min_width="22" @@ -213,8 +202,12 @@  		width="22">  	  <button  		  height="22" -		  image_selected="media_btn_stoploading.png" -		  image_unselected="media_btn_stoploading.png" +		  image_overlay="StopReload_Off" +		  image_disabled="PushButton_Disabled" +		  image_disabled_selected="PushButton_Disabled" +		  image_selected="PushButton_Selected" +		  image_unselected="PushButton_Off" +		  hover_glow_amount="0.15"  		  layout="topleft"  		  tool_tip = "Stop loading"  		  min_width="22" @@ -232,11 +225,15 @@  		min_width="22"  		width="22">  	  <button -		  height="22" -		  image_selected="button_anim_play.tga" -		  image_unselected="button_anim_play.tga" +		  image_overlay="Play_Off" +		  image_disabled="PushButton_Disabled" +		  image_disabled_selected="PushButton_Disabled" +		  image_selected="PushButton_Selected" +		  image_unselected="PushButton_Off" +		  hover_glow_amount="0.15"  		  layout="topleft"  		  tool_tip = "Play media" +		  height="22"  		  min_width="22"  		  width="22">  		<button.commit_callback @@ -252,10 +249,14 @@  		min_width="22"  		width="22">  	  <button -		  height="22" -		  image_selected="button_anim_pause.tga" -		  image_unselected="button_anim_pause.tga" +		  image_overlay="Pause_Off" +		  image_disabled="PushButton_Disabled" +		  image_disabled_selected="PushButton_Disabled" +		  image_selected="PushButton_Selected" +		  image_unselected="PushButton_Off" +		  hover_glow_amount="0.15"  		  layout="topleft" +		  height="22"  		  tool_tip = "Pause media">  		<button.commit_callback  			function="MediaCtrl.Pause" /> @@ -266,7 +267,7 @@  		name="media_address"  		auto_resize="true"  		user_resize="false" -		height="22" +		height="24"  		follows="left|right|bottom"  		layout="topleft"  		width="190" @@ -313,7 +314,7 @@ function="MediaCtrl.CommitURL" />  			  name="media_whitelist_flag"  			  follows="top|right"  			  height="16" -			  image_name="smicon_warn.tga" +			  image_name="Flag"  			  layout="topleft"  			  tool_tip="White List enabled"  			  min_width="16" @@ -327,7 +328,7 @@ function="MediaCtrl.CommitURL" />  		  <icon  			  name="media_secure_lock_flag"  			  height="16" -			  image_name="icon_lock.tga" +			  image_name="Lock2"  			  layout="topleft"  			  tool_tip="Secured Browsing"  			  min_width="16" @@ -351,6 +352,7 @@ function="MediaCtrl.CommitURL" />  		  initial_value="0.5"  		  layout="topleft"  		  tool_tip="Movie play progress" +		  top="8"  		  min_width="100"  		  width="200">  		<slider_bar.commit_callback @@ -362,43 +364,55 @@ function="MediaCtrl.CommitURL" />  		auto_resize="false"  		user_resize="false"  		layout="topleft" -		height="24" -		min_width="24" -		width="24"> +		height="22" +		min_width="22" +		width="22"> +	  <!-- Note: this isn't quite right either...the mute button is not the --> +	  <!-- same as the others because it can't have the "image_overlay" be  --> +	  <!-- two different images.  -->  	  <button +		  image_disabled="PushButton_Disabled" +		  image_disabled_selected="PushButton_Disabled" +		  image_selected="AudioMute_Off" +		  image_unselected="Audio_Off" +		  hover_glow_amount="0.15"  		  name="media_volume_button"  		  height="22" -		  image_selected="icn_speaker-muted_dark.tga" -		  image_unselected="icn_speaker_dark.tga"  		  is_toggle="true"  		  layout="topleft"  		  scale_image="false"   		  tool_tip="Mute This Media" -		  top_delta="22" -		  min_width="24" -		  width="24" > +		  top_delta="18" +		  min_width="22" +		  width="22" >  		<button.commit_callback  			function="MediaCtrl.ToggleMute" />  	  </button>  	</layout_panel> +	<!-- We don't have a design yet for "volume", so this is a temporary --> +	<!-- solution.  See DEV-42827. -->  	<layout_panel  		name="volume_up"  		auto_resize="false"  		user_resize="false"  		layout="topleft" -		min_width="20" +		min_width="14"  		height="14" -		width="20"> +		width="14">  	  <button -		  top="-3" +		  image_overlay="media_btn_scrollup.png" +		  image_disabled="PushButton_Disabled" +		  image_disabled_selected="PushButton_Disabled" +		  image_selected="PushButton_Selected" +		  image_unselected="PushButton_Off" +		  hover_glow_amount="0.15" +		  top="-5"  		  height="14" -		  image_selected="media_btn_scrollup.png" -		  image_unselected="media_btn_scrollup.png"  		  layout="topleft"  		  tool_tip="Volume up"  		  scale_image="true" -		  min_width="20" -		  width="20" > +		  min_width="14" +		  width="14" >  		<button.commit_callback  			function="MediaCtrl.CommitVolumeUp" />  	  </button> @@ -408,27 +422,33 @@ function="MediaCtrl.CommitURL" />  		auto_resize="false"  		user_resize="false"  		layout="topleft" -		min_width="20" +		min_width="14"  		height="14" -		width="20"> +		width="14">  	  <button -		  top="-5" -		  height="14" -		  image_selected="media_btn_scrolldown.png" -		  image_unselected="media_btn_scrolldown.png" +		  image_overlay="media_btn_scrolldown.png" +		  image_disabled="PushButton_Disabled" +		  image_disabled_selected="PushButton_Disabled" +		  image_selected="PushButton_Selected" +		  image_unselected="PushButton_Off" +		  hover_glow_amount="0.15"  		  layout="topleft"  		  tool_tip="Volume down"  		  scale_image="true" -		  min_width="20" -		  width="20"> +		  top="-5" +		  height="14" +		  min_width="14" +		  width="14">  		<button.commit_callback  			function="MediaCtrl.CommitVolumeDown" />  	  </button>  	</layout_panel>  	<!-- Scroll pad --> +	<!-- This was removed from the design, but is still here because it is -->  +	<!-- complex, and recreating it would be hard.  In case the design --> +	<!-- changes, here it lies: -->   	<!-- -		disabled -		<layout_panel +	<layout_panel  		name="media_panel_scroll"  		auto_resize="false"  		user_resize="false" @@ -437,64 +457,77 @@ function="MediaCtrl.CommitURL" />  		layout="topleft"  		min_width="32"  		width="32"> -		<icon -		height="32" -		image_name="media_panel_scrollbg.png" -		layout="topleft" -		top="0" -		min_width="32" -		width="32" /> -		<button -		name="scrollup" -		height="8" -		image_selected="media_btn_scrollup.png" -		image_unselected="media_btn_scrollup.png" -		layout="topleft" -		tool_tip="Scroll up" -		scale_image="false" -		left="12" -		top_delta="4" -		min_width="8" -		width="8" /> -		<button -		name="scrollleft" -		height="8" -		image_selected="media_btn_scrollleft.png" -		image_unselected="media_btn_scrollleft.png" -		layout="topleft" -		left="3" -		tool_tip="Scroll left" -		scale_image="false" -		top="12" -		min_width="8" -		width="8" /> -		<button -		name="scrollright" -		height="8" -		image_selected="media_btn_scrollright.png" -		image_unselected="media_btn_scrollright.png" -		layout="topleft" -		left_pad="9" -		tool_tip="Scroll right" -		scale_image="false" -		top_delta="0" -		min_width="8" -		width="8" /> -		<button -		name="scrolldown" -		height="8" -		image_selected="media_btn_scrolldown.png" -		image_unselected="media_btn_scrolldown.png" -		layout="topleft" -		left="12" -		tool_tip="Scroll down" -		scale_image="false" -		top="20" -		min_width="8" -		width="8" /> -		</layout_panel> -		disabled +	  <icon +		  height="32" +		  image_name="media_panel_scrollbg.png" +		  layout="topleft" +		  top="0" +		  min_width="32" +		  width="32" /> +	  <button +		  name="scrollup" +		  height="8" +		  image_selected="media_btn_scrollup.png" +		  image_unselected="media_btn_scrollup.png" +		  layout="topleft" +		  tool_tip="Scroll up" +		  scale_image="false" +		  left="12" +		  top_delta="4" +		  min_width="8" +		  width="8" /> +	  <button +		  name="scrollleft" +		  height="8" +		  image_selected="media_btn_scrollleft.png" +		  image_unselected="media_btn_scrollleft.png" +		  layout="topleft" +		  left="3" +		  tool_tip="Scroll left" +		  scale_image="false" +		  top="12" +		  min_width="8" +		  width="8" /> +	  <button +		  name="scrollright" +		  height="8" +		  image_selected="media_btn_scrollright.png" +		  image_unselected="media_btn_scrollright.png" +		  layout="topleft" +		  left_pad="9" +		  tool_tip="Scroll right" +		  scale_image="false" +		  top_delta="0" +		  min_width="8" +		  width="8" /> +	  <button +		  name="scrolldown" +		  height="8" +		  image_selected="media_btn_scrolldown.png" +		  image_unselected="media_btn_scrolldown.png" +		  layout="topleft" +		  left="12" +		  tool_tip="Scroll down" +		  scale_image="false" +		  top="20" +		  min_width="8" +		  width="8" /> +	</layout_panel>  	--> +	<panel +		height="28" +		layout="topleft" +		auto_resize="false" +		min_width="3" +		width="3"> +	  <icon +		  height="26" +		  image_name="media_panel_divider.png" +		  layout="topleft" +		  top="0" +		  min_width="3" +		  width="3" /> +	</panel>  	<layout_panel  		name="zoom_frame"  		auto_resize="false" @@ -504,9 +537,13 @@ function="MediaCtrl.CommitURL" />  		min_width="22"  		width="22">  	  <button +		  image_overlay="Zoom_Off" +		  image_disabled="PushButton_Disabled" +		  image_disabled_selected="PushButton_Disabled" +		  image_selected="PushButton_Selected" +		  image_unselected="PushButton_Off" +		  hover_glow_amount="0.15"  		  height="22" -		  image_selected="media_btn_optimalzoom.png" -		  image_unselected="media_btn_optimalzoom.png"  		  layout="topleft"  		  tool_tip="Zoom into media"  		  min_width="22" @@ -522,10 +559,15 @@ function="MediaCtrl.CommitURL" />  		layout="topleft"  		min_width="21"  		width="21" > +	  <!-- There is no "Zoom out" icon, so we use this temporarily -->  	  <button +		  image_overlay="ForwardArrow_Off" +		  image_disabled="PushButton_Disabled" +		  image_disabled_selected="PushButton_Disabled" +		  image_selected="PushButton_Selected" +		  image_unselected="PushButton_Off" +		  hover_glow_amount="0.15"  		  height="22" -		  image_selected="media_btn_done.png" -		  image_unselected="media_btn_done.png"  		  layout="topleft"  		  tool_tip ="Zoom Back"  		  top_delta="-4" @@ -534,22 +576,6 @@ function="MediaCtrl.CommitURL" />  			function="MediaCtrl.Close" />  	  </button>  	</layout_panel> -	<!-- -		<panel -		height="22" -		layout="topleft" -		auto_resize="false" -		min_width="3" -		width="3"> -		<icon -		height="22" -		image_name="media_panel_divider.png" -		layout="topleft" -		top="0" -		min_width="3" -		width="3" /> -		</panel> -	-->  	<layout_panel  		name="new_window"  		auto_resize="false" @@ -558,34 +584,22 @@ function="MediaCtrl.CommitURL" />  		min_width="22"  		width="22">  	  <button +		  image_overlay="ExternalBrowser_Off" +		  image_disabled="PushButton_Disabled" +		  image_disabled_selected="PushButton_Disabled" +		  image_selected="PushButton_Selected" +		  image_unselected="PushButton_Off" +		  hover_glow_amount="0.15"  		  height="22" -		  image_selected="media_btn_newwindow.png" -		  image_unselected="media_btn_newwindow.png"  		  layout="topleft"  		  tool_tip = "Open URL in browser" -		  top_delta="-3" +		  top_delta="-4"  		  min_width="24"  		  width="24" >  		<button.commit_callback  			function="MediaCtrl.Open" />  	  </button>  	</layout_panel> -	<!-- -		<panel -		height="22" -		layout="topleft" -		auto_resize="false" -		min_width="3" -		width="3"> -		<icon -		height="22" -		image_name="media_panel_divider.png" -		layout="topleft" -		top="0" -		min_width="3" -		width="3" /> -		</panel> -	-->  	<!-- bookend panel -->  	<layout_panel  		name="right_bookend" diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index 0f5e96416d..5110b6b2ef 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -283,7 +283,7 @@           mouse_opaque="false"           name="add_friend"           top="5" -         width="75" /> +         width="76" />          <button           follows="bottom|left"           height="19" @@ -292,7 +292,7 @@           name="im"           top="5"           left_pad="5" -         width="45" /> +         width="31" />          <button           follows="bottom|left"           height="19" @@ -301,7 +301,7 @@           name="call"           left_pad="5"           top="5" -         width="45" /> +         width="40" />          <button           enabled="false"           follows="bottom|left" @@ -311,7 +311,7 @@           name="show_on_map_btn"           top="5"           left_pad="5" -         width="45" /> +         width="42" />          <button           follows="bottom|left"           height="19" @@ -320,7 +320,17 @@           name="teleport"           left_pad="5"           top="5" -         width="80" /> +         width="64" /> +        <button +         follows="bottom|right" +         font="SansSerifSmall" +         height="19" +         label="▼" +         layout="topleft" +         name="overflow_btn" +         right="-1" +         top="5" +         width="21" />   </panel>   <panel       follows="bottom|left" diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 7e5c30a978..64cfdf2704 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -221,10 +221,12 @@ class WindowsManifest(ViewerManifest):      def construct(self):          super(WindowsManifest, self).construct() + +        self.enable_crt_manifest_check() +          # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe.          self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) -        self.enable_crt_manifest_check()          # Plugin host application          self.path(os.path.join(os.pardir, | 
