diff --git a/Resources/osci/ripple_dash.osci b/Resources/osci/ripple_dash.osci new file mode 100644 index 0000000..0004ade Binary files /dev/null and b/Resources/osci/ripple_dash.osci differ diff --git a/Resources/svg/range.svg b/Resources/svg/range.svg new file mode 100644 index 0000000..b59c7a0 --- /dev/null +++ b/Resources/svg/range.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Source/LuaComponent.cpp b/Source/LuaComponent.cpp index 147773b..b44bdab 100644 --- a/Source/LuaComponent.cpp +++ b/Source/LuaComponent.cpp @@ -2,7 +2,7 @@ #include "PluginEditor.h" LuaComponent::LuaComponent(OscirenderAudioProcessor& p, OscirenderAudioProcessorEditor& editor) : audioProcessor(p), pluginEditor(editor), slidersModel(sliders, p) { - setText("Lua Settings"); + setText("Lua Sliders"); sliders.setModel(&slidersModel); sliders.setRowHeight(30); diff --git a/Source/components/EffectComponent.cpp b/Source/components/EffectComponent.cpp index b6b87b0..7a25e55 100644 --- a/Source/components/EffectComponent.cpp +++ b/Source/components/EffectComponent.cpp @@ -6,6 +6,7 @@ EffectComponent::EffectComponent(OscirenderAudioProcessor& p, Effect& effect, in addChildComponent(lfoSlider); addAndMakeVisible(lfo); addAndMakeVisible(label); + addAndMakeVisible(rangeButton); sidechainEnabled = effect.parameters[0]->sidechain != nullptr; if (sidechainEnabled) { @@ -33,6 +34,18 @@ EffectComponent::EffectComponent(OscirenderAudioProcessor& p, Effect& effect, in lfo.addItem("Reverse Sawtooth", static_cast(LfoType::ReverseSawtooth)); lfo.addItem("Noise", static_cast(LfoType::Noise)); + rangeButton.setTooltip("Click to change the range of the slider."); + + rangeButton.onClick = [this] { + juce::PopupMenu menu; + + menu.addCustomItem(1, popupLabel, 200, 30, false); + menu.addCustomItem(2, min, 160, 40, false); + menu.addCustomItem(3, max, 160, 40, false); + + menu.showMenuAsync(juce::PopupMenu::Options(), [this](int result) {}); + }; + effect.addListener(index, this); setupComponent(); } @@ -42,6 +55,8 @@ EffectComponent::EffectComponent(OscirenderAudioProcessor& p, Effect& effect) : void EffectComponent::setupComponent() { EffectParameter* parameter = effect.parameters[index]; + setEnabled(effect.enabled == nullptr || effect.enabled->getBoolValue()); + setTooltip(parameter->description); label.setText(parameter->name, juce::dontSendNotification); label.setInterceptsMouseClicks(false, false); @@ -109,7 +124,7 @@ void EffectComponent::setupComponent() { slider.setRange(effect.parameters[index]->min, effect.parameters[index]->max, effect.parameters[index]->step); }; - popupLabel.setText(parameter->name + " Settings", juce::dontSendNotification); + popupLabel.setText(parameter->name + " Range", juce::dontSendNotification); popupLabel.setJustificationType(juce::Justification::centred); popupLabel.setFont(juce::Font(14.0f, juce::Font::bold)); @@ -147,12 +162,14 @@ void EffectComponent::resized() { sidechainButton->setBounds(bounds.removeFromRight(20)); } - bool drawingSmall = bounds.getWidth() < 3 * TEXT_WIDTH; + bool drawingSmall = bounds.getWidth() < 3.5 * TEXT_WIDTH; if (lfoEnabled) { - lfo.setBounds(bounds.removeFromRight(drawingSmall ? 70 : 100).reduced(5)); + lfo.setBounds(bounds.removeFromRight(drawingSmall ? 70 : 100).reduced(0, 5)); } + rangeButton.setBounds(bounds.removeFromRight(20)); + bounds.removeFromLeft(5); label.setBounds(bounds.removeFromLeft(drawingSmall ? SMALL_TEXT_WIDTH : TEXT_WIDTH)); @@ -167,18 +184,6 @@ void EffectComponent::paint(juce::Graphics& g) { g.fillAll(findColour(effectComponentBackgroundColourId)); } -void EffectComponent::mouseDown(const juce::MouseEvent& event) { - if (event.mods.isPopupMenu()) { - juce::PopupMenu menu; - - menu.addCustomItem(1, popupLabel, 200, 30, false); - menu.addCustomItem(2, min, 160, 40, false); - menu.addCustomItem(3, max, 160, 40, false); - - menu.showMenuAsync(juce::PopupMenu::Options(), [this](int result) {}); - } -} - void EffectComponent::parameterValueChanged(int parameterIndex, float newValue) { triggerAsyncUpdate(); } diff --git a/Source/components/EffectComponent.h b/Source/components/EffectComponent.h index c1da63f..1bca007 100644 --- a/Source/components/EffectComponent.h +++ b/Source/components/EffectComponent.h @@ -13,7 +13,6 @@ public: void resized() override; void paint(juce::Graphics& g) override; - void mouseDown(const juce::MouseEvent& event) override; void parameterValueChanged(int parameterIndex, float newValue) override; void parameterGestureChanged(int parameterIndex, bool gestureIsStarting) override; void handleAsyncUpdate() override; @@ -47,5 +46,7 @@ private: LabelledTextBox min{"Min"}; LabelledTextBox max{"Max"}; + SvgButton rangeButton = { "rangeButton", BinaryData::range_svg, juce::Colours::white }; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(EffectComponent) }; diff --git a/Source/components/LuaConsole.cpp b/Source/components/LuaConsole.cpp index 686828e..cc40015 100644 --- a/Source/components/LuaConsole.cpp +++ b/Source/components/LuaConsole.cpp @@ -20,6 +20,10 @@ LuaConsole::LuaConsole() { addAndMakeVisible(pauseConsoleButton); addAndMakeVisible(emptyConsoleLabel); + clearConsoleButton.setTooltip("Clear console output."); + + pauseConsoleButton.setTooltip("Pause console output, and show a scrollbar to navigate through the console history."); + pauseConsoleButton.onClick = [this] { console.setScrollbarThickness(pauseConsoleButton.getToggleState() ? 10 : 0); }; diff --git a/Source/components/SvgButton.h b/Source/components/SvgButton.h index f66854b..eeb340f 100644 --- a/Source/components/SvgButton.h +++ b/Source/components/SvgButton.h @@ -5,8 +5,6 @@ class SvgButton : public juce::DrawableButton, public juce::AudioProcessorParame public: SvgButton(juce::String name, juce::String svg, juce::Colour colour, juce::Colour colourOn, BooleanParameter* toggle = nullptr) : juce::DrawableButton(name, juce::DrawableButton::ButtonStyle::ImageFitted), toggle(toggle) { auto doc = juce::XmlDocument::parse(svg); - - setMouseCursor(juce::MouseCursor::PointingHandCursor); changeSvgColour(doc.get(), colour); normalImage = juce::Drawable::createFromSVG(*doc); @@ -56,6 +54,20 @@ class SvgButton : public juce::DrawableButton, public juce::AudioProcessorParame void handleAsyncUpdate() override { setToggleState(toggle->getBoolValue(), juce::NotificationType::dontSendNotification); } + + void mouseEnter(const juce::MouseEvent& e) override { + juce::DrawableButton::mouseEnter(e); + + if (isEnabled()) { + setMouseCursor(juce::MouseCursor::PointingHandCursor); + } + } + + void mouseExit(const juce::MouseEvent& e) override { + juce::DrawableButton::mouseExit(e); + setMouseCursor(juce::MouseCursor::NormalCursor); + } + private: std::unique_ptr normalImage; std::unique_ptr overImage; diff --git a/osci-render.jucer b/osci-render.jucer index 5b9ab36..adb53e1 100644 --- a/osci-render.jucer +++ b/osci-render.jucer @@ -5,7 +5,7 @@ pluginCharacteristicsValue="pluginProducesMidiOut,pluginWantsMidiIn" pluginManufacturer="jameshball" aaxIdentifier="sh.ball.oscirender" cppLanguageStandard="20" projectLineFeed=" " headerPath="./include" - version="2.1.1" companyName="James H Ball" companyWebsite="https://osci-render.com" + version="2.1.2" companyName="James H Ball" companyWebsite="https://osci-render.com" companyEmail="james@ball.sh" defines="NOMINMAX=1"> @@ -26,6 +26,7 @@ +