Correctly disable components visually

pull/170/head
James Ball 2023-12-10 21:03:12 +00:00
rodzic a520ec1621
commit 7097779110
7 zmienionych plików z 29 dodań i 69 usunięć

Wyświetl plik

@ -6,7 +6,6 @@ EffectsComponent::EffectsComponent(OscirenderAudioProcessor& p, OscirenderAudioP
setText("Audio Effects");
addAndMakeVisible(frequency);
frequency.setCheckboxVisible(false);
frequency.slider.setSkewFactorFromMidPoint(500.0);
frequency.slider.setTextValueSuffix("Hz");

Wyświetl plik

@ -4,7 +4,6 @@
EffectComponent::EffectComponent(OscirenderAudioProcessor& p, Effect& effect, int index) : effect(effect), index(index), audioProcessor(p) {
addAndMakeVisible(slider);
addChildComponent(lfoSlider);
addAndMakeVisible(selected);
addAndMakeVisible(lfo);
lfo.addItem("Static", static_cast<int>(LfoType::Static));
@ -20,16 +19,8 @@ EffectComponent::EffectComponent(OscirenderAudioProcessor& p, Effect& effect, in
setupComponent();
}
EffectComponent::EffectComponent(OscirenderAudioProcessor& p, Effect& effect, int index, bool checkboxVisible) : EffectComponent(p, effect, index) {
setCheckboxVisible(checkboxVisible);
}
EffectComponent::EffectComponent(OscirenderAudioProcessor& p, Effect& effect) : EffectComponent(p, effect, 0) {}
EffectComponent::EffectComponent(OscirenderAudioProcessor& p, Effect& effect, bool checkboxVisible) : EffectComponent(p, effect) {
setCheckboxVisible(checkboxVisible);
}
void EffectComponent::setupComponent() {
EffectParameter* parameter = effect.parameters[index];
@ -39,10 +30,6 @@ void EffectComponent::setupComponent() {
slider.setSliderStyle(juce::Slider::LinearHorizontal);
slider.setTextBoxStyle(juce::Slider::TextBoxRight, false, 70, slider.getTextBoxHeight());
bool enabled = effect.enabled == nullptr || effect.enabled->getValue();
selected.setToggleState(enabled, juce::dontSendNotification);
updateEnabled();
lfoEnabled = parameter->lfo != nullptr && parameter->lfoRate != nullptr;
if (lfoEnabled) {
lfo.setSelectedId(parameter->lfo->getValueUnnormalised(), juce::dontSendNotification);
@ -128,18 +115,8 @@ void EffectComponent::resized() {
lfo.setBounds(bounds.removeFromRight(100).reduced(5));
}
auto checkboxLabel = bounds.removeFromLeft(120);
if (checkboxVisible || subParameter) {
checkboxLabel.removeFromLeft(2);
auto checkboxBounds = checkboxLabel.removeFromLeft(25);
if (checkboxVisible) {
selected.setBounds(checkboxBounds);
}
} else {
checkboxLabel.removeFromLeft(5);
}
textBounds = checkboxLabel;
textBounds = bounds.removeFromLeft(120);
textBounds.removeFromLeft(5);
slider.setBounds(bounds);
lfoSlider.setBounds(bounds);
}
@ -150,13 +127,6 @@ void EffectComponent::paint(juce::Graphics& g) {
g.drawText(effect.parameters[index]->name, textBounds, juce::Justification::left);
}
void EffectComponent::paintOverChildren(juce::Graphics &g) {
if (!selected.getToggleState()) {
g.setColour(juce::Colours::black.withAlpha(0.5f));
g.fillAll();
}
}
void EffectComponent::mouseDown(const juce::MouseEvent& event) {
if (event.mods.isPopupMenu()) {
juce::PopupMenu menu;
@ -188,15 +158,3 @@ void EffectComponent::setComponent(std::shared_ptr<juce::Component> component) {
this->component = component;
addAndMakeVisible(component.get());
}
void EffectComponent::setCheckboxVisible(bool visible) {
checkboxVisible = visible;
}
void EffectComponent::setSubParameter(bool subParameter) {
this->subParameter = subParameter;
}
void EffectComponent::updateEnabled() {
repaint();
}

Wyświetl plik

@ -7,35 +7,26 @@
class EffectComponent : public juce::Component, public juce::AudioProcessorParameter::Listener, juce::AsyncUpdater {
public:
EffectComponent(OscirenderAudioProcessor& p, Effect& effect, int index);
EffectComponent(OscirenderAudioProcessor& p, Effect& effect, int index, bool checkboxVisible);
EffectComponent(OscirenderAudioProcessor& p, Effect& effect);
EffectComponent(OscirenderAudioProcessor& p, Effect& effect, bool checkboxVisible);
~EffectComponent();
void resized() override;
void paint(juce::Graphics& g) override;
void paintOverChildren(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;
void updateEnabled();
void setCheckboxVisible(bool visible);
void setSubParameter(bool subParameter);
void setComponent(std::shared_ptr<juce::Component> component);
juce::Slider slider;
juce::Slider lfoSlider;
Effect& effect;
int index;
juce::ToggleButton selected;
juce::ComboBox lfo;
private:
void setupComponent();
bool checkboxVisible = true;
bool subParameter = false;
bool lfoEnabled = true;
juce::Rectangle<int> textBounds;
std::shared_ptr<juce::Component> component;

Wyświetl plik

@ -5,7 +5,8 @@
EffectsListComponent::EffectsListComponent(DraggableListBox& lb, AudioEffectListBoxItemData& data, int rn, Effect& effect) : DraggableListBoxItem(lb, data, rn), effect(effect), audioProcessor(data.audioProcessor), editor(data.editor) {
auto parameters = effect.parameters;
for (int i = 0; i < parameters.size(); i++) {
std::shared_ptr<EffectComponent> effectComponent = std::make_shared<EffectComponent>(audioProcessor, effect, i, i == 0);
std::shared_ptr<EffectComponent> effectComponent = std::make_shared<EffectComponent>(audioProcessor, effect, i);
selected.setToggleState(effect.enabled == nullptr || effect.enabled->getValue(), juce::dontSendNotification);
// using weak_ptr to avoid circular reference and memory leak
std::weak_ptr<EffectComponent> weakEffectComponent = effectComponent;
effectComponent->slider.setValue(parameters[i]->getValueUnnormalised(), juce::dontSendNotification);
@ -15,18 +16,15 @@ EffectsListComponent::EffectsListComponent(DraggableListBox& lb, AudioEffectList
}
};
if (i == 0) {
effectComponent->selected.onClick = [this, weakEffectComponent] {
if (auto effectComponent = weakEffectComponent.lock()) {
auto data = (AudioEffectListBoxItemData&)modelData;
juce::SpinLock::ScopedLockType lock(audioProcessor.effectsLock);
data.setSelected(rowNum, effectComponent->selected.getToggleState());
effectComponent->updateEnabled();
}
};
}
effectComponent->setSubParameter(i != 0);
list.setEnabled(selected.getToggleState());
selected.onClick = [this, weakEffectComponent] {
if (auto effectComponent = weakEffectComponent.lock()) {
auto data = (AudioEffectListBoxItemData&)modelData;
juce::SpinLock::ScopedLockType lock(audioProcessor.effectsLock);
data.setSelected(rowNum, selected.getToggleState());
list.setEnabled(selected.getToggleState());
}
};
auto component = createComponent(parameters[i]);
if (component != nullptr) {
@ -40,6 +38,7 @@ EffectsListComponent::EffectsListComponent(DraggableListBox& lb, AudioEffectList
list.setRowHeight(ROW_HEIGHT);
list.updateContent();
addAndMakeVisible(list);
addAndMakeVisible(selected);
}
EffectsListComponent::~EffectsListComponent() {}
@ -65,9 +64,20 @@ void EffectsListComponent::paint(juce::Graphics& g) {
DraggableListBoxItem::paint(g);
}
void EffectsListComponent::paintOverChildren(juce::Graphics& g) {
if (!selected.getToggleState()) {
g.setColour(juce::Colours::black.withAlpha(0.5f));
auto bounds = list.getBounds();
bounds.removeFromBottom(2);
g.fillRect(bounds);
list.repaint();
}
}
void EffectsListComponent::resized() {
auto area = getLocalBounds();
area.removeFromLeft(20);
selected.setBounds(area.removeFromLeft(30));
list.setBounds(area);
}

Wyświetl plik

@ -107,6 +107,7 @@ public:
~EffectsListComponent();
void paint(juce::Graphics& g) override;
void paintOverChildren(juce::Graphics& g) override;
void resized() override;
static const int ROW_HEIGHT = 30;
@ -115,6 +116,7 @@ protected:
Effect& effect;
ComponentListModel listModel;
juce::ListBox list;
juce::ToggleButton selected;
private:
OscirenderAudioProcessor& audioProcessor;
OscirenderAudioProcessorEditor& editor;

Wyświetl plik

@ -2,7 +2,6 @@
LuaListComponent::LuaListComponent(OscirenderAudioProcessor& p, Effect& effect) {
effectComponent = std::make_shared<EffectComponent>(p, effect);
effectComponent->setCheckboxVisible(false);
effectComponent->slider.onValueChange = [this, &effect, &p] {
effect.setValue(effectComponent->slider.getValue());

Wyświetl plik

@ -468,7 +468,8 @@
</GROUP>
</GROUP>
</MAINGROUP>
<JUCEOPTIONS JUCE_STRICT_REFCOUNTEDPOINTER="1" JUCE_VST3_CAN_REPLACE_VST2="0"/>
<JUCEOPTIONS JUCE_STRICT_REFCOUNTEDPOINTER="1" JUCE_VST3_CAN_REPLACE_VST2="0"
JUCE_WIN_PER_MONITOR_DPI_AWARE="0"/>
<EXPORTFORMATS>
<LINUX_MAKE targetFolder="Builds/LinuxMakefile">
<CONFIGURATIONS>