Deluge Firmware 1.3.0
Build date: 2025.07.02
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 "hid/buttons.h"
25#include "model/mod_controllable/mod_controllable_audio.h"
26#include <cstdint>
27#include <span>
28
29enum class MenuPermission {
30 NO,
31 YES,
32 MUST_SELECT_RANGE,
33};
34
35class Sound;
36class MultiRange;
37class MIDICable;
38
40class MenuItem {
41public:
42 MenuItem() : name(deluge::l10n::String::EMPTY_STRING), title(deluge::l10n::String::EMPTY_STRING) {}
43 MenuItem(deluge::l10n::String newName, deluge::l10n::String newTitle = deluge::l10n::String::EMPTY_STRING)
44 : name(newName), title(newTitle) {
45 if (newTitle == deluge::l10n::String::EMPTY_STRING) {
46 title = newName;
47 }
48 }
49
50 MenuItem(const MenuItem& other) = delete;
51 MenuItem(const MenuItem&& other) = delete;
52 MenuItem& operator=(const MenuItem& other) = delete;
53 MenuItem& operator=(const MenuItem&& other) = delete;
54
55 virtual ~MenuItem() = default;
56
59
67 virtual ActionResult buttonAction(deluge::hid::Button b, bool on, bool inCardRoutine) {
68 return ActionResult::NOT_DEALT_WITH;
69 }
70
73 virtual void horizontalEncoderAction(int32_t offset) {}
77 virtual void verticalEncoderAction(int32_t offset) {}
82 virtual void selectEncoderAction(int32_t offset) {}
86 virtual bool selectEncoderActionEditsInstrument() { return false; }
93 virtual MenuItem* selectButtonPress() { return nullptr; }
94
96 virtual ActionResult timerCallback() { return ActionResult::DEALT_WITH; }
97
101 virtual bool usesAffectEntire() { return false; }
102
106
108 virtual MenuPermission checkPermissionToBeginSession(ModControllableAudio* modControllable, int32_t whichThing,
109 MultiRange** currentRange);
113 virtual void beginSession(MenuItem* navigatedBackwardFrom = nullptr) {};
114
116 virtual void endSession();
117
119 virtual void readValueAgain() {}
121 virtual void readCurrentValue() {}
122
126
129 virtual uint8_t getIndexOfPatchedParamToBlink() { return 255; }
135 virtual deluge::modulation::params::Kind getParamKind() { return deluge::modulation::params::Kind::NONE; }
138 virtual uint32_t getParamIndex() { return 255; }
139
145 virtual uint8_t shouldBlinkPatchingSourceShortcut(PatchSource s, uint8_t* colour) { return 255; }
146
159 virtual MenuItem* patchingSourceShortcutPress(PatchSource s, bool previousPressStillActive = false) {
160 return nullptr;
161 }
162
166
170 virtual void learnKnob(MIDICable* cable, int32_t whichKnob, int32_t modKnobMode, int32_t midiChannel) {}
171
173 virtual bool allowsLearnMode() { return false; }
178 virtual bool learnNoteOn(MIDICable& cable, int32_t channel, int32_t noteCode) { return false; }
179
180 virtual void learnProgramChange(MIDICable& cable, int32_t channel, int32_t programNumber) {}
181 virtual void learnCC(MIDICable& cable, int32_t channel, int32_t ccNumber, int32_t value);
182
185 virtual bool shouldBlinkLearnLed() { return false; }
186
188 virtual void unlearnAction() {}
189
191 virtual bool isRangeDependent() { return false; }
192
196
201 virtual void renderOLED();
203 virtual void drawPixelsForOled() {}
204
210
212 deluge::l10n::String title;
213
221 [[nodiscard]] virtual std::string_view getTitle() const { return deluge::l10n::getView(title); }
222
233 virtual uint8_t shouldDrawDotOnName() { return 255; }
234
238 virtual void drawName();
239
243 const deluge::l10n::String name;
247 [[nodiscard]] virtual std::string_view getName() const { return deluge::l10n::getView(name); }
248
254 virtual bool isRelevant(ModControllableAudio* modControllable, int32_t whichThing) { return true; }
255
257 static void drawItemsForOled(std::span<std::string_view> options, int32_t selectedOption, int32_t offset = 0);
258
260 virtual bool shouldEnterSubmenu() { return true; }
261
263 // length = spacing before (4 pixels)
264 // + width of icon (7 pixels)
265 // + spacing after (3 pixels)
266 // spacing before is to ensure that menu item text doesn't overlap and can scroll
267 virtual int32_t getSubmenuItemTypeRenderLength() { return (4 + kSubmenuIconSpacingX + 3); }
268 // icon is rendered 10 pixels from right edge of the display (7px icon width + 3px from edge)
269 virtual int32_t getSubmenuItemTypeRenderIconStart() { return (OLED_MAIN_WIDTH_PIXELS - kSubmenuIconSpacingX - 3); }
270 // render the submenu item type (icon or value)
271 virtual void renderSubmenuItemTypeForOled(int32_t yPixel);
272 virtual bool isSubmenu() { return false; }
273 virtual void setupNumberEditor() {}
274 virtual void updatePadLights();
277 virtual void updateAutomationViewParameter() { return; }
278
286 virtual void getColumnLabel(StringBuf& label) { label.append(getName().data()); }
287
291 [[nodiscard]] virtual bool showColumnLabel() const { return true; }
292
296 [[nodiscard]] virtual int32_t getColumnSpan() const { return 1; };
297
301 [[nodiscard]] virtual bool showPopup() const { return true; }
302
306 [[nodiscard]] virtual bool showValueInPopup() const { return true; }
307
311 virtual void getValueForPopup(StringBuf& valueBuf) {};
312
313 virtual void renderInHorizontalMenu(int32_t startX, int32_t width, int32_t startY, int32_t height) {};
314
316};
317
318#define NO_NAVIGATION ((MenuItem*)0xFFFFFFFF)
319
322bool 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:40
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:254
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:221
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:119
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:96
virtual void horizontalEncoderAction(int32_t offset)
Handle horizontal encoder movement.
Definition menu_item.h:73
virtual void verticalEncoderAction(int32_t offset)
Handle vertical encoder movement.
Definition menu_item.h:77
virtual bool allowsLearnMode()
Used by SoundEditor to determine if the current menu item can accept MIDI learning.
Definition menu_item.h:173
virtual MenuItem * patchingSourceShortcutPress(PatchSource s, bool previousPressStillActive=false)
Action to take when a source shortcut is pressed.
Definition menu_item.h:159
virtual bool showValueInPopup() const
Show a parameter value in the popup at the top of the horizontal menu.
Definition menu_item.h:306
virtual bool shouldBlinkLearnLed()
Definition menu_item.h:185
virtual MenuItem * selectButtonPress()
Handle a select button press.
Definition menu_item.h:93
deluge::l10n::String title
Can get overridden by getTitle(). Actual max num chars for OLED display is 14.
Definition menu_item.h:212
virtual bool usesAffectEntire()
Claim support for Kit AFFECT_ENTIRE editing.
Definition menu_item.h:101
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:86
virtual bool shouldEnterSubmenu()
Check if selecting this menu item (with select encoder) should enter a submenu.
Definition menu_item.h:260
virtual void learnKnob(MIDICable *cable, int32_t whichKnob, int32_t modKnobMode, int32_t midiChannel)
Definition menu_item.h:170
virtual int32_t getColumnSpan() const
Get the number of occupied virtual columns in the horizontal menu.
Definition menu_item.h:296
virtual void drawPixelsForOled()
Paints the pixels below the standard title block.
Definition menu_item.h:203
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:178
virtual bool isRangeDependent()
Returns true if this parameter is only relevant to some note ranges.
Definition menu_item.h:191
virtual uint32_t getParamIndex()
Definition menu_item.h:138
virtual deluge::modulation::params::Kind getParamKind()
Definition menu_item.h:135
const deluge::l10n::String name
Default name for use on OLED for deluge::gui::menu_item::Submenu s.
Definition menu_item.h:243
virtual ActionResult buttonAction(deluge::hid::Button b, bool on, bool inCardRoutine)
Handle an arbitrary button.
Definition menu_item.h:67
virtual int32_t getSubmenuItemTypeRenderLength()
Handle rendering of submenu item types.
Definition menu_item.h:267
virtual uint8_t getIndexOfPatchedParamToBlink()
Definition menu_item.h:129
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:247
virtual void unlearnAction()
Unlearn the parameter controlled by this menu.
Definition menu_item.h:188
virtual void updateAutomationViewParameter()
Definition menu_item.h:277
virtual void readCurrentValue()
Like readValueAgain, but does not redraw.
Definition menu_item.h:121
virtual uint8_t shouldDrawDotOnName()
Get the "draw dot state".
Definition menu_item.h:233
virtual uint8_t shouldBlinkPatchingSourceShortcut(PatchSource s, uint8_t *colour)
Definition menu_item.h:145
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:113
virtual bool showPopup() const
Show a popup with the full name of the editing parameter at the top of the horizontal menu.
Definition menu_item.h:301
virtual void selectEncoderAction(int32_t offset)
Handle select encoder movement.
Definition menu_item.h:82
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 void getValueForPopup(StringBuf &valueBuf)
Get the parameter value string to show in the popup.
Definition menu_item.h:311
virtual bool showColumnLabel() const
Show a label for the parameter in the horizontal menu.
Definition menu_item.h:291
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