29class HorizontalMenu :
public Submenu {
31 friend class HorizontalMenuGroup;
33 enum Layout { FIXED, DYNAMIC };
36 uint8_t visiblePageNumber;
37 std::span<MenuItem*> visiblePageItems;
38 uint8_t selectedItemPositionOnPage;
42 using Submenu::Submenu;
44 HorizontalMenu(l10n::String newName, std::span<MenuItem*> newItems, Layout layout)
45 : Submenu(newName, newItems), paging{}, layout(layout) {}
46 HorizontalMenu(l10n::String newName, std::initializer_list<MenuItem*> newItems, Layout layout)
47 :
Submenu(newName, newItems), paging{}, layout(layout) {}
48 HorizontalMenu(l10n::String newName, l10n::String newTitle, std::initializer_list<MenuItem*> newItems,
50 : Submenu(newName, newTitle, newItems), paging{}, layout(layout) {}
52 RenderingStyle renderingStyle()
const override;
53 ActionResult
buttonAction(hid::Button b,
bool on,
bool inCardRoutine)
override;
58 bool focusChild(
const MenuItem* child)
override;
60 virtual bool hasItem(
const MenuItem* item);
61 decltype(items)& getItems() {
return items; }
62 MenuItem* getCurrentItem()
const {
return *current_item_; }
67 Layout layout{DYNAMIC};
68 int32_t lastSelectedItemPosition{kNoSelection};
70 virtual void renderMenuItems(std::span<MenuItem*> items,
const MenuItem* currentItem);
71 virtual Paging& preparePaging(std::span<MenuItem*> items,
const MenuItem* currentItem);
72 virtual void handleInstrumentButtonPress(std::span<MenuItem*> visible_page_items,
const MenuItem* previous,
73 int32_t pressed_button_position);
74 virtual void selectMenuItem(int32_t page_number, int32_t item_pos);
75 virtual void switchVisiblePage(int32_t direction);
76 virtual void switchHorizontalMenu(int32_t direction, std::span<HorizontalMenu* const> chain);
80 static void handleItemAction(MenuItem* menuItem);
81 static void displayNotification(MenuItem* menuItem);
82 void renderTitle(
const Paging& paging)
const;
83 static void renderPageCounters(
const Paging& paging);
84 static void renderColumnLabel(MenuItem* menuItem, int32_t labelY, int32_t slotStartX, int32_t slotWidth,
86 static MenuPermission initializeItem(MenuItem* menuItem);
88 static deluge::hid::encoders::EncoderAcceleration& acceleration();
89 double calcNextKnobSpeed(int8_t offset);