/* * DISTRHO SoulForce, a DPF'ied SoulForce. * Copyright (C) 2006 Niall Moody * Copyright (C) 2015 Filipe Coelho * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "DistrhoUISoulForce.hpp" #include "DistrhoPluginSoulForce.hpp" START_NAMESPACE_DISTRHO namespace Art = DistrhoArtworkSoulForce; // ----------------------------------------------------------------------- DistrhoUISoulForce::DistrhoUISoulForce() : UI(Art::backgroundWidth, Art::backgroundHeight), fImgBackground(Art::backgroundData, Art::backgroundWidth, Art::backgroundHeight, GL_BGR), fImgLedOff(Art::led_offData, Art::led_offWidth, Art::led_offHeight, GL_BGR), fImgLedOn(Art::led_onData, Art::led_onWidth, Art::led_onHeight, GL_BGR), fFootDown(true) { // knobs fKnobShape = new ImageKnob(this, Image(Art::knob_shapeData, Art::knob_shapeWidth, Art::knob_shapeHeight, GL_BGR)); fKnobShape->setId(DistrhoPluginSoulForce::kParameterShape); fKnobShape->setAbsolutePos(17, 64); fKnobShape->setRange(0.0f, 1.0f); fKnobShape->setDefault(0.5f); fKnobShape->setImageLayerCount(92); fKnobShape->setCallback(this); fKnobFBack = new ImageKnob(this, Image(Art::knob_feedbackData, Art::knob_feedbackWidth, Art::knob_feedbackHeight, GL_BGR)); fKnobFBack->setId(DistrhoPluginSoulForce::kParameterFeedback); fKnobFBack->setAbsolutePos(176, 64); fKnobFBack->setRange(0.0f, 1.0f); fKnobFBack->setDefault(0.5f); fKnobFBack->setImageLayerCount(92); fKnobFBack->setCallback(this); // switches fSwitchSource = new ImageSwitch(this, Image(Art::switch_leftData, Art::switch_leftWidth, Art::switch_leftHeight, GL_BGR), Image(Art::switch_rightData, Art::switch_rightWidth, Art::switch_rightHeight, GL_BGR)); fSwitchSource->setId(DistrhoPluginSoulForce::kParameterSource); fSwitchSource->setAbsolutePos(116, 191); fSwitchSource->setCallback(this); // buttons fButtonFoot = new ImageButton(this, Image(Art::button_upData, Art::button_upWidth, Art::button_upHeight, GL_BGR), Image(Art::button_upData, Art::button_upWidth, Art::button_upHeight, GL_BGR), Image(Art::button_downData, Art::button_downWidth, Art::button_downHeight, GL_BGR)); fButtonFoot->setId(DistrhoPluginSoulForce::kParameterFootswitch); fButtonFoot->setAbsolutePos(125, 282); fButtonFoot->setCallback(this); // set initial values programLoaded(0); } // ----------------------------------------------------------------------- // DSP Callbacks void DistrhoUISoulForce::parameterChanged(uint32_t index, float value) { switch (index) { case DistrhoPluginSoulForce::kParameterShape: fKnobShape->setValue(value); break; case DistrhoPluginSoulForce::kParameterFeedback: fKnobFBack->setValue(value); break; case DistrhoPluginSoulForce::kParameterSource: fSwitchSource->setDown(value > 0.5f); break; case DistrhoPluginSoulForce::kParameterFootswitch: if (fFootDown != (value > 0.5f)) { fFootDown = !fFootDown; repaint(); } break; } } void DistrhoUISoulForce::programLoaded(uint32_t index) { switch(index) { case DistrhoPluginSoulForce::kProgramDefault: fKnobShape->setValue(0.5f); fKnobFBack->setValue(0.0f); fSwitchSource->setDown(false); break; case DistrhoPluginSoulForce::kProgramStayDown: fKnobShape->setValue(0.4f); fKnobFBack->setValue(0.0f); fSwitchSource->setDown(false); break; case DistrhoPluginSoulForce::kProgramLookingForTheWorld: fKnobShape->setValue(1.0f); fKnobFBack->setValue(0.0f); fSwitchSource->setDown(false); break; case DistrhoPluginSoulForce::kProgramGuerillaLove: fKnobShape->setValue(0.5f); fKnobFBack->setValue(1.0f); fSwitchSource->setDown(false); break; case DistrhoPluginSoulForce::kProgramTumbleToThePower: fKnobShape->setValue(0.0f); fKnobFBack->setValue(1.0f); fSwitchSource->setDown(false); break; case DistrhoPluginSoulForce::kProgramDoYourselfFavour: fKnobShape->setValue(0.5f); fKnobFBack->setValue(1.0f); fSwitchSource->setDown(true); break; case DistrhoPluginSoulForce::kProgramPastIsPast: fKnobShape->setValue(0.0f); fKnobFBack->setValue(1.0f); fSwitchSource->setDown(true); break; case DistrhoPluginSoulForce::kProgramYouAndOnlyYou: fKnobShape->setValue(0.3f); fKnobFBack->setValue(0.5f); fSwitchSource->setDown(false); break; case DistrhoPluginSoulForce::kProgramSoulForce: fKnobShape->setValue(0.3f); fKnobFBack->setValue(0.5f); fSwitchSource->setDown(true); break; } // always true if (! fFootDown) { fFootDown = true; repaint(); } } // ----------------------------------------------------------------------- // Widget Callbacks void DistrhoUISoulForce::imageKnobDragStarted(ImageKnob* knob) { editParameter(knob->getId(), true); } void DistrhoUISoulForce::imageKnobDragFinished(ImageKnob* knob) { editParameter(knob->getId(), false); } void DistrhoUISoulForce::imageKnobValueChanged(ImageKnob* knob, float value) { setParameterValue(knob->getId(), value); } void DistrhoUISoulForce::imageButtonClicked(ImageButton* imageButton, int) { const uint buttonId(imageButton->getId()); if (buttonId != DistrhoPluginSoulForce::kParameterFootswitch) return; fFootDown = !fFootDown; editParameter(buttonId, true); setParameterValue(buttonId, fFootDown ? 1.0f : 0.0f); editParameter(buttonId, false); repaint(); } void DistrhoUISoulForce::imageSwitchClicked(ImageSwitch* imageSwitch, bool down) { const uint buttonId(imageSwitch->getId()); editParameter(buttonId, true); setParameterValue(buttonId, down ? 1.0f : 0.0f); editParameter(buttonId, false); } void DistrhoUISoulForce::onDisplay() { fImgBackground.draw(); if (fFootDown) fImgLedOn.drawAt(123, 240); else fImgLedOff.drawAt(123, 240); } // ----------------------------------------------------------------------- UI* createUI() { return new DistrhoUISoulForce(); } // ----------------------------------------------------------------------- END_NAMESPACE_DISTRHO