Deluge Firmware 1.3.0
Build date: 2026.10.08
Loading...
Searching...
No Matches
horizontal_menu.h
1/*
2 * Copyright (c) 2024 Nikodemus Siivola, Leonid Burygin
3 *
4 * This file is part of The Synthstrom Audible Deluge Firmware.
5 *
6 * The Synthstrom Audible Deluge Firmware is free software: you can redistribute it and/or modify it under the
7 * terms of the GNU General Public License as published by the Free Software Foundation,
8 * either version 3 of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
11 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 * See the GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License along with this program.
15 * If not, see <https://www.gnu.org/licenses/>.
16 */
17
18#pragma once
19
20#include "gui/menu_item/menu_item.h"
21#include "gui/menu_item/submenu.h"
22#include "hid/encoder_acceleration.h"
23#include "util/containers.h"
24#include <initializer_list>
25#include <span>
26
27namespace deluge::gui::menu_item {
28
29class HorizontalMenu : public Submenu {
30public:
31 friend class HorizontalMenuGroup;
32
33 enum Layout { FIXED, DYNAMIC };
34
35 struct Paging {
36 uint8_t visiblePageNumber;
37 std::span<MenuItem*> visiblePageItems;
38 uint8_t selectedItemPositionOnPage;
39 uint8_t totalPages;
40 };
41
42 using Submenu::Submenu;
43
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,
49 Layout layout)
50 : Submenu(newName, newTitle, newItems), paging{}, layout(layout) {}
51
52 RenderingStyle renderingStyle() const override;
53 ActionResult buttonAction(hid::Button b, bool on, bool inCardRoutine) override;
54 void selectEncoderAction(int32_t offset) override;
55 void renderOLED() override;
56 void beginSession(MenuItem* navigatedBackwardFrom) override;
57 void endSession() override;
58 bool focusChild(const MenuItem* child) override;
59
60 virtual bool hasItem(const MenuItem* item);
61 decltype(items)& getItems() { return items; }
62 MenuItem* getCurrentItem() const { return *current_item_; }
64
65protected:
66 Paging paging;
67 Layout layout{DYNAMIC};
68 int32_t lastSelectedItemPosition{kNoSelection};
69
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);
77
78private:
79 void updateSelectedMenuItemLED(int32_t itemNumber) const;
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,
85 bool isSelected);
86 static MenuPermission initializeItem(MenuItem* menuItem);
87
88 static deluge::hid::encoders::EncoderAcceleration& acceleration();
89 double calcNextKnobSpeed(int8_t offset);
90};
91} // namespace deluge::gui::menu_item
Base class for all menu items.
Definition menu_item.h:50
Definition horizontal_menu.h:29
void selectEncoderAction(int32_t offset) override
Handle select encoder movement.
Definition horizontal_menu.cpp:309
bool selectEncoderActionEditsInstrument() override
Used by the sound editor to mark the current instrument as edited when the select encoder is scrolled...
Definition horizontal_menu.cpp:656
void updateSelectedMenuItemLED(int32_t itemNumber) const
When updating the selected horizontal menu item, you need to refresh the lit instrument LED's.
Definition horizontal_menu.cpp:542
void beginSession(MenuItem *navigatedBackwardFrom) override
Begin an editing session with this menu item.
Definition horizontal_menu.cpp:40
void renderOLED() override
Root rendering routine for OLED.
Definition horizontal_menu.cpp:109
ActionResult buttonAction(hid::Button b, bool on, bool inCardRoutine) override
Handle an arbitrary button.
Definition horizontal_menu.cpp:70
void endSession() override
Definition horizontal_menu.cpp:572
Definition submenu.h:28
Definition horizontal_menu.h:35