Signed-off-by: falkTX <falktx@falktx.com>pull/232/head
| @@ -0,0 +1,47 @@ | |||
| /* | |||
| * DISTRHO Plugin Framework (DPF) | |||
| * Copyright (C) 2012-2020 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| * permission notice appear in all copies. | |||
| * | |||
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |||
| * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |||
| * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||
| * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |||
| * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |||
| * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
| */ | |||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||
| #define DISTRHO_PLUGIN_NAME "FileHandling" | |||
| #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/examples/FileHandling" | |||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||
| #define DISTRHO_PLUGIN_NUM_INPUTS 1 | |||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 1 | |||
| #define DISTRHO_PLUGIN_WANT_STATE 1 | |||
| #define DISTRHO_PLUGIN_WANT_STATEFILES 1 | |||
| #define DISTRHO_UI_USER_RESIZABLE 1 | |||
| #define DISTRHO_UI_USE_NANOVG 1 | |||
| enum Parameters { | |||
| kParameterFileSize1 = 0, | |||
| kParameterFileSize2, | |||
| kParameterFileSize3, | |||
| kParameterCount | |||
| }; | |||
| enum States { | |||
| kStateFile1 = 0, | |||
| kStateFile2, | |||
| kStateFile3, | |||
| kStateCount | |||
| }; | |||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| @@ -0,0 +1,257 @@ | |||
| /* | |||
| * DISTRHO Plugin Framework (DPF) | |||
| * Copyright (C) 2012-2020 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| * permission notice appear in all copies. | |||
| * | |||
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |||
| * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |||
| * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||
| * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |||
| * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |||
| * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
| */ | |||
| #include "DistrhoPlugin.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------------------------------------------- | |||
| /** | |||
| Plugin to demonstrate File handling within DPF. | |||
| */ | |||
| class FileHandlingExamplePlugin : public Plugin | |||
| { | |||
| public: | |||
| FileHandlingExamplePlugin() | |||
| : Plugin(kParameterCount, 0, kStateCount) | |||
| { | |||
| std::memset(fParameters, 0, sizeof(fParameters)); | |||
| } | |||
| protected: | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * Information */ | |||
| /** | |||
| Get the plugin label. | |||
| This label is a short restricted name consisting of only _, a-z, A-Z and 0-9 characters. | |||
| */ | |||
| const char* getLabel() const override | |||
| { | |||
| return "FileHandling"; | |||
| } | |||
| /** | |||
| Get an extensive comment/description about the plugin. | |||
| */ | |||
| const char* getDescription() const override | |||
| { | |||
| return "Plugin to demonstrate File handling."; | |||
| } | |||
| /** | |||
| Get the plugin author/maker. | |||
| */ | |||
| const char* getMaker() const override | |||
| { | |||
| return "DISTRHO"; | |||
| } | |||
| /** | |||
| Get the plugin homepage. | |||
| */ | |||
| const char* getHomePage() const override | |||
| { | |||
| return "https://github.com/DISTRHO/DPF"; | |||
| } | |||
| /** | |||
| Get the plugin license name (a single line of text). | |||
| For commercial plugins this should return some short copyright information. | |||
| */ | |||
| const char* getLicense() const override | |||
| { | |||
| return "ISC"; | |||
| } | |||
| /** | |||
| Get the plugin version, in hexadecimal. | |||
| */ | |||
| uint32_t getVersion() const override | |||
| { | |||
| return d_version(0, 0, 0); | |||
| } | |||
| /** | |||
| Get the plugin unique Id. | |||
| This value is used by LADSPA, DSSI and VST plugin formats. | |||
| */ | |||
| int64_t getUniqueId() const override | |||
| { | |||
| return d_cconst('d', 'F', 'i', 'H'); | |||
| } | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * Init */ | |||
| /** | |||
| Initialize the parameter @a index. | |||
| This function will be called once, shortly after the plugin is created. | |||
| */ | |||
| void initParameter(uint32_t index, Parameter& param) override | |||
| { | |||
| param.hints = kParameterIsOutput|kParameterIsInteger; | |||
| switch (index) | |||
| { | |||
| case kParameterFileSize1: | |||
| param.name = "Size #1"; | |||
| param.symbol = "size1"; | |||
| break; | |||
| case kParameterFileSize2: | |||
| param.name = "Size #2"; | |||
| param.symbol = "size2"; | |||
| break; | |||
| case kParameterFileSize3: | |||
| param.name = "Size #3"; | |||
| param.symbol = "size3"; | |||
| break; | |||
| } | |||
| } | |||
| /** | |||
| Set the state key and default value of @a index.@n | |||
| This function will be called once, shortly after the plugin is created.@n | |||
| Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_STATE is enabled. | |||
| */ | |||
| void initState(uint32_t index, String& stateKey, String& defaultStateValue) override | |||
| { | |||
| switch (index) | |||
| { | |||
| case kStateFile1: | |||
| stateKey = "file1"; | |||
| break; | |||
| case kStateFile2: | |||
| stateKey = "file2"; | |||
| break; | |||
| case kStateFile3: | |||
| stateKey = "file3"; | |||
| break; | |||
| } | |||
| defaultStateValue = ""; | |||
| } | |||
| /** | |||
| TODO API under construction | |||
| */ | |||
| bool isStateFile(uint32_t index) override | |||
| { | |||
| switch (index) | |||
| { | |||
| case kStateFile1: | |||
| case kStateFile2: | |||
| case kStateFile3: | |||
| return true; | |||
| } | |||
| return false; | |||
| } | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * Internal data */ | |||
| /** | |||
| Get the current value of a parameter. | |||
| The host may call this function from any context, including realtime processing. | |||
| We have no parameters in this plugin example, so we do nothing with the function. | |||
| */ | |||
| float getParameterValue(uint32_t index) const override | |||
| { | |||
| return fParameters[index]; | |||
| } | |||
| /** | |||
| Change a parameter value.@n | |||
| The host may call this function from any context, including realtime processing. | |||
| This function will only be called for parameter inputs. | |||
| Since we have no parameters inputs in this example, so we do nothing with the function. | |||
| */ | |||
| void setParameterValue(uint32_t, float) override {} | |||
| /** | |||
| Change an internal state @a key to @a value. | |||
| */ | |||
| void setState(const char* key, const char* value) override | |||
| { | |||
| d_stdout("DSP setState %s %s", key, value); | |||
| int fileId = -1; | |||
| /**/ if (std::strcmp(key, "file1") == 0) | |||
| fileId = 0; | |||
| else if (std::strcmp(key, "file2") == 0) | |||
| fileId = 1; | |||
| else if (std::strcmp(key, "file3") == 0) | |||
| fileId = 2; | |||
| if (fileId == -1) | |||
| return; | |||
| if (FILE* const fh = fopen(value, "r")) | |||
| { | |||
| fseek(fh, 0, SEEK_END); | |||
| // filesize | |||
| const long int size = ftell(fh); | |||
| d_stdout("size of %s is %li", value, size); | |||
| fParameters[kParameterFileSize1 + fileId] = static_cast<float>(size) / 1000.0f; | |||
| fclose(fh); | |||
| } | |||
| } | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * Audio/MIDI Processing */ | |||
| /** | |||
| Run/process function for plugins without MIDI input. | |||
| @note Some parameters might be null if there are no audio inputs or outputs. | |||
| */ | |||
| void run(const float** inputs, float** outputs, uint32_t frames) override | |||
| { | |||
| /** | |||
| This plugin doesn't do audio, it just demonstrates file handling usage. | |||
| So here we directly copy inputs over outputs, leaving the audio untouched. | |||
| We need to be careful in case the host re-uses the same buffer for both ins and outs. | |||
| */ | |||
| if (outputs[0] != inputs[0]) | |||
| std::memcpy(outputs[0], inputs[0], sizeof(float)*frames); | |||
| } | |||
| // ------------------------------------------------------------------------------------------------------- | |||
| private: | |||
| float fParameters[kParameterCount]; | |||
| /** | |||
| Set our plugin class as non-copyable and add a leak detector just in case. | |||
| */ | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FileHandlingExamplePlugin) | |||
| }; | |||
| /* ------------------------------------------------------------------------------------------------------------ | |||
| * Plugin entry point, called by DPF to create a new plugin instance. */ | |||
| Plugin* createPlugin() | |||
| { | |||
| return new FileHandlingExamplePlugin(); | |||
| } | |||
| // ----------------------------------------------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -0,0 +1,269 @@ | |||
| /* | |||
| * DISTRHO Plugin Framework (DPF) | |||
| * Copyright (C) 2012-2020 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| * permission notice appear in all copies. | |||
| * | |||
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |||
| * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |||
| * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||
| * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |||
| * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |||
| * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
| */ | |||
| #include "DistrhoUI.hpp" | |||
| #include "extra/String.hpp" | |||
| #include "DistrhoPluginInfo.h" | |||
| #include "NanoButton.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| const char* kStateKeys[kStateCount] = { | |||
| "file1", | |||
| "file2", | |||
| "file3", | |||
| }; | |||
| // ----------------------------------------------------------------------------------------------------------- | |||
| static void setupButton(Button& btn, int y) | |||
| { | |||
| btn.setAbsolutePos(5, y); | |||
| btn.setLabel("Open..."); | |||
| btn.setSize(100, 30); | |||
| } | |||
| class FileHandlingExampleUI : public UI, | |||
| public Button::Callback | |||
| { | |||
| public: | |||
| static const uint kInitialWidth = 600; | |||
| static const uint kInitialHeight = 350; | |||
| FileHandlingExampleUI() | |||
| : UI(kInitialWidth, kInitialHeight), | |||
| fButton1(this, this), | |||
| fButton2(this, this), | |||
| fButton3(this, this), | |||
| fScale(1.0f) | |||
| { | |||
| std::memset(fParameters, 0, sizeof(fParameters)); | |||
| std::memset(fStrBuf, 0, sizeof(fStrBuf)); | |||
| setupButton(fButton1, 5); | |||
| setupButton(fButton2, 105); | |||
| setupButton(fButton3, 205); | |||
| #ifdef DGL_NO_SHARED_RESOURCES | |||
| createFontFromFile("sans", "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf"); | |||
| #else | |||
| loadSharedResources(); | |||
| #endif | |||
| setGeometryConstraints(kInitialWidth, kInitialHeight, true); | |||
| } | |||
| protected: | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * DSP/Plugin Callbacks */ | |||
| /** | |||
| A parameter has changed on the plugin side.@n | |||
| This is called by the host to inform the UI about parameter changes. | |||
| */ | |||
| void parameterChanged(uint32_t index, float value) override | |||
| { | |||
| fParameters[index] = value; | |||
| repaint(); | |||
| } | |||
| /** | |||
| A state has changed on the plugin side.@n | |||
| This is called by the host to inform the UI about state changes. | |||
| */ | |||
| void stateChanged(const char* key, const char* value) override | |||
| { | |||
| States stateId = kStateCount; | |||
| /**/ if (std::strcmp(key, "file1") == 0) | |||
| stateId = kStateFile1; | |||
| else if (std::strcmp(key, "file2") == 0) | |||
| stateId = kStateFile2; | |||
| else if (std::strcmp(key, "file3") == 0) | |||
| stateId = kStateFile3; | |||
| if (stateId == kStateCount) | |||
| return; | |||
| fState[stateId] = value; | |||
| repaint(); | |||
| } | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * Widget Callbacks */ | |||
| /** | |||
| The NanoVG drawing function. | |||
| */ | |||
| void onNanoDisplay() override | |||
| { | |||
| const float lineHeight = 20 * fScale; | |||
| float y; | |||
| fontSize(15.0f * fScale); | |||
| textLineHeight(lineHeight); | |||
| // --------------------------------------------------------------------------------------- | |||
| // File 1 | |||
| y = 45.0f * fScale; | |||
| if (fState[kStateFile1].isNotEmpty()) | |||
| { | |||
| drawLeft(0.0f, y, "Name:"); | |||
| drawRight(0.0f, y, fState[kStateFile1]); | |||
| y += lineHeight; | |||
| drawLeft(0.0f, y, "Size:"); | |||
| drawRight(0.0f, y, getTextBufFileSize(fParameters[kParameterFileSize1])); | |||
| y += lineHeight; | |||
| } | |||
| else | |||
| { | |||
| drawLeft(0.0f, y, "No file loaded"); | |||
| } | |||
| // --------------------------------------------------------------------------------------- | |||
| // File 2 | |||
| y = 145.0f * fScale; | |||
| if (fState[kStateFile2].isNotEmpty()) | |||
| { | |||
| drawLeft(0.0f, y, "Name:"); | |||
| drawRight(0.0f, y, fState[kStateFile2]); | |||
| y += lineHeight; | |||
| drawLeft(0.0f, y, "Size:"); | |||
| drawRight(0.0f, y, getTextBufFileSize(fParameters[kParameterFileSize2])); | |||
| y += lineHeight; | |||
| } | |||
| else | |||
| { | |||
| drawLeft(0.0f, y, "No file loaded"); | |||
| } | |||
| // --------------------------------------------------------------------------------------- | |||
| // File 3 | |||
| y = 245.0f * fScale; | |||
| if (fState[kStateFile3].isNotEmpty()) | |||
| { | |||
| drawLeft(0.0f, y, "Name:"); | |||
| drawRight(0.0f, y, fState[kStateFile3]); | |||
| y += lineHeight; | |||
| drawLeft(0.0f, y, "Size:"); | |||
| drawRight(0.0f, y, getTextBufFileSize(fParameters[kParameterFileSize3])); | |||
| y += lineHeight; | |||
| } | |||
| else | |||
| { | |||
| drawLeft(0.0f, y, "No file loaded"); | |||
| } | |||
| } | |||
| void onResize(const ResizeEvent& ev) override | |||
| { | |||
| fScale = static_cast<float>(ev.size.getHeight())/kInitialHeight; | |||
| UI::onResize(ev); | |||
| } | |||
| void buttonClicked(Button* const button, bool) override | |||
| { | |||
| States stateId = kStateCount; | |||
| /**/ if (button == &fButton1) | |||
| stateId = kStateFile1; | |||
| else if (button == &fButton2) | |||
| stateId = kStateFile2; | |||
| else if (button == &fButton3) | |||
| stateId = kStateFile3; | |||
| if (stateId == kStateCount) | |||
| return; | |||
| requestStateFile(kStateKeys[stateId]); | |||
| } | |||
| // ------------------------------------------------------------------------------------------------------- | |||
| private: | |||
| // Parameters | |||
| float fParameters[kParameterCount]; | |||
| // State (files) | |||
| String fState[kStateCount]; | |||
| Button fButton1, fButton2, fButton3; | |||
| // UI stuff | |||
| float fScale; | |||
| // temp buf for text | |||
| char fStrBuf[0xff]; | |||
| // helpers for putting text into fStrBuf and returning it | |||
| const char* getTextBufFileSize(const float value) | |||
| { | |||
| /**/ if (value > 1024*1024) | |||
| std::snprintf(fStrBuf, 0xfe, "%.2f GiB", value/(1024*1024)); | |||
| else if (value > 1024) | |||
| std::snprintf(fStrBuf, 0xfe, "%.2f MiB", value/1024); | |||
| else | |||
| std::snprintf(fStrBuf, 0xfe, "%.2f KiB", value); | |||
| return fStrBuf; | |||
| } | |||
| // helpers for drawing text | |||
| void drawLeft(const float x, const float y, const char* const text) | |||
| { | |||
| beginPath(); | |||
| fillColor(200, 200, 200); | |||
| textAlign(ALIGN_RIGHT|ALIGN_TOP); | |||
| textBox(x, y, 100 * fScale, text); | |||
| closePath(); | |||
| } | |||
| void drawRight(const float x, const float y, const char* const text) | |||
| { | |||
| beginPath(); | |||
| fillColor(255, 255, 255); | |||
| textAlign(ALIGN_LEFT|ALIGN_TOP); | |||
| textBox(x + (105 * fScale), y, (kInitialWidth - x) * fScale, text); | |||
| closePath(); | |||
| } | |||
| /** | |||
| Set our UI class as non-copyable and add a leak detector just in case. | |||
| */ | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FileHandlingExampleUI) | |||
| }; | |||
| /* ------------------------------------------------------------------------------------------------------------ | |||
| * UI entry point, called by DPF to create a new UI instance. */ | |||
| UI* createUI() | |||
| { | |||
| return new FileHandlingExampleUI(); | |||
| } | |||
| // ----------------------------------------------------------------------------------------------------------- | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -0,0 +1,46 @@ | |||
| #!/usr/bin/make -f | |||
| # Makefile for DISTRHO Plugins # | |||
| # ---------------------------- # | |||
| # Created by falkTX | |||
| # | |||
| # -------------------------------------------------------------- | |||
| # Project name, used for binaries | |||
| NAME = d_files | |||
| # -------------------------------------------------------------- | |||
| # Files to build | |||
| FILES_DSP = \ | |||
| FileHandlingPlugin.cpp | |||
| FILES_UI = \ | |||
| FileHandlingUI.cpp \ | |||
| NanoButton.cpp | |||
| # -------------------------------------------------------------- | |||
| # Do some magic | |||
| include ../../Makefile.plugins.mk | |||
| # -------------------------------------------------------------- | |||
| # Enable all possible plugin types | |||
| ifeq ($(HAVE_JACK),true) | |||
| ifeq ($(HAVE_OPENGL),true) | |||
| TARGETS += jack | |||
| endif | |||
| endif | |||
| ifeq ($(HAVE_OPENGL),true) | |||
| TARGETS += lv2_sep | |||
| else | |||
| TARGETS += lv2_dsp | |||
| endif | |||
| TARGETS += vst | |||
| all: $(TARGETS) | |||
| # -------------------------------------------------------------- | |||
| @@ -0,0 +1,104 @@ | |||
| /* | |||
| * Copyright (C) 2018-2019 Rob van den Berg <rghvdberg at gmail dot org> | |||
| * | |||
| * This file is part of CharacterCompressor | |||
| * | |||
| * Nnjas2 is free software: you can redistribute it and/or modify | |||
| * it under the terms of the GNU General Public License as published by | |||
| * the Free Software Foundation, either version 3 of the License, or | |||
| * (at your option) any later version. | |||
| * | |||
| * CharacterCompressor is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU General Public License | |||
| * along with CharacterCompressor. If not, see <https://www.gnu.org/licenses/>. | |||
| */ | |||
| #include "NanoButton.hpp" | |||
| #include "Window.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| Button::Button(Widget *parent, Callback *cb) | |||
| : NanoWidget(parent), | |||
| fCallback(cb), | |||
| buttonActive(false) | |||
| { | |||
| loadSharedResources(); | |||
| fNanoFont = findFont(NANOVG_DEJAVU_SANS_TTF); | |||
| labelColor = Color(255, 255, 255); | |||
| backgroundColor = Color(32,32,32); | |||
| Label = "button"; | |||
| } | |||
| void Button::onNanoDisplay() | |||
| { | |||
| auto w = getWidth(); | |||
| auto h = getHeight(); | |||
| auto margin = 1.0f; | |||
| // Background | |||
| beginPath(); | |||
| fillColor(backgroundColor); | |||
| strokeColor(borderColor); | |||
| rect(margin, margin, w - 2 * margin, h-2*margin); | |||
| fill(); | |||
| stroke(); | |||
| closePath(); | |||
| //Label | |||
| beginPath(); | |||
| fontFaceId(fNanoFont); | |||
| fontSize(14); | |||
| fillColor(labelColor); | |||
| Rectangle<float> bounds; | |||
| textBounds(0, 0, Label.c_str(), NULL, bounds); | |||
| // float tw = bounds.getWidth(); | |||
| // float th = bounds.getHeight(); | |||
| float tx = w / 2.0f ; | |||
| float ty = h / 2.0f; | |||
| textAlign(ALIGN_CENTER | ALIGN_MIDDLE); | |||
| fillColor(255, 255, 255, 255); | |||
| text(tx, ty, Label.c_str(), NULL); | |||
| closePath(); | |||
| } | |||
| void Button::setLabel(std::string label) | |||
| { | |||
| Label = label; | |||
| } | |||
| void Button::setLabelColor(const Color color) | |||
| { | |||
| labelColor = color; | |||
| borderColor = color; | |||
| } | |||
| void Button::setBackgroundColor(const Color color) | |||
| { | |||
| backgroundColor = color; | |||
| } | |||
| bool Button::onMouse(const MouseEvent &ev) | |||
| { | |||
| if (ev.press & contains(ev.pos)) | |||
| { | |||
| buttonActive = true; | |||
| setLabelColor(labelColor); | |||
| fCallback->buttonClicked(this, true); | |||
| return true; | |||
| } | |||
| else if (buttonActive) | |||
| { | |||
| buttonActive = false; | |||
| //setLabelColor(Color(128,128,128)); | |||
| return true; | |||
| } | |||
| return false; | |||
| } | |||
| END_NAMESPACE_DISTRHO | |||
| @@ -0,0 +1,60 @@ | |||
| /* | |||
| * Copyright (C) 2018-2019 Rob van den Berg <rghvdberg at gmail dot org> | |||
| * | |||
| * This file is part of CharacterCompressor | |||
| * | |||
| * Nnjas2 is free software: you can redistribute it and/or modify | |||
| * it under the terms of the GNU General Public License as published by | |||
| * the Free Software Foundation, either version 3 of the License, or | |||
| * (at your option) any later version. | |||
| * | |||
| * CharacterCompressor is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU General Public License | |||
| * along with CharacterCompressor. If not, see <https://www.gnu.org/licenses/>. | |||
| */ | |||
| #ifndef BUTTON_HPP_INCLUDED | |||
| #define BUTTON_HPP_INCLUDED | |||
| #include "Widget.hpp" | |||
| #include "NanoVG.hpp" | |||
| #include <string> | |||
| START_NAMESPACE_DISTRHO | |||
| class Button : public NanoWidget | |||
| { | |||
| public: | |||
| class Callback | |||
| { | |||
| public: | |||
| virtual ~Callback() {} | |||
| virtual void buttonClicked(Button *button, bool value) = 0; | |||
| }; | |||
| explicit Button(Widget *parent, Callback *cb); | |||
| void setLabel(std::string label); | |||
| void setLabelColor(Color color); | |||
| void setBackgroundColor(Color color); | |||
| protected: | |||
| void onNanoDisplay() override; | |||
| bool onMouse(const MouseEvent &ev) override; | |||
| private: | |||
| std::string Label; | |||
| Color labelColor,backgroundColor,borderColor; | |||
| Callback *const fCallback; | |||
| bool buttonActive; | |||
| FontId fNanoFont; | |||
| DISTRHO_LEAK_DETECTOR(Button) | |||
| }; | |||
| END_NAMESPACE_DISTRHO | |||
| #endif | |||