Deluge Firmware 1.3.0
Build date: 2025.06.05
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 "gui/l10n/l10n.h"
22#include "gui/l10n/strings.h"
23#include "hid/buttons.h"
24#include "model/mod_controllable/mod_controllable_audio.h"
25#include <cstdint>
26#include <span>
27
28enum class MenuPermission {
29 NO,
30 YES,
31 MUST_SELECT_RANGE,
32};
33
34class Sound;
35class MultiRange;
36class MIDICable;
37
39class MenuItem {
40public:
41 MenuItem() : name(deluge::l10n::String::EMPTY_STRING), title(deluge::l10n::String::EMPTY_STRING) {}
42 MenuItem(deluge::l10n::String newName, deluge::l10n::String newTitle = deluge::l10n::String::EMPTY_STRING)
43 : name(newName), title(newTitle) {
44 if (newTitle == deluge::l10n::String::EMPTY_STRING) {
45 title = newName;
46 }
47 }
48
49 MenuItem(const MenuItem& other) = delete;
50 MenuItem(const MenuItem&& other) = delete;
51 MenuItem& operator=(const MenuItem& other) = delete;
52 MenuItem& operator=(const MenuItem&& other) = delete;
53
54 virtual ~MenuItem() = default;
55
58
66 virtual ActionResult buttonAction(deluge::hid::Button b, bool on, bool inCardRoutine) {
67 return ActionResult::NOT_DEALT_WITH;
68 }
69
72 virtual void horizontalEncoderAction(int32_t offset) {}
76 virtual void verticalEncoderAction(int32_t offset) {}
81 virtual void selectEncoderAction(int32_t offset) {}
85 virtual bool selectEncoderActionEditsInstrument() { return false; }
92 virtual MenuItem* selectButtonPress() { return nullptr; }
93
95 virtual ActionResult timerCallback() { return ActionResult::DEALT_WITH; }
96
100 virtual bool usesAffectEntire() { return false; }
101
105
107 virtual MenuPermission checkPermissionToBeginSession(ModControllableAudio* modControllable, int32_t whichThing,
108 MultiRange** currentRange);
112 virtual void beginSession(MenuItem* navigatedBackwardFrom = nullptr) {};
113
115 virtual void endSession();
116
118 virtual void readValueAgain() {}
120 virtual void readCurrentValue() {}
121
125
128 virtual uint8_t getIndexOfPatchedParamToBlink() { return 255; }
134 virtual deluge::modulation::params::Kind getParamKind() { return deluge::modulation::params::Kind::NONE; }
137 virtual uint32_t getParamIndex() { return 255; }
138
144 virtual uint8_t shouldBlinkPatchingSourceShortcut(PatchSource s, uint8_t* colour) { return 255; }
145
158 virtual MenuItem* patchingSourceShortcutPress(PatchSource s, bool previousPressStillActive = false) {
159 return nullptr;
160 }
161
165
169 virtual void learnKnob(MIDICable* cable, int32_t whichKnob, int32_t modKnobMode, int32_t midiChannel) {}
170
172 virtual bool allowsLearnMode() { return false; }
177 virtual bool learnNoteOn(MIDICable& cable, int32_t channel, int32_t noteCode) { return false; }
178
179 virtual void learnProgramChange(MIDICable& cable, int32_t channel, int32_t programNumber) {}
180 virtual void learnCC(MIDICable& cable, int32_t channel, int32_t ccNumber, int32_t value);
181
184 virtual bool shouldBlinkLearnLed() { return false; }
185
187 virtual void unlearnAction() {}
188
190 virtual bool isRangeDependent() { return false; }
191
195
200 virtual void renderOLED();
202 virtual void drawPixelsForOled() {}
203
209
211 deluge::l10n::String title;
212
220 [[nodiscard]] virtual std::string_view getTitle() const { return deluge::l10n::getView(title); }
221
232 virtual uint8_t shouldDrawDotOnName() { return 255; }
233
237 virtual void drawName();
238
242 const deluge::l10n::String name;
246 [[nodiscard]] virtual std::string_view getName() const { return deluge::l10n::getView(name); }
250 virtual void getColumnLabel(StringBuf& label) { label.append(getName().data()); }
251
255 virtual void getColumnLabelForSmallFont(StringBuf& label) { label.append(getName().data()); }
256
260 [[nodiscard]] virtual int32_t getColumnSpan() const { return 1; };
261
267 virtual bool isRelevant(ModControllableAudio* modControllable, int32_t whichThing) { return true; }
268
270 static void drawItemsForOled(std::span<std::string_view> options, int32_t selectedOption, int32_t offset = 0);
271
273 virtual bool shouldEnterSubmenu() { return true; }
274
276 // length = spacing before (4 pixels)
277 // + width of icon (7 pixels)
278 // + spacing after (3 pixels)
279 // spacing before is to ensure that menu item text doesn't overlap and can scroll
280 virtual int32_t getSubmenuItemTypeRenderLength() { return (4 + kSubmenuIconSpacingX + 3); }
281 // icon is rendered 10 pixels from right edge of the display (7px icon width + 3px from edge)
282 virtual int32_t getSubmenuItemTypeRenderIconStart() { return (OLED_MAIN_WIDTH_PIXELS - kSubmenuIconSpacingX - 3); }
283 // render the submenu item type (icon or value)
284 virtual void renderSubmenuItemTypeForOled(int32_t yPixel);
285
286 virtual void renderInHorizontalMenu(int32_t startX, int32_t width, int32_t startY, int32_t height);
287 virtual bool isSubmenu() { return false; }
288 virtual void setupNumberEditor() {}
289 virtual void updatePadLights();
292 virtual void updateAutomationViewParameter() { return; }
293 void renderColumnLabel(int32_t startX, int32_t width, int32_t startY);
294
296};
297
298#define NO_NAVIGATION ((MenuItem*)0xFFFFFFFF)
299
302bool 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:39
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:267
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:220
virtual void endSession()
End an editing session with this menu item.
Definition menu_item.cpp:127
virtual void readValueAgain()
Re-read the value from the system and redraw the display to match.
Definition menu_item.h:118
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:95
virtual void horizontalEncoderAction(int32_t offset)
Handle horizontal encoder movement.
Definition menu_item.h:72
virtual void verticalEncoderAction(int32_t offset)
Handle vertical encoder movement.
Definition menu_item.h:76
virtual bool allowsLearnMode()
Used by SoundEditor to determine if the current menu item can accept MIDI learning.
Definition menu_item.h:172
virtual MenuItem * patchingSourceShortcutPress(PatchSource s, bool previousPressStillActive=false)
Action to take when a source shortcut is pressed.
Definition menu_item.h:158
virtual bool shouldBlinkLearnLed()
Definition menu_item.h:184
virtual void getColumnLabelForSmallFont(StringBuf &label)
Get the name for use on horizontal menus, if the 'use small font for labels' setting enabled.
Definition menu_item.h:255
virtual void getColumnLabel(StringBuf &label)
Get the name for use on horizontal menus.
Definition menu_item.h:250
virtual MenuItem * selectButtonPress()
Handle a select button press.
Definition menu_item.h:92
deluge::l10n::String title
Can get overridden by getTitle(). Actual max num chars for OLED display is 14.
Definition menu_item.h:211
virtual bool usesAffectEntire()
Claim support for Kit AFFECT_ENTIRE editing.
Definition menu_item.h:100
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:85
virtual bool shouldEnterSubmenu()
Check if selecting this menu item (with select encoder) should enter a submenu.
Definition menu_item.h:273
virtual void learnKnob(MIDICable *cable, int32_t whichKnob, int32_t modKnobMode, int32_t midiChannel)
Definition menu_item.h:169
virtual int32_t getColumnSpan() const
Get the number of occupied virtual columns in the horizontal menu.
Definition menu_item.h:260
virtual void drawPixelsForOled()
Paints the pixels below the standard title block.
Definition menu_item.h:202
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:177
virtual bool isRangeDependent()
Returns true if this parameter is only relevant to some note ranges.
Definition menu_item.h:190
virtual uint32_t getParamIndex()
Definition menu_item.h:137
virtual deluge::modulation::params::Kind getParamKind()
Definition menu_item.h:134
const deluge::l10n::String name
Default name for use on OLED for deluge::gui::menu_item::Submenu s.
Definition menu_item.h:242
virtual ActionResult buttonAction(deluge::hid::Button b, bool on, bool inCardRoutine)
Handle an arbitrary button.
Definition menu_item.h:66
virtual int32_t getSubmenuItemTypeRenderLength()
Handle rendering of submenu item types.
Definition menu_item.h:280
virtual uint8_t getIndexOfPatchedParamToBlink()
Definition menu_item.h:128
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:246
virtual void unlearnAction()
Unlearn the parameter controlled by this menu.
Definition menu_item.h:187
virtual void updateAutomationViewParameter()
Definition menu_item.h:292
virtual void readCurrentValue()
Like readValueAgain, but does not redraw.
Definition menu_item.h:120
virtual uint8_t shouldDrawDotOnName()
Get the "draw dot state".
Definition menu_item.h:232
virtual uint8_t shouldBlinkPatchingSourceShortcut(PatchSource s, uint8_t *colour)
Definition menu_item.h:144
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:112
virtual void selectEncoderAction(int32_t offset)
Handle select encoder movement.
Definition menu_item.h:81
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
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