EXT-8244 FIXED Not wearable links could be added to COF by drag-n-drop in the Inventory
Fixed the dnd behavior so that you can only drag appropriate items into the COF or Outfits folder. Did a bit of superficial code cleanup in terms of adding comments and relocating blocks of code. The actual coding fix was pretty small despite the diff; most of the diff is superficial cleanup.master
parent
d7a1237f87
commit
ced040f8ae
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue