diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 7d047ec67ec25fe045c283d46cb92561ba35a08b..3ffa08ec325b86bf68717304bc4f703e8318087e 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 da8bb15f8ef9397c45efad6f36d346caf8491f4e..3f78312a98553c51091d798b07bf45582630d4bb 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -207,6 +207,8 @@ class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler 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 515e544452b0bd57df69fd5c1ba40acc33acb287..3aa16b4413453ce5690e5ff39a492ff9cf9ac836 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 3c7592046a15dc0d589f586af2e573363503e38f..577b6b54a26a4918f79292d50a6a93431fb1d93a 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -243,6 +243,7 @@ class LLFolderViewItem : public LLView 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 b86c453d617693bced1035bd28af8d9a3c0654ce..b819100b9bbdba0efc8a877396705c5569cc7358 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)