EXP-1158 FIX -- Viewer crash when deleting items from Outbox when some folders are open

* New selection change on delete also insures the selection does not propagate
  to the child of a selected item.
meow-7.2.2
leslie@leslie-HPz600.lindenlab.com 2011-08-30 12:24:51 -07:00
parent c2443b95d3
commit dc91995619
1 changed files with 28 additions and 1 deletions

View File

@ -1010,6 +1010,33 @@ void LLFolderView::removeSelectedItems( void )
LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLFolderView::onItemsRemovalConfirmation, this, _1, _2));
}
bool isDescendantOfASelectedItem(LLFolderViewItem* item, const std::vector<LLFolderViewItem*>& selectedItems)
{
LLFolderViewItem* item_parent = dynamic_cast<LLFolderViewItem*>(item->getParent());
if (item_parent)
{
for(std::vector<LLFolderViewItem*>::const_iterator it = selectedItems.begin(); it != selectedItems.end(); ++it)
{
const LLFolderViewItem* const selected_item = (*it);
LLFolderViewItem* parent = item_parent;
while (parent)
{
if (selected_item == parent)
{
return true;
}
parent = dynamic_cast<LLFolderViewItem*>(parent->getParent());
}
}
}
return false;
}
void LLFolderView::onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@ -1084,7 +1111,7 @@ void LLFolderView::onItemsRemovalConfirmation(const LLSD& notification, const LL
if (!new_selection)
{
new_selection = last_item->getPreviousOpenNode(FALSE);
while (new_selection && new_selection->isSelected())
while (new_selection && (new_selection->isSelected() || isDescendantOfASelectedItem(new_selection, items)))
{
new_selection = new_selection->getPreviousOpenNode(FALSE);
}