diff options
| author | Bradley Payne <vir@lindenlab.com> | 2009-10-12 18:40:11 +0000 | 
|---|---|---|
| committer | Bradley Payne <vir@lindenlab.com> | 2009-10-12 18:40:11 +0000 | 
| commit | 3bd6c1919cc3a142a112278a6dc83bd8292bcb5a (patch) | |
| tree | 6ea3178f5aa587d6d2e445b6cf17f25a6127833b | |
| parent | 45a375c3feb3027d7a329ac1beb97fa30759dcfe (diff) | |
Merging avatar-pipeline/currently-worn-folder-10 down to viewer-2.
svn merge -r 134766:135946  svn+ssh://svn.lindenlab.com/svn/linden/branches/avatar-pipeline/currently-worn-folder-10 .
| -rw-r--r-- | indra/llui/llscrolllistctrl.cpp | 3 | ||||
| -rw-r--r-- | indra/llui/llscrolllistitem.h | 4 | ||||
| -rw-r--r-- | indra/newview/llagentwearables.cpp | 75 | ||||
| -rw-r--r-- | indra/newview/llagentwearables.h | 21 | ||||
| -rw-r--r-- | indra/newview/llappearancemgr.cpp | 53 | ||||
| -rw-r--r-- | indra/newview/llappearancemgr.h | 3 | ||||
| -rw-r--r-- | indra/newview/llfolderviewitem.cpp | 11 | ||||
| -rw-r--r-- | indra/newview/llinventorybridge.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llvoavatarself.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llwearable.h | 4 | 
11 files changed, 131 insertions, 49 deletions
| diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 7b74b1f93b..a6cd6412e5 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -1411,6 +1411,7 @@ void LLScrollListCtrl::drawItems()  				cur_y,   				mItemListRect.getWidth(),  				mLineHeight ); +			item->setRect(item_rect);  			//llinfos << item_rect.getWidth() << llendl; @@ -1708,7 +1709,7 @@ BOOL LLScrollListCtrl::handleMouseDown(S32 x, S32 y, MASK mask)  }  BOOL LLScrollListCtrl::handleMouseUp(S32 x, S32 y, MASK mask) -{ +{	  	if (hasMouseCapture())  	{  		// release mouse capture immediately so  diff --git a/indra/llui/llscrolllistitem.h b/indra/llui/llscrolllistitem.h index 0ec7fbcc2c..15b86cc945 100644 --- a/indra/llui/llscrolllistitem.h +++ b/indra/llui/llscrolllistitem.h @@ -97,6 +97,9 @@ public:  	LLUUID	getUUID() const					{ return mItemValue.asUUID(); }  	LLSD	getValue() const				{ return mItemValue; } +	 +	void	setRect(LLRect rect)			{ mRectangle = rect; } +	LLRect	getRect() const					{ return mRectangle; }  	void	addColumn( const LLScrollListCell::Params& p ); @@ -122,6 +125,7 @@ private:  	void*	mUserdata;  	LLSD	mItemValue;  	std::vector<LLScrollListCell *> mColumns; +	LLRect  mRectangle;  };  #endif diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 50d378335e..2cfa8d2a54 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -563,16 +563,32 @@ LLInventoryItem* LLAgentWearables::getWearableInventoryItem(EWearableType type,  	return item;  } -const LLWearable* LLAgentWearables::getWearableFromWearableItem(const LLUUID& item_id) const +const LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) const  {  	for (S32 i=0; i < WT_COUNT; i++)  	{  		for (U32 j=0; j < getWearableCount((EWearableType)i); j++)  		{ -			LLUUID curr_item_id = getWearableItemID((EWearableType)i, j); -			if (curr_item_id == item_id) +			const LLWearable * curr_wearable = getWearable((EWearableType)i, j); +			if (curr_wearable && (curr_wearable->getItemID() == item_id))  			{ -				return getWearable((EWearableType)i, j); +				return curr_wearable; +			} +		} +	} +	return NULL; +} + +const LLWearable*	LLAgentWearables::getWearableFromAssetID(const LLUUID& asset_id) const +{ +	for (S32 i=0; i < WT_COUNT; i++) +	{ +		for (U32 j=0; j < getWearableCount((EWearableType)i); j++) +		{ +			const LLWearable * curr_wearable = getWearable((EWearableType)i, j); +			if (curr_wearable && (curr_wearable->getAssetID() == asset_id)) +			{ +				return curr_wearable;  			}  		}  	} @@ -683,10 +699,19 @@ const LLUUID LLAgentWearables::getWearableItemID(EWearableType type, U32 index)  		return LLUUID();  } +const LLUUID LLAgentWearables::getWearableAssetID(EWearableType type, U32 index) const +{ +	const LLWearable *wearable = getWearable(type,index); +	if (wearable) +		return wearable->getAssetID(); +	else +		return LLUUID(); +} +  // Warning: include_linked_items = TRUE makes this operation expensive.  BOOL LLAgentWearables::isWearingItem(const LLUUID& item_id, BOOL include_linked_items) const  { -	if (getWearableFromWearableItem(item_id) != NULL) return TRUE; +	if (getWearableFromItemID(item_id) != NULL) return TRUE;  	if (include_linked_items)  	{  		LLInventoryModel::item_array_t item_array; @@ -696,8 +721,8 @@ BOOL LLAgentWearables::isWearingItem(const LLUUID& item_id, BOOL include_linked_  			 iter++)  		{  			LLViewerInventoryItem *linked_item = (*iter); -			const LLUUID &item_id = linked_item->getUUID(); -			if (getWearableFromWearableItem(item_id) != NULL) return TRUE; +			const LLUUID &linked_item_id = linked_item->getUUID(); +			if (getWearableFromItemID(linked_item_id) != NULL) return TRUE;  		}  	}  	return FALSE; @@ -1152,26 +1177,6 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)  		return LLUUID::null;  	} -	LLDynamicArray<S32> wearables_to_include; -	getAllWearablesArray(wearables_to_include); -	 -	LLDynamicArray<S32> attachments_to_include; -	mAvatarObject->getAllAttachmentsArray(attachments_to_include); - -	return makeNewOutfitLinks(new_folder_name, wearables_to_include, attachments_to_include); -} - -// Note:	wearables_to_include should be a list of EWearableType types -//			attachments_to_include should be a list of attachment points -LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name, -											 const LLDynamicArray<S32>& wearables_to_include, -											 const LLDynamicArray<S32>& attachments_to_include) -{ -	if (mAvatarObject.isNull()) -	{ -		return LLUUID::null; -	} -  	// First, make a folder in the My Outfits directory.  	LLUUID parent_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_MY_OUTFITS);  	LLUUID folder_id = gInventory.createNewCategory( @@ -1180,8 +1185,8 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name,  		new_folder_name);  	LLAppearanceManager::shallowCopyCategory(LLAppearanceManager::getCOF(),folder_id, NULL); - -#if 0 +	 +#if 0  // BAP - fix to go into rename state automatically after outfit is created.  	LLViewerInventoryCategory *parent_category = gInventory.getCategory(parent_id);  	if (parent_category)  	{ @@ -1839,7 +1844,7 @@ void LLAgentWearables::userAttachMultipleAttachments(LLInventoryModel::item_arra  			msg->nextBlockFast(_PREHASH_HeaderData);  			msg->addUUIDFast(_PREHASH_CompoundMsgID, compound_msg_id );  			msg->addU8Fast(_PREHASH_TotalObjects, obj_count ); -			msg->addBOOLFast(_PREHASH_FirstDetachAll, true ); // BAP changing this doesn't seem to matter? +			msg->addBOOLFast(_PREHASH_FirstDetachAll, false );  		}  		const LLInventoryItem* item = obj_item_array.get(i).get(); @@ -1882,6 +1887,16 @@ void LLAgentWearables::updateWearablesLoaded()  	mWearablesLoaded = (itemUpdatePendingCount()==0);  } +bool LLAgentWearables::canWearableBeRemoved(const LLWearable* wearable) const +{ +	if (!wearable) return false; +	 +	EWearableType type = wearable->getType(); +	// Make sure the user always has at least one shape, skin, eyes, and hair type currently worn. +	return !(((type == WT_SHAPE) || (type == WT_SKIN) || (type == WT_HAIR) || (type == WT_EYES)) +			 && (getWearableCount(type) <= 1) );		   +} +  void LLAgentWearables::updateServer()  {  	sendAgentWearablesUpdate(); diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 701ce7f05a..8b9d29342a 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -75,20 +75,25 @@ public:  	BOOL			areWearablesLoaded() const;  	void			updateWearablesLoaded();  	void			checkWearablesLoaded() const; +	 +	// Note: False for shape, skin, eyes, and hair, unless you have MORE than 1. +	bool			canWearableBeRemoved(const LLWearable* wearable) const;  	//--------------------------------------------------------------------  	// Accessors  	//--------------------------------------------------------------------  public: -	const LLUUID	getWearableItemID(EWearableType type, U32 index /*= 0*/) const; -	const LLWearable*		getWearableFromWearableItem(const LLUUID& item_id) const; -	LLInventoryItem* getWearableInventoryItem(EWearableType type, U32 index /*= 0*/); +	const LLUUID		getWearableItemID(EWearableType type, U32 index /*= 0*/) const; +	const LLUUID		getWearableAssetID(EWearableType type, U32 index /*= 0*/) const; +	const LLWearable*	getWearableFromItemID(const LLUUID& item_id) const; +	const LLWearable*	getWearableFromAssetID(const LLUUID& asset_id) const; +	LLInventoryItem*	getWearableInventoryItem(EWearableType type, U32 index /*= 0*/);  	// MULTI-WEARABLE: assuming one per type. -	static BOOL		selfHasWearable(EWearableType type); -	LLWearable*		getWearable(const EWearableType type, U32 index /*= 0*/);  +	static BOOL			selfHasWearable(EWearableType type); +	LLWearable*			getWearable(const EWearableType type, U32 index /*= 0*/);   	const LLWearable* 	getWearable(const EWearableType type, U32 index /*= 0*/) const; -	U32				getWearableCount(const EWearableType type) const; +	U32					getWearableCount(const EWearableType type) const;  	//-------------------------------------------------------------------- @@ -159,9 +164,7 @@ public:  	// 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); -	LLUUID			makeNewOutfitLinks(const std::string& new_folder_name, -									   const LLDynamicArray<S32>& wearables_to_include, -									   const LLDynamicArray<S32>& attachments_to_include); +  private:  	void			makeNewOutfitDone(S32 type, U32 index);  diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 3831846e2e..cf8d852dfe 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -165,6 +165,8 @@ void LLOutfitObserver::done()  					cb);  			}  		} +		// BAP fixes a lag in display of created dir. +		gInventory.notifyObservers();  	}  	else  	{ @@ -495,11 +497,16 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory  		}  		else if (item->getActualType() == LLAssetType::AT_LINK_FOLDER)  		{ -			link_inventory_item(gAgent.getID(), -								item->getLinkedUUID(), -								dst_id, -								item->getName(), -								LLAssetType::AT_LINK_FOLDER, cb); +			LLViewerInventoryCategory *catp = item->getLinkedCategory(); +			// Skip copying outfit links. +			if (catp && catp->getPreferredType() != LLAssetType::AT_OUTFIT) +			{ +				link_inventory_item(gAgent.getID(), +									item->getLinkedUUID(), +									dst_id, +									item->getName(), +									LLAssetType::AT_LINK_FOLDER, cb); +			}  		}  		else  		{ @@ -519,6 +526,9 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory  {  	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); @@ -538,6 +548,8 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory  	gInventory.collectDescendents(current_outfit_id, cof_cats, cof_items,  								  LLInventoryModel::EXCLUDE_TRASH); +	//dumpCat(current_outfit_id,"COF before remove:"); +  	if (items.count() > 0)  	{  		for (S32 i = 0; i < cof_items.count(); ++i) @@ -547,15 +559,19 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory  		gInventory.notifyObservers();  	} +	//dumpCat(current_outfit_id,"COF after remove:"); +  	LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;  	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() == LLAssetType::AT_OUTFIT)  	{  		link_inventory_item(gAgent.getID(), category, current_outfit_id, catp->getName(), -							LLAssetType::AT_LINK_FOLDER, LLPointer<LLInventoryCallback>(NULL)); +							LLAssetType::AT_LINK_FOLDER, link_waiter);  	}  } @@ -628,6 +644,8 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,  /* static */ void LLAppearanceManager::updateAppearanceFromCOF()  { +	dumpCat(getCOF(),"COF, start"); +  	bool follow_folder_links = true;  	LLUUID current_outfit_id = getCOF(); @@ -921,3 +939,26 @@ void LLAppearanceManager::removeItemLinks(LLUUID& item_id, bool do_update)  		LLAppearanceManager::updateAppearanceFromCOF();  	}  } + +/* static */ +void LLAppearanceManager::dumpCat(const LLUUID& cat_id, std::string str) +{ +	LLInventoryModel::cat_array_t cats; +	LLInventoryModel::item_array_t items; +	gInventory.collectDescendents(cat_id, cats, items, LLInventoryModel::EXCLUDE_TRASH); + +#if 0 +	llinfos << llendl; +	llinfos << str << llendl; +	S32 hitcount = 0; +	for(S32 i=0; i<items.count(); i++) +	{ +		LLViewerInventoryItem *item = items.get(i); +		if (item) +			hitcount++; +		llinfos << i <<" "<< item->getName() <<llendl; +	} +#endif +	llinfos << str << " count " << items.count() << llendl; +} + diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 2aa10e0bea..fe24696182 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -64,6 +64,9 @@ public:  	// Remove COF entries  	static void removeItemLinks(LLUUID& item_id, bool do_update = true); +	// For debugging - could be moved elsewhere. +	static void dumpCat(const LLUUID& cat_id, std::string str); +  private:  	static void getCOFValidDescendents(const LLUUID& category,   									   LLInventoryModel::item_array_t& items); diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 0d432bd398..66881be309 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -600,6 +600,11 @@ BOOL LLFolderViewItem::handleRightMouseDown( S32 x, S32 y, MASK mask )  BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask )  { +	if (LLView::childrenHandleMouseDown(x, y, mask)) +	{ +		return TRUE; +	} +	  	// No handler needed for focus lost since this class has no  	// state that depends on it.  	gFocusMgr.setMouseCapture( this ); @@ -719,6 +724,11 @@ BOOL LLFolderViewItem::handleScrollWheel(S32 x, S32 y, S32 clicks)  BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask )  { +	if (LLView::childrenHandleMouseUp(x, y, mask)) +	{ +		return TRUE; +	} +	  	// if mouse hasn't moved since mouse down...  	if ( pointInView(x, y) && mSelectPending )  	{ @@ -968,6 +978,7 @@ void LLFolderViewItem::draw()  			}  		}  	} +	LLView::draw();  } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index f2329c2ef5..d4a9324208 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -4421,7 +4421,7 @@ void LLWearableBridge::onEditOnAvatar(void* user_data)  void LLWearableBridge::editOnAvatar()  { -	const LLWearable* wearable = gAgentWearables.getWearableFromWearableItem(mUUID); +	const LLWearable* wearable = gAgentWearables.getWearableFromItemID(mUUID);  	if( wearable )  	{  		// Set the tab to the right wearable. diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 60d64d50b9..9437d8797e 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -5501,7 +5501,9 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object)  				}  				else  				{ +					LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:");  					LLAppearanceManager::removeItemLinks(item_id, false); +  				}  				// BAP - needs to change for label to track link. diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 20b8750fbf..76a4bfbf0c 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -987,7 +987,9 @@ LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *viewer_obj  	LLViewerInventoryItem *item = gInventory.getItem(attachment->getItemID());  	if (item)  	{ +		LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:");  		LLAppearanceManager::wearItem(item,false);  // Add COF link for item. +  	}  	gInventory.addChangedMask(LLInventoryObserver::LABEL, attachment->getItemID());  	gInventory.notifyObservers(); diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h index 5f0b235c7f..d7b4d3f91e 100644 --- a/indra/newview/llwearable.h +++ b/indra/newview/llwearable.h @@ -62,6 +62,7 @@ public:  	// Accessors  	//--------------------------------------------------------------------  public: +	const LLUUID&				getItemID() const;  	const LLAssetID&			getAssetID() const { return mAssetID; }  	const LLTransactionID&		getTransactionID() const { return mTransactionID; }  	EWearableType				getType() const	{ return mType; } @@ -77,6 +78,7 @@ public:  	const std::string&			getTypeLabel() const;  	const std::string&			getTypeName() const;  	LLAssetType::EType			getAssetType() const; +	LLLocalTextureObject*		getLocalTextureObject(S32 index) const;  public:  	BOOL				isDirty() const; @@ -102,8 +104,6 @@ public:  	friend std::ostream& operator<<(std::ostream &s, const LLWearable &w);  	void				setItemID(const LLUUID& item_id); -	const LLUUID&		getItemID() const; -	LLLocalTextureObject* getLocalTextureObject(S32 index) const;  	void				setLocalTextureObject(S32 index, LLLocalTextureObject *lto);  private: | 
