Deluge Firmware 1.3.0
Build date: 2025.11.04
Loading...
Searching...
No Matches
menu_item.h
1/*
2 * Copyright © 2014-2023 Synthstrom Audible Limited
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 "definitions_cxx.hpp"
21#include "deluge/model/settings/runtime_feature_settings.h"
22#include "gui/l10n/l10n.h"
23#include "gui/l10n/strings.h"
24#include "model/mod_controllable/mod_controllable_audio.h"
25#include <span>
26
27enum class MenuPermission {
28 NO,
29 YES,
30 MUST_SELECT_RANGE,
31};
32
34 uint8_t start_x{0};
35 uint8_t start_y{0};
36 uint8_t width{0};
37 uint8_t height{0};
38};
39
40class Sound;
41class MultiRange;
42class MIDICable;
43
44namespace deluge::gui::menu_item {
45class Submenu;
46class HorizontalMenu;
47} // namespace deluge::gui::menu_item
48
50class MenuItem {
51public:
52 MenuItem() : name(deluge::l10n::String::EMPTY_STRING), title(deluge::l10n::String::EMPTY_STRING) {}
53 MenuItem(deluge::l10n::String newName, deluge::l10n::String newTitle = deluge::l10n::String::EMPTY_STRING)
54 : name(newName), title(newTitle) {
55 if (newTitle == deluge::l10n::String::EMPTY_STRING) {
56 title = newName;
57 }
58 }
59
60 MenuItem(const MenuItem& other) = delete;
61 MenuItem(const MenuItem&& other) = delete;
62 MenuItem& operator=(const MenuItem& other) = delete;
63 MenuItem& operator=(const MenuItem&& other) = delete;
64
65 virtual ~MenuItem() = default;
66
69
77 virtual ActionResult buttonAction(deluge::hid::Button b, bool on, bool inCardRoutine) {
78 return ActionResult::NOT_DEALT_WITH;
79 }
80
83 virtual void horizontalEncoderAction(int32_t offset) {}
87 virtual void verticalEncoderAction(int32_t offset) {}
92 virtual void selectEncoderAction(int32_t offset) {}
96 virtual bool selectEncoderActionEditsInstrument() { return false; }
103 virtual MenuItem* selectButtonPress() { return nullptr; }
104
106 virtual ActionResult timerCallback() { return ActionResult::DEALT_WITH; }
107
111 virtual bool usesAffectEntire() { return false; }
112
116
118 virtual MenuPermission checkPermissionToBeginSession(ModControllableAudio* modControllable, int32_t whichThing,
119 MultiRange** currentRange);
123 virtual void beginSession(MenuItem* navigatedBackwardFrom = nullptr) {};
124
126 virtual void endSession();
127
129 virtual void readValueAgain() {}
131 virtual void readCurrentValue() {}
132
136
139 virtual uint8_t getIndexOfPatchedParamToBlink() { return 255; }
145 virtual deluge::modulation::params::Kind getParamKind() { return deluge::modulation::params::Kind::NONE; }
148 virtual uint32_t getParamIndex() { return 255; }
149
155 virtual uint8_t shouldBlinkPatchingSourceShortcut(PatchSource s, uint8_t* colour) { return 255; }
156
169 virtual MenuItem* patchingSourceShortcutPress(PatchSource s, bool previousPressStillActive = false) {
170 return nullptr;
171 }
172
176
180 virtual void learnKnob(MIDICable* cable, int32_t whichKnob, int32_t modKnobMode, int32_t midiChannel) {}
181
183 virtual bool allowsLearnMode() { return false; }
188 virtual bool learnNoteOn(MIDICable& cable, int32_t channel, int32_t noteCode) { return false; }
189
190 virtual void learnProgramChange(MIDICable& cable, int32_t channel, int32_t programNumber) {}
191 virtual void learnCC(MIDICable& cable, int32_t channel, int32_t ccNumber, int32_t value);
192
195 virtual bool shouldBlinkLearnLed() { return false; }
196
198 virtual void unlearnAction() {}
199
201 virtual bool isRangeDependent() { return false; }
202
206
211 virtual void renderOLED();
213 virtual void drawPixelsForOled() {}
214
220
222 deluge::l10n::String title;
223
231 [[nodiscard]] virtual std::string_view getTitle() const { return deluge::l10n::getView(title); }
232
243 virtual uint8_t shouldDrawDotOnName() { return 255; }
244
248 virtual void drawName();
249
253 const deluge::l10n::String name;
257 [[nodiscard]] virtual std::string_view getName() const { return deluge::l10n::getView(name); }
258
264 virtual bool isRelevant(ModControllableAudio* modControllable, int32_t whichThing) { return true; }
265
267 static void drawItemsForOled(std::span<std::string_view> options, int32_t selectedOption, int32_t offset = 0);
268
270 virtual bool shouldEnterSubmenu() { return true; }
271
273 // length = spacing before (4 pixels)
274 // + width of icon (7 pixels)
275 // + spacing after (3 pixels)
276 // spacing before is to ensure that menu item text doesn't overlap and can scroll
277 virtual int32_t getSubmenuItemTypeRenderLength() { return (4 + kSubmenuIconSpacingX + 3); }
278 // icon is rendered 10 pixels from right edge of the display (7px icon width + 3px from edge)
279 virtual int32_t getSubmenuItemTypeRenderIconStart() { return (OLED_MAIN_WIDTH_PIXELS - kSubmenuIconSpacingX - 3); }
280 // render the submenu item type (icon or value)
281 virtual void renderSubmenuItemTypeForOled(int32_t yPixel);
282 virtual bool isSubmenu() { return false; }
283 virtual void setupNumberEditor() {}
284 virtual void updatePadLights();
285
293 virtual void getColumnLabel(StringBuf& label) { label.append(getName().data()); }
294
298 [[nodiscard]] virtual bool showColumnLabel() const { return true; }
299
303 [[nodiscard]] virtual int32_t getColumnSpan() const { return 1; };
304
308 [[nodiscard]] virtual bool showNotification() const { return true; }
309
313 [[nodiscard]] virtual bool allowToBeginSessionFromHorizontalMenu() { return false; }
314
318 virtual void getNotificationValue(StringBuf& valueBuf) {}
319
320 virtual void renderInHorizontalMenu(const HorizontalMenuSlotParams& slot) {};
321
322 deluge::gui::menu_item::HorizontalMenu* parent{nullptr};
323
325};
326
327#define NO_NAVIGATION ((MenuItem*)0xFFFFFFFF)
328
331bool isItemRelevant(MenuItem* item);
A MIDI cable connection. Stores all state specific to a given cable and its contained ports and chann...
Definition midi_device.h:94
Base class for all menu items.
Definition menu_item.h:50
virtual bool isRelevant(ModControllableAudio *modControllable, int32_t whichThing)
Check if this MenuItem should show up in a containing deluge::gui::menu_item::Submenu.
Definition menu_item.h:264
virtual std::string_view getTitle() const
Get the title to be used when rendering on OLED, both as a deluge::gui::menu_item::Submenu and when d...
Definition menu_item.h:231
virtual void endSession()
End an editing session with this menu item.
Definition menu_item.cpp:82
virtual void readValueAgain()
Re-read the value from the system and redraw the display to match.
Definition menu_item.h:129
virtual MenuPermission checkPermissionToBeginSession(ModControllableAudio *modControllable, int32_t whichThing, MultiRange **currentRange)
Double-check that this MenuItem will work with the currently selected sound range.
Definition menu_item.cpp:27
virtual ActionResult timerCallback()
Handle a TimerName::UI_SPECIFIC event.
Definition menu_item.h:106
virtual void getNotificationValue(StringBuf &valueBuf)
Get the parameter value string to show in the popup.
Definition menu_item.h:318
virtual void horizontalEncoderAction(int32_t offset)
Handle horizontal encoder movement.
Definition menu_item.h:83
virtual void verticalEncoderAction(int32_t offset)
Handle vertical encoder movement.
Definition menu_item.h:87
virtual bool allowsLearnMode()
Used by SoundEditor to determine if the current menu item can accept MIDI learning.
Definition menu_item.h:183
virtual MenuItem * patchingSourceShortcutPress(PatchSource s, bool previousPressStillActive=false)
Action to take when a source shortcut is pressed.
Definition menu_item.h:169
virtual bool shouldBlinkLearnLed()
Definition menu_item.h:195
virtual MenuItem * selectButtonPress()
Handle a select button press.
Definition menu_item.h:103
virtual bool allowToBeginSessionFromHorizontalMenu()
Allow entering menu session by selecting the menu item twice in Horizontal menu.
Definition menu_item.h:313
deluge::l10n::String title
Can get overridden by getTitle(). Actual max num chars for OLED display is 14.
Definition menu_item.h:222
virtual bool usesAffectEntire()
Claim support for Kit AFFECT_ENTIRE editing.
Definition menu_item.h:111
virtual bool selectEncoderActionEditsInstrument()
Used by the sound editor to mark the current instrument as edited when the select encoder is scrolled...
Definition menu_item.h:96
virtual bool shouldEnterSubmenu()
Check if selecting this menu item (with select encoder) should enter a submenu.
Definition menu_item.h:270
virtual void learnKnob(MIDICable *cable, int32_t whichKnob, int32_t modKnobMode, int32_t midiChannel)
Definition menu_item.h:180
virtual int32_t getColumnSpan() const
Get the number of occupied virtual columns in Horizontal menu.
Definition menu_item.h:303
virtual void drawPixelsForOled()
Paints the pixels below the standard title block.
Definition menu_item.h:213
virtual bool learnNoteOn(MIDICable &cable, int32_t channel, int32_t noteCode)
Attempt to bind this menu item to a note code.
Definition menu_item.h:188
virtual bool isRangeDependent()
Returns true if this parameter is only relevant to some note ranges.
Definition menu_item.h:201
virtual uint32_t getParamIndex()
Definition menu_item.h:148
virtual deluge::modulation::params::Kind getParamKind()
Definition menu_item.h:145
const deluge::l10n::String name
Default name for use on OLED for deluge::gui::menu_item::Submenu s.
Definition menu_item.h:253
virtual ActionResult buttonAction(deluge::hid::Button b, bool on, bool inCardRoutine)
Handle an arbitrary button.
Definition menu_item.h:77
virtual int32_t getSubmenuItemTypeRenderLength()
Handle rendering of submenu item types.
Definition menu_item.h:277
virtual uint8_t getIndexOfPatchedParamToBlink()
Definition menu_item.h:139
virtual bool showNotification() const
Show a popup with the full name and value of the editing parameter at the top of Horizontal menu.
Definition menu_item.h:308
virtual std::string_view getName() const
Get the actual name for use on OLED for deluge::gui::menu_item::Submenu s.
Definition menu_item.h:257
virtual void unlearnAction()
Unlearn the parameter controlled by this menu.
Definition menu_item.h:198
virtual void readCurrentValue()
Like readValueAgain, but does not redraw.
Definition menu_item.h:131
virtual uint8_t shouldDrawDotOnName()
Get the "draw dot state".
Definition menu_item.h:243
virtual uint8_t shouldBlinkPatchingSourceShortcut(PatchSource s, uint8_t *colour)
Definition menu_item.h:155
virtual void renderOLED()
Root rendering routine for OLED.
Definition menu_item.cpp:37
static void drawItemsForOled(std::span< std::string_view > options, int32_t selectedOption, int32_t offset=0)
Internal helper which can draw the standard deluge::gui::menu_item::Submenu layout.
Definition menu_item.cpp:48
virtual void beginSession(MenuItem *navigatedBackwardFrom=nullptr)
Begin an editing session with this menu item.
Definition menu_item.h:123
virtual void selectEncoderAction(int32_t offset)
Handle select encoder movement.
Definition menu_item.h:92
virtual void drawName()
Draw the name we want to use when selecting this in a deluge::gui::menu_item::Submenu to the 7SEG.
Definition menu_item.cpp:43
virtual bool showColumnLabel() const
Show a label for the parameter in Horizontal menu.
Definition menu_item.h:298
Definition mod_controllable_audio.h:47
Definition multi_range.h:23
Definition sound.h:71
Definition d_stringbuf.h:16
Kind
Definition param.h:42
Definition menu_item.h:33