summaryrefslogtreecommitdiff
path: root/indra/llui/llfolderview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llui/llfolderview.cpp')
-rw-r--r--indra/llui/llfolderview.cpp140
1 files changed, 56 insertions, 84 deletions
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index 5d98dc9663..fedb8bc014 100644
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -749,28 +749,18 @@ void LLFolderView::removeSelectedItems()
// iterate through the new container.
count = items.size();
LLUUID new_selection_id;
+ LLFolderViewItem* item_to_select = getNextUnselectedItem();
+
if(count == 1)
{
LLFolderViewItem* item_to_delete = items[0];
LLFolderViewFolder* parent = item_to_delete->getParentFolder();
- LLFolderViewItem* new_selection = item_to_delete->getNextOpenNode(FALSE);
- if (!new_selection)
- {
- new_selection = item_to_delete->getPreviousOpenNode(FALSE);
- }
if(parent)
{
if (item_to_delete->remove())
{
// change selection on successful delete
- if (new_selection)
- {
- getRoot()->setSelection(new_selection, new_selection->isOpen(), mParentPanel->hasFocus());
- }
- else
- {
- getRoot()->setSelection(NULL, mParentPanel->hasFocus());
- }
+ setSelection(item_to_select, item_to_select ? item_to_select->isOpen() : false, mParentPanel->hasFocus());
}
}
arrangeAll();
@@ -779,28 +769,8 @@ void LLFolderView::removeSelectedItems()
{
LLDynamicArray<LLFolderViewModelItem*> listeners;
LLFolderViewModelItem* listener;
- LLFolderViewItem* last_item = items[count - 1];
- 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);
- }
- }
- if (new_selection)
- {
- getRoot()->setSelection(new_selection, new_selection->isOpen(), mParentPanel->hasFocus());
- }
- else
- {
- getRoot()->setSelection(NULL, mParentPanel->hasFocus());
- }
+
+ setSelection(item_to_select, item_to_select ? item_to_select->isOpen() : false, mParentPanel->hasFocus());
for(S32 i = 0; i < count; ++i)
{
@@ -1032,28 +1002,13 @@ void LLFolderView::cut()
S32 count = mSelectedItems.size();
if(getVisible() && getEnabled() && (count > 0))
{
- LLFolderViewModelItem* listener = NULL;
-
- 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);
- }
- }
+ LLFolderViewItem* item_to_select = getNextUnselectedItem();
selected_items_t::iterator item_it;
for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
{
LLFolderViewItem* item_to_cut = *item_it;
- listener = item_to_cut->getViewModelItem();
+ LLFolderViewModelItem* listener = item_to_cut->getViewModelItem();
if(listener)
{
listener->cutToClipboard();
@@ -1061,14 +1016,7 @@ void LLFolderView::cut()
}
}
- if (new_selection)
- {
- setSelection(new_selection, new_selection->isOpen(), mParentPanel->hasFocus());
- }
- else
- {
- setSelection(NULL, mParentPanel->hasFocus());
- }
+ setSelection(item_to_select, item_to_select ? item_to_select->isOpen() : false, mParentPanel->hasFocus());
}
mSearchString.clear();
}
@@ -1274,12 +1222,12 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
if (next->isSelected())
{
// shrink selection
- getRoot()->changeSelection(last_selected, FALSE);
+ changeSelection(last_selected, FALSE);
}
else if (last_selected->getParentFolder() == next->getParentFolder())
{
// grow selection
- getRoot()->changeSelection(next, TRUE);
+ changeSelection(next, TRUE);
}
}
}
@@ -1338,12 +1286,12 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
if (prev->isSelected())
{
// shrink selection
- getRoot()->changeSelection(last_selected, FALSE);
+ changeSelection(last_selected, FALSE);
}
else if (last_selected->getParentFolder() == prev->getParentFolder())
{
// grow selection
- getRoot()->changeSelection(prev, TRUE);
+ changeSelection(prev, TRUE);
}
}
}
@@ -1701,9 +1649,6 @@ void LLFolderView::scrollToShowItem(LLFolderViewItem* item, const LLRect& constr
if(item)
{
LLRect local_rect = item->getLocalRect();
- LLRect item_scrolled_rect; // item position relative to display area of scroller
- LLRect visible_doc_rect = mScrollContainer->getVisibleContentRect();
-
S32 icon_height = mIcon.isNull() ? 0 : mIcon->getHeight();
S32 label_height = getLabelFontForStyle(mLabelStyle)->getLineHeight();
// when navigating with keyboard, only move top of opened folder on screen, otherwise show whole folder
@@ -1812,6 +1757,20 @@ void LLFolderView::update()
mNeedsAutoSelect = FALSE;
}
+ BOOL is_visible = isInVisibleChain();
+
+ //Puts folders/items in proper positions
+ if ( is_visible )
+ {
+ sanitizeSelection();
+ if( needsArrange() )
+ {
+ S32 height = 0;
+ S32 width = 0;
+ S32 total_height = arrange( &width, &height );
+ notifyParent(LLSD().with("action", "size_changes").with("height", total_height));
+ }
+ }
// during filtering process, try to pin selected item's location on screen
// this will happen when searching your inventory and when new items arrive
@@ -1823,18 +1782,26 @@ void LLFolderView::update()
// lets pin it!
mPinningSelectedItem = TRUE;
- LLRect visible_content_rect = (mScrollContainer ? mScrollContainer->getVisibleContentRect() : LLRect());
+ //Computes visible area
+ const LLRect visible_content_rect = (mScrollContainer ? mScrollContainer->getVisibleContentRect() : LLRect());
LLFolderViewItem* selected_item = mSelectedItems.back();
+ //Computes location of selected content, content outside visible area will be scrolled to using below code
LLRect item_rect;
selected_item->localRectToOtherView(selected_item->getLocalRect(), &item_rect, this);
- // if item is visible in scrolled region
- if (visible_content_rect.overlaps(item_rect))
+
+ //Computes intersected region of the selected content and visible area
+ LLRect overlap_rect(item_rect);
+ overlap_rect.intersectWith(visible_content_rect);
+
+ //Don't scroll when the selected content exists within the visible area
+ if (overlap_rect.getHeight() >= selected_item->getItemHeight())
{
// then attempt to keep it in same place on screen
mScrollConstraintRect = item_rect;
mScrollConstraintRect.translate(-visible_content_rect.mLeft, -visible_content_rect.mBottom);
}
+ //Scroll because the selected content is outside the visible area
else
{
// otherwise we just want it onscreen somewhere
@@ -1865,20 +1832,6 @@ void LLFolderView::update()
constraint_rect.setOriginAndSize(0, 0, content_rect.getWidth(), content_rect.getHeight());
}
- BOOL is_visible = isInVisibleChain();
-
- if ( is_visible )
- {
- sanitizeSelection();
- if( needsArrange() )
- {
- S32 height = 0;
- S32 width = 0;
- S32 total_height = arrange( &width, &height );
- notifyParent(LLSD().with("action", "size_changes").with("height", total_height));
- }
- }
-
if (mSelectedItems.size() && mNeedsScroll)
{
scrollToShowItem(mSelectedItems.back(), constraint_rect);
@@ -2083,3 +2036,22 @@ S32 LLFolderView::getItemHeight()
}
return 0;
}
+
+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;
+}