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 |