21#include <JuceHeader.h>
23#include "../MemaProcessorEditor/PluginControlComponent.h"
24#include "../MemaProcessorEditor/InputControlComponent.h"
25#include "../MemaProcessorEditor/CrosspointsControlComponent.h"
26#include "../MemaProcessorEditor/OutputControlComponent.h"
34 : juce::AudioProcessorEditor(processor)
36 std::function<void()> boundsRequirementChange = [=]() {
37 if(m_crosspointCtrl && m_outputCtrl && m_inputCtrl)
39 auto requiredCrosspointsSize = m_crosspointCtrl->getRequiredSize();
40 auto requiredOutputCtrlSize = m_outputCtrl->getRequiredSize();
41 auto requiredInputCtrlSize = m_inputCtrl->getRequiredSize();
43 auto requiredSize = requiredCrosspointsSize;
46 if (requiredCrosspointsSize.getWidth() < requiredInputCtrlSize.getWidth())
47 requiredSize.setWidth(requiredInputCtrlSize.getWidth());
48 if (requiredCrosspointsSize.getHeight() < requiredOutputCtrlSize.getHeight())
49 requiredSize.setHeight(requiredOutputCtrlSize.getHeight());
52 requiredSize.setWidth(requiredSize.getWidth() + requiredOutputCtrlSize.getWidth() + 1);
53 requiredSize.setHeight(requiredSize.getHeight() + requiredInputCtrlSize.getHeight() + 1 + sc_pluginControlHeight + 2);
55 if (onEditorSizeChangeRequested)
56 onEditorSizeChangeRequested(requiredSize);
60 m_pluginControl = std::make_unique<PluginControlComponent>();
61 m_pluginControl->onPluginSelected = [=](
const juce::PluginDescription& pluginDescription) {
62 auto memaProc =
dynamic_cast<MemaProcessor*
>(getAudioProcessor());
65 auto success = memaProc->setPlugin(pluginDescription);
69 m_pluginControl->onPluginEnabledChange = [=](
bool enabled) {
70 auto memaProc =
dynamic_cast<MemaProcessor*
>(getAudioProcessor());
72 memaProc->setPluginEnabledState(enabled);
74 m_pluginControl->onPluginPrePostChange = [=](
bool post) {
75 auto memaProc =
dynamic_cast<MemaProcessor*
>(getAudioProcessor());
77 memaProc->setPluginPrePostState(post);
79 m_pluginControl->onShowPluginEditor = [=]() {
80 auto memaProc =
dynamic_cast<MemaProcessor*
>(getAudioProcessor());
82 memaProc->openPluginEditor();
84 m_pluginControl->onClearPlugin = [=]() {
85 auto memaProc =
dynamic_cast<MemaProcessor*
>(getAudioProcessor());
87 memaProc->clearPlugin();
89 m_pluginControl->onPluginParametersStatusChanged = [=]() {
90 auto& paramInfos = m_pluginControl->getParameterInfos();
91 auto memaProc =
dynamic_cast<MemaProcessor*
>(getAudioProcessor());
94 for (
auto& info : paramInfos)
95 memaProc->setPluginParameterRemoteControlInfos(info.second.index, info.second.isRemoteControllable, info.second.type, info.second.stepCount);
98 addAndMakeVisible(m_pluginControl.get());
100 m_ioLabel = std::make_unique<IOLabelComponent>(IOLabelComponent::Direction::OI);
101 addAndMakeVisible(m_ioLabel.get());
103 m_resetToUnityButton = std::make_unique<juce::DrawableButton>(
"UnityReset", juce::DrawableButton::ButtonStyle::ImageOnButtonBackground);
104 m_resetToUnityButton->setTooltip(
"Reset to unity patch and unmute all");
105 m_resetToUnityButton->onClick = [
this] {
if (onResetToUnity) onResetToUnity(); };
106 addAndMakeVisible(m_resetToUnityButton.get());
108 m_inputCtrl = std::make_unique<InputControlComponent>();
109 m_inputCtrl->onBoundsRequirementChange = boundsRequirementChange;
110 addAndMakeVisible(m_inputCtrl.get());
112 m_crosspointCtrl = std::make_unique<CrosspointsControlComponent>();
113 m_crosspointCtrl->onBoundsRequirementChange = boundsRequirementChange;
114 addAndMakeVisible(m_crosspointCtrl.get());
116 m_outputCtrl = std::make_unique<OutputControlComponent>();
117 m_outputCtrl->onBoundsRequirementChange = boundsRequirementChange;
118 addAndMakeVisible(m_outputCtrl.get());
120 auto memaProc =
dynamic_cast<MemaProcessor*
>(&processor);
123 memaProc->addInputListener(m_inputCtrl.get());
124 memaProc->addInputCommander(m_inputCtrl.get());
126 memaProc->addCrosspointCommander(m_crosspointCtrl.get());
128 memaProc->addOutputListener(m_outputCtrl.get());
129 memaProc->addOutputCommander(m_outputCtrl.get());
131 memaProc->onPluginSet = [=](
const juce::PluginDescription& pluginDescription) {
if (m_pluginControl) m_pluginControl->setSelectedPlugin(pluginDescription); };
133 m_pluginControl->setPluginEnabled(memaProc->isPluginEnabled());
134 m_pluginControl->setPluginPrePost(memaProc->isPluginPost());
135 m_pluginControl->setSelectedPlugin(memaProc->getPluginDescription());
136 m_pluginControl->setParameterInfos(memaProc->getPluginParameterInfos());
139 m_gridLayout.items = { juce::GridItem(*m_ioLabel), juce::GridItem(*m_inputCtrl), juce::GridItem(*m_outputCtrl), juce::GridItem(*m_crosspointCtrl) };
140 m_gridLayout.rowGap.pixels = 1.0;
141 m_gridLayout.columnGap.pixels = 1.0;
146MemaProcessorEditor::MemaProcessorEditor(AudioProcessor* processor)
147 : MemaProcessorEditor(*processor)
151MemaProcessorEditor::~MemaProcessorEditor()
155void MemaProcessorEditor::paint (Graphics& g)
158 g.setColour(getLookAndFeel().findColour(juce::AlertWindow::backgroundColourId));
161void MemaProcessorEditor::resized()
163 auto bounds = getLocalBounds();
164 m_pluginControl->setBounds(bounds.removeFromTop(sc_pluginControlHeight + 1));
165 bounds.removeFromTop(1);
167 auto requiredInputsHeight = m_inputCtrl->getRequiredSize().getHeight();
168 auto requiredOutputsWidth = m_outputCtrl->getRequiredSize().getWidth();
170 m_gridLayout.templateRows = { juce::Grid::TrackInfo(juce::Grid::Px(requiredInputsHeight)), juce::Grid::TrackInfo(juce::Grid::Fr(1)) };
171 m_gridLayout.templateColumns = { juce::Grid::TrackInfo(juce::Grid::Px(requiredOutputsWidth)), juce::Grid::TrackInfo(juce::Grid::Fr(1)) };
172 m_gridLayout.performLayout(bounds);
175 auto resetButtonBounds = m_ioLabel->getBounds();
176 auto wMargin = (resetButtonBounds.getWidth() - sc_resetButtonSize) / 2;
177 auto hMargin = (resetButtonBounds.getHeight() - sc_resetButtonSize) / 2;
178 resetButtonBounds.reduce(wMargin, hMargin);
179 m_resetToUnityButton->setBounds(resetButtonBounds);
182void MemaProcessorEditor::lookAndFeelChanged()
184 auto resetToUnityDrawable = juce::Drawable::createFromSVG(*juce::XmlDocument::parse(BinaryData::replay_24dp_svg).get());
185 resetToUnityDrawable->replaceColour(juce::Colours::black, getLookAndFeel().findColour(juce::TextButton::ColourIds::textColourOnId));
186 m_resetToUnityButton->setImages(resetToUnityDrawable.get());
189 m_pluginControl->lookAndFeelChanged();
191 juce::AudioProcessorEditor::lookAndFeelChanged();
MemaProcessorEditor(juce::AudioProcessor &processor)