summaryrefslogtreecommitdiff
path: root/indra/newview/llinventoryitemslist.cpp
diff options
context:
space:
mode:
authorErik Kundiman <erik@megapahit.org>2025-12-04 13:58:12 +0800
committerErik Kundiman <erik@megapahit.org>2025-12-04 16:48:50 +0800
commite3a35af2c676fb211ff7d01a79eb1a3299bc82f3 (patch)
tree0ff7a0a15d1a53850399250b65f0a2a42f7bbf22 /indra/newview/llinventoryitemslist.cpp
parentac052bed7f9f97efc63f0a0322214d4dcdcd5664 (diff)
parentc4ec3d866082d588de671e833413474d7ab19524 (diff)
Merge remote-tracking branch 'secondlife/release/2026.01' into 2026.01
Diffstat (limited to 'indra/newview/llinventoryitemslist.cpp')
-rw-r--r--indra/newview/llinventoryitemslist.cpp54
1 files changed, 45 insertions, 9 deletions
diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp
index 73cc953692..15735ebde3 100644
--- a/indra/newview/llinventoryitemslist.cpp
+++ b/indra/newview/llinventoryitemslist.cpp
@@ -51,6 +51,7 @@ LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p
: LLFlatListViewEx(p)
, mRefreshState(REFRESH_COMPLETE)
, mForceRefresh(false)
+, mNeedsArrange(true)
{
// TODO: mCommitOnSelectionChange is set to "false" in LLFlatListView
// but reset to true in all derived classes. This settings might need to
@@ -144,6 +145,7 @@ void LLInventoryItemsList::updateSelection()
bool LLInventoryItemsList::doIdle()
{
if (mRefreshState == REFRESH_COMPLETE) return true; // done
+ LL_PROFILE_ZONE_SCOPED;
if (isInVisibleChain() || mForceRefresh || !getFilterSubString().empty())
{
@@ -165,7 +167,7 @@ void LLInventoryItemsList::idle(void* user_data)
using namespace std::chrono;
auto start = steady_clock::now();
- const milliseconds time_limit = milliseconds(3);
+ const milliseconds time_limit = milliseconds(2);
const auto end_time = start + time_limit;
S32 max_update_count = 50;
@@ -218,8 +220,6 @@ void LLInventoryItemsList::refresh()
mRefreshState = REFRESH_LIST_SORT;
}
- rearrangeItems();
- notifyParentItemsRectChanged();
break;
}
case REFRESH_LIST_ERASE:
@@ -229,10 +229,21 @@ void LLInventoryItemsList::refresh()
for (; mRemovedItems.end() != it; ++it)
{
// don't filter items right away
- removeItemByUUID(*it, false);
+ removeItemByUUID(*it, false /*don't rearrange*/);
}
mRemovedItems.clear();
- mRefreshState = REFRESH_LIST_SORT; // fix visibility and arrange
+ mRefreshState = REFRESH_LIST_SORT; // fix visibility
+
+ // Assume that visible items were removed.
+ if (getVisible())
+ {
+ rearrangeItems();
+ notifyParentItemsRectChanged();
+ }
+ else
+ {
+ mNeedsArrange = true;
+ }
break;
}
case REFRESH_LIST_APPEND:
@@ -275,18 +286,25 @@ void LLInventoryItemsList::refresh()
LLSD action;
action.with("match_filter", cur_filter);
+ bool new_visible_items = false;
pairs_const_iterator_t pair_it = panel_list.begin();
for (; pair_it != panel_list.end(); ++pair_it)
{
item_pair_t* item_pair = *pair_it;
if (item_pair->first->getParent() != NULL)
{
- updateItemVisibility(item_pair->first, action);
+ new_visible_items |= updateItemVisibility(item_pair->first, action);
}
}
- rearrangeItems();
- notifyParentItemsRectChanged();
+ mNeedsArrange |= new_visible_items;
+ if (mNeedsArrange && getVisible())
+ {
+ // show changes now
+ rearrangeItems();
+ notifyParentItemsRectChanged();
+ mNeedsArrange = false;
+ }
if (mAddedItems.size() > 0)
{
@@ -304,16 +322,33 @@ void LLInventoryItemsList::refresh()
{
LL_PROFILE_ZONE_NAMED("items_refresh_sort");
// Filter, sort, rearrange and notify parent about shape changes
- filterItems(true, true);
+ if (filterItems(true, true))
+ {
+ mNeedsArrange = false; // just rearranged
+ }
if (mAddedItems.size() == 0)
{
+ if (mNeedsArrange)
+ {
+ // Done, last chance to rearrange
+ rearrangeItems();
+ notifyParentItemsRectChanged();
+ mNeedsArrange = false;
+ }
// After list building completed, select items that had been requested to select before list was build
updateSelection();
mRefreshState = REFRESH_COMPLETE;
}
else
{
+ if (mNeedsArrange && getVisible())
+ {
+ // show changes now
+ rearrangeItems();
+ notifyParentItemsRectChanged();
+ mNeedsArrange = false;
+ }
mRefreshState = REFRESH_LIST_APPEND;
}
break;
@@ -347,6 +382,7 @@ void LLInventoryItemsList::computeDifference(
LLPanel* LLInventoryItemsList::createNewItem(LLViewerInventoryItem* item)
{
+ LL_PROFILE_ZONE_SCOPED;
if (!item)
{
LL_WARNS() << "No inventory item. Couldn't create flat list item." << LL_ENDL;