Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LayeredMenu: allows multiple presses on a single shortcut to cycle #3209

Open
wants to merge 6 commits into
base: community
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@
- If a clip has a name, it is displayed with a number prefix, indicating its section, eg. "3: CHORUS".
- When clips are copied, the clip name is copied as well. If the target track already has a clip with the same name, an integer suffix starting from 2 is added unless the name already has an integer suffix. This integer suffix is incremented until the clip name is unique on the target track. Ie. copying a clip named "BRIDGE" to the same otherwise empty track will first create "BRIDGE2", then "BRIDGE3", etc.

#### <ins>Layered Shortcuts<ins>
- Layered Shortcuts mechanism allows multiple shortcuts to be accessed under a single shotcut pad. Holding shift and pressing the same shortcut again cycles between shortcuts. The items available under layered shortcuts can also be accessed from menu: layered shortcut is never the only access method.
- Following shortcuts have layers:
- `UNISON NUMBER`: cycles between `UNISON AMOUNT` and `UNISON STEREO SPREAD`, replacing the previous "press select when in `UNISON AMOUNT` access mechanism for `UNISON STEREO SPREAD`.
- `ENV` shortcuts: cycles between envelope 1 and 3 (ENV1 shortcuts), and envelope 2 and 4 (ENV2 shortcuts).

#### <ins>Tempo</ins>
- Added Community Feature toggle (`Settings > Community Features > Alternative Tap Tempo Behaviour (TAPT)`) to adjust number of `TAP TEMPO` button presses to engage `TAP TEMPO` to `FOUR (4)` to avoid mistakingly changing tempo.

Expand Down Expand Up @@ -586,7 +592,8 @@ also affect normal sequenced notes while arpeggiator is Off.
- `WAVEFOLD` distortion has been added and occurs pre-filter. The parameter pad shortcut is between `SATURATION`
and `LPF CUTOFF`.
- `UNISON STEREO SPREAD` has been added and can be dialed to spread the unison parts across the stereo field.
Click `SELECT` when in `UNISON AMOUNT` to reveal the parameter.
~~Click `SELECT` when in `UNISON AMOUNT` to reveal the parameter.~~ Since 1.3: hold `SHIFT` and press the
`UNISON NUMBER` shortcut pad twice, or access via `SOUND > VOICE > UNISON` menu.

##### Filter

Expand Down
17 changes: 13 additions & 4 deletions docs/community_features.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,15 @@ at velocity 0 it would look the same as its tail (but you can't have 0 velocity)

#### 2.2 Horizontal Menus
- The menus for the following items have been updated on OLED, with multiple values visible and editable at the same time. Hold `SHIFT` and turn `SELECT` to edit them. This feature is on by default, and can be disabled via `SETTINGS > COMMUNITY FEATURES`.
- Envelope 1 & 2.
- Envelopes 1-4
- LPF and HPF.
- LFOs.

#### 2.3 Layered Shortcuts
- Layered Shortcuts mechanism allows multiple shortcuts to be accessed under a single shotcut pad. Holding shift and pressing the same shortcut again cycles between shortcuts. The items available under layered shortcuts can also be accessed from menu: layered shortcut is never the only access method.
- Following shortcuts have layers:
- `UNISON NUMBER`: cycles between `UNISON AMOUNT` and `UNISON STEREO SPREAD`. ([#3209])

## 3. General Improvements

Here is a list of general improvements that have been made, ordered from newest to oldest:
Expand Down Expand Up @@ -1043,9 +1048,8 @@ to each individual note onset. ([#1978])
- ([#157]) Add a `MOD MATRIX` entry to the `SOUND` menu which shows a list of all currently active modulations.

#### 4.5.2 - Unison Stereo Spread

- ([#223]) The unison parts can be spread accross the stereo field. Press `SELECT` when in the `UNISON NUMBER` menu to
access the new unison spread parameter.
- ([#223], [#3209]) The unison parts can be spread accross the stereo field. Access through `SOUND > VOICE > UNISON` menu,
or though layered shortcut on `UNISON NUMBER` pad.

#### 4.5.3 - Waveform Loop Lock

Expand Down Expand Up @@ -1082,6 +1086,9 @@ as an oscillator type within the subtractive engine, so it can be combined with

- As the UI and implementation is still experimental, a community setting has to be activated to create new DX7 patches. See the separate document for details.

#### 4.5.7 - More envelopes
- ([#3209]) Two more envelopes have been added. Pressing the ENV1 shortcuts toggles between ENV1 and ENV3, while the ENV2 shortcuts toggle between ENV2 and ENV4.

### 4.6 - Instrument Clip View - Kit Clip Features

#### 4.6.1 - Keyboard View
Expand Down Expand Up @@ -1572,6 +1579,8 @@ different firmware

[#3079]: https://github.com/SynthstromAudible/DelugeFirmware/pull/3079

[#3209]: https://github.com/SynthstromAudible/DelugeFirmware/pull/3209

[Automation View Documentation]: features/automation_view.md

[Arpeggiator Documentation]: features/arpeggiator.md
Expand Down
4 changes: 3 additions & 1 deletion src/definitions_cxx.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ constexpr int32_t kFlangerMinTime = (3 << 16);
constexpr int32_t kFlangerAmplitude = (kModFXMaxDelay - kFlangerMinTime);
constexpr int32_t kFlangerOffset = ((kModFXMaxDelay + kFlangerMinTime) >> 1);

constexpr int32_t kNumEnvelopes = 2;
constexpr int32_t kNumEnvelopes = 4;
constexpr int32_t kNumLFOs = 2;
constexpr int32_t kNumModulators = 2;

Expand Down Expand Up @@ -307,6 +307,8 @@ enum class PatchSource : uint8_t {
SIDECHAIN,
ENVELOPE_0,
ENVELOPE_1,
ENVELOPE_2,
ENVELOPE_3,
LFO_LOCAL,
X,
Y,
Expand Down
14 changes: 14 additions & 0 deletions src/deluge/gui/l10n/english.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
"STRING_FOR_PATCH_SOURCE_LFO_LOCAL": "LFO2",
"STRING_FOR_PATCH_SOURCE_ENVELOPE_0": "Envelope 1",
"STRING_FOR_PATCH_SOURCE_ENVELOPE_1": "Envelope 2",
"STRING_FOR_PATCH_SOURCE_ENVELOPE_2": "Envelope 3",
"STRING_FOR_PATCH_SOURCE_ENVELOPE_3": "Envelope 4",
"STRING_FOR_PATCH_SOURCE_VELOCITY": "Velocity",
"STRING_FOR_PATCH_SOURCE_NOTE": "Note",
"STRING_FOR_PATCH_SOURCE_SIDECHAIN": "Sidechain",
Expand Down Expand Up @@ -91,6 +93,16 @@
"STRING_FOR_PARAM_LOCAL_ENV_1_SUSTAIN": "Env2 sustain",
"STRING_FOR_PARAM_LOCAL_ENV_1_RELEASE": "Env2 release",

"STRING_FOR_PARAM_LOCAL_ENV_2_ATTACK": "Env3 attack",
"STRING_FOR_PARAM_LOCAL_ENV_2_DECAY": "Env3 decay",
"STRING_FOR_PARAM_LOCAL_ENV_2_SUSTAIN": "Env3 sustain",
"STRING_FOR_PARAM_LOCAL_ENV_2_RELEASE": "Env3 release",

"STRING_FOR_PARAM_LOCAL_ENV_3_ATTACK": "Env4 attack",
"STRING_FOR_PARAM_LOCAL_ENV_3_DECAY": "Env4 decay",
"STRING_FOR_PARAM_LOCAL_ENV_3_SUSTAIN": "Env4 sustain",
"STRING_FOR_PARAM_LOCAL_ENV_3_RELEASE": "Env4 release",

"STRING_FOR_PARAM_GLOBAL_LFO_FREQ": "LFO1 rate",
"STRING_FOR_PARAM_LOCAL_LFO_LOCAL_FREQ": "LFO2 rate",

Expand Down Expand Up @@ -392,6 +404,8 @@
"STRING_FOR_DEV_MENU_G": "Dev Menu G",
"STRING_FOR_ENVELOPE_1": "Envelope 1",
"STRING_FOR_ENVELOPE_2": "Envelope 2",
"STRING_FOR_ENVELOPE_3": "Envelope 3",
"STRING_FOR_ENVELOPE_4": "Envelope 4",
"STRING_FOR_VOLUME_LEVEL": "Volume",
"STRING_FOR_AMOUNT_LEVEL": "Level",
"STRING_FOR_REPEAT_MODE": "Repeat mode",
Expand Down
12 changes: 12 additions & 0 deletions src/deluge/gui/l10n/g_english.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ PLACE_SDRAM_DATA Language english{
{STRING_FOR_PATCH_SOURCE_LFO_LOCAL, "LFO2"},
{STRING_FOR_PATCH_SOURCE_ENVELOPE_0, "Envelope 1"},
{STRING_FOR_PATCH_SOURCE_ENVELOPE_1, "Envelope 2"},
{STRING_FOR_PATCH_SOURCE_ENVELOPE_2, "Envelope 3"},
{STRING_FOR_PATCH_SOURCE_ENVELOPE_3, "Envelope 4"},
{STRING_FOR_PATCH_SOURCE_VELOCITY, "Velocity"},
{STRING_FOR_PATCH_SOURCE_NOTE, "Note"},
{STRING_FOR_PATCH_SOURCE_SIDECHAIN, "Sidechain"},
Expand Down Expand Up @@ -89,6 +91,14 @@ PLACE_SDRAM_DATA Language english{
{STRING_FOR_PARAM_LOCAL_ENV_1_DECAY, "Env2 decay"},
{STRING_FOR_PARAM_LOCAL_ENV_1_SUSTAIN, "Env2 sustain"},
{STRING_FOR_PARAM_LOCAL_ENV_1_RELEASE, "Env2 release"},
{STRING_FOR_PARAM_LOCAL_ENV_2_ATTACK, "Env3 attack"},
{STRING_FOR_PARAM_LOCAL_ENV_2_DECAY, "Env3 decay"},
{STRING_FOR_PARAM_LOCAL_ENV_2_SUSTAIN, "Env3 sustain"},
{STRING_FOR_PARAM_LOCAL_ENV_2_RELEASE, "Env3 release"},
{STRING_FOR_PARAM_LOCAL_ENV_3_ATTACK, "Env4 attack"},
{STRING_FOR_PARAM_LOCAL_ENV_3_DECAY, "Env4 decay"},
{STRING_FOR_PARAM_LOCAL_ENV_3_SUSTAIN, "Env4 sustain"},
{STRING_FOR_PARAM_LOCAL_ENV_3_RELEASE, "Env4 release"},
{STRING_FOR_PARAM_GLOBAL_LFO_FREQ, "LFO1 rate"},
{STRING_FOR_PARAM_LOCAL_LFO_LOCAL_FREQ, "LFO2 rate"},
{STRING_FOR_PARAM_GLOBAL_MOD_FX_DEPTH, "Mod-FX depth"},
Expand Down Expand Up @@ -352,6 +362,8 @@ PLACE_SDRAM_DATA Language english{
{STRING_FOR_DEV_MENU_G, "Dev Menu G"},
{STRING_FOR_ENVELOPE_1, "Envelope 1"},
{STRING_FOR_ENVELOPE_2, "Envelope 2"},
{STRING_FOR_ENVELOPE_3, "Envelope 3"},
{STRING_FOR_ENVELOPE_4, "Envelope 4"},
{STRING_FOR_VOLUME_LEVEL, "Volume"},
{STRING_FOR_AMOUNT_LEVEL, "Level"},
{STRING_FOR_REPEAT_MODE, "Repeat mode"},
Expand Down
2 changes: 2 additions & 0 deletions src/deluge/gui/l10n/g_seven_segment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ PLACE_SDRAM_DATA Language seven_segment{
{STRING_FOR_PATCH_SOURCE_LFO_LOCAL, "LFO2"},
{STRING_FOR_PATCH_SOURCE_ENVELOPE_0, "ENV1"},
{STRING_FOR_PATCH_SOURCE_ENVELOPE_1, "ENV2"},
{STRING_FOR_PATCH_SOURCE_ENVELOPE_2, "ENV3"},
{STRING_FOR_PATCH_SOURCE_ENVELOPE_3, "ENV4"},
{STRING_FOR_PATCH_SOURCE_VELOCITY, "VELOCITY"},
{STRING_FOR_PATCH_SOURCE_NOTE, "NOTE"},
{STRING_FOR_PATCH_SOURCE_SIDECHAIN, "SIDE"},
Expand Down
2 changes: 2 additions & 0 deletions src/deluge/gui/l10n/seven_segment.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
"STRING_FOR_PATCH_SOURCE_LFO_LOCAL": "LFO2",
"STRING_FOR_PATCH_SOURCE_ENVELOPE_0": "ENV1",
"STRING_FOR_PATCH_SOURCE_ENVELOPE_1": "ENV2",
"STRING_FOR_PATCH_SOURCE_ENVELOPE_2": "ENV3",
"STRING_FOR_PATCH_SOURCE_ENVELOPE_3": "ENV4",
"STRING_FOR_PATCH_SOURCE_VELOCITY": "VELOCITY",
"STRING_FOR_PATCH_SOURCE_NOTE": "NOTE",
"STRING_FOR_PATCH_SOURCE_SIDECHAIN": "SIDE",
Expand Down
12 changes: 12 additions & 0 deletions src/deluge/gui/l10n/strings.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ enum class String : size_t {
STRING_FOR_PATCH_SOURCE_LFO_LOCAL,
STRING_FOR_PATCH_SOURCE_ENVELOPE_0,
STRING_FOR_PATCH_SOURCE_ENVELOPE_1,
STRING_FOR_PATCH_SOURCE_ENVELOPE_2,
STRING_FOR_PATCH_SOURCE_ENVELOPE_3,
STRING_FOR_PATCH_SOURCE_VELOCITY,
STRING_FOR_PATCH_SOURCE_NOTE,
STRING_FOR_PATCH_SOURCE_SIDECHAIN,
Expand Down Expand Up @@ -78,6 +80,14 @@ enum class String : size_t {
STRING_FOR_PARAM_LOCAL_ENV_1_DECAY,
STRING_FOR_PARAM_LOCAL_ENV_1_SUSTAIN,
STRING_FOR_PARAM_LOCAL_ENV_1_RELEASE,
STRING_FOR_PARAM_LOCAL_ENV_2_ATTACK,
STRING_FOR_PARAM_LOCAL_ENV_2_DECAY,
STRING_FOR_PARAM_LOCAL_ENV_2_SUSTAIN,
STRING_FOR_PARAM_LOCAL_ENV_2_RELEASE,
STRING_FOR_PARAM_LOCAL_ENV_3_ATTACK,
STRING_FOR_PARAM_LOCAL_ENV_3_DECAY,
STRING_FOR_PARAM_LOCAL_ENV_3_SUSTAIN,
STRING_FOR_PARAM_LOCAL_ENV_3_RELEASE,
STRING_FOR_PARAM_GLOBAL_LFO_FREQ,
STRING_FOR_PARAM_GLOBAL_VOLUME_POST_FX,
STRING_FOR_PARAM_GLOBAL_VOLUME_POST_REVERB_SEND,
Expand Down Expand Up @@ -376,6 +386,8 @@ enum class String : size_t {
STRING_FOR_DEV_MENU_G,
STRING_FOR_ENVELOPE_1,
STRING_FOR_ENVELOPE_2,
STRING_FOR_ENVELOPE_3,
STRING_FOR_ENVELOPE_4,
STRING_FOR_VOLUME_LEVEL,
STRING_FOR_AMOUNT_LEVEL,
STRING_FOR_REPEAT_MODE,
Expand Down
3 changes: 2 additions & 1 deletion src/deluge/gui/menu_item/bend_range/per_finger.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ class PerFinger final : public BendRange {
}
}
bool isRelevant(ModControllableAudio* modControllable, int32_t whichThing) override {
return soundEditor.navigationDepth == 1 || soundEditor.editingKit();
// Why the depth check?
return soundEditor.getNavigationDepth() == 1 || soundEditor.editingKit();
}
};
} // namespace deluge::gui::menu_item::bend_range
2 changes: 1 addition & 1 deletion src/deluge/gui/menu_item/generate/dmenus/envelopes.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,5 @@
[attack, decay, sustain, release],
name=f"STRING_FOR_ENVELOPE_{i+1}",
)
for i in range(2)
for i in range(4)
]
2 changes: 2 additions & 0 deletions src/deluge/gui/menu_item/generate/g_menus.inc
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ std::array<MenuItem*, 4> child5 = {
};
submenu::Envelope env0Menu{STRING_FOR_ENVELOPE_1, child5, 0};
submenu::Envelope env1Menu{STRING_FOR_ENVELOPE_2, child5, 1};
submenu::Envelope env2Menu{STRING_FOR_ENVELOPE_3, child5, 2};
submenu::Envelope env3Menu{STRING_FOR_ENVELOPE_4, child5, 3};
osc::Type oscTypeMenu{STRING_FOR_TYPE, STRING_FOR_OSC_TYPE_MENU_TITLE};
osc::source::Volume sourceVolumeMenu{STRING_FOR_VOLUME_LEVEL, STRING_FOR_OSC_LEVEL_MENU_TITLE, params::LOCAL_OSC_A_VOLUME};
osc::source::WaveIndex sourceWaveIndexMenu{STRING_FOR_WAVE_INDEX, STRING_FOR_OSC_WAVE_IND_MENU_TITLE, params::LOCAL_OSC_A_WAVE_INDEX};
Expand Down
141 changes: 141 additions & 0 deletions src/deluge/gui/menu_item/layered_menu.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
/*
* Copyright © 2025 Synthstrom Audible Limited
*
* This file is part of The Synthstrom Audible Deluge Firmware.
*
* The Synthstrom Audible Deluge Firmware is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program.
* If not, see <https://www.gnu.org/licenses/>.
*/

#pragma once

#include "gui/menu_item/menu_item.h"
#include <initializer_list>

namespace deluge::gui::menu_item {

// This is a bit brittle to maintain: if anyone adds a virtual method to MenuItem with a default
// implementation and doesn't update this class, things will break.
//
// Should probably make MenuItem purely virtual, and put the default implementations in StandardMenuItem
// for most classes to inherit - but Nikodemus didn't want to do that up-front before this was otherwise
// considered a valid design.

/// @brief Used to stack multiple menu items on a single shortcut pad: SoundEditor calls nextLayer() when
/// a shortcut is activated twice in a row. This is a no-op for regular menu items, but allows LayeredShortcut
/// to change the current_item_, to most other MenuItem methods are delegated.
class LayeredShortcut final : public MenuItem {
public:
LayeredShortcut(std::initializer_list<MenuItem*> newItems)
: MenuItem(), items{newItems}, current_item_{items.begin()} {}

/// @brief Activates the next layer of a LayeredShortcut; called by soundEditor when a shortcut which
/// was already active is activated again.
/// @return The currently active layer number. Used to build a patchIndex for indirection magic for
/// envalopes and other menu-items which use it -- doesn't do anything if the menu item doesn't use
/// soundEditor.patchIndex.
int32_t nextLayer() final {
current_item_ = std::next(current_item_);
if (current_item_ == items.end()) {
current_item_ = items.begin();
}
return std::distance(items.begin(), current_item_);
}

/// @brief Called by SoundEditor when menu item loses focus. Used to reset the active layer back to
/// first.
void lostFocus() final {
// Tell the current layer it lost focus.
(*current_item_)->lostFocus();
// Reset to first layer.
current_item_ = items.begin();
}

/// @brief Returns the actual active menu item.
MenuItem* actual() final { return (*current_item_)->actual(); }

ActionResult buttonAction(deluge::hid::Button b, bool on, bool inCardRoutine) final {
return (*current_item_)->buttonAction(b, on, inCardRoutine);
}
void horizontalEncoderAction(int32_t offset) final { return (*current_item_)->horizontalEncoderAction(offset); }
void verticalEncoderAction(int32_t offset) final { return (*current_item_)->verticalEncoderAction(offset); }
void selectEncoderAction(int32_t offset) final { return (*current_item_)->selectEncoderAction(offset); }
bool selectEncoderActionEditsInstrument() final { return (*current_item_)->selectEncoderActionEditsInstrument(); }
MenuItem* selectButtonPress() final { return (*current_item_)->selectButtonPress(); }
ActionResult timerCallback() final { return (*current_item_)->timerCallback(); }
bool usesAffectEntire() final { return (*current_item_)->usesAffectEntire(); }
MenuPermission checkPermissionToBeginSession(ModControllableAudio* modControllable, int32_t whichThing,
MultiRange** currentRange) final {
return (*current_item_)->checkPermissionToBeginSession(modControllable, whichThing, currentRange);
}
void beginSession(MenuItem* navigatedBackwardFrom = nullptr) final {
(*current_item_)->beginSession(navigatedBackwardFrom);
}
void readValueAgain() final { return (*current_item_)->readValueAgain(); }
void readCurrentValue() final { return (*current_item_)->readCurrentValue(); }
uint8_t getIndexOfPatchedParamToBlink() final { return (*current_item_)->getIndexOfPatchedParamToBlink(); }
deluge::modulation::params::Kind getParamKind() final { return (*current_item_)->getParamKind(); }
uint32_t getParamIndex() final { return (*current_item_)->getParamIndex(); }
uint8_t shouldBlinkPatchingSourceShortcut(PatchSource s, uint8_t* colour) final {
return (*current_item_)->shouldBlinkPatchingSourceShortcut(s, colour);
}
MenuItem* patchingSourceShortcutPress(PatchSource s, bool previousPressStillActive = false) final {
return (*current_item_)->patchingSourceShortcutPress(s, previousPressStillActive);
}
void learnKnob(MIDICable* cable, int32_t whichKnob, int32_t modKnobMode, int32_t midiChannel) final {
return (*current_item_)->learnKnob(cable, whichKnob, modKnobMode, midiChannel);
}
bool allowsLearnMode() final { return (*current_item_)->allowsLearnMode(); }
bool learnNoteOn(MIDICable& cable, int32_t channel, int32_t noteCode) final {
return (*current_item_)->learnNoteOn(cable, channel, noteCode);
}
void learnProgramChange(MIDICable& cable, int32_t channel, int32_t programNumber) final {
return (*current_item_)->learnProgramChange(cable, channel, programNumber);
}
void learnCC(MIDICable& cable, int32_t channel, int32_t ccNumber, int32_t value) final {
return (*current_item_)->learnCC(cable, channel, ccNumber, value);
}
bool shouldBlinkLearnLed() final { return (*current_item_)->shouldBlinkLearnLed(); }
void unlearnAction() final { return (*current_item_)->unlearnAction(); }
bool isRangeDependent() final { return (*current_item_)->isRangeDependent(); }
void renderOLED() final { return (*current_item_)->renderOLED(); }
void drawPixelsForOled() final { return (*current_item_)->drawPixelsForOled(); }
std::string_view getTitle() const final { return (*current_item_)->getTitle(); }
uint8_t shouldDrawDotOnName() final { return (*current_item_)->shouldDrawDotOnName(); }
void drawName() final { return (*current_item_)->drawName(); }
std::string_view getName() const final { return (*current_item_)->getName(); }
void getColumnLabel(StringBuf& label) override { return (*current_item_)->getColumnLabel(label); }
bool isRelevant(ModControllableAudio* modControllable, int32_t whichThing) final {
return (*current_item_)->isRelevant(modControllable, whichThing);
}
bool shouldEnterSubmenu() final { return (*current_item_)->shouldEnterSubmenu(); }
int32_t getSubmenuItemTypeRenderLength() final { return (*current_item_)->getSubmenuItemTypeRenderLength(); }
int32_t getSubmenuItemTypeRenderIconStart() final { return (*current_item_)->getSubmenuItemTypeRenderIconStart(); }
void renderSubmenuItemTypeForOled(int32_t yPixel) final {
return (*current_item_)->renderSubmenuItemTypeForOled(yPixel);
}
void renderInHorizontalMenu(int32_t startX, int32_t width, int32_t startY, int32_t height) final {
return (*current_item_)->renderInHorizontalMenu(startX, width, startY, height);
}
bool isSubmenu() final { return (*current_item_)->isSubmenu(); }
void setupNumberEditor() final { return (*current_item_)->setupNumberEditor(); }
void updatePadLights() final { return (*current_item_)->updatePadLights(); }
void updateAutomationViewParameter() final { return (*current_item_)->updateAutomationViewParameter(); }

bool focusChild(MenuItem* item) final { return (*current_item_)->focusChild(item); }
bool supportsHorizontalRendering() final { return (*current_item_)->supportsHorizontalRendering(); }

private:
deluge::vector<MenuItem*> items;
typename decltype(items)::iterator current_item_;
};

} // namespace deluge::gui::menu_item
Loading
Loading