commit 78a5dc943310487a23d49e1ca12384c09328ce0c
parent eaf5c25db3ece56521f6cdf5b2653da1af591af6
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date: Thu, 7 Apr 2022 21:05:12 +0200
fix knobs modifying multiple parts in multi mode after having some parts selected
Diffstat:
2 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/source/jucePlugin/VirusParameterBinding.cpp b/source/jucePlugin/VirusParameterBinding.cpp
@@ -12,7 +12,15 @@ VirusParameterBinding::~VirusParameterBinding()
void VirusParameterBinding::clearBindings()
{
for (const auto b : m_bindings)
+ {
+ auto* slider = dynamic_cast<juce::Slider*>(b.component);
+
+ if(slider != nullptr)
+ removeMouseListener(*slider);
+
b.parameter->onValueChanged = nullptr;
+ }
+
m_bindings.clear();
}
@@ -67,12 +75,19 @@ void VirusParameterBinding::bind(juce::Slider &_slider, Virus::ParameterType _pa
void VirusParameterBinding::bind(juce::Slider &_slider, Virus::ParameterType _param, const uint8_t _part)
{
const auto v = m_processor.getController().getParameter(_param, _part == CurrentPart ? m_processor.getController().getCurrentPart() : _part);
+
if (!v)
{
assert(false && "Failed to find parameter");
return;
}
- _slider.addMouseListener(new VirusParameterBindingMouseListener(v, _slider), false);
+
+ removeMouseListener(_slider);
+
+ auto* listener = new VirusParameterBindingMouseListener(v, _slider);
+ m_sliderMouseListeners.insert(std::make_pair(&_slider, listener));
+
+ _slider.addMouseListener(listener, false);
const auto range = v->getNormalisableRange();
_slider.setRange(range.start, range.end, range.interval);
_slider.setDoubleClickReturnValue(true, v->convertFrom0to1(v->getDefaultValue()));
@@ -147,3 +162,15 @@ void VirusParameterBinding::bind(juce::Button &_btn, const Virus::ParameterType
const BoundParameter p{v, &_btn, _param, CurrentPart};
m_bindings.emplace_back(p);
}
+
+void VirusParameterBinding::removeMouseListener(juce::Slider& _slider)
+{
+ auto it = m_sliderMouseListeners.find(&_slider);
+
+ if(it != m_sliderMouseListeners.end())
+ {
+ _slider.removeMouseListener(it->second);
+ delete it->second;
+ m_sliderMouseListeners.erase(it);
+ }
+}
diff --git a/source/jucePlugin/VirusParameterBinding.h b/source/jucePlugin/VirusParameterBinding.h
@@ -36,6 +36,9 @@ public:
void bind(juce::ComboBox &_control, Virus::ParameterType _param, uint8_t _part);
void bind(juce::Button &_control, Virus::ParameterType _param);
+private:
+ void removeMouseListener(juce::Slider& _slider);
+
AudioPluginAudioProcessor& m_processor;
static constexpr uint8_t CurrentPart = 0xff;
@@ -49,4 +52,5 @@ public:
};
std::vector<BoundParameter> m_bindings;
+ std::map<juce::Slider*, MouseListener*> m_sliderMouseListeners;
};