From 6b763be6583fd4a2a0efcccb4470c05470285093 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sat, 1 Oct 2011 15:08:44 +0200 Subject: [PATCH 1/2] - fixed : inventory panel scrolls to the current selection whenever the current filter becomes out of date even if the panel currently has the focus -> Repro: (1) left-click an inventory item to set a selection (2) scroll up or down until the currently selected item isn't visible anymore (3) trigger an online/offline notification --- indra/newview/llfolderview.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 4583bb6ed8..0ce10c2a6b 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -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()); +// [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(this) || gFocusMgr.getMouseCapture()); + !(gFocusMgr.childHasKeyboardFocus(mParentPanel) || gFocusMgr.getMouseCapture()); +// [/SL:KB] // filter to determine visiblity before arranging filterFromRoot(); From 8c79a194210d6a6f033869db624070bc79ede471 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Tue, 4 Oct 2011 20:41:27 +0200 Subject: [PATCH 2/2] - fixed : inventory selection jumps to the first visible (filtered) item when deleting the last visible (filtered) item in a folder -> Repro: (1) create a folder with two items (2) delete the first item => selection moves to the second item (3) delete the second item => selection moves to the first matched item -> in (3) the selection actually moves to the next visible folder [see LLFolderView::removeSelectedItems()] -> getFiltered() on the folder will return FALSE since while it might have filtered descendents, it won't match it itself => LLFolderView::doIdle() will set the selection to the first filtered item --- indra/newview/llfolderview.cpp | 64 +++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 0ce10c2a6b..76b553c3d6 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -2185,7 +2185,7 @@ void LLFolderView::doIdle() // 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 && + mNeedsAutoSelect |= filter_modified_and_active && !(gFocusMgr.childHasKeyboardFocus(mParentPanel) || gFocusMgr.getMouseCapture()); // [/SL:KB] @@ -2197,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(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. @@ -2217,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