Deluge Firmware 1.3.0
Build date: 2025.09.14
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
33class Sound;
34class MultiRange;
35class MIDICable;
36
37namespace deluge::gui::menu_item {
38class Submenu;
39class HorizontalMenu;
40} // namespace deluge::gui::menu_item
41
43class MenuItem {
44public:
45 MenuItem() : name(deluge::l10n::String::EMPTY_STRING), title(deluge::l10n::String::EMPTY_STRING) {}
46 MenuItem(deluge::l10n::String newName, deluge::l10n::String newTitle = deluge::l10n::String::EMPTY_STRING)
47 : name(newName), title(newTitle) {
48 if (newTitle == deluge::l10n::String::EMPTY_STRING) {
49 title = newName;
50 }
51 }
52
53 MenuItem(const MenuItem& other) = delete;
54 MenuItem(const MenuItem&& other) = delete;
55 MenuItem& operator=(const MenuItem& other) = delete;
56 MenuItem& operator=(const MenuItem&& other) = delete;
57
58 virtual ~MenuItem() = default;
59
62
70 virtual ActionResult buttonAction(deluge::hid::Button b, bool on, bool inCardRoutine) {
71 return ActionResult::NOT_DEALT_WITH;
72 }
73
76 virtual void horizontalEncoderAction(int32_t offset) {}
80 virtual void verticalEncoderAction(int32_t offset) {}
85 virtual void selectEncoderAction(int32_t offset) {}
89 virtual bool selectEncoderActionEditsInstrument() { return false; }
96 virtual MenuItem* selectButtonPress() { return nullptr; }
97
99 virtual ActionResult timerCallback() { return ActionResult::DEALT_WITH; }
100
104 virtual bool usesAffectEntire() { return false; }
105
109
111 virtual MenuPermission checkPermissionToBeginSession(ModControllableAudio* modControllable, int32_t whichThing,
112 MultiRange** currentRange);
116 virtual void beginSession(MenuItem* navigatedBackwardFrom = nullptr) {};
117
119 virtual void endSession();
120
122 virtual void readValueAgain() {}
124 virtual void readCurrentValue() {}
125
129
132 virtual uint8_t getIndexOfPatchedParamToBlink() { return 255; }
138 virtual deluge::modulation::params::Kind getParamKind() { return deluge::modulation::params::Kind::NONE; }
141 virtual uint32_t getParamIndex() { return 255; }
142
148 virtual uint8_t shouldBlinkPatchingSourceShortcut(PatchSource s, uint8_t* colour) { return 255; }
149
162 virtual MenuItem* patchingSourceShortcutPress(PatchSource s, bool previousPressStillActive = false) {
163 return nullptr;
164 }
165
169
173 virtual void learnKnob(MIDICable* cable, int32_t whichKnob, int32_t modKnobMode, int32_t midiChannel) {}
174
176 virtual bool allowsLearnMode() { return false; }
181 virtual bool learnNoteOn(MIDICable& cable, int32_t channel, int32_t noteCode) { return false; }
182
183 virtual void learnProgramChange(MIDICable& cable, int32_t channel, int32_t programNumber) {}
184 virtual void learnCC(MIDICable& cable, int32_t channel, int32_t ccNumber, int32_t value);
185
188 virtual bool shouldBlinkLearnLed() { return false; }
189
191 virtual void unlearnAction() {}
192
194 virtual bool isRangeDependent() { return false; }
195
199
204 virtual void renderOLED();
206 virtual void drawPixelsForOled() {}
207
213
215 deluge::l10n::String title;
216
224 [[nodiscard]] virtual std::string_view getTitle() const { return deluge::l10n::getView(title); }
225
236 virtual uint8_t shouldDrawDotOnName() { return 255; }
237
241 virtual void drawName();
242
246 const deluge::l10n::String name;
250 [[nodiscard]] virtual std::string_view getName() const { return deluge::l10n::getView(name); }
251
257 virtual bool isRelevant(ModControllableAudio* modControllable, int32_t whichThing) { return true; }
258
260 static void drawItemsForOled(std::span<std::string_view> options, int32_t selectedOption, int32_t offset = 0);
261
263 virtual bool shouldEnterSubmenu() { return true; }
264
266 // length = spacing before (4 pixels)
267 // + width of icon (7 pixels)
268 // + spacing after (3 pixels)
269 // spacing before is to ensure that menu item text doesn't overlap and can scroll
270 virtual int32_t getSubmenuItemTypeRenderLength() { return (4 + kSubmenuIconSpacingX + 3); }
271 // icon is rendered 10 pixels from right edge of the display (7px icon width + 3px from edge)
272 virtual int32_t getSubmenuItemTypeRenderIconStart() { return (OLED_MAIN_WIDTH_PIXELS - kSubmenuIconSpacingX - 3); }
273 // render the submenu item type (icon or value)
274 virtual void renderSubmenuItemTypeForOled(int32_t yPixel);
275 virtual bool isSubmenu() { return false; }
276 virtual void setupNumberEditor() {}
277 virtual void updatePadLights();
280 virtual void updateAutomationViewParameter() { return; }
281
289 virtual void getColumnLabel(StringBuf& label) { label.append(getName().data()); }
290
294 [[nodiscard]] virtual bool showColumnLabel() const { return true; }
295
299 [[nodiscard]] virtual int32_t getColumnSpan() const { return 1; };
300
304 [[nodiscard]] virtual bool showNotification() const { return true; }
305
309 [[nodiscard]] virtual bool allowToBeginSessionFromHorizontalMenu() { return false; }
310
314 virtual void getNotificationValue(StringBuf& valueBuf) {}
315
316 virtual void renderInHorizontalMenu(int32_t startX, int32_t width, int32_t startY, int32_t height) {};
317
318 deluge::gui::menu_item::HorizontalMenu* parent{nullptr};
319
321};
322
323#define NO_NAVIGATION ((MenuItem*)0xFFFFFFFF)
324
327bool 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:43
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:257
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:224
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:122
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:99
virtual void getNotificationValue(StringBuf &valueBuf)
Get the parameter value string to show in the popup.
Definition menu_item.h:314
virtual void horizontalEncoderAction(int32_t offset)
Handle horizontal encoder movement.
Definition menu_item.h:76
virtual void verticalEncoderAction(int32_t offset)
Handle vertical encoder movement.
Definition menu_item.h:80
virtual bool allowsLearnMode()
Used by SoundEditor to determine if the current menu item can accept MIDI learning.
Definition menu_item.h:176
virtual MenuItem * patchingSourceShortcutPress(PatchSource s, bool previousPressStillActive=false)
Action to take when a source shortcut is pressed.
Definition menu_item.h:162
virtual bool shouldBlinkLearnLed()
Definition menu_item.h:188
virtual MenuItem * selectButtonPress()
Handle a select button press.
Definition menu_item.h:96
virtual bool allowToBeginSessionFromHorizontalMenu()
Allow entering menu session by selecting the menu item twice in Horizontal menu.
Definition menu_item.h:309
deluge::l10n::String title
Can get overridden by getTitle(). Actual max num chars for OLED display is 14.
Definition menu_item.h:215
virtual bool usesAffectEntire()
Claim support for Kit AFFECT_ENTIRE editing.
Definition menu_item.h:104
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:89
virtual bool shouldEnterSubmenu()
Check if selecting this menu item (with select encoder) should enter a submenu.
Definition menu_item.h:263
virtual void learnKnob(MIDICable *cable, int32_t whichKnob, int32_t modKnobMode, int32_t midiChannel)
Definition menu_item.h:173
virtual int32_t getColumnSpan() const
Get the number of occupied virtual columns in Horizontal menu.
Definition menu_item.h:299
virtual void drawPixelsForOled()
Paints the pixels below the standard title block.
Definition menu_item.h:206
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:181
virtual bool isRangeDependent()
Returns true if this parameter is only relevant to some note ranges.
Definition menu_item.h:194
virtual uint32_t getParamIndex()
Definition menu_item.h:141
virtual deluge::modulation::params::Kind getParamKind()
Definition menu_item.h:138
const deluge::l10n::String name
Default name for use on OLED for deluge::gui::menu_item::Submenu s.
Definition menu_item.h:246
virtual ActionResult buttonAction(deluge::hid::Button b, bool on, bool inCardRoutine)
Handle an arbitrary button.
Definition menu_item.h:70
virtual int32_t getSubmenuItemTypeRenderLength()
Handle rendering of submenu item types.
Definition menu_item.h:270
virtual uint8_t getIndexOfPatchedParamToBlink()
Definition menu_item.h:132
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:304
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:250
virtual void unlearnAction()
Unlearn the parameter controlled by this menu.
Definition menu_item.h:191
virtual void updateAutomationViewParameter()
Definition menu_item.h:280
virtual void readCurrentValue()
Like readValueAgain, but does not redraw.
Definition menu_item.h:124
virtual uint8_t shouldDrawDotOnName()
Get the "draw dot state".
Definition menu_item.h:236
virtual uint8_t shouldBlinkPatchingSourceShortcut(PatchSource s, uint8_t *colour)
Definition menu_item.h:148
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:116
virtual void selectEncoderAction(int32_t offset)
Handle select encoder movement.
Definition menu_item.h:85
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:294
Definition mod_controllable_audio.h:47
Definition multi_range.h:23
Definition sound.h:71
Definition d_stringbuf.h:16
Definition horizontal_menu.h:28
Definition submenu.h:28
Kind
Definition param.h:42