diff --git a/libs/sst/sst-jucegui b/libs/sst/sst-jucegui index 0d7a2b19..9944f20f 160000 --- a/libs/sst/sst-jucegui +++ b/libs/sst/sst-jucegui @@ -1 +1 @@ -Subproject commit 0d7a2b192ff55d80d060ecf54914c5f939c480e6 +Subproject commit 9944f20fbd1bafdda3d233aea91fb79985262203 diff --git a/src-ui/app/edit-screen/components/mapping-pane/SampleWaveform.cpp b/src-ui/app/edit-screen/components/mapping-pane/SampleWaveform.cpp index 61237ac1..c8758fe5 100644 --- a/src-ui/app/edit-screen/components/mapping-pane/SampleWaveform.cpp +++ b/src-ui/app/edit-screen/components/mapping-pane/SampleWaveform.cpp @@ -301,6 +301,11 @@ void SampleWaveform::rebuildEnvelopePaths() void SampleWaveform::mouseDown(const juce::MouseEvent &e) { + if (e.mods.isPopupMenu() && onPopupMenu) + { + onPopupMenu(); + return; + } auto posi = e.position.roundToInt(); if (startSampleHZ.contains(posi)) mouseState = MouseState::HZ_DRAG_SAMPSTART; @@ -353,6 +358,10 @@ void SampleWaveform::mouseDrag(const juce::MouseEvent &e) void SampleWaveform::mouseUp(const juce::MouseEvent &e) { + if (e.mods.isPopupMenu() && onPopupMenu) + { + return; + } if (mouseState != MouseState::NONE) display->onSamplePointChangedFromGUI(); } diff --git a/src-ui/app/edit-screen/components/mapping-pane/SampleWaveform.h b/src-ui/app/edit-screen/components/mapping-pane/SampleWaveform.h index 2bfd2b31..47b52f9c 100644 --- a/src-ui/app/edit-screen/components/mapping-pane/SampleWaveform.h +++ b/src-ui/app/edit-screen/components/mapping-pane/SampleWaveform.h @@ -109,6 +109,8 @@ struct SampleWaveform : juce::Component, HasEditor, sst::jucegui::components::Zo repaint(); } + std::function onPopupMenu{nullptr}; + float vStart{0.f}, vZoom{1.f}; void setVerticalZoom(float ps, float zf) override { diff --git a/src-ui/app/edit-screen/components/mapping-pane/VariantDisplay.cpp b/src-ui/app/edit-screen/components/mapping-pane/VariantDisplay.cpp index 975cbab1..f171049e 100644 --- a/src-ui/app/edit-screen/components/mapping-pane/VariantDisplay.cpp +++ b/src-ui/app/edit-screen/components/mapping-pane/VariantDisplay.cpp @@ -39,11 +39,19 @@ VariantDisplay::VariantDisplay(scxt::ui::app::edit_screen::MacroMappingVariantPa : HasEditor(p->editor), variantView(p->sampleView), parentPane(p) { waveformsTabbedGroup = std::make_unique(this); + waveformsTabbedGroup->onTabPopupMenu = [w = juce::Component::SafePointer(this)](auto id) { + if (w) + w->showVariantTabMenu(id); + }; addAndMakeVisible(*waveformsTabbedGroup); for (auto i = 0; i < maxVariantsPerZone; ++i) { - waveforms[i].waveformViewport = - std::make_unique(std::make_unique(this)); + auto wf = std::make_unique(this); + wf->onPopupMenu = [i, w = juce::Component::SafePointer(this)]() { + if (w) + w->showVariantTabMenu(i); + }; + waveforms[i].waveformViewport = std::make_unique(std::move(wf)); waveforms[i].waveformViewport->setVZoomFloor(1.0 / 16.0); waveforms[i].waveform = static_cast( @@ -936,4 +944,35 @@ void VariantDisplay::FileInfos::paint(juce::Graphics &g) g.drawText(msg, bx.reduced(margin, 0), juce::Justification::centred); } +void VariantDisplay::showVariantTabMenu(int variantIdx) +{ + auto numVariants{0}; + for (auto i = 0; i < maxVariantsPerZone; ++i) + { + if (variantView.variants[i].active) + { + numVariants++; + } + } + bool isPlus = variantIdx >= numVariants; + + juce::PopupMenu p; + if (isPlus) + { + p.addSectionHeader("Add Variant"); + p.addSeparator(); + ; + p.addItem("Copy From", editor->makeComingSoon("Copy From")); + p.addItem("Sample", editor->makeComingSoon("Sample")); + } + else + { + p.addSectionHeader("Variant " + std::to_string(variantIdx + 1)); + p.addSeparator(); + ; + p.addItem("Copy", editor->makeComingSoon("Copy Variant")); + p.addItem("Delete", editor->makeComingSoon("Delete Variant")); + } + p.showMenuAsync(editor->defaultPopupMenuOptions()); +} } // namespace scxt::ui::app::edit_screen \ No newline at end of file diff --git a/src-ui/app/edit-screen/components/mapping-pane/VariantDisplay.h b/src-ui/app/edit-screen/components/mapping-pane/VariantDisplay.h index 98995c53..f3b57ec9 100644 --- a/src-ui/app/edit-screen/components/mapping-pane/VariantDisplay.h +++ b/src-ui/app/edit-screen/components/mapping-pane/VariantDisplay.h @@ -180,6 +180,8 @@ struct VariantDisplay : juce::Component, HasEditor void showVariantPlaymodeMenu(); void showSRCMenu(); + void showVariantTabMenu(int variantIdx); + // Header section using boolToggle_t = sst::jucegui::component_adapters::DiscreteToValueReference< sst::jucegui::components::ToggleButton, bool>;