diff options
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/llagentwearables.cpp | 7 | ||||
| -rw-r--r-- | indra/newview/llfolderview.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llfoldervieweventlistener.h | 3 | ||||
| -rw-r--r-- | indra/newview/llinventorybridge.cpp | 49 | ||||
| -rw-r--r-- | indra/newview/llinventorybridge.h | 10 | ||||
| -rw-r--r-- | indra/newview/llpanelmaininventory.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llpanelobjectinventory.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llpaneloutfitsinventory.cpp | 21 | ||||
| -rw-r--r-- | indra/newview/llplacesinventorybridge.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llstartup.cpp | 11 | 
10 files changed, 80 insertions, 42 deletions
| diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 41f2ff29e6..acbf02678c 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -927,13 +927,6 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs  	if (mInitialWearablesUpdateReceived)  		return;  	mInitialWearablesUpdateReceived = true; -	 -	// If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account) -	// then auto-populate outfits from the library into the My Outfits folder. -	if (LLInventoryModel::getIsFirstTimeInViewer2() || gSavedSettings.getBOOL("MyOutfitsAutofill")) -	{ -		gAgentWearables.populateMyOutfitsFolder(); -	}  	LLUUID agent_id;  	gMessageSystem->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index c6135d3bc3..5c65b2c293 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -1272,8 +1272,7 @@ BOOL LLFolderView::canCut() const  		const LLFolderViewItem* item = *selected_it;  		const LLFolderViewEventListener* listener = item->getListener(); -		// *WARKAROUND: it is too many places where the "isItemRemovable" method should be changed with "const" modifier -		if (!listener || !(const_cast<LLFolderViewEventListener*>(listener))->isItemRemovable()) +		if (!listener || !listener->isItemRemovable())  		{  			return FALSE;  		} diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h index d6c4459e6f..12e100caf4 100644 --- a/indra/newview/llfoldervieweventlistener.h +++ b/indra/newview/llfoldervieweventlistener.h @@ -73,7 +73,8 @@ public:  	virtual BOOL isItemRenameable() const = 0;  	virtual BOOL renameItem(const std::string& new_name) = 0;  	virtual BOOL isItemMovable( void ) const = 0;		// Can be moved to another folder -	virtual BOOL isItemRemovable( void ) = 0;	// Can be destroyed +	virtual BOOL isItemRemovable( void ) const = 0;		// Can be destroyed +	virtual BOOL isItemInTrash( void) const { return FALSE; } // TODO: make into pure virtual.  	virtual BOOL removeItem() = 0;  	virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) = 0;  	virtual void move( LLFolderViewEventListener* parent_listener ) = 0; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index ab178b4007..1fd069f195 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -174,7 +174,7 @@ time_t LLInvFVBridge::getCreationDate() const  }  // Can be destroyed (or moved to trash) -BOOL LLInvFVBridge::isItemRemovable() +BOOL LLInvFVBridge::isItemRemovable() const  {  	const LLInventoryModel* model = getInventoryModel();  	if(!model)  @@ -605,7 +605,7 @@ void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	lldebugs << "LLInvFVBridge::buildContextMenu()" << llendl;  	std::vector<std::string> items;  	std::vector<std::string> disabled_items; -	if(isInTrash()) +	if(isItemInTrash())  	{  		items.push_back(std::string("Purge Item"));  		if (!isItemRemovable()) @@ -670,7 +670,7 @@ LLInventoryModel* LLInvFVBridge::getInventoryModel() const  	return panel ? panel->getModel() : NULL;  } -BOOL LLInvFVBridge::isInTrash() const +BOOL LLInvFVBridge::isItemInTrash() const  {  	LLInventoryModel* model = getInventoryModel();  	if(!model) return FALSE; @@ -680,7 +680,7 @@ BOOL LLInvFVBridge::isInTrash() const  BOOL LLInvFVBridge::isLinkedObjectInTrash() const  { -	if (isInTrash()) return TRUE; +	if (isItemInTrash()) return TRUE;  	const LLInventoryObject *obj = getInventoryObject();  	if (obj && obj->getIsLinkType()) @@ -1412,7 +1412,7 @@ public:  };  // Can be destroyed (or moved to trash) -BOOL LLFolderBridge::isItemRemovable() +BOOL LLFolderBridge::isItemRemovable() const  {  	LLInventoryModel* model = getInventoryModel();  	if(!model) @@ -3208,7 +3208,7 @@ void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	lldebugs << "LLTextureBridge::buildContextMenu()" << llendl;  	std::vector<std::string> items;  	std::vector<std::string> disabled_items; -	if(isInTrash()) +	if(isItemInTrash())  	{  		items.push_back(std::string("Purge Item"));  		if (!isItemRemovable()) @@ -3302,7 +3302,7 @@ void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	std::vector<std::string> items;  	std::vector<std::string> disabled_items; -	if(isInTrash()) +	if(isItemInTrash())  	{  		items.push_back(std::string("Purge Item"));  		if (!isItemRemovable()) @@ -3351,7 +3351,7 @@ void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	std::vector<std::string> disabled_items;  	lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl; -	if(isInTrash()) +	if(isItemInTrash())  	{  		items.push_back(std::string("Purge Item"));  		if (!isItemRemovable()) @@ -3576,7 +3576,7 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	std::vector<std::string> items;  	std::vector<std::string> disabled_items; -	if(isInTrash()) +	if(isItemInTrash())  	{  		items.push_back(std::string("Purge Item"));  		if (!isItemRemovable()) @@ -3841,7 +3841,7 @@ void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	lldebugs << "LLGestureBridge::buildContextMenu()" << llendl;  	std::vector<std::string> items;  	std::vector<std::string> disabled_items; -	if(isInTrash()) +	if(isItemInTrash())  	{  		items.push_back(std::string("Purge Item"));  		if (!isItemRemovable()) @@ -3905,7 +3905,7 @@ void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	std::vector<std::string> disabled_items;  	lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl; -	if(isInTrash()) +	if(isItemInTrash())  	{  		items.push_back(std::string("Purge Item"));  		if (!isItemRemovable()) @@ -4184,7 +4184,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  {  	std::vector<std::string> items;  	std::vector<std::string> disabled_items; -	if(isInTrash()) +	if(isItemInTrash())  	{  		items.push_back(std::string("Purge Item"));  		if (!isItemRemovable()) @@ -4220,7 +4220,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  			{  				items.push_back(std::string("Detach From Yourself"));  			} -			else if (!isInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing()) +			else if (!isItemInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing())  			{  				items.push_back(std::string("Attach Separator"));  				items.push_back(std::string("Object Wear")); @@ -4558,7 +4558,7 @@ void LLWearableBridge::openItem()  		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());  	}  	/* -	if( isInTrash() ) +	if( isItemInTrash() )  	{  		LLNotificationsUtil::add("CannotWearTrash");  	} @@ -4600,7 +4600,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	lldebugs << "LLWearableBridge::buildContextMenu()" << llendl;  	std::vector<std::string> items;  	std::vector<std::string> disabled_items; -	if(isInTrash()) +	if(isItemInTrash())  	{  		items.push_back(std::string("Purge Item"));  		if (!isItemRemovable()) @@ -4916,8 +4916,12 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,  	}  	// Find and remove this item from the COF. +	// FIXME 2.1 - call removeCOFItemLinks in llappearancemgr instead.  	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. +	if (items.size() != 1) +	{ +		llwarns << "Found " << items.size() << " COF links to " << item_id.asString() << ", expected 1" << llendl; +	}  	for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();  		 iter != items.end();  		 ++iter) @@ -4953,7 +4957,10 @@ void LLWearableBridge::removeAllClothesFromAvatar()  		// Find and remove this item from the COF.  		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. +		if (items.size() != 1) +		{ +			llwarns << "Found " << items.size() << " COF links to " << item_id.asString() << ", expected 1" << llendl; +		}  		for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();  			 iter != items.end();  			 ++iter) @@ -5195,7 +5202,7 @@ void	LLLSLTextBridgeAction::doIt()  } -BOOL LLWearableBridgeAction::isInTrash() const +BOOL LLWearableBridgeAction::isItemInTrash() const  {  	if(!mModel) return FALSE;  	const LLUUID trash_id = mModel->findCategoryUUIDForType(LLFolderType::FT_TRASH); @@ -5243,7 +5250,7 @@ void LLWearableBridgeAction::wearOnAvatar()  //virtual  void LLWearableBridgeAction::doIt()  { -	if(isInTrash()) +	if(isItemInTrash())  	{  		LLNotificationsUtil::add("CannotWearTrash");  	} @@ -5308,7 +5315,7 @@ void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	items.push_back(std::string("Find Original"));  	disabled_items.push_back(std::string("Find Original")); -	if(isInTrash()) +	if(isItemInTrash())  	{  		items.push_back(std::string("Purge Item"));  		if (!isItemRemovable()) @@ -5359,7 +5366,7 @@ void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	std::vector<std::string> items;  	std::vector<std::string> disabled_items; -	if(isInTrash()) +	if(isItemInTrash())  	{  		items.push_back(std::string("Purge Item"));  		if (!isItemRemovable()) diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 6fffec96a0..6e256edc05 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -158,8 +158,10 @@ public:  	virtual void showProperties();  	virtual BOOL isItemRenameable() const { return TRUE; }  	//virtual BOOL renameItem(const std::string& new_name) {} -	virtual BOOL isItemRemovable(); +	virtual BOOL isItemRemovable() const;  	virtual BOOL isItemMovable() const; +	virtual BOOL isItemInTrash() const; +  	//virtual BOOL removeItem() = 0;  	virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch);  	virtual void move(LLFolderViewEventListener* new_parent_bridge) {} @@ -185,13 +187,13 @@ public:  	// Allow context menus to be customized for side panel.  	bool isInOutfitsSidePanel() const; +  protected:  	LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid);  	LLInventoryObject* getInventoryObject() const;  	LLInventoryModel* getInventoryModel() const; -	BOOL isInTrash() const;  	BOOL isLinkedObjectInTrash() const; // Is this obj or its baseobj in the trash?  	BOOL isLinkedObjectMissing() const; // Is this a linked obj whose baseobj is not in inventory? @@ -306,7 +308,7 @@ public:  							EDragAndDropType cargo_type,  							void* cargo_data); -	virtual BOOL isItemRemovable(); +	virtual BOOL isItemRemovable() const;  	virtual BOOL isItemMovable() const ;  	virtual BOOL isUpToDate() const;  	virtual BOOL isItemCopyable() const; @@ -786,7 +788,7 @@ protected:  	LLWearableBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){} -	BOOL isInTrash() const; +	BOOL isItemInTrash() const;  	// return true if the item is in agent inventory. if false, it  	// must be lost or in the inventory library.  	BOOL isAgentInventory() const; diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index a5a61f0c7b..1895993a8e 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -1071,7 +1071,11 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)  			{  				const LLUUID &item_id = (*iter);  				LLFolderViewItem *item = folder->getItemByID(item_id); -				can_delete &= item->getListener()->isItemRemovable(); +				const LLFolderViewEventListener *listener = item->getListener(); +				llassert(listener); +				if (!listener) return FALSE; +				can_delete &= listener->isItemRemovable(); +				can_delete &= !listener->isItemInTrash();  			}  			return can_delete;  		} diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 5c5c35141e..e8ae006968 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -117,7 +117,7 @@ public:  	virtual BOOL isItemRenameable() const;  	virtual BOOL renameItem(const std::string& new_name);  	virtual BOOL isItemMovable() const; -	virtual BOOL isItemRemovable(); +	virtual BOOL isItemRemovable() const;  	virtual BOOL removeItem();  	virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch);  	virtual void move(LLFolderViewEventListener* parent_listener); @@ -412,9 +412,9 @@ BOOL LLTaskInvFVBridge::isItemMovable() const  	return TRUE;  } -BOOL LLTaskInvFVBridge::isItemRemovable() +BOOL LLTaskInvFVBridge::isItemRemovable() const  { -	LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); +	const LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());  	if(object  	   && (object->permModify() || object->permYouOwner()))  	{ @@ -710,7 +710,7 @@ public:  	virtual BOOL isItemRenameable() const;  	// virtual BOOL isItemCopyable() const { return FALSE; }  	virtual BOOL renameItem(const std::string& new_name); -	virtual BOOL isItemRemovable(); +	virtual BOOL isItemRemovable() const;  	virtual void buildContextMenu(LLMenuGL& menu, U32 flags);  	virtual BOOL hasChildren() const;  	virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const; @@ -742,7 +742,7 @@ BOOL LLTaskCategoryBridge::renameItem(const std::string& new_name)  	return FALSE;  } -BOOL LLTaskCategoryBridge::isItemRemovable() +BOOL LLTaskCategoryBridge::isItemRemovable() const  {  	return FALSE;  } diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index cf903958ee..c2f2d32142 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -159,6 +159,27 @@ void LLPanelOutfitsInventory::onOpen(const LLSD& key)  	// Make sure we know which tab is selected, update the filter,  	// and update verbs.  	onTabChange(); +	 +	// Auto open the first outfit newly created so new users can see sample outfit contents +	static bool should_open_outfit = true; +	if (should_open_outfit && gAgent.isFirstLogin()) +	{ +		LLInventoryPanel* outfits_panel = getChild<LLInventoryPanel>(OUTFITS_TAB_NAME); +		if (outfits_panel) +		{ +			LLUUID my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); +			LLFolderViewFolder* my_outfits_folder = outfits_panel->getRootFolder()->getFolderByID(my_outfits_id); +			if (my_outfits_folder) +			{ +				LLFolderViewFolder* first_outfit = dynamic_cast<LLFolderViewFolder*>(my_outfits_folder->getFirstChild()); +				if (first_outfit) +				{ +					first_outfit->setOpen(TRUE); +				} +			} +		} +	} +	should_open_outfit = false;  }  void LLPanelOutfitsInventory::updateVerbs() diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp index 83443687c9..4fe69f295c 100644 --- a/indra/newview/llplacesinventorybridge.cpp +++ b/indra/newview/llplacesinventorybridge.cpp @@ -66,7 +66,7 @@ void LLPlacesLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	std::vector<std::string> items;  	std::vector<std::string> disabled_items; -	if(isInTrash()) +	if(isItemInTrash())  	{  		items.push_back(std::string("Purge Item"));  		if (!isItemRemovable()) diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 9fda77fe74..a402dfc3d1 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1876,6 +1876,17 @@ bool idle_startup()  				LLViewerShaderMgr::instance()->setShaders();  			}  		} +		 +		// If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account) +		// then auto-populate outfits from the library into the My Outfits folder. +		static bool check_populate_my_outfits = true; +		if (check_populate_my_outfits &&  +			(LLInventoryModel::getIsFirstTimeInViewer2()  +			 || gSavedSettings.getBOOL("MyOutfitsAutofill"))) +		{ +			gAgentWearables.populateMyOutfitsFolder(); +		} +		check_populate_my_outfits = false;  		return TRUE;  	} | 
