summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2023-07-20 23:47:05 +0300
committerakleshchev <117672381+akleshchev@users.noreply.github.com>2023-07-21 00:48:14 +0300
commit4fb9a3f469c2cb0197d686acb68827f0fa32b451 (patch)
tree0584eba8f1997d7f5de28da6c0ec679a091052ac /indra
parent3058e6e6fd66ad4abb91fa5354ee11f6b7843a02 (diff)
SL-20040 Fix selection and context menu issues
Diffstat (limited to 'indra')
-rw-r--r--indra/newview/llinventorygallery.cpp287
-rw-r--r--indra/newview/llinventorygallery.h15
-rw-r--r--indra/newview/llpanelmaininventory.cpp20
3 files changed, 212 insertions, 110 deletions
diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp
index 75df5c1043..ca1b2eb09e 100644
--- a/indra/newview/llinventorygallery.cpp
+++ b/indra/newview/llinventorygallery.cpp
@@ -107,6 +107,7 @@ LLInventoryGallery::LLInventoryGallery(const LLInventoryGallery::Params& p)
mIsInitialized(false),
mRootDirty(false),
mNeedsArrange(false),
+ mNeedsSelection(false),
mSearchType(LLInventoryFilter::SEARCHTYPE_NAME),
mSortOrder(LLInventoryFilter::SO_DATE)
{
@@ -221,6 +222,7 @@ void LLInventoryGallery::setRootFolder(const LLUUID cat_id)
mItemToSelect.setNull();
mItemBuildQuery.clear();
mNeedsArrange = false;
+ mNeedsSelection = false;
dirtyRootFolder();
}
@@ -829,14 +831,15 @@ void LLInventoryGallery::onIdle(void* userdata)
self->updateMessageVisibility();
}
- if (self->mItemToSelect.notNull())
+ if (self->mNeedsSelection)
{
LLUUID item_to_select = self->mItemToSelect;
self->mItemToSelect = LLUUID::null;
+ self->mNeedsSelection = false;
self->changeItemSelection(item_to_select, true);
}
- if (self->mItemToSelect.isNull() && self->mItemBuildQuery.empty())
+ if (!self->mNeedsSelection && self->mItemBuildQuery.empty())
{
gIdleCallbacks.deleteFunction(onIdle, (void*)self);
}
@@ -908,7 +911,6 @@ bool LLInventoryGallery::updateAddedItem(LLUUID item_id)
LLInventoryGalleryItem* item = buildGalleryItem(name, item_id, obj->getType(), thumbnail_id, inventory_type, misc_flags, obj->getCreationDate(), obj->getIsLinkType(), is_worn);
mItemMap.insert(LLInventoryGallery::gallery_item_map_t::value_type(item_id, item));
- item->setRightMouseDownCallback(boost::bind(&LLInventoryGallery::showContextMenu, this, _1, _2, _3, item_id));
item->setFocusReceivedCallback(boost::bind(&LLInventoryGallery::changeItemSelection, this, item_id, false));
if (mGalleryCreated)
{
@@ -1000,15 +1002,21 @@ void LLInventoryGallery::updateItemThumbnail(LLUUID item_id)
BOOL LLInventoryGallery::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
- if(mItemMap[mSelectedItemID])
+ if (mSelectedItemIDs.size() > 0)
{
- mItemMap[mSelectedItemID]->setFocus(false);
- setFocus(true);
+ selection_deque::iterator iter = mSelectedItemIDs.begin();
+ if (mItemMap[*iter])
+ {
+ mItemMap[*iter]->setFocus(false);
+ setFocus(true);
+ }
}
clearSelection();
+
+ // Scroll is going to always return true
BOOL res = LLPanel::handleRightMouseDown(x, y, mask);
- if (mSelectedItemID.isNull())
+ if (mSelectedItemIDs.empty())
{
if (mInventoryGalleryMenu && mFolderID.notNull())
{
@@ -1029,20 +1037,21 @@ BOOL LLInventoryGallery::handleKeyHere(KEY key, MASK mask)
{
case KEY_RETURN:
// Open selected items if enter key hit on the inventory panel
- if (mask == MASK_NONE && mInventoryGalleryMenu && mSelectedItemID.notNull())
+ if (mask == MASK_NONE && mInventoryGalleryMenu && mSelectedItemIDs.size() == 1)
{
- LLViewerInventoryCategory* category = gInventory.getCategory(mSelectedItemID);
+ selection_deque::iterator iter = mSelectedItemIDs.begin();
+ LLViewerInventoryCategory* category = gInventory.getCategory(*iter);
if (category)
{
- setRootFolder(mSelectedItemID);
+ setRootFolder(*iter);
handled = TRUE;
}
else
{
- LLViewerInventoryItem* item = gInventory.getItem(mSelectedItemID);
+ LLViewerInventoryItem* item = gInventory.getItem(*iter);
if (item)
{
- LLInvFVBridgeAction::doAction(item->getType(), mSelectedItemID, &gInventory);
+ LLInvFVBridgeAction::doAction(item->getType(), *iter, &gInventory);
}
}
}
@@ -1063,9 +1072,10 @@ BOOL LLInventoryGallery::handleKeyHere(KEY key, MASK mask)
case KEY_F2:
mFilterSubString.clear();
- if (mInventoryGalleryMenu && mSelectedItemID.notNull())
+ if (mInventoryGalleryMenu && mSelectedItemIDs.size() == 1)
{
- mInventoryGalleryMenu->doToSelected("rename", mSelectedItemID);
+ selection_deque::iterator iter = mSelectedItemIDs.begin();
+ mInventoryGalleryMenu->doToSelected("rename", *iter);
}
handled = TRUE;
break;
@@ -1142,9 +1152,9 @@ void LLInventoryGallery::moveUp()
{
mFilterSubString.clear();
- if (mInventoryGalleryMenu && mSelectedItemID.notNull() && mItemsAddedCount > 1)
+ if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1)
{
- LLInventoryGalleryItem* item = getSelectedItem();
+ LLInventoryGalleryItem* item = getFirstSelectedItem();
if (item)
{
S32 n = mItemIndexMap[item];
@@ -1165,9 +1175,9 @@ void LLInventoryGallery::moveDown()
{
mFilterSubString.clear();
- if (mInventoryGalleryMenu && mSelectedItemID.notNull() && mItemsAddedCount > 1)
+ if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1)
{
- LLInventoryGalleryItem* item = getSelectedItem();
+ LLInventoryGalleryItem* item = getFirstSelectedItem();
if (item)
{
S32 n = mItemIndexMap[item];
@@ -1188,9 +1198,9 @@ void LLInventoryGallery::moveLeft()
{
mFilterSubString.clear();
- if (mInventoryGalleryMenu && mSelectedItemID.notNull() && mItemsAddedCount > 1)
+ if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1)
{
- LLInventoryGalleryItem* item = getSelectedItem();
+ LLInventoryGalleryItem* item = getFirstSelectedItem();
if (item)
{
// Might be better to get item from panel
@@ -1213,9 +1223,9 @@ void LLInventoryGallery::moveRight()
{
mFilterSubString.clear();
- if (mInventoryGalleryMenu && mSelectedItemID.notNull() && mItemsAddedCount > 1)
+ if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1)
{
- LLInventoryGalleryItem* item = getSelectedItem();
+ LLInventoryGalleryItem* item = getFirstSelectedItem();
if (item)
{
S32 n = mItemIndexMap[item];
@@ -1243,9 +1253,12 @@ void LLInventoryGallery::onFocusLost()
LLPanel::onFocusLost();
- if (mSelectedItemID.notNull() && mItemMap[mSelectedItemID])
+ for (const LLUUID& id : mSelectedItemIDs)
{
- mItemMap[mSelectedItemID]->setSelected(false);
+ if (mItemMap[id])
+ {
+ mItemMap[id]->setSelected(false);
+ }
}
}
@@ -1255,13 +1268,19 @@ void LLInventoryGallery::onFocusReceived()
gEditMenuHandler = this;
// Tab support, when tabbing into this view, select first item
- if (mSelectedItemID.notNull() && mItemMap[mSelectedItemID])
+ if (mSelectedItemIDs.size() > 0)
{
- LLInventoryGalleryItem* focus_item = mItemMap[mSelectedItemID];
- focus_item->setSelected(true);
- focus_item->setFocus(TRUE);
+ for (const LLUUID& id : mSelectedItemIDs)
+ {
+ if (mItemMap[id])
+ {
+ LLInventoryGalleryItem* focus_item = mItemMap[id];
+ focus_item->setSelected(true);
+ focus_item->setFocus(TRUE);
+ }
+ }
}
- else if (mIndexToItemMap.size() > 0 && mItemToSelect.isNull())
+ else if (mIndexToItemMap.size() > 0 && !mNeedsSelection)
{
// choose any items from visible rect
S32 vert_offset = mScrollPanel->getDocPosVertical();
@@ -1280,6 +1299,11 @@ void LLInventoryGallery::showContextMenu(LLUICtrl* ctrl, S32 x, S32 y, const LLU
{
if (mInventoryGalleryMenu && item_id.notNull())
{
+ if (std::find(mSelectedItemIDs.begin(), mSelectedItemIDs.end(), item_id) == mSelectedItemIDs.end())
+ {
+ mSelectedItemIDs.clear();
+ mSelectedItemIDs.push_back(item_id);
+ }
uuid_vec_t selected_uuids;
selected_uuids.push_back(item_id);
mInventoryGalleryMenu->show(ctrl, selected_uuids, x, y);
@@ -1291,32 +1315,32 @@ void LLInventoryGallery::changeItemSelection(const LLUUID& item_id, bool scroll_
if ((mItemMap.count(item_id) == 0) || mNeedsArrange)
{
mItemToSelect = item_id;
+ mNeedsSelection = true;
return;
}
- if (mSelectedItemID == item_id)
- {
- return;
- }
- if (mNeedsArrange && item_id.notNull())
+ if (std::find(mSelectedItemIDs.begin(), mSelectedItemIDs.end(), item_id) == mSelectedItemIDs.end())
{
- mItemToSelect = item_id;
return;
}
- if (mItemMap[mSelectedItemID])
+ for (const LLUUID& id : mSelectedItemIDs)
{
- mItemMap[mSelectedItemID]->setSelected(FALSE);
+ if (mItemMap[id])
+ {
+ mItemMap[id]->setSelected(FALSE);
+ }
}
+
if (mItemMap[item_id])
{
mItemMap[item_id]->setSelected(TRUE);
}
- mSelectedItemID = item_id;
+ mSelectedItemIDs.push_back(item_id);
signalSelectionItemID(item_id);
if (scroll_to_selection)
{
- scrollToShowItem(mSelectedItemID);
+ scrollToShowItem(item_id);
}
}
@@ -1347,31 +1371,45 @@ void LLInventoryGallery::scrollToShowItem(const LLUUID& item_id)
}
}
-LLInventoryGalleryItem* LLInventoryGallery::getSelectedItem()
+LLInventoryGalleryItem* LLInventoryGallery::getFirstSelectedItem()
{
- return mItemMap[mSelectedItemID];
+ if (mSelectedItemIDs.size() > 0)
+ {
+ selection_deque::iterator iter = mSelectedItemIDs.begin();
+ return mItemMap[*iter];
+ }
+ return NULL;
}
void LLInventoryGallery::copy()
{
+ if (!getVisible() || !getEnabled())
+ {
+ return;
+ }
+
LLClipboard::instance().reset();
- if (getVisible() && getEnabled() && mSelectedItemID.notNull())
+
+ for (const LLUUID& id : mSelectedItemIDs)
{
- LLClipboard::instance().addToClipboard(mSelectedItemID);
+ LLClipboard::instance().addToClipboard(id);
}
mFilterSubString.clear();
}
BOOL LLInventoryGallery::canCopy() const
{
- if (!getVisible() || !getEnabled() || mSelectedItemID.isNull())
+ if (!getVisible() || !getEnabled() || mSelectedItemIDs.empty())
{
return FALSE;
}
- if (!isItemCopyable(mSelectedItemID))
+ for (const LLUUID& id : mSelectedItemIDs)
{
- return FALSE;
+ if (!isItemCopyable(id))
+ {
+ return FALSE;
+ }
}
return TRUE;
@@ -1379,36 +1417,45 @@ BOOL LLInventoryGallery::canCopy() const
void LLInventoryGallery::cut()
{
+ if (!getVisible() || !getEnabled())
+ {
+ return;
+ }
+
// clear the inventory clipboard
LLClipboard::instance().reset();
- if (getVisible() && getEnabled() && mSelectedItemID.notNull())
+ LLClipboard::instance().setCutMode(true);
+ for (const LLUUID& id : mSelectedItemIDs)
{
// todo: fade out selected item
- LLClipboard::instance().setCutMode(true);
- LLClipboard::instance().addToClipboard(mSelectedItemID);
+ LLClipboard::instance().addToClipboard(id);
}
+
mFilterSubString.clear();
}
BOOL LLInventoryGallery::canCut() const
{
- if (!getVisible() || !getEnabled() || mSelectedItemID.isNull())
+ if (!getVisible() || !getEnabled() || mSelectedItemIDs.empty())
{
return FALSE;
}
- LLViewerInventoryCategory* cat = gInventory.getCategory(mSelectedItemID);
- if (cat)
+ for (const LLUUID& id : mSelectedItemIDs)
{
- if (!get_is_category_removable(&gInventory, mSelectedItemID))
+ LLViewerInventoryCategory* cat = gInventory.getCategory(id);
+ if (cat)
+ {
+ if (!get_is_category_removable(&gInventory, id))
+ {
+ return FALSE;
+ }
+ }
+ else if (!get_is_item_removable(&gInventory, id))
{
return FALSE;
}
}
- else if (!get_is_item_removable(&gInventory, mSelectedItemID))
- {
- return FALSE;
- }
return TRUE;
}
@@ -1421,14 +1468,20 @@ void LLInventoryGallery::paste()
}
const LLUUID& marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
- if (!mSelectedItemID.isNull() && gInventory.isObjectDescendentOf(mSelectedItemID, marketplacelistings_id))
+ if (mSelectedItemIDs.size() == 1 && gInventory.isObjectDescendentOf(*mSelectedItemIDs.begin(), marketplacelistings_id))
{
return;
}
- LLInventoryObject* obj = gInventory.getObject(mSelectedItemID);
+ LLUUID first_selected_id;
+ if (mSelectedItemIDs.size() > 0)
+ {
+ first_selected_id = *mSelectedItemIDs.begin();
+ }
+
+ LLInventoryObject* obj = gInventory.getObject(first_selected_id);
bool is_folder = obj && (obj->getType() == LLAssetType::AT_CATEGORY);
- LLUUID dest = is_folder ? mSelectedItemID : mFolderID;
+ LLUUID dest = is_folder ? first_selected_id : mFolderID;
bool is_cut_mode = LLClipboard::instance().isCutMode();
std::vector<LLUUID> objects;
@@ -1463,6 +1516,7 @@ void LLInventoryGallery::paste()
gInventory.changeCategoryParent(cat, dest, false);
// Don't select immediately, wait for item to arrive
mItemToSelect = item_id;
+ mNeedsSelection = true;
}
else
{
@@ -1479,6 +1533,7 @@ void LLInventoryGallery::paste()
gInventory.changeItemParent(item, dest, false);
// Don't select immediately, wait for item to arrive
mItemToSelect = item_id;
+ mNeedsSelection = true;
}
else
{
@@ -1535,28 +1590,31 @@ BOOL LLInventoryGallery::canPaste() const
return TRUE;
}
-void LLInventoryGallery::onDelete(const LLSD& notification, const LLSD& response, const LLUUID& selected_id)
+void LLInventoryGallery::onDelete(const LLSD& notification, const LLSD& response, const selection_deque selected_ids)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
- LLInventoryObject* obj = gInventory.getObject(selected_id);
- if (!obj)
- {
- return;
- }
- if (obj->getType() == LLAssetType::AT_CATEGORY)
+ for (const LLUUID& id : selected_ids)
{
- if (get_is_category_removable(&gInventory, selected_id))
+ LLInventoryObject* obj = gInventory.getObject(id);
+ if (!obj)
{
- gInventory.removeCategory(selected_id);
+ return;
}
- }
- else
- {
- if (get_is_item_removable(&gInventory, selected_id))
+ if (obj->getType() == LLAssetType::AT_CATEGORY)
+ {
+ if (get_is_category_removable(&gInventory, id))
+ {
+ gInventory.removeCategory(id);
+ }
+ }
+ else
{
- gInventory.removeItem(selected_id);
+ if (get_is_item_removable(&gInventory, id))
+ {
+ gInventory.removeItem(id);
+ }
}
}
}
@@ -1572,31 +1630,39 @@ void LLInventoryGallery::deleteSelection()
LLSD args;
args["QUESTION"] = LLTrans::getString("DeleteItem");
- LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLInventoryGallery::onDelete, _1, _2, mSelectedItemID));
+ LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLInventoryGallery::onDelete, _1, _2, mSelectedItemIDs));
}
bool LLInventoryGallery::canDeleteSelection()
{
- if (mSelectedItemID.isNull())
+ if (mSelectedItemIDs.empty())
{
return false;
}
- LLViewerInventoryCategory* cat = gInventory.getCategory(mSelectedItemID);
- if (cat)
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ if (mFolderID == trash_id || gInventory.isObjectDescendentOf(mFolderID, trash_id))
+ {
+ return false;
+ }
+
+ for (const LLUUID& id : mSelectedItemIDs)
{
- if (!get_is_category_removable(&gInventory, mSelectedItemID))
+ LLViewerInventoryCategory* cat = gInventory.getCategory(id);
+ if (cat)
+ {
+ if (!get_is_category_removable(&gInventory, id))
+ {
+ return false;
+ }
+ }
+ else if (!get_is_item_removable(&gInventory, id))
{
return false;
}
}
- else if (!get_is_item_removable(&gInventory, mSelectedItemID))
- {
- return false;
- }
- const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- return !gInventory.isObjectDescendentOf(mSelectedItemID, trash_id);
+ return true;
}
void LLInventoryGallery::pasteAsLink()
@@ -1611,12 +1677,12 @@ void LLInventoryGallery::pasteAsLink()
const LLUUID& my_outifts_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
LLUUID dest;
- LLInventoryObject* obj = gInventory.getObject(mSelectedItemID);
- if (obj && obj->getType() == LLAssetType::AT_CATEGORY)
+ if (mSelectedItemIDs.size() > 0)
{
- dest = mSelectedItemID;
+ dest = *mSelectedItemIDs.begin();
}
- else
+ LLInventoryObject* obj = gInventory.getObject(dest);
+ if (!obj || obj->getType() != LLAssetType::AT_CATEGORY)
{
dest = mFolderID;
}
@@ -1894,18 +1960,35 @@ void LLInventoryGallery::onGesturesChanged()
void LLInventoryGallery::deselectItem(const LLUUID& category_id)
{
// Reset selection if the item is selected.
- if (category_id == mSelectedItemID)
+ LLInventoryGalleryItem* item = mItemMap[category_id];
+ if (item && item->isSelected())
{
- mSelectedItemID = LLUUID::null;
- signalSelectionItemID(mSelectedItemID);
+ mItemMap[category_id]->setSelected(FALSE);
+ setFocus(true);
+ // Todo: support multiselect
+ signalSelectionItemID(LLUUID::null);
+ }
+
+ selection_deque::iterator found = std::find(mSelectedItemIDs.begin(), mSelectedItemIDs.end(), category_id);
+ if (found != mSelectedItemIDs.end())
+ {
+ mSelectedItemIDs.erase(found);
}
}
void LLInventoryGallery::clearSelection()
{
- if(mSelectedItemID != LLUUID::null)
+ for (const LLUUID& id: mSelectedItemIDs)
+ {
+ if (mItemMap[id])
+ {
+ mItemMap[id]->setSelected(FALSE);
+ }
+ }
+ if (!mSelectedItemIDs.empty())
{
- changeItemSelection(LLUUID::null);
+ mSelectedItemIDs.clear();
+ signalSelectionItemID(LLUUID::null);
}
}
@@ -1919,6 +2002,15 @@ boost::signals2::connection LLInventoryGallery::setSelectionChangeCallback(selec
return mSelectionChangeSignal.connect(cb);
}
+LLUUID LLInventoryGallery::getFirstSelectedItemID()
+{
+ if (mSelectedItemIDs.size() > 0)
+ {
+ return *mSelectedItemIDs.begin();
+ }
+ return LLUUID::null;
+}
+
LLUUID LLInventoryGallery::getOutfitImageID(LLUUID outfit_id)
{
LLUUID thumbnail_id;
@@ -2284,6 +2376,10 @@ BOOL LLInventoryGalleryItem::handleRightMouseDown(S32 x, S32 y, MASK mask)
setFocus(TRUE);
mGallery->claimEditHandler();
+ //S32 gal_x, gal_y;
+ //localPointToOtherView(x, y, &gal_x, &gal_y, mGallery);
+ mGallery->showContextMenu(this, x, y, mUUID);
+
LLUICtrl::handleRightMouseDown(x, y, mask);
return TRUE;
}
@@ -2532,6 +2628,7 @@ BOOL LLInventoryGallery::baseHandleDragAndDrop(LLUUID dest_id, BOOL drop,
{
// Don't select immediately, wait for item to arrive
mItemToSelect = inv_item->getUUID();
+ mNeedsSelection = true;
}
break;
case DAD_LINK:
@@ -2553,6 +2650,7 @@ BOOL LLInventoryGallery::baseHandleDragAndDrop(LLUUID dest_id, BOOL drop,
if (accepted && drop && inv_item)
{
mItemToSelect = inv_item->getUUID();
+ mNeedsSelection = true;
}
break;
case DAD_CATEGORY:
@@ -2567,6 +2665,7 @@ BOOL LLInventoryGallery::baseHandleDragAndDrop(LLUUID dest_id, BOOL drop,
if (accepted && drop)
{
mItemToSelect = cat_ptr->getUUID();
+ mNeedsSelection = true;
}
}
break;
diff --git a/indra/newview/llinventorygallery.h b/indra/newview/llinventorygallery.h
index 5f9c191fc5..42bda59c5a 100644
--- a/indra/newview/llinventorygallery.h
+++ b/indra/newview/llinventorygallery.h
@@ -51,6 +51,7 @@ public:
typedef boost::signals2::signal<void(const LLUUID&)> selection_change_signal_t;
typedef boost::function<void(const LLUUID&)> selection_change_callback_t;
+ typedef std::deque<LLUUID> selection_deque;
struct Params
: public LLInitParam::Block<Params, LLPanel::Params>
@@ -132,7 +133,7 @@ public:
void scrollToShowItem(const LLUUID& item_id);
void signalSelectionItemID(const LLUUID& category_id);
boost::signals2::connection setSelectionChangeCallback(selection_change_callback_t cb);
- LLUUID getSelectedItemID() { return mSelectedItemID; }
+ LLUUID getFirstSelectedItemID();
void setSearchType(LLInventoryFilter::ESearchType type);
LLInventoryFilter::ESearchType getSearchType() { return mSearchType; }
@@ -142,7 +143,7 @@ public:
bool hasVisibleItems();
void handleModifiedFilter();
LLScrollContainer* getScrollableContainer() { return mScrollPanel; }
- LLInventoryGalleryItem* getSelectedItem();
+ LLInventoryGalleryItem* getFirstSelectedItem();
// Copy & paste (LLEditMenuHandler)
void copy() override;
@@ -155,7 +156,7 @@ public:
BOOL canPaste() const override;
// Copy & paste & delete
- static void onDelete(const LLSD& notification, const LLSD& response, const LLUUID& selected_id);
+ static void onDelete(const LLSD& notification, const LLSD& response, const selection_deque selected_ids);
void deleteSelection();
bool canDeleteSelection();
void pasteAsLink();
@@ -170,10 +171,10 @@ public:
BOOL baseHandleDragAndDrop(LLUUID dest_id, BOOL drop, EDragAndDropType cargo_type,
void* cargo_data, EAcceptance* accept, std::string& tooltip_msg);
-protected:
-
void showContextMenu(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& item_id);
+protected:
+
bool applyFilter(LLInventoryGalleryItem* item, const std::string& filter_substring);
bool checkAgainstFilters(LLInventoryGalleryItem* item, const std::string& filter_substring);
static void onIdle(void* userdata);
@@ -183,8 +184,9 @@ protected:
LLThumbnailsObserver* mThumbnailsObserver;
LLGalleryGestureObserver* mGestureObserver;
LLInventoryObserver* mInventoryObserver;
- LLUUID mSelectedItemID;
+ selection_deque mSelectedItemIDs;
LLUUID mItemToSelect;
+ bool mNeedsSelection;
bool mIsInitialized;
bool mRootDirty;
@@ -300,6 +302,7 @@ public:
LLFontGL* getTextFont();
void setItemName(std::string name);
+ bool isSelected() { return mSelected; }
void setSelected(bool value);
void setWorn(bool value);
void setUUID(LLUUID id) {mUUID = id;}
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index b63d6b9308..30f301027c 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -1750,7 +1750,7 @@ void LLPanelMainInventory::saveTexture(const LLSD& userdata)
LLUUID item_id;
if(mSingleFolderMode && isGalleryViewMode())
{
- item_id = mCombinationGalleryPanel->getSelectedItemID();
+ item_id = mCombinationGalleryPanel->getFirstSelectedItemID();
if (item_id.isNull()) return;
}
else
@@ -1848,7 +1848,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
{
if(mSingleFolderMode && isGalleryViewMode())
{
- LLInventoryObject *obj = gInventory.getObject(mCombinationGalleryPanel->getSelectedItemID());
+ LLInventoryObject *obj = gInventory.getObject(mCombinationGalleryPanel->getFirstSelectedItemID());
if (obj && obj->getIsLinkType())
{
show_item_original(obj->getUUID());
@@ -1878,7 +1878,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
if (main_inventory)
{
- LLInventoryObject *obj = gInventory.getObject(mCombinationGalleryPanel->getSelectedItemID());
+ LLInventoryObject *obj = gInventory.getObject(mCombinationGalleryPanel->getFirstSelectedItemID());
if (obj)
{
main_inventory->findLinks(obj->getUUID(), obj->getName());
@@ -1905,7 +1905,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
LLSD params;
if(mSingleFolderMode && isGalleryViewMode())
{
- params = LLSD(mCombinationGalleryPanel->getSelectedItemID());
+ params = LLSD(mCombinationGalleryPanel->getFirstSelectedItemID());
}
else
{
@@ -1965,7 +1965,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
{
if(mSingleFolderMode && isGalleryViewMode())
{
- std::set<LLUUID> uuids{ mCombinationGalleryPanel->getSelectedItemID()};
+ std::set<LLUUID> uuids{ mCombinationGalleryPanel->getFirstSelectedItemID()};
LLAvatarActions::shareWithAvatars(uuids, gFloaterView->getParentFloater(this));
}
else
@@ -2009,7 +2009,7 @@ bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata)
LLViewerInventoryItem *inv_item = NULL;
if(mSingleFolderMode && isGalleryViewMode())
{
- inv_item = gInventory.getItem(mCombinationGalleryPanel->getSelectedItemID());
+ inv_item = gInventory.getItem(mCombinationGalleryPanel->getFirstSelectedItemID());
}
else
{
@@ -2059,7 +2059,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
LLUUID item_id;
if(mSingleFolderMode && isGalleryViewMode())
{
- item_id = mCombinationGalleryPanel->getSelectedItemID();
+ item_id = mCombinationGalleryPanel->getFirstSelectedItemID();
}
else{
LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
@@ -2079,7 +2079,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
LLUUID item_id;
if(mSingleFolderMode && isGalleryViewMode())
{
- item_id = mCombinationGalleryPanel->getSelectedItemID();
+ item_id = mCombinationGalleryPanel->getFirstSelectedItemID();
}
else{
LLFolderView* root = getActivePanel()->getRootFolder();
@@ -2114,7 +2114,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
{
if(mSingleFolderMode && isGalleryViewMode())
{
- return can_share_item(mCombinationGalleryPanel->getSelectedItemID());
+ return can_share_item(mCombinationGalleryPanel->getFirstSelectedItemID());
}
else{
LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
@@ -2626,7 +2626,7 @@ void LLPanelMainInventory::setGallerySelection(const LLUUID& item_id, bool new_w
void LLPanelMainInventory::scrollToGallerySelection()
{
- mCombinationGalleryPanel->scrollToShowItem(mCombinationGalleryPanel->getSelectedItemID());
+ mCombinationGalleryPanel->scrollToShowItem(mCombinationGalleryPanel->getFirstSelectedItemID());
}
void LLPanelMainInventory::scrollToInvPanelSelection()