summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2024-03-13 22:15:56 +0200
committerAndrey Kleshchev <andreykproductengine@lindenlab.com>2024-05-09 23:50:03 +0300
commitb6d195a7472f2e9860fb6ebe6a0dbc35200c0ddc (patch)
tree3f493b83f0d21a2eedd6d5d8ca143f5fb50222cb /indra
parenta420e84f4822d19388241f99a916dacc4d1eab61 (diff)
SL-20288 Fix renaming
getChangedIDs is only accurate in scope of observer's callback, don't use it onIdle. getObject call made no sense, item was warrantied to be LLViewerInventoryItem and would only be AT_CATEGORY if it is a link, making the following cast to a category dangerous
Diffstat (limited to 'indra')
-rw-r--r--indra/newview/lloutfitslist.cpp33
-rw-r--r--indra/newview/lloutfitslist.h2
2 files changed, 21 insertions, 14 deletions
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index ef38edfe3d..1fa1750933 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -798,7 +798,7 @@ void LLOutfitListBase::onOpen(const LLSD& info)
// Start observing changes in "My Outfits" category.
mCategoriesObserver->addCategory(outfits,
- boost::bind(&LLOutfitListBase::refreshList, this, outfits));
+ boost::bind(&LLOutfitListBase::observerCallback, this, outfits));
//const LLUUID cof = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
// Start observing changes in Current Outfit category.
@@ -818,6 +818,13 @@ void LLOutfitListBase::onOpen(const LLSD& info)
}
}
+void LLOutfitListBase::observerCallback(const LLUUID& category_id)
+{
+ const LLInventoryModel::changed_items_t& changed_items = gInventory.getChangedIDs();
+ mChangedItems.insert(changed_items.begin(), changed_items.end());
+ refreshList(category_id);
+}
+
void LLOutfitListBase::refreshList(const LLUUID& category_id)
{
bool wasNull = mRefreshListState.CategoryUUID.isNull();
@@ -913,24 +920,22 @@ void LLOutfitListBase::onIdleRefreshList()
// Get changed items from inventory model and update outfit tabs
// which might have been renamed.
- const LLInventoryModel::changed_items_t& changed_items = gInventory.getChangedIDs();
- for (LLInventoryModel::changed_items_t::const_iterator items_iter = changed_items.begin();
- items_iter != changed_items.end();
- ++items_iter)
+ while (!mChangedItems.empty())
{
+ std::set<LLUUID>::const_iterator items_iter = mChangedItems.begin();
LLViewerInventoryCategory *cat = gInventory.getCategory(*items_iter);
- if (!cat)
+ mChangedItems.erase(items_iter);
+
+ // Links aren't supposed to be allowed here, check only cats
+ if (cat)
{
- LLInventoryObject* obj = gInventory.getObject(*items_iter);
- if (!obj || (obj->getType() != LLAssetType::AT_CATEGORY))
- {
- break;
- }
- cat = (LLViewerInventoryCategory*)obj;
+ std::string name = cat->getName();
+ updateChangedCategoryName(cat, name);
}
- std::string name = cat->getName();
- updateChangedCategoryName(cat, name);
+ curent_time = LLTimer::getTotalSeconds();
+ if (curent_time >= end_time)
+ return;
}
sortOutfits();
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index 8975ac09d1..70ce7d3412 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -110,6 +110,7 @@ public:
virtual bool getHasExpandableFolders() = 0;
protected:
+ void observerCallback(const LLUUID& category_id);
virtual LLOutfitListGearMenuBase* createGearMenu() = 0;
virtual void onHighlightBaseOutfit(LLUUID base_id, LLUUID prev_id) = 0;
virtual void onSetSelectedOutfitByUUID(const LLUUID& outfit_uuid) = 0;
@@ -128,6 +129,7 @@ protected:
uuid_vec_t::const_iterator AddedIterator;
uuid_vec_t::const_iterator RemovedIterator;
} mRefreshListState;
+ std::set<LLUUID> mChangedItems;
bool mIsInitialized;
LLInventoryCategoriesObserver* mCategoriesObserver;