wavetable/plugin/Source/PluginEditor.h

170 lines
6.4 KiB
C
Raw Normal View History

2020-05-20 16:44:46 -07:00
#pragma once
#include <JuceHeader.h>
#include "PluginProcessor.h"
2023-08-23 08:45:23 -07:00
#include "Panels.h"
//==============================================================================
class Editor : public juce::Component
{
public:
Editor (WavetableAudioProcessor& proc_)
: proc ( proc_ )
{
for (auto& o : oscillators) addAndMakeVisible (o);
for (auto& f : filters) addAndMakeVisible (f);
for (auto& a : fltADSR) addAndMakeVisible (a);
for (auto& l : lfos) addAndMakeVisible (l);
for (auto& l : lfoGraphs) addAndMakeVisible (l);
addAndMakeVisible (mix);
for (auto& i : modItems)
modHeader.addItem (i);
addAndMakeVisible (modHeader);
for (int i = 0; i < Cfg::numLFOs; i++)
{
lfoBox.addBox (i, &lfos[i]);
lfoBox.addBox (i, &lfoGraphs[i]);
}
addAndMakeVisible (lfoBox);
lfoBox.setPage (0);
for (auto& i : fxItems)
fxHeader.addItem (i);
addAndMakeVisible (fxHeader);
effects.addBox (&gate);
effects.addBox (&pattern);
effects.addBox (&chorus);
effects.addBox (&distort);
effects.addBox (&eq);
effects.addBox (&compress);
effects.addBox (&delay);
effects.addBox (&reverb);
effects.addBox (&limit);
effects.addBox (&scope);
addAndMakeVisible (effects);
setupCallbacks();
}
void setupCallbacks()
{
// LFO mod items
for (int i = 0; i < Cfg::numLFOs; i++)
{
modItems[i].onClick = [this, i]
{
modItems[0].setSelected (i == 0);
modItems[1].setSelected (i == 1);
modItems[2].setSelected (i == 2);
lfoBox.setPage (i);
};
}
modItems[0].onClick();
}
void resized() override
{
auto rc = getLocalBounds();
auto rcOsc = rc.removeFromTop (163);
for (auto& o : oscillators) { o.setBounds (rcOsc.removeFromLeft (224)); rcOsc.removeFromLeft (1); };
rc.removeFromTop (1);
auto rcFlt = rc.removeFromTop (163);
filters[0].setBounds (rcFlt.removeFromLeft (168)); rcFlt.removeFromLeft (1);
fltADSR[0].setBounds (rcFlt.removeFromLeft (186)); rcFlt.removeFromLeft (1);
mix.setBounds (rcFlt.removeFromLeft (187)); rcFlt.removeFromLeft (1);
fltADSR[1].setBounds (rcFlt.removeFromLeft (186)); rcFlt.removeFromLeft (1);
filters[1].setBounds (rcFlt.removeFromLeft (168)); rcFlt.removeFromLeft (1);
auto rcB1 = rc.removeFromTop (26);
modHeader.setBounds (rcB1);
auto rcMod = rc.removeFromTop (163);
lfoBox.setBounds (rcMod);
auto rcB2 = rc.removeFromTop (26);
fxHeader.setBounds (rcB2);
auto rcFX = rc.removeFromTop (163);
effects.setBounds (rcFX);
}
WavetableAudioProcessor& proc;
OscillatorBox oscillators[Cfg::numOSCs] { { "oscillator 1", proc, 0 }, { "oscillator 2", proc, 1 },
{ "oscillator 3", proc, 2 }, { "oscillator 4", proc, 3 } };
FilterBox filters[Cfg::numFilters] { { "filter 1", proc, 0 }, { "filter 2", proc, 1 } };
FilterADSRArea fltADSR[Cfg::numFilters] { { proc, 0 }, { proc, 1 } };
MixBox mix { "osc mix", proc };
LFOBox lfos[Cfg::numLFOs] { { "LFO 1", proc, 0 }, { "LFO 2", proc, 1 }, { "LFO 3", proc, 2 } };
LFOArea lfoGraphs[Cfg::numLFOs] { { proc, 0 }, { proc, 1 }, { proc, 2 } };
gin::HeaderItem modItems[8] { { "LFO 1", proc.lfoParams[0].enable, proc.modMatrix, proc.modSrcMonoLFO[0], proc.modSrcLFO[0] },
{ "LFO 2", proc.lfoParams[1].enable, proc.modMatrix, proc.modSrcMonoLFO[1], proc.modSrcLFO[1] },
{ "LFO 3", proc.lfoParams[2].enable, proc.modMatrix, proc.modSrcMonoLFO[2], proc.modSrcLFO[2] },
{ "ENV 1", proc.envParams[0].enable, proc.modMatrix, {}, proc.modSrcEnv[0] },
{ "ENV 2", proc.envParams[1].enable, proc.modMatrix, {}, proc.modSrcEnv[1] },
{ "ENV 3", proc.envParams[2].enable, proc.modMatrix, {}, proc.modSrcEnv[2] },
{ "STEP", proc.stepLfoParams.enable, proc.modMatrix, proc.modSrcMonoStep, proc.modSrcStep },
{ "MIDI", nullptr } };
gin::HeaderRow modHeader;
gin::HeaderItem fxItems[8] { { "GATE", proc.gateParams.enable },
{ "CHORUS", proc.chorusParams.enable },
{ "DISTORT", proc.distortionParams.enable },
{ "EQ", proc.eqParams.enable },
{ "COMPRESS", proc.compressorParams.enable },
{ "DELAY", proc.delayParams.enable },
{ "REVERB", proc.reverbParams.enable },
{ "LIMIT", proc.limiterParams.enable } };
gin::HeaderRow fxHeader;
GateBox gate { proc };
GateArea pattern { proc };
ChorusBox chorus { proc };
DistortBox distort { proc };
EQBox eq { proc };
CompressBox compress { proc };
DelayBox delay { proc };
ReverbBox reverb { proc };
LimitBox limit { proc };
ScopeArea scope { proc };
gin::BoxArea lfoBox;
gin::BoxArea effects;
};
2020-05-20 16:44:46 -07:00
//==============================================================================
class WavetableAudioProcessorEditor : public gin::ProcessorEditor
{
public:
WavetableAudioProcessorEditor (WavetableAudioProcessor&);
~WavetableAudioProcessorEditor() override;
//==============================================================================
2023-08-23 08:45:23 -07:00
void paint (juce::Graphics&) override;
2020-05-20 16:44:46 -07:00
void resized() override;
private:
2023-08-23 08:45:23 -07:00
WavetableAudioProcessor& vaProc;
2020-05-20 16:44:46 -07:00
2023-08-23 08:45:23 -07:00
Editor editor { vaProc };
2020-05-20 16:44:46 -07:00
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WavetableAudioProcessorEditor)
};