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);
96 memaProc->setPluginParameterDisplayOrder(m_pluginControl->getParameterDisplayOrder());
99 addAndMakeVisible(m_pluginControl.get());
101 m_ioLabel = std::make_unique<IOLabelComponent>(IOLabelComponent::Direction::OI);
102 addAndMakeVisible(m_ioLabel.get());
104 m_resetToUnityButton = std::make_unique<juce::DrawableButton>(
"UnityReset", juce::DrawableButton::ButtonStyle::ImageOnButtonBackground);
105 m_resetToUnityButton->setTooltip(
"Reset to unity patch and unmute all");
106 m_resetToUnityButton->onClick = [
this] {
if (onResetToUnity) onResetToUnity(); };
107 addAndMakeVisible(m_resetToUnityButton.get());
109 m_inputCtrl = std::make_unique<InputControlComponent>();
110 m_inputCtrl->onBoundsRequirementChange = boundsRequirementChange;
111 addAndMakeVisible(m_inputCtrl.get());
113 m_crosspointCtrl = std::make_unique<CrosspointsControlComponent>();
114 m_crosspointCtrl->onBoundsRequirementChange = boundsRequirementChange;
115 addAndMakeVisible(m_crosspointCtrl.get());
117 m_outputCtrl = std::make_unique<OutputControlComponent>();
118 m_outputCtrl->onBoundsRequirementChange = boundsRequirementChange;
119 addAndMakeVisible(m_outputCtrl.get());
121 auto memaProc =
dynamic_cast<MemaProcessor*
>(&processor);
124 memaProc->addInputListener(m_inputCtrl.get());
125 memaProc->addInputCommander(m_inputCtrl.get());
127 memaProc->addCrosspointCommander(m_crosspointCtrl.get());
129 memaProc->addOutputListener(m_outputCtrl.get());
130 memaProc->addOutputCommander(m_outputCtrl.get());
132 memaProc->onPluginSet = [=](
const juce::PluginDescription& pluginDescription) {
if (m_pluginControl) m_pluginControl->setSelectedPlugin(pluginDescription); };
133 memaProc->onPluginParameterInfosChanged = [=]() {
136 m_pluginControl->setParameterInfos(memaProc->getPluginParameterInfos());
137 m_pluginControl->setParameterDisplayOrder(memaProc->getPluginParameterDisplayOrder());
140 memaProc->onPluginProcessingStateChanged = [=](
bool enabled,
bool post) {
143 m_pluginControl->setPluginEnabled(enabled);
144 m_pluginControl->setPluginPrePost(post);
148 m_pluginControl->setPluginEnabled(memaProc->isPluginEnabled());
149 m_pluginControl->setPluginPrePost(memaProc->isPluginPost());
150 m_pluginControl->setSelectedPlugin(memaProc->getPluginDescription());
151 m_pluginControl->setParameterInfos(memaProc->getPluginParameterInfos());
152 m_pluginControl->setParameterDisplayOrder(memaProc->getPluginParameterDisplayOrder());
155 m_gridLayout.items = { juce::GridItem(*m_ioLabel), juce::GridItem(*m_inputCtrl), juce::GridItem(*m_outputCtrl), juce::GridItem(*m_crosspointCtrl) };
156 m_gridLayout.rowGap.pixels = 1.0;
157 m_gridLayout.columnGap.pixels = 1.0;
162MemaProcessorEditor::MemaProcessorEditor(AudioProcessor* processor)
163 : MemaProcessorEditor(*processor)
167MemaProcessorEditor::~MemaProcessorEditor()
171void MemaProcessorEditor::paint (Graphics& g)
174 g.setColour(getLookAndFeel().findColour(juce::AlertWindow::backgroundColourId));
177void MemaProcessorEditor::resized()
179 auto bounds = getLocalBounds();
180 m_pluginControl->setBounds(bounds.removeFromTop(sc_pluginControlHeight + 1));
181 bounds.removeFromTop(1);
183 auto requiredInputsHeight = m_inputCtrl->getRequiredSize().getHeight();
184 auto requiredOutputsWidth = m_outputCtrl->getRequiredSize().getWidth();
186 m_gridLayout.templateRows = { juce::Grid::TrackInfo(juce::Grid::Px(requiredInputsHeight)), juce::Grid::TrackInfo(juce::Grid::Fr(1)) };
187 m_gridLayout.templateColumns = { juce::Grid::TrackInfo(juce::Grid::Px(requiredOutputsWidth)), juce::Grid::TrackInfo(juce::Grid::Fr(1)) };
188 m_gridLayout.performLayout(bounds);
191 auto resetButtonBounds = m_ioLabel->getBounds();
192 auto wMargin = (resetButtonBounds.getWidth() - sc_resetButtonSize) / 2;
193 auto hMargin = (resetButtonBounds.getHeight() - sc_resetButtonSize) / 2;
194 resetButtonBounds.reduce(wMargin, hMargin);
195 m_resetToUnityButton->setBounds(resetButtonBounds);
198void MemaProcessorEditor::lookAndFeelChanged()
200 auto resetToUnityDrawable = juce::Drawable::createFromSVG(*juce::XmlDocument::parse(BinaryData::replay_24dp_svg).get());
201 resetToUnityDrawable->replaceColour(juce::Colours::black, getLookAndFeel().findColour(juce::TextButton::ColourIds::textColourOnId));
202 m_resetToUnityButton->setImages(resetToUnityDrawable.get());
205 m_pluginControl->lookAndFeelChanged();
207 juce::AudioProcessorEditor::lookAndFeelChanged();
MemaProcessorEditor(juce::AudioProcessor &processor)