kopia lustrzana https://github.com/jameshball/osci-render
Correctly disable components visually
rodzic
a520ec1621
commit
7097779110
|
@ -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");
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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>
|
||||
|
|
Ładowanie…
Reference in New Issue