Deluge Firmware 1.3.0
Build date: 2025.04.16
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 readValueAgain() {}
117 virtual void readCurrentValue() {}
118
122
125 virtual uint8_t getIndexOfPatchedParamToBlink() { return 255; }
131 virtual deluge::modulation::params::Kind getParamKind() { return deluge::modulation::params::Kind::NONE; }
134 virtual uint32_t getParamIndex() { return 255; }
135
141 virtual uint8_t shouldBlinkPatchingSourceShortcut(PatchSource s, uint8_t* colour) { return 255; }
142
155 virtual MenuItem* patchingSourceShortcutPress(PatchSource s, bool previousPressStillActive = false) {
156 return nullptr;
157 }
158
162
166 virtual void learnKnob(MIDICable* cable, int32_t whichKnob, int32_t modKnobMode, int32_t midiChannel) {}
167
169 virtual bool allowsLearnMode() { return false; }
174 virtual bool learnNoteOn(MIDICable& cable, int32_t channel, int32_t noteCode) { return false; }
175
176 virtual void learnProgramChange(MIDICable& cable, int32_t channel, int32_t programNumber) {}
177 virtual void learnCC(MIDICable& cable, int32_t channel, int32_t ccNumber, int32_t value);
178
181 virtual bool shouldBlinkLearnLed() { return false; }
182
184 virtual void unlearnAction() {}
185
187 virtual bool isRangeDependent() { return false; }
188
192
197 virtual void renderOLED();
199 virtual void drawPixelsForOled() {}
200
206
208 deluge::l10n::String title;
209
217 [[nodiscard]] virtual std::string_view getTitle() const { return deluge::l10n::getView(title); }
218
229 virtual uint8_t shouldDrawDotOnName() { return 255; }
230
234 virtual void drawName();
235
239 const deluge::l10n::String name;
243 [[nodiscard]] virtual std::string_view getName() const { return deluge::l10n::getView(name); }
247 virtual void getColumnLabel(StringBuf& label) { label.append(getName().data()); }
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
273 virtual void renderInHorizontalMenu(int32_t startX, int32_t width, int32_t startY, int32_t height);
274 virtual bool isSubmenu() { return false; }
275 virtual void setupNumberEditor() {}
276 virtual void updatePadLights();
279 virtual void updateAutomationViewParameter() { return; }
280 void renderColumnLabel(int32_t startX, int32_t width, int32_t startY);
281
283};
284
285#define NO_NAVIGATION ((MenuItem*)0xFFFFFFFF)
286
289bool 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: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:217
virtual void readValueAgain()
Re-read the value from the system and redraw the display to match.
Definition menu_item.h:115
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:26
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:169
virtual MenuItem * patchingSourceShortcutPress(PatchSource s, bool previousPressStillActive=false)
Action to take when a source shortcut is pressed.
Definition menu_item.h:155
virtual bool shouldBlinkLearnLed()
Definition menu_item.h:181
virtual void getColumnLabel(StringBuf &label)
Get the name for use on horizontal menus.
Definition menu_item.h:247
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:208
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:260
virtual void learnKnob(MIDICable *cable, int32_t whichKnob, int32_t modKnobMode, int32_t midiChannel)
Definition menu_item.h:166
virtual void drawPixelsForOled()
Paints the pixels below the standard title block.
Definition menu_item.h:199
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:174
virtual bool isRangeDependent()
Returns true if this parameter is only relevant to some note ranges.
Definition menu_item.h:187
virtual uint32_t getParamIndex()
Definition menu_item.h:134
virtual deluge::modulation::params::Kind getParamKind()
Definition menu_item.h:131
const deluge::l10n::String name
Default name for use on OLED for deluge::gui::menu_item::Submenu s.
Definition menu_item.h:239
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:267
virtual uint8_t getIndexOfPatchedParamToBlink()
Definition menu_item.h:125
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:243
virtual void unlearnAction()
Unlearn the parameter controlled by this menu.
Definition menu_item.h:184
virtual void updateAutomationViewParameter()
Definition menu_item.h:279
virtual void readCurrentValue()
Like readValueAgain, but does not redraw.
Definition menu_item.h:117
virtual uint8_t shouldDrawDotOnName()
Get the "draw dot state".
Definition menu_item.h:229
virtual uint8_t shouldBlinkPatchingSourceShortcut(PatchSource s, uint8_t *colour)
Definition menu_item.h:141
virtual void renderOLED()
Root rendering routine for OLED.
Definition menu_item.cpp:36
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:47
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:42
Definition mod_controllable_audio.h:47
Definition multi_range.h:23
Definition sound.h:71
Definition d_string.h:106
Kind
Definition param.h:42