DPF

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

commit 1f711ed1077bd1b4810cbe3336573d8182b71ea8
parent 94dee0ca4b2e2b66926129d731d3fd0c6502bf15
Author: falkTX <falktx@falktx.com>
Date:   Tue, 18 May 2021 04:38:52 +0100

Make ImageButton cairo compatible

Diffstat:
Mdgl/Cairo.hpp | 1+
Mdgl/ImageBaseWidgets.hpp | 34++++++++++++++++++++++++++++++++++
Mdgl/ImageWidgets.hpp | 32--------------------------------
Mdgl/OpenGL.hpp | 4++++
Mdgl/src/Cairo.cpp | 2++
Mdgl/src/Common.hpp | 11++++++-----
Mdgl/src/ImageBaseWidgets.cpp | 92+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdgl/src/ImageWidgets.cpp | 85+------------------------------------------------------------------------------
Mdgl/src/OpenGL.cpp | 1+
9 files changed, 141 insertions(+), 121 deletions(-)

diff --git a/dgl/Cairo.hpp b/dgl/Cairo.hpp @@ -170,6 +170,7 @@ typedef CairoBaseWidget<StandaloneWindow> CairoStandaloneWindow; // -------------------------------------------------------------------------------------------------------------------- typedef ImageBaseAboutWindow<CairoImage> CairoImageAboutWindow; +typedef ImageBaseButton<CairoImage> CairoImageButton; // -------------------------------------------------------------------------------------------------------------------- diff --git a/dgl/ImageBaseWidgets.hpp b/dgl/ImageBaseWidgets.hpp @@ -18,6 +18,7 @@ #define DGL_IMAGE_BASE_WIDGETS_HPP_INCLUDED #include "StandaloneWindow.hpp" +#include "SubWidget.hpp" START_NAMESPACE_DGL @@ -48,6 +49,39 @@ private: // -------------------------------------------------------------------------------------------------------------------- +template <class ImageType> +class ImageBaseButton : public SubWidget +{ +public: + class Callback + { + public: + virtual ~Callback() {} + virtual void imageButtonClicked(ImageBaseButton* imageButton, int button) = 0; + }; + + explicit ImageBaseButton(Widget* parentWidget, const ImageType& image); + explicit ImageBaseButton(Widget* parentWidget, const ImageType& imageNormal, const ImageType& imageDown); + explicit ImageBaseButton(Widget* parentWidget, const ImageType& imageNormal, const ImageType& imageHover, const ImageType& imageDown); + + ~ImageBaseButton() override; + + void setCallback(Callback* callback) noexcept; + +protected: + void onDisplay() override; + bool onMouse(const MouseEvent&) override; + bool onMotion(const MotionEvent&) override; + +private: + struct PrivateData; + PrivateData* const pData; + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ImageBaseButton) +}; + +// -------------------------------------------------------------------------------------------------------------------- + END_NAMESPACE_DGL #endif // DGL_IMAGE_BASE_WIDGETS_HPP_INCLUDED diff --git a/dgl/ImageWidgets.hpp b/dgl/ImageWidgets.hpp @@ -31,38 +31,6 @@ START_NAMESPACE_DGL // ----------------------------------------------------------------------- -class ImageButton : public SubWidget -{ -public: - class Callback - { - public: - virtual ~Callback() {} - virtual void imageButtonClicked(ImageButton* imageButton, int button) = 0; - }; - - explicit ImageButton(Widget* parentWidget, const Image& image); - explicit ImageButton(Widget* parentWidget, const Image& imageNormal, const Image& imageDown); - explicit ImageButton(Widget* parentWidget, const Image& imageNormal, const Image& imageHover, const Image& imageDown); - - ~ImageButton() override; - - void setCallback(Callback* callback) noexcept; - -protected: - void onDisplay() override; - bool onMouse(const MouseEvent&) override; - bool onMotion(const MotionEvent&) override; - -private: - struct PrivateData; - PrivateData* const pData; - - DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ImageButton) -}; - -// ----------------------------------------------------------------------- - class ImageKnob : public SubWidget { public: diff --git a/dgl/OpenGL.hpp b/dgl/OpenGL.hpp @@ -281,10 +281,14 @@ private: // ----------------------------------------------------------------------- typedef ImageBaseAboutWindow<OpenGLImage> OpenGLImageAboutWindow; +typedef ImageBaseButton<OpenGLImage> OpenGLImageButton; DISTRHO_DEPRECATED_BY("OpenGLImageAboutWindow") typedef OpenGLImageAboutWindow ImageAboutWindow; +DISTRHO_DEPRECATED_BY("OpenGLImageButton") +typedef OpenGLImageButton ImageButton; + // ----------------------------------------------------------------------- END_NAMESPACE_DGL diff --git a/dgl/src/Cairo.cpp b/dgl/src/Cairo.cpp @@ -16,6 +16,7 @@ #include "../Cairo.hpp" #include "../Color.hpp" +#include "../ImageBaseWidgets.hpp" #include "SubWidgetPrivateData.hpp" #include "TopLevelWidgetPrivateData.hpp" @@ -468,6 +469,7 @@ void ImageBaseAboutWindow<CairoImage>::onDisplay() } template class ImageBaseAboutWindow<CairoImage>; +template class ImageBaseButton<CairoImage>; // ----------------------------------------------------------------------- diff --git a/dgl/src/Common.hpp b/dgl/src/Common.hpp @@ -17,12 +17,13 @@ #ifndef DGL_COMMON_HPP_INCLUDED #define DGL_COMMON_HPP_INCLUDED -#include "../ImageWidgets.hpp" +#include "../ImageBaseWidgets.hpp" START_NAMESPACE_DGL // ----------------------------------------------------------------------- +template <class ImageType> struct ButtonImpl { enum State { kStateNormal = 0, @@ -32,11 +33,11 @@ struct ButtonImpl { int button; int state; - SubWidget* self; + ImageBaseButton<ImageType>* const self; - ImageButton::Callback* callback_img; + typename ImageBaseButton<ImageType>::Callback* callback_img; - ButtonImpl(SubWidget* const s) noexcept + explicit ButtonImpl(ImageBaseButton<ImageType>* const s) noexcept : button(-1), state(kStateNormal), self(s), @@ -66,7 +67,7 @@ struct ButtonImpl { self->repaint(); if (callback_img != nullptr) - callback_img->imageButtonClicked((ImageButton*)self, button2); + callback_img->imageButtonClicked(self, button2); return true; } diff --git a/dgl/src/ImageBaseWidgets.cpp b/dgl/src/ImageBaseWidgets.cpp @@ -15,6 +15,7 @@ */ #include "../ImageBaseWidgets.hpp" +#include "Common.hpp" START_NAMESPACE_DGL @@ -88,4 +89,95 @@ void ImageBaseAboutWindow<ImageType>::onReshape(uint width, uint height) // -------------------------------------------------------------------------------------------------------------------- +template <class ImageType> +struct ImageBaseButton<ImageType>::PrivateData { + ButtonImpl<ImageType> impl; + ImageType imageNormal; + ImageType imageHover; + ImageType imageDown; + + PrivateData(ImageBaseButton<ImageType>* const s, const ImageType& normal, const ImageType& hover, const ImageType& down) + : impl(s), + imageNormal(normal), + imageHover(hover), + imageDown(down) {} + + DISTRHO_DECLARE_NON_COPY_STRUCT(PrivateData) +}; + +// -------------------------------------------------------------------------------------------------------------------- + +template <class ImageType> +ImageBaseButton<ImageType>::ImageBaseButton(Widget* const parentWidget, const ImageType& image) + : SubWidget(parentWidget), + pData(new PrivateData(this, image, image, image)) +{ + setSize(image.getSize()); +} + +template <class ImageType> +ImageBaseButton<ImageType>::ImageBaseButton(Widget* const parentWidget, const ImageType& imageNormal, const ImageType& imageDown) + : SubWidget(parentWidget), + pData(new PrivateData(this, imageNormal, imageNormal, imageDown)) +{ + DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageDown.getSize()); + + setSize(imageNormal.getSize()); +} + +template <class ImageType> +ImageBaseButton<ImageType>::ImageBaseButton(Widget* const parentWidget, const ImageType& imageNormal, const ImageType& imageHover, const ImageType& imageDown) + : SubWidget(parentWidget), + pData(new PrivateData(this, imageNormal, imageHover, imageDown)) +{ + DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageHover.getSize() && imageHover.getSize() == imageDown.getSize()); + + setSize(imageNormal.getSize()); +} + +template <class ImageType> +ImageBaseButton<ImageType>::~ImageBaseButton() +{ + delete pData; +} + +template <class ImageType> +void ImageBaseButton<ImageType>::setCallback(Callback* callback) noexcept +{ + pData->impl.callback_img = callback; +} + +template <class ImageType> +void ImageBaseButton<ImageType>::onDisplay() +{ + const GraphicsContext& context(getGraphicsContext()); + + switch (pData->impl.state) + { + case ButtonImpl<ImageType>::kStateDown: + pData->imageDown.draw(context); + break; + case ButtonImpl<ImageType>::kStateHover: + pData->imageHover.draw(context); + break; + default: + pData->imageNormal.draw(context); + break; + } +} + +template <class ImageType> +bool ImageBaseButton<ImageType>::onMouse(const MouseEvent& ev) +{ + return pData->impl.onMouse(ev); +} + +template <class ImageType> +bool ImageBaseButton<ImageType>::onMotion(const MotionEvent& ev) +{ + return pData->impl.onMotion(ev); +} + +// -------------------------------------------------------------------------------------------------------------------- + END_NAMESPACE_DGL diff --git a/dgl/src/ImageWidgets.cpp b/dgl/src/ImageWidgets.cpp @@ -14,10 +14,7 @@ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include "../Image.hpp" -#include "../ImageBaseWidgets.hpp" - -#include "Common.hpp" +#include "../ImageWidgets.hpp" #include "WidgetPrivateData.hpp" // TODO make this code more generic and move GL specific bits to OpenGL.cpp @@ -33,86 +30,6 @@ START_NAMESPACE_DGL // ----------------------------------------------------------------------- -struct ImageButton::PrivateData { - ButtonImpl impl; - Image imageNormal; - Image imageHover; - Image imageDown; - - PrivateData(SubWidget* const s, const Image& normal, const Image& hover, const Image& down) - : impl(s), - imageNormal(normal), - imageHover(hover), - imageDown(down) {} - - DISTRHO_DECLARE_NON_COPY_STRUCT(PrivateData) -}; - -// ----------------------------------------------------------------------- - -ImageButton::ImageButton(Widget* const parentWidget, const Image& image) - : SubWidget(parentWidget), - pData(new PrivateData(this, image, image, image)) -{ - setSize(image.getSize()); -} - -ImageButton::ImageButton(Widget* const parentWidget, const Image& imageNormal, const Image& imageDown) - : SubWidget(parentWidget), - pData(new PrivateData(this, imageNormal, imageNormal, imageDown)) -{ - DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageDown.getSize()); - - setSize(imageNormal.getSize()); -} - -ImageButton::ImageButton(Widget* const parentWidget, const Image& imageNormal, const Image& imageHover, const Image& imageDown) - : SubWidget(parentWidget), - pData(new PrivateData(this, imageNormal, imageHover, imageDown)) -{ - DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageHover.getSize() && imageHover.getSize() == imageDown.getSize()); - - setSize(imageNormal.getSize()); -} - -ImageButton::~ImageButton() -{ - delete pData; -} - -void ImageButton::setCallback(Callback* callback) noexcept -{ - pData->impl.callback_img = callback; -} - -void ImageButton::onDisplay() -{ - switch (pData->impl.state) - { - case ButtonImpl::kStateDown: - pData->imageDown.draw(); - break; - case ButtonImpl::kStateHover: - pData->imageHover.draw(); - break; - default: - pData->imageNormal.draw(); - break; - } -} - -bool ImageButton::onMouse(const MouseEvent& ev) -{ - return pData->impl.onMouse(ev); -} - -bool ImageButton::onMotion(const MotionEvent& ev) -{ - return pData->impl.onMotion(ev); -} - -// ----------------------------------------------------------------------- - ImageKnob::ImageKnob(Widget* const parentWidget, const Image& image, Orientation orientation) noexcept : SubWidget(parentWidget), fImage(image), diff --git a/dgl/src/OpenGL.cpp b/dgl/src/OpenGL.cpp @@ -444,6 +444,7 @@ void ImageBaseAboutWindow<OpenGLImage>::onDisplay() } template class ImageBaseAboutWindow<OpenGLImage>; +template class ImageBaseButton<OpenGLImage>; // -----------------------------------------------------------------------