DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit e5df7030c2cf49478f15ed0831c215137ddb8b59
parent 03d53ea7e778a3943b432164e7d7edd1c51d28ff
Author: falkTX <falktx@falktx.com>
Date:   Sat, 14 Aug 2021 20:38:42 +0100

Rework file handling example button, add a note for later

Signed-off-by: falkTX <falktx@falktx.com>

Diffstat:
Mdgl/EventHandlers.hpp | 11+++++++++++
Mexamples/FileHandling/FileHandlingUI.cpp | 20++++++++++++--------
Mexamples/FileHandling/NanoButton.cpp | 84+++++++++++++++++++++++++++++++++++++++----------------------------------------
Mexamples/FileHandling/NanoButton.hpp | 39++++++++++++++++++---------------------
4 files changed, 82 insertions(+), 72 deletions(-)

diff --git a/dgl/EventHandlers.hpp b/dgl/EventHandlers.hpp @@ -21,6 +21,17 @@ START_NAMESPACE_DGL +/* NOTE none of these classes get assigned to a widget automatically + Manual plugging into Widget events is needed, like so: + + ``` + bool onMouse(const MouseEvent& ev) override + { + return ButtonEventHandler::mouseEvent(ev); + } + ``` +*/ + // -------------------------------------------------------------------------------------------------------------------- class ButtonEventHandler diff --git a/examples/FileHandling/FileHandlingUI.cpp b/examples/FileHandling/FileHandlingUI.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2020 Filipe Coelho <falktx@falktx.com> + * Copyright (C) 2012-2021 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 @@ -33,7 +33,7 @@ const char* kStateKeys[kStateCount] = { // ----------------------------------------------------------------------------------------------------------- -static void setupButton(Button& btn, int y) +inline void setupButton(Button& btn, const int y) { btn.setAbsolutePos(5, y); btn.setLabel("Open..."); @@ -41,7 +41,7 @@ static void setupButton(Button& btn, int y) } class FileHandlingExampleUI : public UI, - public Button::Callback + public ButtonEventHandler::Callback { public: static const uint kInitialWidth = 600; @@ -67,7 +67,7 @@ public: loadSharedResources(); #endif - setGeometryConstraints(kInitialWidth, kInitialHeight, true); + setGeometryConstraints(kInitialWidth, kInitialHeight, false); } protected: @@ -193,18 +193,22 @@ protected: fButton2.setSize(100*fScale, 30*fScale); fButton3.setSize(100*fScale, 30*fScale); + fButton1.setFontScale(fScale); + fButton2.setFontScale(fScale); + fButton3.setFontScale(fScale); + UI::onResize(ev); } - void buttonClicked(Button* const button, bool) override + void buttonClicked(SubWidget* const widget, int) override { States stateId; - /**/ if (button == &fButton1) + /**/ if (widget == &fButton1) stateId = kStateFile1; - else if (button == &fButton2) + else if (widget == &fButton2) stateId = kStateFile2; - else if (button == &fButton3) + else if (widget == &fButton3) stateId = kStateFile3; else return; diff --git a/examples/FileHandling/NanoButton.cpp b/examples/FileHandling/NanoButton.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2018-2019 Rob van den Berg <rghvdberg at gmail dot org> + * Copyright (C) 2020-2021 Filipe Coelho <falktx@falktx.com> * * This file is part of CharacterCompressor * @@ -22,16 +23,40 @@ START_NAMESPACE_DGL -Button::Button(Widget *parent, Callback *cb) +Button::Button(Widget* const parent, ButtonEventHandler::Callback* const cb) : NanoWidget(parent), - fCallback(cb), - buttonActive(false) + ButtonEventHandler(this), + backgroundColor(32, 32, 32), + labelColor(255, 255, 255), + label("button"), + fontScale(1.0f) { +#ifdef DGL_NO_SHARED_RESOURCES + createFontFromFile("sans", "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf"); +#else loadSharedResources(); - fNanoFont = findFont(NANOVG_DEJAVU_SANS_TTF); - labelColor = Color(255, 255, 255); - backgroundColor = Color(32,32,32); - Label = "button"; +#endif + ButtonEventHandler::setCallback(cb); +} + +void Button::setBackgroundColor(const Color color) +{ + backgroundColor = color; +} + +void Button::setFontScale(const float scale) +{ + fontScale = scale; +} + +void Button::setLabel(const std::string& label2) +{ + label = label2; +} + +void Button::setLabelColor(const Color color) +{ + labelColor = color; } void Button::onNanoDisplay() @@ -43,62 +68,35 @@ void Button::onNanoDisplay() // Background beginPath(); fillColor(backgroundColor); - strokeColor(borderColor); + strokeColor(labelColor); rect(margin, margin, w - 2 * margin, h - 2 * margin); fill(); stroke(); closePath(); - //Label + // Label beginPath(); - fontFaceId(fNanoFont); - fontSize(14); + fontSize(14 * fontScale); fillColor(labelColor); Rectangle<float> bounds; - textBounds(0, 0, Label.c_str(), NULL, bounds); - // float tw = bounds.getWidth(); - // float th = bounds.getHeight(); + textBounds(0, 0, label.c_str(), NULL, bounds); 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); + text(tx, ty, label.c_str(), NULL); closePath(); } -void Button::setLabel(std::string label) +bool Button::onMouse(const MouseEvent& ev) { - Label = label; + return ButtonEventHandler::mouseEvent(ev); } -void Button::setLabelColor(const Color color) +bool Button::onMotion(const MotionEvent& ev) { - 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; + return ButtonEventHandler::motionEvent(ev); } END_NAMESPACE_DGL diff --git a/examples/FileHandling/NanoButton.hpp b/examples/FileHandling/NanoButton.hpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2018-2019 Rob van den Berg <rghvdberg at gmail dot org> + * Copyright (C) 2020-2021 Filipe Coelho <falktx@falktx.com> * * This file is part of CharacterCompressor * @@ -17,44 +18,40 @@ * along with CharacterCompressor. If not, see <https://www.gnu.org/licenses/>. */ -#ifndef BUTTON_HPP_INCLUDED -#define BUTTON_HPP_INCLUDED +#ifndef NANO_BUTTON_HPP_INCLUDED +#define NANO_BUTTON_HPP_INCLUDED -#include "Widget.hpp" #include "NanoVG.hpp" #include <string> START_NAMESPACE_DGL -class Button : public NanoSubWidget +class Button : public NanoSubWidget, + public ButtonEventHandler { 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); + explicit Button(Widget* parent, ButtonEventHandler::Callback* cb); + void setBackgroundColor(Color color); + void setFontScale(float scale); + void setLabel(const std::string& label); + void setLabelColor(Color color); protected: void onNanoDisplay() override; - bool onMouse(const MouseEvent &ev) override; + bool onMouse(const MouseEvent& ev) override; + bool onMotion(const MotionEvent& ev) override; private: - std::string Label; - Color labelColor,backgroundColor,borderColor; - Callback *const fCallback; - bool buttonActive; - FontId fNanoFont; + Color backgroundColor; + Color labelColor; + std::string label; + float fontScale; + DISTRHO_LEAK_DETECTOR(Button) }; END_NAMESPACE_DGL -#endif +#endif // NANO_BUTTON_HPP_INCLUDED