From c63dea6b91508bc87dc1423260ce1ebab3910f27 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Thu, 9 Aug 2012 16:26:37 -0700 Subject: MAINT-1197 : Fix inventory deselection/reselection when cutting items --- indra/newview/llfolderview.cpp | 23 +++++++++++++++++++++-- indra/newview/llfolderview.h | 2 ++ indra/newview/llfolderviewitem.cpp | 4 ++++ indra/newview/llfolderviewitem.h | 1 + indra/newview/llinventorybridge.cpp | 6 ++++++ 5 files changed, 34 insertions(+), 2 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 7d047ec67e..3ffa08ec32 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -2254,7 +2254,7 @@ void LLFolderView::doIdle() 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 (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->potentiallyFiltered())) + if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->potentiallyVisible())) { // these are named variables to get around gcc not binding non-const references to rvalues // and functor application is inherently non-const to allow for stateful functors @@ -2264,7 +2264,7 @@ void LLFolderView::doIdle() // Open filtered folders for folder views with mAutoSelectOverride=TRUE. // Used by LLPlacesFolderView. - if (mAutoSelectOverride && !mFilter->getFilterSubString().empty()) + if (!mFilter->getFilterSubString().empty()) { // these are named variables to get around gcc not binding non-const references to rvalues // and functor application is inherently non-const to allow for stateful functors @@ -2556,6 +2556,25 @@ void LLFolderView::onRenamerLost() } } +LLFolderViewItem* LLFolderView::getNextUnselectedItem() +{ + LLFolderViewItem* last_item = *mSelectedItems.rbegin(); + LLFolderViewItem* new_selection = last_item->getNextOpenNode(FALSE); + while(new_selection && new_selection->isSelected()) + { + new_selection = new_selection->getNextOpenNode(FALSE); + } + if (!new_selection) + { + new_selection = last_item->getPreviousOpenNode(FALSE); + while (new_selection && (new_selection->isInSelection())) + { + new_selection = new_selection->getPreviousOpenNode(FALSE); + } + } + return new_selection; +} + LLInventoryFilter* LLFolderView::getFilter() { return mFilter; diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index da8bb15f8e..3f78312a98 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -207,6 +207,8 @@ public: virtual void doDelete(); virtual BOOL canDoDelete() const; + LLFolderViewItem* getNextUnselectedItem(); + // Public rename functionality - can only start the process void startRenamingSelectedItem( void ); diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 515e544452..3aa16b4413 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -1098,6 +1098,10 @@ void LLFolderViewItem::draw() } } +bool LLFolderViewItem::isInSelection() const +{ + return mIsSelected || (mParentFolder && mParentFolder->isInSelection()); +} ///---------------------------------------------------------------------------- /// Class LLFolderViewFolder diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index 3c7592046a..577b6b54a2 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -243,6 +243,7 @@ public: virtual void destroyView(); BOOL isSelected() const { return mIsSelected; } + bool isInSelection() const; void setUnselected() { mIsSelected = FALSE; } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index b86c453d61..b819100b9b 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1355,7 +1355,10 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action) else if ("cut" == action) { cutToClipboard(); + // MAINT-1197: This is temp code to work around a deselection/reselection bug. Please discard when merging CHUI. + LLFolderViewItem* item_to_select = mRoot->getNextUnselectedItem(); LLFolderView::removeCutItems(); + mRoot->setSelection(item_to_select, item_to_select ? item_to_select->isOpen() : false, false); return; } else if ("copy" == action) @@ -2743,7 +2746,10 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action) else if ("cut" == action) { cutToClipboard(); + // MAINT-1197: This is temp code to work around a deselection/reselection bug. Please discard when merging CHUI. + LLFolderViewItem* item_to_select = mRoot->getNextUnselectedItem(); LLFolderView::removeCutItems(); + mRoot->setSelection(item_to_select, item_to_select ? item_to_select->isOpen() : false, false); return; } else if ("copy" == action) -- cgit v1.2.3 From 1b639c33c59bb460881e6ef9dcd5fcfabbd21e18 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Fri, 10 Aug 2012 15:35:48 -0700 Subject: VWR-29358 : Fix auto scroll to selection when the filter is active --- indra/newview/llfolderview.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 3ffa08ec32..d4080ab3f7 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -2235,14 +2235,9 @@ void LLFolderView::doIdle() arrangeAll(); } - mNeedsAutoSelect = mFilter->hasFilterString() && - !(gFocusMgr.childHasKeyboardFocus(this) || gFocusMgr.getMouseCapture()); - - - if (mFilter->isModified() && mFilter->isNotDefault()) - { - mNeedsAutoSelect = TRUE; - } + BOOL filter_modified_and_active = mFilter->isModified() && mFilter->isNotDefault(); + mNeedsAutoSelect = filter_modified_and_active && + !(gFocusMgr.childHasKeyboardFocus(this) || gFocusMgr.getMouseCapture()); mFilter->clearModified(); // filter to determine visibility before arranging -- cgit v1.2.3