29class Submenu :
public MenuItem {
31 enum RenderingStyle { VERTICAL, HORIZONTAL };
33 Submenu(l10n::String newName, std::initializer_list<MenuItem*> newItems)
34 : MenuItem(newName), items{newItems}, current_item_{items.end()} {}
35 Submenu(l10n::String newName, std::span<MenuItem*> newItems)
36 : MenuItem(newName), items{newItems.begin(), newItems.end()}, current_item_{items.end()} {}
37 Submenu(l10n::String newName, l10n::String
title, std::initializer_list<MenuItem*> newItems)
38 : MenuItem(newName,
title), items{newItems}, current_item_{items.end()} {}
39 Submenu(l10n::String newName, l10n::String
title, std::span<MenuItem*> newItems)
40 : MenuItem(newName,
title), items{newItems.begin(), newItems.end()}, current_item_{items.end()} {}
41 Submenu(l10n::String newName, std::span<MenuItem*> newItems, int32_t newThingIndex)
42 : MenuItem(newName), items{newItems.begin(), newItems.end()}, current_item_{items.end()},
43 thingIndex(newThingIndex) {}
44 Submenu(l10n::String newName, std::initializer_list<MenuItem*> newItems, int32_t newThingIndex)
45 : MenuItem(newName), items{newItems}, current_item_{items.end()}, thingIndex(newThingIndex) {}
47 void beginSession(MenuItem* navigatedBackwardFrom =
nullptr)
override;
51 ActionResult
buttonAction(deluge::hid::Button b,
bool on,
bool inCardRoutine)
override;
56 void learnKnob(
MIDICable* cable, int32_t whichKnob, int32_t modKnobMode, int32_t midiChannel) final;
57 void learnProgramChange(
MIDICable& cable, int32_t channel, int32_t programNumber) override;
59 virtual RenderingStyle renderingStyle()
const {
return RenderingStyle::VERTICAL; };
60 void renderInHorizontalMenu(int32_t startX, int32_t width, int32_t startY, int32_t height)
override;
62 void drawSubmenuItemsForOled(std::span<MenuItem*> options,
const int32_t selectedOption);
66 bool isSubmenu()
override {
return true; }
67 virtual bool focusChild(
const MenuItem* child);
68 void updatePadLights()
override;
72 std::optional<uint8_t> getThingIndex() {
return thingIndex; }
75 std::optional<uint8_t> thingIndex = std::nullopt;
76 uint32_t initial_index_ = 0;
77 deluge::vector<MenuItem*> items;
78 typename decltype(items)::iterator current_item_;
81 bool shouldForwardButtons();
84class HorizontalMenu :
public Submenu {
86 enum Layout { FIXED, DYNAMIC };
90 int32_t itemsWidthScaling;
91 std::vector<MenuItem*> items;
95 int32_t visiblePageNumber;
96 int32_t selectedItemPositionOnPage;
97 std::vector<PageInfo> pages;
98 PageInfo& getVisiblePage() {
return pages[visiblePageNumber]; }
101 using Submenu::Submenu;
103 HorizontalMenu(l10n::String newName, std::span<MenuItem*> newItems, Layout layout)
104 : Submenu(newName, newItems), horizontalMenuLayout(layout), paging{} {}
105 HorizontalMenu(l10n::String newName, std::initializer_list<MenuItem*> newItems, Layout layout)
106 :
Submenu(newName, newItems), horizontalMenuLayout(layout), paging{} {}
107 HorizontalMenu(l10n::String newName, l10n::String newTitle, std::initializer_list<MenuItem*> newItems,
109 : Submenu(newName, newTitle, newItems), horizontalMenuLayout(layout), paging{} {}
111 RenderingStyle renderingStyle()
const override;
112 ActionResult
buttonAction(deluge::hid::Button b,
bool on,
bool inCardRoutine)
override;
118 HorizontalMenu::Paging paging;
119 int32_t lastSelectedHorizontalMenuItemPosition = kNoSelection;
120 Layout horizontalMenuLayout = Layout::DYNAMIC;
124 ActionResult switchVisiblePage(int32_t direction);
126 HorizontalMenu::Paging splitMenuItemsByPages();
127 int32_t calcPageItemsWidthScaling(int32_t totalItemsSpan, std::vector<MenuItem*>& pageItems,
128 bool isLastPage =
false)
const;