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 @@
+