Two more changes to BListView:

* fixed handling of B_HOME and B_END in extend mode for multiselection, such that
  now all the items inbetween the anchor and the final target are selected, too
* made sure that the anchor always gets adjusted in _Select(), as otherwise
  navigation via cursor keys could get "locked".


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31980 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Oliver Tappe
2009-07-30 16:50:08 +00:00
parent c2c39a98a2
commit c08c945ff3
+15 -9
View File
@@ -423,7 +423,7 @@ BListView::KeyDown(const char *bytes, int32 numBytes)
Select(0); Select(0);
} else { } else {
if (fAnchorIndex > 0) { if (fAnchorIndex > 0) {
if (fAnchorIndex <= fFirstSelected) if (!extend || fAnchorIndex <= fFirstSelected)
Select(fAnchorIndex - 1, extend); Select(fAnchorIndex - 1, extend);
else else
Deselect(fAnchorIndex); Deselect(fAnchorIndex);
@@ -440,7 +440,7 @@ BListView::KeyDown(const char *bytes, int32 numBytes)
Select(0); Select(0);
} else { } else {
if (fAnchorIndex < CountItems() - 1) { if (fAnchorIndex < CountItems() - 1) {
if (fAnchorIndex >= fLastSelected) if (!extend || fAnchorIndex >= fLastSelected)
Select(fAnchorIndex + 1, extend); Select(fAnchorIndex + 1, extend);
else else
Deselect(fAnchorIndex); Deselect(fAnchorIndex);
@@ -452,11 +452,17 @@ BListView::KeyDown(const char *bytes, int32 numBytes)
} }
case B_HOME: case B_HOME:
Select(0, extend); if (extend)
Select(0, fAnchorIndex, true);
else
Select(0, false);
ScrollToSelection(); ScrollToSelection();
break; break;
case B_END: case B_END:
Select(CountItems() - 1, extend); if (extend)
Select(fAnchorIndex, CountItems() - 1, true);
else
Select(CountItems() - 1, false);
ScrollToSelection(); ScrollToSelection();
break; break;
@@ -1418,8 +1424,11 @@ BListView::_Select(int32 index, bool extend)
bool changed = false; bool changed = false;
if (fFirstSelected != -1 && !extend) if (!extend) {
changed = _DeselectAll(index, index); fAnchorIndex = index;
if (fFirstSelected != -1)
changed = _DeselectAll(index, index);
}
BListItem* item = ItemAt(index); BListItem* item = ItemAt(index);
if (!item->IsEnabled() || item->IsSelected()) { if (!item->IsEnabled() || item->IsSelected()) {
@@ -1439,9 +1448,6 @@ BListView::_Select(int32 index, bool extend)
fLastSelected = index; fLastSelected = index;
} }
if (!extend)
fAnchorIndex = index;
ItemAt(index)->Select(); ItemAt(index)->Select();
if (Window()) if (Window())
InvalidateItem(index); InvalidateItem(index);