FIRE-286: Inventory window item selection jumps unexpecetdly

meow-7.2.2
Kitty Barnett 2011-10-07 07:21:45 +02:00
commit 451b54088a
1 changed files with 61 additions and 9 deletions

View File

@ -2182,8 +2182,12 @@ void LLFolderView::doIdle()
mFilter->clearModified();
BOOL filter_modified_and_active = mCompletedFilterGeneration < mFilter->getCurrentGeneration() &&
mFilter->isNotDefault();
mNeedsAutoSelect = filter_modified_and_active &&
!(gFocusMgr.childHasKeyboardFocus(this) || gFocusMgr.getMouseCapture());
// mNeedsAutoSelect = filter_modified_and_active &&
// !(gFocusMgr.childHasKeyboardFocus(this) || gFocusMgr.getMouseCapture());
// [SL:KB] - Patch: Inventory-Selection | Checked: 2011-10-01 (Catznip-3.0.0a) | Added: Catznip-3.0.0a
mNeedsAutoSelect |= filter_modified_and_active &&
!(gFocusMgr.childHasKeyboardFocus(mParentPanel) || gFocusMgr.getMouseCapture());
// [/SL:KB]
// filter to determine visiblity before arranging
filterFromRoot();
@ -2193,17 +2197,62 @@ void LLFolderView::doIdle()
// signaling the end of the automatic update
// only do this when mNeedsFilter is set, meaning filtered items have
// potentially changed
if (mNeedsAutoSelect)
// if (mNeedsAutoSelect)
// [SL:KB] - Patch: Inventory-Selection | Checked: 2011-10-04 (Catznip-3.0.0a) | Added: Catznip-3.0.0a
if ( (mNeedsAutoSelect) && (!needsArrange()) )
// [/SL:KB]
{
LLFastTimer t3(FTM_AUTO_SELECT);
// select new item only if a filtered item not currently selected
LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back();
if ((selected_itemp && !selected_itemp->getFiltered()) && !mAutoSelectOverride)
// LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back();
// if ((selected_itemp && !selected_itemp->getFiltered()) && !mAutoSelectOverride)
// {
// // select first filtered item
// LLSelectFirstFilteredItem filter;
// applyFunctorRecursively(filter);
// }
// [SL:KB] - Patch: Inventory-Selection | Checked: 2011-10-04 (Catznip-3.0.0a) | Added: Catznip-3.0.0a
if ( (!mSelectedItems.empty()) && (!mAutoSelectOverride) )
{
// select first filtered item
LLSelectFirstFilteredItem filter;
applyFunctorRecursively(filter);
LLFolderViewItem* pCurSelItem = mSelectedItems.back();
// Iterate through all currently selected items and only deselect those that don't match the filter (or are a folder with no filtered descendents)
for (selected_items_t::iterator itSelItem = mSelectedItems.begin(); itSelItem != mSelectedItems.end(); )
{
LLFolderViewItem* pSelItem = *itSelItem;
LLFolderViewFolder* pSelFolder = dynamic_cast<LLFolderViewFolder*>(pCurSelItem);
if ( ((pSelFolder) && (!pSelFolder->hasFilteredDescendants())) || ((!pSelFolder) && (!pSelItem->getFiltered())) )
{
removeFromSelectionList(pSelItem);
itSelItem = mSelectedItems.begin();
}
else
{
++itSelItem;
}
}
// If there are no selected items left then try to select the nearest visible item to the previous selection
if (mSelectedItems.empty())
{
LLFolderViewItem* pNewSelItem = pCurSelItem->getNextOpenNode(FALSE);
if (!pNewSelItem)
pNewSelItem = pCurSelItem->getPreviousOpenNode(FALSE);
if (pNewSelItem)
{
setSelectionFromRoot(pNewSelItem, pNewSelItem->isOpen(), mParentPanel->hasFocus());
if (pNewSelItem->getParentFolder())
pNewSelItem->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
}
else
{
setSelectionFromRoot(NULL, mParentPanel->hasFocus());
}
}
scrollToShowSelection();
}
// [/SL:KB]
// Open filtered folders for folder views with mAutoSelectOverride=TRUE.
// Used by LLPlacesFolderView.
@ -2213,7 +2262,10 @@ void LLFolderView::doIdle()
applyFunctorRecursively(filter);
}
scrollToShowSelection();
// scrollToShowSelection();
// [SL:KB] - Patch: Inventory-Selection | Checked: 2011-10-04 (Catznip-3.0.0a) | Added: Catznip-3.0.0a
mNeedsAutoSelect = FALSE;
// [/SL:KB]
}
// during filtering process, try to pin selected item's location on screen