From ad94a6926399b7339c9a28e06b758042776c9bb4 Mon Sep 17 00:00:00 2001 From: reuk Date: Tue, 18 Jan 2022 19:42:45 +0000 Subject: [PATCH] GenericAudioProcessorEditor: Refresh parameter value text when parameter info changes When plugins change their 'parameter info' this often means that their previous parameter text is no longer valid, so we should fetch new text to represent the parameter value. This change was primarily tested with Kontakt. --- .../juce_GenericAudioProcessorEditor.cpp | 50 +++++++++++-------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp b/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp index e380d0c623..690042a5ab 100644 --- a/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp +++ b/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp @@ -97,13 +97,19 @@ private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParameterListener) }; +class ParameterComponent : public Component, + public ParameterListener +{ +public: + using ParameterListener::ParameterListener; +}; + //============================================================================== -class BooleanParameterComponent final : public Component, - private ParameterListener +class BooleanParameterComponent : public ParameterComponent { public: BooleanParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param) - : ParameterListener (proc, param) + : ParameterComponent (proc, param) { // Set the initial value. handleNewParameterValue(); @@ -122,12 +128,12 @@ public: button.setBounds (area.reduced (0, 10)); } -private: void handleNewParameterValue() override { button.setToggleState (isParameterOn(), dontSendNotification); } +private: void buttonClicked() { if (isParameterOn() != button.getToggleState()) @@ -146,12 +152,11 @@ private: }; //============================================================================== -class SwitchParameterComponent final : public Component, - private ParameterListener +class SwitchParameterComponent : public ParameterComponent { public: SwitchParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param) - : ParameterListener (proc, param) + : ParameterComponent (proc, param) { for (auto& button : buttons) { @@ -186,7 +191,6 @@ public: button.setBounds (area.removeFromLeft (80)); } -private: void handleNewParameterValue() override { bool newState = isParameterOn(); @@ -198,6 +202,7 @@ private: } } +private: void rightButtonChanged() { auto buttonState = buttons[1].getToggleState(); @@ -249,12 +254,11 @@ private: }; //============================================================================== -class ChoiceParameterComponent final : public Component, - private ParameterListener +class ChoiceParameterComponent : public ParameterComponent { public: ChoiceParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param) - : ParameterListener (proc, param), + : ParameterComponent (proc, param), parameterValues (getParameter().getAllValueStrings()) { box.addItemList (parameterValues, 1); @@ -312,12 +316,11 @@ private: }; //============================================================================== -class SliderParameterComponent final : public Component, - private ParameterListener +class SliderParameterComponent : public ParameterComponent { public: SliderParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param) - : ParameterListener (proc, param) + : ParameterComponent (proc, param) { if (getParameter().getNumSteps() != AudioProcessor::getDefaultNumParameterSteps()) slider.setRange (0.0, 1.0, 1.0 / (getParameter().getNumSteps() - 1.0)); @@ -354,12 +357,6 @@ public: slider.setBounds (area); } -private: - void updateTextDisplay() - { - valueLabel.setText (getParameter().getCurrentValueAsText(), dontSendNotification); - } - void handleNewParameterValue() override { if (! isDragging) @@ -369,6 +366,12 @@ private: } } +private: + void updateTextDisplay() + { + valueLabel.setText (getParameter().getCurrentValueAsText(), dontSendNotification); + } + void sliderValueChanged() { auto newVal = (float) slider.getValue(); @@ -458,9 +461,9 @@ private: AudioProcessorEditor& editor; AudioProcessorParameter& parameter; Label parameterName, parameterLabel; - std::unique_ptr parameterComp; + std::unique_ptr parameterComp; - std::unique_ptr createParameterComp (AudioProcessor& processor) const + std::unique_ptr createParameterComp (AudioProcessor& processor) const { // The AU, AUv3 and VST (only via a .vstxml file) SDKs support // marking a parameter as boolean. If you want consistency across @@ -501,6 +504,9 @@ private: { parameterName .setText (parameter.getName (128), dontSendNotification); parameterLabel.setText (parameter.getLabel(), dontSendNotification); + + if (auto* p = parameterComp.get()) + p->handleNewParameterValue(); } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParameterDisplayComponent)