BListView: Skip disabled items via keys

Update B_UP_ARROW, B_DOWN_ARROW, B_HOME, and B_END
in KeyDown() to skip over disabled items.
This commit is contained in:
John Scipione
2013-12-23 05:03:42 -05:00
parent c6c5cd9940
commit 63632ee1a2
+67 -20
View File
@@ -393,18 +393,37 @@ BListView::KeyDown(const char* bytes, int32 numBytes)
bool extend = fListType == B_MULTIPLE_SELECTION_LIST bool extend = fListType == B_MULTIPLE_SELECTION_LIST
&& (modifiers() & B_SHIFT_KEY) != 0; && (modifiers() & B_SHIFT_KEY) != 0;
if (fFirstSelected == -1
&& (bytes[0] == B_UP_ARROW || bytes[0] == B_DOWN_ARROW)) {
// nothing is selected yet, select the first enabled item
int32 lastItem = CountItems() - 1;
for (int32 i = 0; i <= lastItem; i++) {
if (ItemAt(i)->IsEnabled()) {
Select(i);
break;
}
}
return;
}
switch (bytes[0]) { switch (bytes[0]) {
case B_UP_ARROW: case B_UP_ARROW:
{ {
if (fFirstSelected == -1) {
// if nothing is selected yet, always select the first item
Select(0);
} else {
if (fAnchorIndex > 0) { if (fAnchorIndex > 0) {
if (!extend || fAnchorIndex <= fFirstSelected) if (!extend || fAnchorIndex <= fFirstSelected) {
Select(fAnchorIndex - 1, extend); for (int32 i = 1; fAnchorIndex - i >= 0; i++) {
else if (ItemAt(fAnchorIndex - i)->IsEnabled()) {
Deselect(fAnchorIndex--); // Select the previous enabled item
Select(fAnchorIndex - i, extend);
break;
}
}
} else {
Deselect(fAnchorIndex);
do
fAnchorIndex--;
while (fAnchorIndex > 0
&& !ItemAt(fAnchorIndex)->IsEnabled());
} }
} }
@@ -414,15 +433,22 @@ BListView::KeyDown(const char* bytes, int32 numBytes)
case B_DOWN_ARROW: case B_DOWN_ARROW:
{ {
if (fFirstSelected == -1) { int32 lastItem = CountItems() - 1;
// if nothing is selected yet, always select the first item if (fAnchorIndex < lastItem) {
Select(0); if (!extend || fAnchorIndex >= fLastSelected) {
for (int32 i = 1; fAnchorIndex + i <= lastItem; i++) {
if (ItemAt(fAnchorIndex + i)->IsEnabled()) {
// Select the next enabled item
Select(fAnchorIndex + i, extend);
break;
}
}
} else { } else {
if (fAnchorIndex < CountItems() - 1) { Deselect(fAnchorIndex);
if (!extend || fAnchorIndex >= fLastSelected) do
Select(fAnchorIndex + 1, extend); fAnchorIndex++;
else while (fAnchorIndex < lastItem
Deselect(fAnchorIndex++); && !ItemAt(fAnchorIndex)->IsEnabled());
} }
} }
@@ -434,8 +460,16 @@ BListView::KeyDown(const char* bytes, int32 numBytes)
if (extend) { if (extend) {
Select(0, fAnchorIndex, true); Select(0, fAnchorIndex, true);
fAnchorIndex = 0; fAnchorIndex = 0;
} else } else {
Select(0, false); // select the first enabled item
int32 lastItem = CountItems() - 1;
for (int32 i = 0; i <= lastItem; i++) {
if (ItemAt(i)->IsEnabled()) {
Select(i, false);
break;
}
}
}
ScrollToSelection(); ScrollToSelection();
break; break;
@@ -444,8 +478,15 @@ BListView::KeyDown(const char* bytes, int32 numBytes)
if (extend) { if (extend) {
Select(fAnchorIndex, CountItems() - 1, true); Select(fAnchorIndex, CountItems() - 1, true);
fAnchorIndex = CountItems() - 1; fAnchorIndex = CountItems() - 1;
} else } else {
Select(CountItems() - 1, false); // select the last enabled item
for (int32 i = CountItems() - 1; i >= 0; i--) {
if (ItemAt(i)->IsEnabled()) {
Select(i, false);
break;
}
}
}
ScrollToSelection(); ScrollToSelection();
break; break;
@@ -536,8 +577,14 @@ BListView::MouseDown(BPoint point)
// select entire block // select entire block
// TODO: maybe review if we want it like in Tracker // TODO: maybe review if we want it like in Tracker
// (anchor item) // (anchor item)
if (index >= fFirstSelected && index < fLastSelected) {
// clicked inside of selected items block, deselect all
// but from the first selected item to the clicked item
DeselectExcept(fFirstSelected, index);
} else {
Select(min_c(index, fFirstSelected), max_c(index, Select(min_c(index, fFirstSelected), max_c(index,
fLastSelected)); fLastSelected));
}
} else { } else {
if (modifiers & B_COMMAND_KEY) { if (modifiers & B_COMMAND_KEY) {
// toggle selection state of clicked item (like in Tracker) // toggle selection state of clicked item (like in Tracker)