| @@ -382,11 +382,11 @@ struct MenuWindow : public Component | |||
| { | |||
| if (key.isKeyCode (KeyPress::downKey)) | |||
| { | |||
| selectNextItem (1); | |||
| selectNextItem (MenuSelectionDirection::forwards); | |||
| } | |||
| else if (key.isKeyCode (KeyPress::upKey)) | |||
| { | |||
| selectNextItem (-1); | |||
| selectNextItem (MenuSelectionDirection::backwards); | |||
| } | |||
| else if (key.isKeyCode (KeyPress::leftKey)) | |||
| { | |||
| @@ -414,14 +414,14 @@ struct MenuWindow : public Component | |||
| if (showSubMenuFor (currentChild)) | |||
| { | |||
| if (isSubMenuVisible()) | |||
| activeSubMenu->selectNextItem (0); | |||
| activeSubMenu->selectNextItem (MenuSelectionDirection::current); | |||
| } | |||
| else if (componentAttachedTo != nullptr) | |||
| { | |||
| componentAttachedTo->keyPressed (key); | |||
| } | |||
| } | |||
| else if (key.isKeyCode (KeyPress::returnKey)) | |||
| else if (key.isKeyCode (KeyPress::returnKey) || key.isKeyCode (KeyPress::spaceKey)) | |||
| { | |||
| triggerCurrentlyHighlightedItem(); | |||
| } | |||
| @@ -948,24 +948,46 @@ struct MenuWindow : public Component | |||
| } | |||
| } | |||
| void selectNextItem (int delta) | |||
| enum class MenuSelectionDirection | |||
| { | |||
| forwards, | |||
| backwards, | |||
| current | |||
| }; | |||
| void selectNextItem (MenuSelectionDirection direction) | |||
| { | |||
| disableTimerUntilMouseMoves(); | |||
| auto start = jmax (0, items.indexOf (currentChild)); | |||
| auto start = [&] | |||
| { | |||
| auto index = items.indexOf (currentChild); | |||
| if (index >= 0) | |||
| return index; | |||
| return direction == MenuSelectionDirection::backwards ? items.size() - 1 | |||
| : 0; | |||
| }(); | |||
| auto preIncrement = (direction != MenuSelectionDirection::current && currentChild != nullptr); | |||
| for (int i = items.size(); --i >= 0;) | |||
| { | |||
| start += delta; | |||
| if (preIncrement) | |||
| start += (direction == MenuSelectionDirection::backwards ? -1 : 1); | |||
| if (auto* mic = items.getUnchecked ((start + items.size()) % items.size())) | |||
| { | |||
| if (canBeTriggered (mic->item) || hasActiveSubMenu (mic->item)) | |||
| { | |||
| setCurrentlyHighlightedChild (mic); | |||
| break; | |||
| return; | |||
| } | |||
| } | |||
| if (! preIncrement) | |||
| preIncrement = true; | |||
| } | |||
| } | |||