28class HorizontalMenu :
public Submenu {
30 friend class HorizontalMenuGroup;
32 enum Layout { FIXED, DYNAMIC };
35 uint8_t visiblePageNumber;
36 std::span<MenuItem*> visiblePageItems;
37 uint8_t selectedItemPositionOnPage;
41 using Submenu::Submenu;
43 HorizontalMenu(l10n::String newName, std::span<MenuItem*> newItems, Layout layout)
44 : Submenu(newName, newItems), paging{}, layout(layout) {}
45 HorizontalMenu(l10n::String newName, std::initializer_list<MenuItem*> newItems, Layout layout)
46 :
Submenu(newName, newItems), paging{}, layout(layout) {}
47 HorizontalMenu(l10n::String newName, l10n::String newTitle, std::initializer_list<MenuItem*> newItems,
49 : Submenu(newName, newTitle, newItems), paging{}, layout(layout) {}
51 RenderingStyle renderingStyle()
const override;
52 ActionResult
buttonAction(hid::Button b,
bool on,
bool inCardRoutine)
override;
55 MenuPermission checkPermissionToBeginSession(
ModControllableAudio* modControllable, int32_t whichThing,
58 virtual bool hasItem(
const MenuItem* item);
62 Layout layout{DYNAMIC};
63 int32_t lastSelectedItemPosition{kNoSelection};
65 virtual void renderMenuItems(std::span<MenuItem*> items,
const MenuItem* currentItem);
66 virtual Paging& preparePaging(std::span<MenuItem*> items,
const MenuItem* currentItem);
67 virtual void handleInstrumentButtonPress(std::span<MenuItem*> visiblePageItems,
const MenuItem* previous,
68 int32_t pressedButtonPosition);
69 virtual void selectMenuItem(int32_t pageNumber, int32_t itemPos);
70 virtual void switchVisiblePage(int32_t direction);
71 virtual void switchHorizontalMenu(int32_t direction, std::span<HorizontalMenu* const> chain,
72 bool forceSelectFirstItem =
false);
76 static void handleItemAction(MenuItem* menuItem);
77 static void displayNotification(MenuItem* menuItem);
78 static void renderPageCounters(
const Paging& paging);
79 static void renderColumnLabel(MenuItem* menuItem, int32_t labelY, int32_t slotStartX, int32_t slotWidth,
82 double currentKnobSpeed{0.0};
83 double calcNextKnobSpeed(int8_t offset);