DPF

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

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:
Mdgl/Cairo.hpp | 72++++++++++++++++++++++++++++++++++++++++++++----------------------------
Mdgl/NanoVG.hpp | 8+++++++-
Mdgl/StandaloneWindow.hpp | 4++--
Mdgl/src/Cairo.cpp | 31+++++++++++++++++++++++++++++++
Mdgl/src/NanoVG.cpp | 19++++++++++---------
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>;