diff --git a/dgl/Cairo.hpp b/dgl/Cairo.hpp index 9345dbb0..dbf7f338 100644 --- 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 @@ -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 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 CairoSubWidget; +typedef CairoWidget CairoTopLevelWidget; +typedef CairoWidget CairoStandaloneWindow; + // -------------------------------------------------------------------------------------------------------------------- typedef ImageBaseAboutWindow CairoImageAboutWindow; diff --git a/dgl/NanoVG.hpp b/dgl/NanoVG.hpp index 584a5977..1edf16fe 100644 --- a/dgl/NanoVG.hpp +++ b/dgl/NanoVG.hpp @@ -895,11 +895,17 @@ 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. */ diff --git a/dgl/StandaloneWindow.hpp b/dgl/StandaloneWindow.hpp index fad3354e..148626fa 100644 --- 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 index a946b374..9843ae7f 100644 --- a/dgl/src/Cairo.cpp +++ b/dgl/src/Cairo.cpp @@ -144,6 +144,37 @@ void CairoImage::drawAt(const GraphicsContext&, const Point&) { } +// ----------------------------------------------------------------------- +// CairoSubWidget + +template <> +CairoWidget::CairoWidget(Widget* const parent) + : SubWidget(parent) {} + +template class CairoWidget; + +// ----------------------------------------------------------------------- +// CairoTopLevelWidget + +template <> +CairoWidget::CairoWidget(Window& windowToMapTo) + : TopLevelWidget(windowToMapTo) {} + +template class CairoWidget; + +// ----------------------------------------------------------------------- +// CairoStandaloneWindow + +template <> +CairoWidget::CairoWidget(Application& app) + : StandaloneWindow(app) {} + +template <> +CairoWidget::CairoWidget(Application& app, Window& parentWindow) + : StandaloneWindow(app, parentWindow) {} + +template class CairoWidget; + // ----------------------------------------------------------------------- template <> diff --git a/dgl/src/NanoVG.cpp b/dgl/src/NanoVG.cpp index f777ae76..70f6e503 100644 --- a/dgl/src/NanoVG.cpp +++ b/dgl/src/NanoVG.cpp @@ -943,7 +943,7 @@ bool NanoVG::loadSharedResources() #endif // ----------------------------------------------------------------------- -// SubWidget +// NanoSubWidget template <> NanoWidget::NanoWidget(Widget* const parent, int flags) @@ -956,26 +956,27 @@ NanoWidget::NanoWidget(Widget* const parent, int flags) template class NanoWidget; // ----------------------------------------------------------------------- -// TopLevelWidget +// NanoTopLevelWidget template <> NanoWidget::NanoWidget(Window& windowToMapTo, int flags) : TopLevelWidget(windowToMapTo), - NanoVG(flags) -{ -} + NanoVG(flags) {} template class NanoWidget; // ----------------------------------------------------------------------- -// StandaloneWindow +// NanoStandaloneWindow template <> NanoWidget::NanoWidget(Application& app, int flags) : StandaloneWindow(app), - NanoVG(flags) -{ -} + NanoVG(flags) {} + +template <> +NanoWidget::NanoWidget(Application& app, Window& parentWindow, int flags) + : StandaloneWindow(app, parentWindow), + NanoVG(flags) {} template class NanoWidget;