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:00 -05:00
parent c6c5cd9940
commit 63632ee1a2

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 (fAnchorIndex > 0) {
// if nothing is selected yet, always select the first item if (!extend || fAnchorIndex <= fFirstSelected) {
Select(0); for (int32 i = 1; fAnchorIndex - i >= 0; i++) {
} else { if (ItemAt(fAnchorIndex - i)->IsEnabled()) {
if (fAnchorIndex > 0) { // Select the previous enabled item
if (!extend || fAnchorIndex <= fFirstSelected) Select(fAnchorIndex - i, extend);
Select(fAnchorIndex - 1, extend); break;
else }
Deselect(fAnchorIndex--); }
} 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) {
} else { for (int32 i = 1; fAnchorIndex + i <= lastItem; i++) {
if (fAnchorIndex < CountItems() - 1) { if (ItemAt(fAnchorIndex + i)->IsEnabled()) {
if (!extend || fAnchorIndex >= fLastSelected) // Select the next enabled item
Select(fAnchorIndex + 1, extend); Select(fAnchorIndex + i, extend);
else break;
Deselect(fAnchorIndex++); }
}
} else {
Deselect(fAnchorIndex);
do
fAnchorIndex++;
while (fAnchorIndex < lastItem
&& !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)
Select(min_c(index, fFirstSelected), max_c(index, if (index >= fFirstSelected && index < fLastSelected) {
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,
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)