/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2017 - ROLI Ltd. JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 5 End-User License Agreement and JUCE 5 Privacy Policy (both updated and effective as of the 27th April 2017). End User License Agreement: www.juce.com/juce-5-licence Privacy Policy: www.juce.com/juce-5-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ #include "MaterialLookAndFeel.h" //============================================================================== class AUv3SynthEditor : public AudioProcessorEditor, public ButtonListener, public Slider::Listener, private Timer { public: //============================================================================== AUv3SynthEditor (AudioProcessor& processor) : AudioProcessorEditor (processor), recordButton ("Record"), roomSizeSlider (Slider::LinearHorizontal, Slider::NoTextBox) { LookAndFeel::setDefaultLookAndFeel (&materialLookAndFeel); roomSizeSlider.setValue (getParameterValue ("roomSize"), NotificationType::dontSendNotification); recordButton.addListener (this); addAndMakeVisible (recordButton); roomSizeSlider.addListener (this); roomSizeSlider.setRange (0.0, 1.0); addAndMakeVisible (roomSizeSlider); Path proAudioPath; proAudioPath.loadPathFromData (BinaryData::proaudio_path, BinaryData::proaudio_pathSize); proAudioIcon.setPath (proAudioPath); addAndMakeVisible (proAudioIcon); Colour proAudioIconColour = findColour (TextButton::buttonOnColourId); proAudioIcon.setFill (FillType (proAudioIconColour)); setSize (600, 400); startTimer (100); } //============================================================================== void paint (Graphics& g) override { g.fillAll (findColour (ResizableWindow::backgroundColourId)); } void resized() override { Rectangle r = getLocalBounds(); int guiElementAreaHeight = r.getHeight() / 3; proAudioIcon.setTransformToFit (r.removeFromLeft (proportionOfWidth (0.25)) .withSizeKeepingCentre (guiElementAreaHeight, guiElementAreaHeight) .toFloat(), RectanglePlacement::fillDestination); int margin = guiElementAreaHeight / 4; r.reduce (margin, margin); int buttonHeight = guiElementAreaHeight - margin; recordButton.setBounds (r.removeFromTop (guiElementAreaHeight).withSizeKeepingCentre (r.getWidth(), buttonHeight)); roomSizeSlider.setBounds (r.removeFromTop (guiElementAreaHeight).withSizeKeepingCentre (r.getWidth(), buttonHeight)); } //============================================================================== void buttonClicked (Button* button) override { if (button == &recordButton) { recordButton.setEnabled (false); setParameterValue ("isRecording", 1.0f); } } void sliderValueChanged (Slider*) override { setParameterValue ("roomSize", roomSizeSlider.getValue()); } private: //============================================================================== void timerCallback() override { bool isRecordingNow = (getParameterValue ("isRecording") >= 0.5f); recordButton.setEnabled (! isRecordingNow); roomSizeSlider.setValue (getParameterValue ("roomSize"), NotificationType::dontSendNotification); } //============================================================================== AudioProcessorParameter* getParameter (const String& paramId) { if (AudioProcessor* processor = getAudioProcessor()) { const OwnedArray& params = processor->getParameters(); for (int i = 0; i < params.size(); ++i) { if (AudioProcessorParameterWithID* param = dynamic_cast (params[i])) { if (param->paramID == paramId) return param; } } } return nullptr; } //============================================================================== float getParameterValue (const String& paramId) { if (AudioProcessorParameter* param = getParameter (paramId)) return param->getValue(); return 0.0f; } void setParameterValue (const String& paramId, float value) { if (AudioProcessorParameter* param = getParameter (paramId)) param->setValueNotifyingHost (value); } //============================================================================== MaterialLookAndFeel materialLookAndFeel; //============================================================================== TextButton recordButton; Slider roomSizeSlider; DrawablePath proAudioIcon; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AUv3SynthEditor) };