hrev46593 adds 4 changesets to branch 'master' old head: 5fd5e562aa8b8ae91cc4d3609d7bbea5a4d9ff4f new head: 63632ee1a2eba022507cbf3c3a1df10d7300a354 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=63632ee+%5E5fd5e56 ---------------------------------------------------------------------------- d093101: BListView: style fixes b38f03f: BListView: small optimization. We already got item at index, don’t get it again c6c5cd9: BListView: Only select enabled items when selecting multiple items in a multi-select list view. 63632ee: 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. [ John Scipione <jscipione@xxxxxxxxx> ] ---------------------------------------------------------------------------- 1 file changed, 86 insertions(+), 36 deletions(-) src/kits/interface/ListView.cpp | 122 +++++++++++++++++++++++++----------- ############################################################################ Commit: d09310121521f334cb1a874707a94ee19972d95d URL: http://cgit.haiku-os.org/haiku/commit/?id=d093101 Author: John Scipione <jscipione@xxxxxxxxx> Date: Mon Dec 23 09:35:46 2013 UTC BListView: style fixes ---------------------------------------------------------------------------- diff --git a/src/kits/interface/ListView.cpp b/src/kits/interface/ListView.cpp index d19cd75..91e9395 100644 --- a/src/kits/interface/ListView.cpp +++ b/src/kits/interface/ListView.cpp @@ -411,6 +411,7 @@ BListView::KeyDown(const char* bytes, int32 numBytes) ScrollToSelection(); break; } + case B_DOWN_ARROW: { if (fFirstSelected == -1) { @@ -438,6 +439,7 @@ BListView::KeyDown(const char* bytes, int32 numBytes) ScrollToSelection(); break; + case B_END: if (extend) { Select(fAnchorIndex, CountItems() - 1, true); @@ -455,6 +457,7 @@ BListView::KeyDown(const char* bytes, int32 numBytes) ScrollTo(scrollOffset); break; } + case B_PAGE_DOWN: { BPoint scrollOffset(LeftTop()); @@ -1510,7 +1513,7 @@ BListView::_Select(int32 index, bool extend) } ItemAt(index)->Select(); - if (Window()) + if (Window() != NULL) InvalidateItem(index); return true; @@ -1548,10 +1551,10 @@ BListView::_Select(int32 from, int32 to, bool extend) } for (int32 i = from; i <= to; ++i) { - BListItem *item = ItemAt(i); if (item && !item->IsSelected()) { + BListItem* item = ItemAt(i); item->Select(); - if (Window()) + if (Window() != NULL) InvalidateItem(i); changed = true; } @@ -1567,14 +1570,14 @@ BListView::_Deselect(int32 index) if (index < 0 || index >= CountItems()) return false; - BWindow *window = Window(); + BWindow* window = Window(); BAutolock locker(window); - if (window && !locker.IsLocked()) + if (window != NULL && !locker.IsLocked()) return false; - BListItem *item = ItemAt(index); + BListItem* item = ItemAt(index); - if (item && item->IsSelected()) { + if (item != NULL && item->IsSelected()) { BRect frame(ItemFrame(index)); BRect bounds(Bounds()); @@ -1616,8 +1619,8 @@ BListView::_DeselectAll(int32 exceptFrom, int32 exceptTo) if (exceptFrom != -1 && exceptFrom <= index && exceptTo >= index) continue; - BListItem *item = ItemAt(index); - if (item && item->IsSelected()) { + BListItem* item = ItemAt(index); + if (item != NULL && item->IsSelected()) { item->Deselect(); InvalidateItem(index); changed = true; @@ -1680,7 +1683,7 @@ BListView::DrawItem(BListItem* item, BRect itemRect, bool complete) bool BListView::_SwapItems(int32 a, int32 b) { - // remember frames of items before anyhing happens, + // remember frames of items before anything happens, // the tricky situation is when the two items have // a different height BRect aFrame = ItemFrame(a); ############################################################################ Commit: b38f03f5616565030499a74f5a96834790b7f1b4 URL: http://cgit.haiku-os.org/haiku/commit/?id=b38f03f Author: John Scipione <jscipione@xxxxxxxxx> Date: Mon Dec 23 09:38:27 2013 UTC BListView: small optimization. We already got item at index, don’t get it again ---------------------------------------------------------------------------- diff --git a/src/kits/interface/ListView.cpp b/src/kits/interface/ListView.cpp index 91e9395..421e768 100644 --- a/src/kits/interface/ListView.cpp +++ b/src/kits/interface/ListView.cpp @@ -1512,7 +1512,7 @@ BListView::_Select(int32 index, bool extend) fLastSelected = index; } - ItemAt(index)->Select(); + item->Select(); if (Window() != NULL) InvalidateItem(index); ############################################################################ Commit: c6c5cd994038eb544c98f0e95de8b1da37b27276 URL: http://cgit.haiku-os.org/haiku/commit/?id=c6c5cd9 Author: John Scipione <jscipione@xxxxxxxxx> Date: Mon Dec 23 09:40:10 2013 UTC BListView: Only select enabled items when selecting multiple items in a multi-select list view. ---------------------------------------------------------------------------- diff --git a/src/kits/interface/ListView.cpp b/src/kits/interface/ListView.cpp index 421e768..01d3ce0 100644 --- a/src/kits/interface/ListView.cpp +++ b/src/kits/interface/ListView.cpp @@ -1551,8 +1551,8 @@ BListView::_Select(int32 from, int32 to, bool extend) } for (int32 i = from; i <= to; ++i) { - if (item && !item->IsSelected()) { BListItem* item = ItemAt(i); + if (item != NULL && !item->IsSelected() && item->IsEnabled()) { item->Select(); if (Window() != NULL) InvalidateItem(i); ############################################################################ Revision: hrev46593 Commit: 63632ee1a2eba022507cbf3c3a1df10d7300a354 URL: http://cgit.haiku-os.org/haiku/commit/?id=63632ee Author: John Scipione <jscipione@xxxxxxxxx> Date: Mon Dec 23 10:03:00 2013 UTC 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. ---------------------------------------------------------------------------- diff --git a/src/kits/interface/ListView.cpp b/src/kits/interface/ListView.cpp index 01d3ce0..a13e5fe 100644 --- a/src/kits/interface/ListView.cpp +++ b/src/kits/interface/ListView.cpp @@ -393,18 +393,37 @@ BListView::KeyDown(const char* bytes, int32 numBytes) bool extend = fListType == B_MULTIPLE_SELECTION_LIST && (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]) { case B_UP_ARROW: { - if (fFirstSelected == -1) { - // if nothing is selected yet, always select the first item - Select(0); - } else { - if (fAnchorIndex > 0) { - if (!extend || fAnchorIndex <= fFirstSelected) - Select(fAnchorIndex - 1, extend); - else - Deselect(fAnchorIndex--); + if (fAnchorIndex > 0) { + if (!extend || fAnchorIndex <= fFirstSelected) { + for (int32 i = 1; fAnchorIndex - i >= 0; i++) { + if (ItemAt(fAnchorIndex - i)->IsEnabled()) { + // 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: { - if (fFirstSelected == -1) { - // if nothing is selected yet, always select the first item - Select(0); - } else { - if (fAnchorIndex < CountItems() - 1) { - if (!extend || fAnchorIndex >= fLastSelected) - Select(fAnchorIndex + 1, extend); - else - Deselect(fAnchorIndex++); + int32 lastItem = CountItems() - 1; + if (fAnchorIndex < lastItem) { + 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 { + Deselect(fAnchorIndex); + do + fAnchorIndex++; + while (fAnchorIndex < lastItem + && !ItemAt(fAnchorIndex)->IsEnabled()); } } @@ -434,8 +460,16 @@ BListView::KeyDown(const char* bytes, int32 numBytes) if (extend) { Select(0, fAnchorIndex, true); fAnchorIndex = 0; - } else - Select(0, false); + } else { + // 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(); break; @@ -444,8 +478,15 @@ BListView::KeyDown(const char* bytes, int32 numBytes) if (extend) { Select(fAnchorIndex, CountItems() - 1, true); fAnchorIndex = CountItems() - 1; - } else - Select(CountItems() - 1, false); + } else { + // select the last enabled item + for (int32 i = CountItems() - 1; i >= 0; i--) { + if (ItemAt(i)->IsEnabled()) { + Select(i, false); + break; + } + } + } ScrollToSelection(); break; @@ -536,8 +577,14 @@ BListView::MouseDown(BPoint point) // select entire block // TODO: maybe review if we want it like in Tracker // (anchor item) - Select(min_c(index, fFirstSelected), max_c(index, - fLastSelected)); + 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, + fLastSelected)); + } } else { if (modifiers & B_COMMAND_KEY) { // toggle selection state of clicked item (like in Tracker)