commit f55f3c85ae9c543f3c767559fdedd075f0840340
parent 077b572d56a1e07c66e7b0e6ee4265703c99cd9e
Author: falkTX <falktx@falktx.com>
Date: Mon, 17 May 2021 00:15:01 +0100
Make CairoWidget a templated class, just like done with NanoVG
Diffstat:
5 files changed, 94 insertions(+), 40 deletions(-)
diff --git a/dgl/Cairo.hpp b/dgl/Cairo.hpp
@@ -20,7 +20,6 @@
#include "ImageBase.hpp"
#include "ImageBaseWidgets.hpp"
#include "SubWidget.hpp"
-#include "TopLevelWidget.hpp"
#include <cairo/cairo.h>
@@ -86,49 +85,66 @@ public:
// --------------------------------------------------------------------------------------------------------------------
/**
- Cairo SubWidget, handy class that takes graphics context during onDisplay and passes it in a new function.
+ CairoWidget, handy class that takes graphics context during onDisplay and passes it in a new function.
*/
-class CairoSubWidget : public SubWidget
+template <class BaseWidget>
+class CairoWidget : public BaseWidget
{
public:
- CairoSubWidget(Widget* widgetToGroupTo)
- : SubWidget(widgetToGroupTo) {}
-
-protected:
- void onDisplay() override
- {
- const CairoGraphicsContext& context((const CairoGraphicsContext&)getGraphicsContext());
- onCairoDisplay(context);
- }
+ /**
+ Constructor for a CairoSubWidget.
+ @see CreateFlags
+ */
+ explicit CairoWidget(Widget* const parentGroupWidget);
- virtual void onCairoDisplay(const CairoGraphicsContext& context) = 0;
+ /**
+ Constructor for a CairoTopLevelWidget.
+ @see CreateFlags
+ */
+ explicit CairoWidget(Window& windowToMapTo);
- DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CairoSubWidget);
-};
+ /**
+ Constructor for a CairoStandaloneWindow without parent window.
+ @see CreateFlags
+ */
+ explicit CairoWidget(Application& app);
-// --------------------------------------------------------------------------------------------------------------------
+ /**
+ Constructor for a CairoStandaloneWindow with parent window.
+ @see CreateFlags
+ */
+ explicit CairoWidget(Application& app, Window& parentWindow);
-/**
- Cairo TopLevelWidget, handy class that takes graphics context during onDisplay and passes it in a new function.
- */
-class CairoTopLevelWidget : public TopLevelWidget
-{
-public:
- CairoTopLevelWidget(Window& windowToMapTo)
- : TopLevelWidget(windowToMapTo) {}
+ /**
+ Destructor.
+ */
+ virtual ~CairoWidget() {}
protected:
+ /**
+ New virtual onDisplay function.
+ @see onDisplay
+ */
+ virtual void onCairoDisplay(const CairoGraphicsContext& context) = 0;
+
+private:
+ /**
+ Widget display function.
+ Implemented internally to wrap begin/endFrame() automatically.
+ */
void onDisplay() override
{
- const CairoGraphicsContext& context((const CairoGraphicsContext&)getGraphicsContext());
+ const CairoGraphicsContext& context((const CairoGraphicsContext&)BaseWidget::getGraphicsContext());
onCairoDisplay(context);
}
- virtual void onCairoDisplay(const CairoGraphicsContext& context) = 0;
-
- DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CairoTopLevelWidget);
+ DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CairoWidget);
};
+typedef CairoWidget<SubWidget> CairoSubWidget;
+typedef CairoWidget<TopLevelWidget> CairoTopLevelWidget;
+typedef CairoWidget<StandaloneWindow> CairoStandaloneWindow;
+
// --------------------------------------------------------------------------------------------------------------------
typedef ImageBaseAboutWindow<CairoImage> CairoImageAboutWindow;
diff --git a/dgl/NanoVG.hpp b/dgl/NanoVG.hpp
@@ -895,12 +895,18 @@ public:
explicit NanoWidget(Window& windowToMapTo, int flags = CREATE_ANTIALIAS);
/**
- Constructor for a NanoStandaloneWindow.
+ Constructor for a NanoStandaloneWindow without parent window.
@see CreateFlags
*/
explicit NanoWidget(Application& app, int flags = CREATE_ANTIALIAS);
/**
+ Constructor for a NanoStandaloneWindow with parent window.
+ @see CreateFlags
+ */
+ explicit NanoWidget(Application& app, Window& parentWindow, int flags = CREATE_ANTIALIAS);
+
+ /**
Destructor.
*/
virtual ~NanoWidget() {}
diff --git a/dgl/StandaloneWindow.hpp b/dgl/StandaloneWindow.hpp
@@ -38,8 +38,8 @@ public:
/**
Constructor with parent window, typically used to run as modal.
*/
- StandaloneWindow(Application& app, Window& parent)
- : Window(app, parent),
+ StandaloneWindow(Application& app, Window& parentWindow)
+ : Window(app, parentWindow),
TopLevelWidget((Window&)*this) {}
/**
diff --git a/dgl/src/Cairo.cpp b/dgl/src/Cairo.cpp
@@ -145,6 +145,37 @@ void CairoImage::drawAt(const GraphicsContext&, const Point<int>&)
}
// -----------------------------------------------------------------------
+// CairoSubWidget
+
+template <>
+CairoWidget<SubWidget>::CairoWidget(Widget* const parent)
+ : SubWidget(parent) {}
+
+template class CairoWidget<SubWidget>;
+
+// -----------------------------------------------------------------------
+// CairoTopLevelWidget
+
+template <>
+CairoWidget<TopLevelWidget>::CairoWidget(Window& windowToMapTo)
+ : TopLevelWidget(windowToMapTo) {}
+
+template class CairoWidget<TopLevelWidget>;
+
+// -----------------------------------------------------------------------
+// CairoStandaloneWindow
+
+template <>
+CairoWidget<StandaloneWindow>::CairoWidget(Application& app)
+ : StandaloneWindow(app) {}
+
+template <>
+CairoWidget<StandaloneWindow>::CairoWidget(Application& app, Window& parentWindow)
+ : StandaloneWindow(app, parentWindow) {}
+
+template class CairoWidget<StandaloneWindow>;
+
+// -----------------------------------------------------------------------
template <>
void ImageBaseAboutWindow<CairoImage>::onDisplay()
diff --git a/dgl/src/NanoVG.cpp b/dgl/src/NanoVG.cpp
@@ -943,7 +943,7 @@ bool NanoVG::loadSharedResources()
#endif
// -----------------------------------------------------------------------
-// SubWidget
+// NanoSubWidget
template <>
NanoWidget<SubWidget>::NanoWidget(Widget* const parent, int flags)
@@ -956,26 +956,27 @@ NanoWidget<SubWidget>::NanoWidget(Widget* const parent, int flags)
template class NanoWidget<SubWidget>;
// -----------------------------------------------------------------------
-// TopLevelWidget
+// NanoTopLevelWidget
template <>
NanoWidget<TopLevelWidget>::NanoWidget(Window& windowToMapTo, int flags)
: TopLevelWidget(windowToMapTo),
- NanoVG(flags)
-{
-}
+ NanoVG(flags) {}
template class NanoWidget<TopLevelWidget>;
// -----------------------------------------------------------------------
-// StandaloneWindow
+// NanoStandaloneWindow
template <>
NanoWidget<StandaloneWindow>::NanoWidget(Application& app, int flags)
: StandaloneWindow(app),
- NanoVG(flags)
-{
-}
+ NanoVG(flags) {}
+
+template <>
+NanoWidget<StandaloneWindow>::NanoWidget(Application& app, Window& parentWindow, int flags)
+ : StandaloneWindow(app, parentWindow),
+ NanoVG(flags) {}
template class NanoWidget<StandaloneWindow>;