commit 1f711ed1077bd1b4810cbe3336573d8182b71ea8
parent 94dee0ca4b2e2b66926129d731d3fd0c6502bf15
Author: falkTX <falktx@falktx.com>
Date: Tue, 18 May 2021 04:38:52 +0100
Make ImageButton cairo compatible
Diffstat:
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>;
// -----------------------------------------------------------------------