summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeslie Linden <leslie@lindenlab.com>2011-07-07 10:37:50 -0700
committerLeslie Linden <leslie@lindenlab.com>2011-07-07 10:37:50 -0700
commit791da71c3ea45130cd3817a059a18418e43269b0 (patch)
treec53063458d4fec3386af7d22e4497c521ba8508b
parent77e99e0887b8b1f60ccfe1aeb1cf31c56517f81d (diff)
EXP-983 FIX -- Viewer crashes around Place Profile and Landmarks listing in Viewer Experience
* Fixed up some funny use of objects that had already been deleted. Reviewed by Richard.
-rw-r--r--indra/newview/llinventorypanel.cpp21
-rw-r--r--indra/newview/llinventorypanel.h4
2 files changed, 14 insertions, 11 deletions
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 8f947b15b9..84199a895a 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -471,7 +471,8 @@ void LLInventoryPanel::modelChanged(U32 mask)
{
view_item->destroyView();
}
- buildNewViews(item_id);
+ view_item = buildNewViews(item_id);
+ view_folder = dynamic_cast<LLFolderViewFolder *>(view_item);
}
//////////////////////////////
@@ -524,7 +525,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
//////////////////////////////
// STRUCTURE Operation
// This item already exists in both memory and UI. It was probably reparented.
- if (model_item && view_item)
+ else if (model_item && view_item)
{
// Don't process the item if it is the root
if (view_item->getRoot() != view_item)
@@ -552,7 +553,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
//////////////////////////////
// REMOVE Operation
// This item has been removed from memory, but its associated UI element still exists.
- if (!model_item && view_item)
+ else if (!model_item && view_item)
{
// Remove the item's UI.
view_item->destroyView();
@@ -619,7 +620,7 @@ void LLInventoryPanel::initializeViews()
}
}
-void LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
+LLFolderViewItem* LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
{
// Destroy the old view for this ID so we can rebuild it.
LLFolderViewItem* old_view = mFolderRoot->getItemByID(id);
@@ -628,7 +629,7 @@ void LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
old_view->destroyView();
}
- buildNewViews(id);
+ return buildNewViews(id);
}
LLFolderView * LLInventoryPanel::createFolderView(LLInvFVBridge * bridge, bool useLabelSuffix)
@@ -695,19 +696,19 @@ LLFolderViewItem * LLInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge
return LLUICtrlFactory::create<LLFolderViewItem>(params);
}
-void LLInventoryPanel::buildNewViews(const LLUUID& id)
+LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
{
LLInventoryObject const* objectp = gInventory.getObject(id);
LLUUID root_id = mFolderRoot->getListener()->getUUID();
LLFolderViewFolder* parent_folder = NULL;
-
+ LLFolderViewItem* itemp = NULL;
+
if (id == root_id)
{
parent_folder = mFolderRoot;
}
else if (objectp)
{
- LLFolderViewItem* itemp = NULL;
const LLUUID &parent_id = objectp->getParentUUID();
parent_folder = (LLFolderViewFolder*)mFolderRoot->getItemByID(parent_id);
@@ -719,7 +720,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : "
<< ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
<< llendl;
- return;
+ return NULL;
}
if ((objectp->getType() == LLAssetType::AT_CATEGORY) &&
@@ -796,6 +797,8 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
}
mInventory->unlockDirectDescendentArrays(id);
}
+
+ return itemp;
}
// bit of a hack to make sure the inventory is open.
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 4894b43a56..a4287a438e 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -220,10 +220,10 @@ public:
protected:
// Builds the UI. Call this once the inventory is usable.
void initializeViews();
- void rebuildViewsFor(const LLUUID& id); // Given the id and the parent, build all of the folder views.
+ LLFolderViewItem* rebuildViewsFor(const LLUUID& id); // Given the id and the parent, build all of the folder views.
virtual void buildFolderView(const LLInventoryPanel::Params& params);
- virtual void buildNewViews(const LLUUID& id);
+ LLFolderViewItem* buildNewViews(const LLUUID& id);
BOOL getIsHiddenFolderType(LLFolderType::EType folder_type) const;
virtual LLFolderView* createFolderView(LLInvFVBridge * bridge, bool useLabelSuffix);