viewer#2142 Crash at LLOutfitGalleryItem::setDefaultImage

master
Andrey Kleshchev 2024-07-29 21:19:57 +03:00 committed by Andrey Kleshchev
parent d881c72a9a
commit 9e4cc30b29
4 changed files with 101 additions and 51 deletions

View File

@ -221,9 +221,10 @@ void LLInventoryGallery::setRootFolder(const LLUUID cat_id)
for (const LLUUID& id : mSelectedItemIDs)
{
if (mItemMap[id])
LLInventoryGalleryItem* item = getItem(id);
if (item)
{
mItemMap[id]->setSelected(false);
item->setSelected(false);
}
}
@ -348,7 +349,7 @@ void LLInventoryGallery::initGallery()
mScrollPanel->addChild(mGalleryPanel);
for (int i = 0; i < n; i++)
{
addToGallery(mItemMap[cats[i]]);
addToGallery(getItem(cats[i]));
}
reArrangeRows();
mGalleryCreated = true;
@ -656,6 +657,16 @@ LLInventoryGalleryItem* LLInventoryGallery::buildGalleryItem(std::string name, L
return gitem;
}
LLInventoryGalleryItem* LLInventoryGallery::getItem(const LLUUID& id) const
{
auto it = mItemMap.find(id);
if (it != mItemMap.end())
{
return it->second;
}
return nullptr;
}
void LLInventoryGallery::buildGalleryPanel(int row_count)
{
LLPanel::Params params;
@ -1006,14 +1017,15 @@ void LLInventoryGallery::updateItemThumbnail(LLUUID item_id)
thumbnail_id = getOutfitImageID(item_id);
}
if (mItemMap[item_id])
LLInventoryGalleryItem* item = getItem(item_id);
if (item)
{
mItemMap[item_id]->setLoadImmediately(mLoadThumbnailsImmediately);
mItemMap[item_id]->setThumbnail(thumbnail_id);
item->setLoadImmediately(mLoadThumbnailsImmediately);
item->setThumbnail(thumbnail_id);
bool passes_filter = checkAgainstFilters(mItemMap[item_id], mFilterSubString);
if((mItemMap[item_id]->isHidden() && passes_filter)
|| (!mItemMap[item_id]->isHidden() && !passes_filter))
bool passes_filter = checkAgainstFilters(item, mFilterSubString);
if((item->isHidden() && passes_filter)
|| (!item->isHidden() && !passes_filter))
{
reArrangeRows();
}
@ -1169,7 +1181,7 @@ void LLInventoryGallery::moveUp(MASK mask)
if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1)
{
LLInventoryGalleryItem* item = mItemMap[mLastInteractedUUID];
LLInventoryGalleryItem* item = getItem(mLastInteractedUUID);
if (item)
{
if (mask == MASK_NONE || mask == MASK_CONTROL)
@ -1214,7 +1226,7 @@ void LLInventoryGallery::moveDown(MASK mask)
if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1)
{
LLInventoryGalleryItem* item = mItemMap[mLastInteractedUUID];
LLInventoryGalleryItem* item = getItem(mLastInteractedUUID);
if (item)
{
if (mask == MASK_NONE || mask == MASK_CONTROL)
@ -1259,11 +1271,7 @@ void LLInventoryGallery::moveLeft(MASK mask)
if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1)
{
LLInventoryGalleryItem* item = mItemMap[mLastInteractedUUID];
if (mask == MASK_SHIFT)
{
item = mItemMap[mLastInteractedUUID];
}
LLInventoryGalleryItem* item = getItem(mLastInteractedUUID);
if (item)
{
// Might be better to get item from panel
@ -1307,7 +1315,7 @@ void LLInventoryGallery::moveRight(MASK mask)
if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1)
{
LLInventoryGalleryItem* item = mItemMap[mLastInteractedUUID];
LLInventoryGalleryItem* item = getItem(mLastInteractedUUID);
if (item)
{
S32 n = mItemIndexMap[item];
@ -1373,8 +1381,8 @@ void LLInventoryGallery::toggleSelectionRangeFromLast(const LLUUID target)
{
return;
}
LLInventoryGalleryItem* last_item = mItemMap[mLastInteractedUUID];
LLInventoryGalleryItem* next_item = mItemMap[target];
LLInventoryGalleryItem* last_item = getItem(mLastInteractedUUID);
LLInventoryGalleryItem* next_item = getItem(target);
if (last_item && next_item)
{
S32 last_idx = mItemIndexMap[last_item];
@ -1417,9 +1425,10 @@ void LLInventoryGallery::onFocusLost()
for (const LLUUID& id : mSelectedItemIDs)
{
if (mItemMap[id])
LLInventoryGalleryItem* item = getItem(id);
if (item)
{
mItemMap[id]->setSelected(false);
item->setSelected(false);
}
}
}
@ -1435,9 +1444,10 @@ void LLInventoryGallery::onFocusReceived()
LLInventoryGalleryItem* focus_item = NULL;
for (const LLUUID& id : mSelectedItemIDs)
{
if (mItemMap[id] && !mItemMap[id]->isHidden())
LLInventoryGalleryItem* item = getItem(id);
if (item && !item->isHidden())
{
focus_item = mItemMap[id];
focus_item = item;
focus_item->setSelected(true);
}
}
@ -1478,9 +1488,10 @@ void LLInventoryGallery::changeItemSelection(const LLUUID& item_id, bool scroll_
{
for (const LLUUID& id : mSelectedItemIDs)
{
if (mItemMap[id])
LLInventoryGalleryItem* item = getItem(id);
if (item)
{
mItemMap[id]->setSelected(false);
item->setSelected(false);
}
}
mSelectedItemIDs.clear();
@ -1499,9 +1510,10 @@ void LLInventoryGallery::changeItemSelection(const LLUUID& item_id, bool scroll_
return;
}
if (mItemMap[item_id])
LLInventoryGalleryItem* item = getItem(item_id);
if (item)
{
mItemMap[item_id]->setSelected(true);
item->setSelected(true);
}
mSelectedItemIDs.push_back(item_id);
signalSelectionItemID(item_id);
@ -1527,9 +1539,10 @@ void LLInventoryGallery::addItemSelection(const LLUUID& item_id, bool scroll_to_
return;
}
if (mItemMap[item_id])
LLInventoryGalleryItem* item = getItem(item_id);
if (item)
{
mItemMap[item_id]->setSelected(true);
item->setSelected(true);
}
mSelectedItemIDs.push_back(item_id);
signalSelectionItemID(item_id);
@ -1552,18 +1565,20 @@ bool LLInventoryGallery::toggleItemSelection(const LLUUID& item_id, bool scroll_
selection_deque::iterator found = std::find(mSelectedItemIDs.begin(), mSelectedItemIDs.end(), item_id);
if (found != mSelectedItemIDs.end())
{
if (mItemMap[item_id])
LLInventoryGalleryItem* item = getItem(item_id);
if (item)
{
mItemMap[item_id]->setSelected(false);
item->setSelected(false);
}
mSelectedItemIDs.erase(found);
result = false;
}
else
{
if (mItemMap[item_id])
LLInventoryGalleryItem* item = getItem(item_id);
if (item)
{
mItemMap[item_id]->setSelected(true);
item->setSelected(true);
}
mSelectedItemIDs.push_back(item_id);
signalSelectionItemID(item_id);
@ -1580,7 +1595,7 @@ bool LLInventoryGallery::toggleItemSelection(const LLUUID& item_id, bool scroll_
void LLInventoryGallery::scrollToShowItem(const LLUUID& item_id)
{
LLInventoryGalleryItem* item = mItemMap[item_id];
LLInventoryGalleryItem* item = getItem(item_id);
if(item)
{
const LLRect visible_content_rect = mScrollPanel->getVisibleContentRect();
@ -1610,7 +1625,7 @@ LLInventoryGalleryItem* LLInventoryGallery::getFirstSelectedItem()
if (mSelectedItemIDs.size() > 0)
{
selection_deque::iterator iter = mSelectedItemIDs.begin();
return mItemMap[*iter];
return getItem(*iter);
}
return NULL;
}
@ -1768,9 +1783,10 @@ void LLInventoryGallery::paste()
{
for (const LLUUID& id : mSelectedItemIDs)
{
if (mItemMap[id])
LLInventoryGalleryItem* item = getItem(id);
if (item)
{
mItemMap[id]->setSelected(false);
item->setSelected(false);
}
}
mSelectedItemIDs.clear();
@ -2108,9 +2124,10 @@ void LLInventoryGallery::pasteAsLink()
{
for (const LLUUID& id : mSelectedItemIDs)
{
if (mItemMap[id])
LLInventoryGalleryItem* item = getItem(id);
if (item)
{
mItemMap[id]->setSelected(false);
item->setSelected(false);
}
}
mSelectedItemIDs.clear();
@ -2433,10 +2450,10 @@ void LLInventoryGallery::onGesturesChanged()
void LLInventoryGallery::deselectItem(const LLUUID& category_id)
{
// Reset selection if the item is selected.
LLInventoryGalleryItem* item = mItemMap[category_id];
LLInventoryGalleryItem* item = getItem(category_id);
if (item && item->isSelected())
{
mItemMap[category_id]->setSelected(false);
item->setSelected(false);
setFocus(true);
// Todo: support multiselect
// signalSelectionItemID(LLUUID::null);
@ -2453,9 +2470,10 @@ void LLInventoryGallery::clearSelection()
{
for (const LLUUID& id: mSelectedItemIDs)
{
if (mItemMap[id])
LLInventoryGalleryItem* item = getItem(id);
if (item)
{
mItemMap[id]->setSelected(false);
item->setSelected(false);
}
}
if (!mSelectedItemIDs.empty())

View File

@ -228,6 +228,7 @@ private:
void updateGalleryWidth();
LLInventoryGalleryItem* buildGalleryItem(std::string name, LLUUID item_id, LLAssetType::EType type, LLUUID thumbnail_id, LLInventoryType::EType inventory_type, U32 flags, time_t creation_date, bool is_link, bool is_worn);
LLInventoryGalleryItem* getItem(const LLUUID& id) const;
void buildGalleryPanel(int row_count);
void reshapeGalleryPanel(int row_count);

View File

@ -128,7 +128,7 @@ void LLOutfitGallery::onOpen(const LLSD& info)
mScrollPanel->addChild(mGalleryPanel);
for (int i = 0; i < n; i++)
{
addToGallery(mOutfitMap[cats[i]]);
addToGallery(getItem(cats[i]));
}
reArrangeRows();
mGalleryCreated = true;
@ -377,7 +377,7 @@ void LLOutfitGallery::onOutfitsRemovalConfirmation(const LLSD& notification, con
void LLOutfitGallery::scrollToShowItem(const LLUUID& item_id)
{
LLOutfitGalleryItem* item = mOutfitMap[item_id];
LLOutfitGalleryItem* item = getItem(item_id);
if (item)
{
const LLRect visible_content_rect = mScrollPanel->getVisibleContentRect();
@ -525,6 +525,10 @@ LLPanel* LLOutfitGallery::addToRow(LLPanel* row_stack, LLOutfitGalleryItem* item
void LLOutfitGallery::addToGallery(LLOutfitGalleryItem* item)
{
if (!item)
{
return;
}
if(item->isHidden())
{
mHiddenItems.push_back(item);
@ -632,9 +636,19 @@ LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name, LLUUID
return gitem;
}
LLOutfitGalleryItem* LLOutfitGallery::getSelectedItem()
LLOutfitGalleryItem* LLOutfitGallery::getSelectedItem() const
{
return mOutfitMap[mSelectedOutfitUUID];
return getItem(mSelectedOutfitUUID);
}
LLOutfitGalleryItem* LLOutfitGallery::getItem(const LLUUID& id) const
{
auto it = mOutfitMap.find(id);
if (it != mOutfitMap.end())
{
return it->second;
}
return nullptr;
}
void LLOutfitGallery::buildGalleryPanel(int row_count)
@ -1275,7 +1289,15 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
}
if (asset_id.notNull())
{
photo_loaded |= mOutfitMap[category_id]->setImageAssetId(asset_id);
LLOutfitGalleryItem* item = getItem(category_id);
if (item)
{
photo_loaded |= item->setImageAssetId(asset_id);
}
else
{
photo_loaded = true;
}
// Rename links
if (!mOutfitRenamePending.isNull() && mOutfitRenamePending.asString() == item_name)
{
@ -1301,13 +1323,21 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
}
if (!photo_loaded)
{
mOutfitMap[category_id]->setDefaultImage();
LLOutfitGalleryItem* item = getItem(category_id);
if (item)
{
item->setDefaultImage();
}
}
}
}
else
{
mOutfitMap[category_id]->setImageAssetId(asset_id);
LLOutfitGalleryItem* item = getItem(category_id);
if (item)
{
item->setImageAssetId(asset_id);
}
}
}

View File

@ -135,7 +135,8 @@ private:
void updateGalleryWidth();
LLOutfitGalleryItem* buildGalleryItem(std::string name, LLUUID outfit_id);
LLOutfitGalleryItem* getSelectedItem();
LLOutfitGalleryItem* getSelectedItem() const;
LLOutfitGalleryItem* getItem(const LLUUID& id) const;
void onTextureSelectionChanged(LLInventoryItem* itemp);