diff options
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/llinventorybridge.cpp | 135 | 
1 files changed, 90 insertions, 45 deletions
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 79a18115a7..ec4ef422e2 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2848,6 +2848,9 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response  	return false;  } +// This is used both for testing whether an item can be dropped +// into the folder, as well as performing the actual drop, depending +// if drop == TRUE.  BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  										BOOL drop)  { @@ -2867,8 +2870,23 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  	LLViewerObject* object = NULL;  	if(LLToolDragAndDrop::SOURCE_AGENT == source)  	{ +		const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); +		const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); +		const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE); + +		const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); +		const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); +		const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); +		const BOOL move_is_outof_current_outfit = LLAppearanceMgr::instance().getIsInCOF(inv_item->getUUID()); +		const BOOL folder_allows_reorder = (mUUID == favorites_id); + +		//-------------------------------------------------------------------------------- +		// Determine if item can be moved. +		// +  		BOOL is_movable = TRUE; -		switch( inv_item->getActualType() ) + +		switch (inv_item->getActualType())  		{  			case LLAssetType::AT_CATEGORY:  				is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType()); @@ -2876,41 +2894,50 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			default:  				break;  		} - -		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); -		const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); -		const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); -		const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); -		const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); -		const BOOL move_is_outof_current_outfit = LLAppearanceMgr::instance().getIsInCOF(inv_item->getUUID()); -  		// Can't explicitly drag things out of the COF.  		if (move_is_outof_current_outfit)  		{  			is_movable = FALSE;  		} -		 -		if(is_movable && move_is_into_trash) +		if (move_is_into_trash)  		{ -			is_movable = inv_item->getIsLinkType() || !get_is_item_worn(inv_item->getUUID()); +			is_movable &= inv_item->getIsLinkType() || !get_is_item_worn(inv_item->getUUID());  		} - -		if ( is_movable ) +		if (is_movable)  		{  			// Don't allow creating duplicates in the Calling Card/Friends  			// subfolders, see bug EXT-1599. Check is item direct descendent  			// of target folder and forbid item's movement if it so.  			// Note: isItemDirectDescendentOfCategory checks if  			// passed category is in the Calling Card/Friends folder -			is_movable = ! LLFriendCardsManager::instance() -				.isObjDirectDescendentOfCategory (inv_item, getCategory()); +			is_movable &= !LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(inv_item, getCategory()); +		} + +		//  +		//-------------------------------------------------------------------------------- +		 +		//-------------------------------------------------------------------------------- +		// Determine if item can be moved & dropped +		// + +		accept = TRUE; + +		if (!is_movable)  +			accept = FALSE; +		if ((mUUID == inv_item->getParentUUID()) && !folder_allows_reorder) +			accept = FALSE; +		if (move_is_into_current_outfit || move_is_into_outfit) +		{ +			if ((inv_item->getInventoryType() != LLInventoryType::IT_WEARABLE) && +				(inv_item->getInventoryType() != LLInventoryType::IT_GESTURE) && +				(inv_item->getInventoryType() != LLInventoryType::IT_OBJECT)) +				accept = FALSE; +		} +		if (move_is_into_current_outfit && get_is_item_worn(inv_item->getUUID())) +		{ +			accept = FALSE;  		} -		const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE); -		const BOOL folder_allows_reorder = (mUUID == favorites_id); -	    -		// we can move item inside a folder only if this folder is Favorites. See EXT-719 -		accept = is_movable && ((mUUID != inv_item->getParentUUID()) || folder_allows_reorder);  		if(accept && drop)  		{  			if (inv_item->getType() == LLAssetType::AT_GESTURE @@ -2918,10 +2945,8 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			{  				LLGestureMgr::instance().deactivateGesture(inv_item->getUUID());  			} -			// If an item is being dragged between windows, unselect -			// everything in the active window so that we don't follow -			// the selection to its new location (which is very -			// annoying). +			// If an item is being dragged between windows, unselect everything in the active window  +			// so that we don't follow the selection to its new location (which is very annoying).  			LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);  			if (active_panel)  			{ @@ -2932,7 +2957,12 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  				}  			} -			// if dragging from/into favorites folder only reorder items +			//-------------------------------------------------------------------------------- +			// Destination folder logic +			//  + +			// REORDER +			// (only reorder the item)  			if ((mUUID == inv_item->getParentUUID()) && folder_allows_reorder)  			{  				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); @@ -2944,7 +2974,10 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  					gInventory.rearrangeFavoriteLandmarks(srcItemId, destItemId);  				}  			} -			else if (favorites_id == mUUID) // if target is the favorites folder we use copy + +			// FAVORITES folder +			// (copy the item) +			else if (favorites_id == mUUID)  			{  				// use callback to rearrange favorite landmarks after adding  				// to have new one placed before target (on which it was dropped). See EXT-4312. @@ -2964,38 +2997,50 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  					std::string(),  					cb);  			} +			// CURRENT OUTFIT or OUTFIT folder +			// (link the item)  			else if (move_is_into_current_outfit || move_is_into_outfit)  			{ -				// BAP - should skip if dup. -				if (move_is_into_current_outfit) +				if ((inv_item->getInventoryType() == LLInventoryType::IT_WEARABLE) ||  +					(inv_item->getInventoryType() == LLInventoryType::IT_GESTURE) ||  +					(inv_item->getInventoryType() == LLInventoryType::IT_OBJECT))  				{ -					LLAppearanceMgr::instance().addCOFItemLink(inv_item); -				} -				else -				{ -					LLPointer<LLInventoryCallback> cb = NULL; -					link_inventory_item( -						gAgent.getID(), -						inv_item->getLinkedUUID(), -						mUUID, -						inv_item->getName(), -						inv_item->getDescription(), -						LLAssetType::AT_LINK, -						cb); +					// BAP - should skip if dup. +					if (move_is_into_current_outfit) +					{ +						LLAppearanceMgr::instance().addCOFItemLink(inv_item); +					} +					else +					{ +						LLPointer<LLInventoryCallback> cb = NULL; +						link_inventory_item( +							gAgent.getID(), +							inv_item->getLinkedUUID(), +							mUUID, +							inv_item->getName(), +							inv_item->getDescription(), +							LLAssetType::AT_LINK, +							cb); +					}  				}  			} +			// NORMAL or TRASH folder +			// (move the item, restamp if into trash)  			else  			{ -				// restamp if the move is into the trash.  				LLInvFVBridge::changeItemParent(  					model,  					(LLViewerInventoryItem*)inv_item,  					mUUID,  					move_is_into_trash);  			} + +			//  +			//-------------------------------------------------------------------------------- +  		}  	} -	else if(LLToolDragAndDrop::SOURCE_WORLD == source) +	else if (LLToolDragAndDrop::SOURCE_WORLD == source)  	{  		// Make sure the object exists. If we allowed dragging from  		// anonymous objects, it would be possible to bypass @@ -3013,7 +3058,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  		BOOL is_move = FALSE;  		if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())  			&& perm.allowTransferTo(gAgent.getID()))) -//		   || gAgent.isGodlike()) +			// || gAgent.isGodlike())  		{  			accept = TRUE;  | 
