summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/llinventorygallery.cpp64
-rw-r--r--indra/newview/llinventorygallery.h6
2 files changed, 61 insertions, 9 deletions
diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp
index 189fb33334..358b4e457a 100644
--- a/indra/newview/llinventorygallery.cpp
+++ b/indra/newview/llinventorygallery.cpp
@@ -59,8 +59,6 @@ static LLPanelInjector<LLInventoryGallery> t_inventory_gallery("inventory_galler
const S32 GALLERY_ITEMS_PER_ROW_MIN = 2;
// Helper dnd functions
-BOOL baseHandleDragAndDrop(LLUUID dest_id, BOOL drop, EDragAndDropType cargo_type,
- void* cargo_data, EAcceptance* accept, std::string& tooltip_msg);
BOOL dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, BOOL drop, std::string& tooltip_msg, BOOL is_link);
BOOL dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, BOOL drop, std::string& tooltip_msg, BOOL user_confirm);
void dropToMyOutfits(LLInventoryCategory* inv_cat);
@@ -87,6 +85,7 @@ LLInventoryGallery::LLInventoryGallery(const LLInventoryGallery::Params& p)
mRowPanWidthFactor(p.row_panel_width_factor),
mGalleryWidthFactor(p.gallery_width_factor),
mIsInitialized(false),
+ mNeedsArrange(false),
mSearchType(LLInventoryFilter::SEARCHTYPE_NAME)
{
updateGalleryWidth();
@@ -143,6 +142,8 @@ LLInventoryGallery::~LLInventoryGallery()
delete mInventoryGalleryMenu;
delete mRootGalleryMenu;
delete mFilter;
+
+ gIdleCallbacks.deleteFunction(onIdle, this);
while (!mUnusedRowPanels.empty())
{
@@ -175,6 +176,8 @@ LLInventoryGallery::~LLInventoryGallery()
void LLInventoryGallery::setRootFolder(const LLUUID cat_id)
{
+ gIdleCallbacks.deleteFunction(onIdle, this);
+
LLViewerInventoryCategory* category = gInventory.getCategory(cat_id);
if(!category || (mFolderID == cat_id))
{
@@ -688,6 +691,33 @@ bool LLInventoryGallery::checkAgainstFilters(LLInventoryGalleryItem* item, const
return !hidden;
}
+void LLInventoryGallery::onIdle(void* userdata)
+{
+ LLInventoryGallery* self = (LLInventoryGallery*)userdata;
+
+ if (!self->mIsInitialized || !self->mGalleryCreated)
+ {
+ self->mNeedsArrange = false;
+ return;
+ }
+
+ if (self->mNeedsArrange)
+ {
+ self->mNeedsArrange = false;
+ self->reArrangeRows();
+ }
+
+ if (self->mItemToSelect.notNull())
+ {
+ self->changeItemSelection(self->mItemToSelect, true);
+ }
+
+ if (self->mItemToSelect.isNull())
+ {
+ gIdleCallbacks.deleteFunction(onIdle, (void*)self);
+ }
+}
+
void LLInventoryGallery::setSearchType(LLInventoryFilter::ESearchType type)
{
if(mSearchType != type)
@@ -1090,14 +1120,13 @@ void LLInventoryGallery::showContextMenu(LLUICtrl* ctrl, S32 x, S32 y, const LLU
void LLInventoryGallery::changeItemSelection(const LLUUID& item_id, bool scroll_to_selection)
{
- if ((mItemMap.count(item_id) == 0))
+ if ((mItemMap.count(item_id) == 0) || mNeedsArrange)
{
mItemToSelect = item_id;
return;
}
if (mSelectedItemID != item_id)
{
-
if (mItemMap[mSelectedItemID])
{
mItemMap[mSelectedItemID]->setSelected(FALSE);
@@ -1441,6 +1470,7 @@ void LLInventoryGallery::refreshList(const LLUUID& category_id)
{
const LLUUID cat_id = (*iter);
updateAddedItem(cat_id);
+ mNeedsArrange = true;
}
// Handle removed tabs.
@@ -1462,11 +1492,14 @@ void LLInventoryGallery::refreshList(const LLUUID& category_id)
}
updateChangedItemName(*items_iter, obj->getName());
+ mNeedsArrange = true;
}
- if(mItemToSelect.notNull())
+ if(mNeedsArrange || mItemToSelect.notNull())
{
- changeItemSelection(mItemToSelect, true);
+ // Don't scroll to target/arrange immediately
+ // since more updates might be pending
+ gIdleCallbacks.addFunction(onIdle, (void*)this);
}
updateMessageVisibility();
}
@@ -2009,7 +2042,7 @@ BOOL LLInventoryGalleryItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL dro
{
return FALSE;
}
- return baseHandleDragAndDrop(mUUID, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ return mGallery->baseHandleDragAndDrop(mUUID, drop, cargo_type, cargo_data, accept, tooltip_msg);
}
BOOL LLInventoryGalleryItem::handleKeyHere(KEY key, MASK mask)
@@ -2178,7 +2211,7 @@ void LLThumbnailsObserver::removeSkippedItem(const LLUUID& obj_id)
// Helper drag&drop functions
//-----------------------------
-BOOL baseHandleDragAndDrop(LLUUID dest_id, BOOL drop,
+BOOL LLInventoryGallery::baseHandleDragAndDrop(LLUUID dest_id, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
@@ -2203,6 +2236,10 @@ BOOL baseHandleDragAndDrop(LLUUID dest_id, BOOL drop,
case DAD_MESH:
case DAD_SETTINGS:
accepted = dragItemIntoFolder(dest_id, inv_item, drop, tooltip_msg, true);
+ if (accepted && drop)
+ {
+ mItemToSelect = inv_item->getUUID();
+ }
break;
case DAD_LINK:
// DAD_LINK type might mean one of two asset types: AT_LINK or AT_LINK_FOLDER.
@@ -2220,6 +2257,10 @@ BOOL baseHandleDragAndDrop(LLUUID dest_id, BOOL drop,
{
accepted = dragItemIntoFolder(dest_id, inv_item, drop, tooltip_msg, TRUE);
}
+ if (accepted && drop)
+ {
+ mItemToSelect = inv_item->getUUID();
+ }
break;
case DAD_CATEGORY:
if (LLFriendCardsManager::instance().isAnyFriendCategory(dest_id))
@@ -2228,7 +2269,12 @@ BOOL baseHandleDragAndDrop(LLUUID dest_id, BOOL drop,
}
else
{
- accepted = dragCategoryIntoFolder(dest_id, (LLInventoryCategory*)cargo_data, drop, tooltip_msg, FALSE);
+ LLInventoryCategory* cat_ptr = (LLInventoryCategory*)cargo_data;
+ accepted = dragCategoryIntoFolder(dest_id, cat_ptr, drop, tooltip_msg, FALSE);
+ if (accepted && drop)
+ {
+ mItemToSelect = cat_ptr->getUUID();
+ }
}
break;
case DAD_ROOT_CATEGORY:
diff --git a/indra/newview/llinventorygallery.h b/indra/newview/llinventorygallery.h
index 54588a3907..3797b9bc61 100644
--- a/indra/newview/llinventorygallery.h
+++ b/indra/newview/llinventorygallery.h
@@ -155,16 +155,21 @@ public:
void claimEditHandler();
static bool isItemCopyable(const LLUUID & item_id);
+ 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);
void applyFilter(LLInventoryGalleryItem* item, const std::string& filter_substring);
bool checkAgainstFilters(LLInventoryGalleryItem* item, const std::string& filter_substring);
+ static void onIdle(void* userdata);
LLInventoryCategoriesObserver* mCategoriesObserver;
LLThumbnailsObserver* mThumbnailsObserver;
LLGalleryGestureObserver* mGestureObserver;
+ LLInventoryObserver* mInventoryObserver;
LLUUID mSelectedItemID;
LLUUID mItemToSelect;
bool mIsInitialized;
@@ -211,6 +216,7 @@ private:
int mRowCount;
int mItemsAddedCount;
bool mGalleryCreated;
+ bool mNeedsArrange;
/* Params */
int mRowPanelHeight;