diff options
| -rw-r--r-- | indra/newview/llinventorybridge.cpp | 87 | 
1 files changed, 79 insertions, 8 deletions
| diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index b15dcd993a..e672892282 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1649,10 +1649,12 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  		const LLUUID &cat_id = inv_cat->getUUID();  		const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH, false);  		const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false); +		const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false);  		const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);  		const BOOL move_is_into_outfit = getCategory() && (getCategory()->getPreferredType() == LLFolderType::FT_OUTFIT);  		const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); +		const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id);  		//--------------------------------------------------------------------------------  		// Determine if folder can be moved. @@ -1690,6 +1692,21 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  				}  			}  		} +		if (move_is_into_landmarks) +		{ +			for (S32 i=0; i < descendent_items.count(); ++i) +			{ +				LLViewerInventoryItem* item = descendent_items[i]; + +				// Don't move anything except landmarks and categories into Landmarks folder. +				// We use getType() instead of getActua;Type() to allow links to landmarks and folders. +				if (LLAssetType::AT_LANDMARK != item->getType() && LLAssetType::AT_CATEGORY != item->getType()) +				{ +					is_movable = FALSE; +					break; // It's generally movable, but not into Landmarks. +				} +			} +		}  		//   		//-------------------------------------------------------------------------------- @@ -2661,6 +2678,8 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,  								EDragAndDropType cargo_type,  								void* cargo_data)  { +	LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data; +  	//llinfos << "LLFolderBridge::dragOrDrop()" << llendl;  	BOOL accept = FALSE;  	switch(cargo_type) @@ -2676,9 +2695,24 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,  		case DAD_BODYPART:  		case DAD_ANIMATION:  		case DAD_GESTURE: +			accept = dragItemIntoFolder(inv_item, drop); +			break;  		case DAD_LINK: -			accept = dragItemIntoFolder((LLInventoryItem*)cargo_data, -										drop); +			// DAD_LINK type might mean one of two asset types: AT_LINK or AT_LINK_FOLDER. +			// If we have an item of AT_LINK_FOLDER type we should process the linked +			// category being dragged or dropped into folder. +			if (inv_item && LLAssetType::AT_LINK_FOLDER == inv_item->getActualType()) +			{ +				LLInventoryCategory* linked_category = gInventory.getCategory(inv_item->getLinkedUUID()); +				if (linked_category) +				{ +					accept = dragCategoryIntoFolder((LLInventoryCategory*)linked_category, drop); +				} +			} +			else +			{ +				accept = dragItemIntoFolder(inv_item, drop); +			}  			break;  		case DAD_CATEGORY:  			if (LLFriendCardsManager::instance().isAnyFriendCategory(mUUID)) @@ -2875,6 +2909,24 @@ static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_curr  	return TRUE;  } +// Returns TRUE if item is a landmark or a link to a landmark +// and can be moved to Favorites or Landmarks folder. +static BOOL can_move_to_landmarks(LLInventoryItem* inv_item) +{ +	// Need to get the linked item to know its type because LLInventoryItem::getType() +	// returns actual type AT_LINK for links, not the asset type of a linked item. +	if (LLAssetType::AT_LINK == inv_item->getType()) +	{ +		LLInventoryItem* linked_item = gInventory.getItem(inv_item->getLinkedUUID()); +		if (linked_item) +		{ +			return LLAssetType::AT_LANDMARK == linked_item->getType(); +		} +	} + +	return LLAssetType::AT_LANDMARK == inv_item->getType(); +} +  void LLFolderBridge::dropToFavorites(LLInventoryItem* inv_item)  {  	// use callback to rearrange favorite landmarks after adding @@ -2931,9 +2983,12 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  	const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);  	const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE, false); +	const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false);  	const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); +	const BOOL move_is_into_favorites = (mUUID == favorites_id);  	const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); +	const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id);  	LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();  	BOOL accept = FALSE; @@ -2944,7 +2999,6 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  		const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);  		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. @@ -2990,12 +3044,16 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  		if (!is_movable)   			accept = FALSE; -		if ((mUUID == inv_item->getParentUUID()) && !folder_allows_reorder) +		if ((mUUID == inv_item->getParentUUID()) && !move_is_into_favorites)  			accept = FALSE;  		if (move_is_into_current_outfit || move_is_into_outfit)  		{  			accept = can_move_to_outfit(inv_item, move_is_into_current_outfit);  		} +		else if (move_is_into_favorites || move_is_into_landmarks) +		{ +			accept = can_move_to_landmarks(inv_item); +		}  		if(accept && drop)  		{ @@ -3021,8 +3079,8 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			//   			// REORDER -			// (only reorder the item) -			if ((mUUID == inv_item->getParentUUID()) && folder_allows_reorder) +			// (only reorder the item in Favorites folder) +			if ((mUUID == inv_item->getParentUUID()) && move_is_into_favorites)  			{  				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());  				LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL; @@ -3036,7 +3094,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			// FAVORITES folder  			// (copy the item) -			else if (favorites_id == mUUID) +			else if (move_is_into_favorites)  			{  				dropToFavorites(inv_item);  			} @@ -3101,6 +3159,13 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  		{  			accept = FALSE;  		} +		// Don't allow to move a single item to Favorites or Landmarks +		// if it is not a landmark or a link to a landmark. +		else if ((move_is_into_favorites || move_is_into_landmarks) +				 && !can_move_to_landmarks(inv_item)) +		{ +			accept = FALSE; +		}  		if(drop && accept)  		{ @@ -3146,12 +3211,18 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			{  				accept = can_move_to_outfit(inv_item, move_is_into_current_outfit);  			} +			// Don't allow to move a single item to Favorites or Landmarks +			// if it is not a landmark or a link to a landmark. +			else if (move_is_into_favorites || move_is_into_landmarks) +			{ +				accept = can_move_to_landmarks(inv_item); +			}  			if (accept && drop)  			{  				// FAVORITES folder  				// (copy the item) -				if (favorites_id == mUUID) +				if (move_is_into_favorites)  				{  					dropToFavorites(inv_item);  				} | 
