diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llinventorymodel.cpp | 23 | ||||
| -rw-r--r-- | indra/newview/llinventorypanel.cpp | 13 | 
2 files changed, 31 insertions, 5 deletions
| diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 9b0d12b353..fe65b87afd 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1240,14 +1240,33 @@ void LLInventoryModel::purgeDescendentsOf(const LLUUID& id)  							   items,  							   INCLUDE_TRASH);  			S32 count = items.count(); + +			item_map_t::iterator item_map_end = mItemMap.end(); +			cat_map_t::iterator cat_map_end = mCategoryMap.end(); +			LLUUID uu_id; +  			for(S32 i = 0; i < count; ++i)  			{ -				deleteObject(items.get(i)->getUUID()); +				uu_id = items.get(i)->getUUID(); + +				// This check prevents the deletion of a previously deleted item. +				// This is necessary because deletion is not done in a hierarchical +				// order. The current item may have been already deleted as a child +				// of its deleted parent. +				if (mItemMap.find(uu_id) != item_map_end) +				{ +					deleteObject(uu_id); +				}  			} +  			count = categories.count();  			for(S32 i = 0; i < count; ++i)  			{ -				deleteObject(categories.get(i)->getUUID()); +				uu_id = categories.get(i)->getUUID(); +				if (mCategoryMap.find(uu_id) != cat_map_end) +				{ +					deleteObject(uu_id); +				}  			}  		}  	} diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 340f851ed8..6a7ee3b6a0 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -421,7 +421,14 @@ void LLInventoryPanel::modelChanged(U32 mask)  		// LLFolderViewFolder is derived from LLFolderViewItem so dynamic_cast from item  		// to folder is the fast way to get a folder without searching through folders tree. -		LLFolderViewFolder* view_folder = dynamic_cast<LLFolderViewFolder*>(view_item); +		LLFolderViewFolder* view_folder = NULL; + +		// Check requires as this item might have already been deleted +		// as a child of its deleted parent. +		if (model_item && view_item) +		{ +			view_folder = dynamic_cast<LLFolderViewFolder*>(view_item); +		}  		//////////////////////////////  		// LABEL Operation @@ -448,7 +455,7 @@ void LLInventoryPanel::modelChanged(U32 mask)  		if (mask & LLInventoryObserver::REBUILD)  		{  			handled = true; -			if (model_item && view_item) +			if (model_item && view_item && viewmodel_item)  			{  				view_item->destroyView();  				removeItemID(viewmodel_item->getUUID()); @@ -538,7 +545,7 @@ void LLInventoryPanel::modelChanged(U32 mask)  			//////////////////////////////  			// REMOVE Operation  			// This item has been removed from memory, but its associated UI element still exists. -			else if (!model_item && view_item) +			else if (!model_item && view_item && viewmodel_item)  			{  				// Remove the item's UI.                  removeItemID(viewmodel_item->getUUID()); | 
