| @@ -589,10 +589,7 @@ TreeViewItem* TreeView::getSelectedItem (const int index) const noexcept | |||
| int TreeView::getNumRowsInTree() const | |||
| { | |||
| if (rootItem != nullptr) | |||
| return rootItem->getNumRows() - (rootItemVisible ? 0 : 1); | |||
| return 0; | |||
| return rootItem != nullptr ? (rootItem->getNumRows() - (rootItemVisible ? 0 : 1)) : 0; | |||
| } | |||
| TreeViewItem* TreeView::getItemOnRow (int index) const | |||
| @@ -699,44 +696,45 @@ void TreeView::enablementChanged() | |||
| void TreeView::moveSelectedRow (const int delta) | |||
| { | |||
| int rowSelected = 0; | |||
| const int numRowsInTree = getNumRowsInTree(); | |||
| TreeViewItem* const firstSelected = getSelectedItem (0); | |||
| if (firstSelected != nullptr) | |||
| rowSelected = firstSelected->getRowNumberInTree(); | |||
| if (numRowsInTree > 0) | |||
| { | |||
| int rowSelected = 0; | |||
| rowSelected = jlimit (0, getNumRowsInTree() - 1, rowSelected + delta); | |||
| TreeViewItem* const firstSelected = getSelectedItem (0); | |||
| if (firstSelected != nullptr) | |||
| rowSelected = firstSelected->getRowNumberInTree(); | |||
| for (;;) | |||
| { | |||
| TreeViewItem* item = getItemOnRow (rowSelected); | |||
| rowSelected = jlimit (0, numRowsInTree - 1, rowSelected + delta); | |||
| if (item != nullptr) | |||
| for (;;) | |||
| { | |||
| if (! item->canBeSelected()) | |||
| { | |||
| // if the row we want to highlight doesn't allow it, try skipping | |||
| // to the next item.. | |||
| const int nextRowToTry = jlimit (0, getNumRowsInTree() - 1, | |||
| rowSelected + (delta < 0 ? -1 : 1)); | |||
| TreeViewItem* const item = getItemOnRow (rowSelected); | |||
| if (rowSelected != nextRowToTry) | |||
| { | |||
| rowSelected = nextRowToTry; | |||
| continue; | |||
| } | |||
| else | |||
| if (item != nullptr) | |||
| { | |||
| if (! item->canBeSelected()) | |||
| { | |||
| // if the row we want to highlight doesn't allow it, try skipping | |||
| // to the next item.. | |||
| const int nextRowToTry = jlimit (0, numRowsInTree - 1, rowSelected + (delta < 0 ? -1 : 1)); | |||
| if (rowSelected != nextRowToTry) | |||
| { | |||
| rowSelected = nextRowToTry; | |||
| continue; | |||
| } | |||
| break; | |||
| } | |||
| } | |||
| item->setSelected (true, true); | |||
| item->setSelected (true, true); | |||
| scrollToKeepItemVisible (item); | |||
| } | |||
| scrollToKeepItemVisible (item); | |||
| break; | |||
| } | |||
| break; | |||
| } | |||
| } | |||