40 setResizable(
true,
true);
41 setResizeLimits(800, 640, 1920, 1080);
44 setLookAndFeel(&lookAndFeel);
47 addAndMakeVisible(headerBlock);
50 addAndMakeVisible(graphBlock);
53 addAndMakeVisible(reverbBlock);
56 filterBlockNames = {
"low-shelf",
"peak (low)",
"peak (high)",
"high-shelf" };
58 for (
auto filterBlock : filterBlocks)
60 addAndMakeVisible(*filterBlock);
64 headerBlock.irChoice.addListener(&graphBlock);
65 headerBlock.irChoice.addListener(
this);
67 reverbBlock.irLength.addListener(&graphBlock);
68 reverbBlock.preDelay.addListener(&graphBlock);
69 reverbBlock.irGain.addListener(&graphBlock);
70 reverbBlock.outGain.addListener(&graphBlock);
71 reverbBlock.wetRatio.addListener(&graphBlock);
73 for (
auto& filterBlock : filterBlocks)
75 filterBlock->freq.addListener(&graphBlock);
76 filterBlock->q.addListener(&graphBlock);
77 filterBlock->gain.addListener(&graphBlock);
87 setLookAndFeel(
nullptr);
93 g.fillAll(getLookAndFeel().findColour(juce::ResizableWindow::backgroundColourId));
95 g.setColour(juce::Colours::white);
107 juce::Rectangle<
int> bounds(getLocalBounds());
109 int width = bounds.getWidth();
110 int height = bounds.getHeight();
112 int padding = (
int)(PADDING_REL * height);
115 auto headerBounds = bounds;
117 headerBounds.setBottom((
int)(0.13 * height));
119 headerBounds.reduce(padding, padding);
121 headerBlock.setBounds(headerBounds);
124 auto graphBounds = bounds;
126 graphBounds.setTop(headerBounds.getBottom());
127 graphBounds.setBottom(headerBounds.getBottom() + padding + (
int)(0.52 * height));
128 graphBounds.setRight((
int)(0.75 * width));
130 graphBounds.reduce(padding, padding);
132 graphBlock.setBounds(graphBounds);
135 auto reverbBounds = bounds;
137 reverbBounds.setTop(headerBounds.getBottom());
138 reverbBounds.setBottom(headerBounds.getBottom() + padding + (
int)std::round(0.52 * height));
139 reverbBounds.setLeft(graphBounds.getRight() + padding);
141 reverbBounds.reduce(padding, padding);
143 reverbBlock.setBounds(reverbBounds);
146 auto filterBounds = bounds;
148 filterBounds.setTop(reverbBounds.getBottom());
149 filterBounds.setBottom(reverbBounds.getBottom() + padding + (
int)std::round(0.35 * height));
151 int filterBlockWidth = width / 4;
153 for (
int i = 0; i < 4; ++i)
155 auto thisFilterBounds = filterBounds.removeFromLeft(filterBlockWidth);
156 thisFilterBounds.reduce(padding, padding);
158 filterBlocks[i]->setBounds(thisFilterBounds);
173 if (clickedButton !=
nullptr && clickedButton == &headerBlock.irChoice) {
175 m.addItem(1,
"Load custom IR...");
178 for (
int i = 0; i < headerBlock.previousSelectedIRs.size(); i++)
180 m.addItem(i + 2, headerBlock.previousSelectedIRs[i]);
185 for (
auto irFile : IRBank::getInstance().buffers)
187 m.addItem(m.getNumItems() + 1, irFile.first);
190 m.showMenuAsync(juce::PopupMenu::Options(),
191 juce::ModalCallbackFunction::forComponent(menuCallback, &headerBlock));
206 if (headerBlock !=
nullptr && result != 0)
208 auto irName = headerBlock->parameters.state.getChildWithName(AudioProcessor::PID_IR_FILE_CHOICE);
209 juce::String selectedIR;
212 juce::AudioFormatManager formatManager;
213 formatManager.registerBasicFormats();
215 juce::FileChooser fileChooser(
"Select an impulse response",
216 juce::File::getCurrentWorkingDirectory(),
217 formatManager.getWildcardForAllFormats(),
219 if (fileChooser.browseForFileToOpen())
221 selectedIR = fileChooser.getResult().getFullPathName();
222 irName.setProperty(
"value", selectedIR,
nullptr);
223 headerBlock->irChoice.setButtonText(selectedIR);
224 headerBlock->previousSelectedIRs.add(selectedIR);
227 else if (result <= (headerBlock->previousSelectedIRs.size() + 1))
229 selectedIR = headerBlock->previousSelectedIRs[result - 2];
230 irName.setProperty(
"value", selectedIR,
nullptr);
231 headerBlock->irChoice.setButtonText(selectedIR);
235 selectedIR = std::next(IRBank::getInstance().buffers.begin(),
236 result - headerBlock->previousSelectedIRs.size() - 2)->first;
237 irName.setProperty(
"value", selectedIR,
nullptr);
238 headerBlock->irChoice.setButtonText(selectedIR);
AudioProcessorEditor(AudioProcessor &)
Constructs an AudioProcessorEditor object associated with an AudioProcessor.
float getParam(const juce::AudioProcessorValueTreeState ¶ms, const juce::String &blockId) const
Internal method used to get (and check) a parameter's value.
void buttonClicked(juce::Button *button) override
Callback function to open the popup menu asynchronously.
void resized() override
Manages the layout of AudioProcessorEditor when the window is resized.
static void menuCallback(int result, UIHeaderBlock *headerBlock)
Callback function to open the popup menu asynchronously.