From e5df7030c2cf49478f15ed0831c215137ddb8b59 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sat, 14 Aug 2021 20:39:09 +0100 Subject: [PATCH] Rework file handling example button, add a note for later Signed-off-by: falkTX --- dgl/EventHandlers.hpp | 11 ++++ examples/FileHandling/FileHandlingUI.cpp | 20 +++--- examples/FileHandling/NanoButton.cpp | 84 ++++++++++++------------ examples/FileHandling/NanoButton.hpp | 39 +++++------ 4 files changed, 82 insertions(+), 72 deletions(-) diff --git a/dgl/EventHandlers.hpp b/dgl/EventHandlers.hpp index ecfda08f..dddeb427 100644 --- 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 index 1983ee7b..6520bea1 100644 --- a/examples/FileHandling/FileHandlingUI.cpp +++ b/examples/FileHandling/FileHandlingUI.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2020 Filipe Coelho + * Copyright (C) 2012-2021 Filipe Coelho * * 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 index e5282a11..106ccff1 100644 --- a/examples/FileHandling/NanoButton.cpp +++ b/examples/FileHandling/NanoButton.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2018-2019 Rob van den Berg + * Copyright (C) 2020-2021 Filipe Coelho * * 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 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 index c1efd40d..77f9bc6e 100644 --- a/examples/FileHandling/NanoButton.hpp +++ b/examples/FileHandling/NanoButton.hpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2018-2019 Rob van den Berg + * Copyright (C) 2020-2021 Filipe Coelho * * This file is part of CharacterCompressor * @@ -17,44 +18,40 @@ * along with CharacterCompressor. If not, see . */ -#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 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