@@ -89,6 +89,7 @@ private: | |||||
void setAbsoluteY(int) const noexcept {} | void setAbsoluteY(int) const noexcept {} | ||||
void setAbsolutePos(int, int) const noexcept {} | void setAbsolutePos(int, int) const noexcept {} | ||||
void setAbsolutePos(const Point<int>&) const noexcept {} | void setAbsolutePos(const Point<int>&) const noexcept {} | ||||
void setNeedsFullViewport(bool) const noexcept {} | |||||
DISTRHO_LEAK_DETECTOR(ImageSlider) | DISTRHO_LEAK_DETECTOR(ImageSlider) | ||||
}; | }; | ||||
@@ -770,7 +770,7 @@ public: | |||||
int textBreakLines(const char* string, const char* end, float breakRowWidth, TextRow* rows, int maxRows); | int textBreakLines(const char* string, const char* end, float breakRowWidth, TextRow* rows, int maxRows); | ||||
private: | private: | ||||
NVGcontext* fContext; | |||||
NVGcontext* const fContext; | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NanoVG) | DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NanoVG) | ||||
}; | }; | ||||
@@ -782,7 +782,8 @@ private: | |||||
NanoVG Widget class. | NanoVG Widget class. | ||||
This class implements the NanoVG drawing API inside a DGL Widget. | This class implements the NanoVG drawing API inside a DGL Widget. | ||||
onDisplay is implemented internally. | |||||
The drawing function onDisplay() is implemented internally but a | |||||
new onNanoDisplay() needs to be overridden instead. | |||||
*/ | */ | ||||
class NanoWidget : public Widget, | class NanoWidget : public Widget, | ||||
public NanoVG | public NanoVG | ||||
@@ -51,17 +51,23 @@ protected: | |||||
private: | private: | ||||
Widget* fWidget; | Widget* fWidget; | ||||
void _addWidget(Widget* const widget) override | |||||
void _addWidget(Widget* widget) override | |||||
{ | { | ||||
if (fWidget == nullptr) | if (fWidget == nullptr) | ||||
{ | |||||
fWidget = widget; | fWidget = widget; | ||||
fWidget->setNeedsFullViewport(true); | |||||
} | |||||
Window::_addWidget(widget); | Window::_addWidget(widget); | ||||
} | } | ||||
void _removeWidget(Widget* const widget) override | |||||
void _removeWidget(Widget* widget) override | |||||
{ | { | ||||
if (fWidget == widget) | if (fWidget == widget) | ||||
{ | |||||
fWidget->setNeedsFullViewport(false); | |||||
fWidget = nullptr; | fWidget = nullptr; | ||||
} | |||||
Window::_removeWidget(widget); | Window::_removeWidget(widget); | ||||
} | } | ||||
@@ -159,12 +159,6 @@ public: | |||||
*/ | */ | ||||
void hide(); | void hide(); | ||||
/** | |||||
Tell the parent window this widget this the full viewport. | |||||
When enabled, the local widget coordinates are ignored. | |||||
*/ | |||||
void setNeedsFullViewport(bool yesNo) noexcept; | |||||
/** | /** | ||||
Get width. | Get width. | ||||
*/ | */ | ||||
@@ -302,6 +296,14 @@ protected: | |||||
*/ | */ | ||||
virtual void onResize(const ResizeEvent&); | virtual void onResize(const ResizeEvent&); | ||||
/** | |||||
Tell the parent window this widget this the full viewport. | |||||
When enabled, the local widget coordinates are ignored. | |||||
@note: This is an internal function; | |||||
You do not need it under normal circumstances. | |||||
*/ | |||||
void setNeedsFullViewport(bool yesNo) noexcept; | |||||
private: | private: | ||||
Window& fParent; | Window& fParent; | ||||
bool fNeedsFullViewport; | bool fNeedsFullViewport; | ||||
@@ -37,7 +37,7 @@ ImageSlider::ImageSlider(Window& parent, const Image& image, int id) noexcept | |||||
fStartedY(0), | fStartedY(0), | ||||
fCallback(nullptr) | fCallback(nullptr) | ||||
{ | { | ||||
setNeedsFullViewport(true); | |||||
Widget::setNeedsFullViewport(true); | |||||
} | } | ||||
ImageSlider::ImageSlider(Widget* widget, const Image& image, int id) noexcept | ImageSlider::ImageSlider(Widget* widget, const Image& image, int id) noexcept | ||||
@@ -55,7 +55,7 @@ ImageSlider::ImageSlider(Widget* widget, const Image& image, int id) noexcept | |||||
fStartedY(0), | fStartedY(0), | ||||
fCallback(nullptr) | fCallback(nullptr) | ||||
{ | { | ||||
setNeedsFullViewport(true); | |||||
Widget::setNeedsFullViewport(true); | |||||
} | } | ||||
ImageSlider::ImageSlider(const ImageSlider& imageSlider) noexcept | ImageSlider::ImageSlider(const ImageSlider& imageSlider) noexcept | ||||
@@ -76,7 +76,7 @@ ImageSlider::ImageSlider(const ImageSlider& imageSlider) noexcept | |||||
fEndPos(imageSlider.fEndPos), | fEndPos(imageSlider.fEndPos), | ||||
fSliderArea(imageSlider.fSliderArea) | fSliderArea(imageSlider.fSliderArea) | ||||
{ | { | ||||
setNeedsFullViewport(true); | |||||
Widget::setNeedsFullViewport(true); | |||||
} | } | ||||
int ImageSlider::getId() const noexcept | int ImageSlider::getId() const noexcept | ||||
@@ -59,11 +59,6 @@ void Widget::hide() | |||||
setVisible(false); | setVisible(false); | ||||
} | } | ||||
void Widget::setNeedsFullViewport(bool yesNo) noexcept | |||||
{ | |||||
fNeedsFullViewport = yesNo; | |||||
} | |||||
int Widget::getWidth() const noexcept | int Widget::getWidth() const noexcept | ||||
{ | { | ||||
return fArea.getWidth(); | return fArea.getWidth(); | ||||
@@ -230,6 +225,11 @@ void Widget::onResize(const ResizeEvent&) | |||||
{ | { | ||||
} | } | ||||
void Widget::setNeedsFullViewport(bool yesNo) noexcept | |||||
{ | |||||
fNeedsFullViewport = yesNo; | |||||
} | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
END_NAMESPACE_DGL | END_NAMESPACE_DGL |
@@ -22,12 +22,19 @@ | |||||
#include "../dgl/Widget.hpp" | #include "../dgl/Widget.hpp" | ||||
#if DISTRHO_UI_USE_NANOVG | |||||
# include "../dgl/NanoVG.hpp" | |||||
typedef DGL::NanoWidget UIWidget; | |||||
#else | |||||
typedef DGL::Widget UIWidget; | |||||
#endif | |||||
START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// UI | // UI | ||||
class UI : public DGL::Widget | |||||
class UI : public UIWidget | |||||
{ | { | ||||
public: | public: | ||||
UI(); | UI(); | ||||
@@ -91,6 +98,13 @@ private: | |||||
friend class UIExporter; | friend class UIExporter; | ||||
friend class UIExporterWindow; | friend class UIExporterWindow; | ||||
// these should not be used | |||||
void setAbsoluteX(int) const noexcept {} | |||||
void setAbsoluteY(int) const noexcept {} | |||||
void setAbsolutePos(int, int) const noexcept {} | |||||
void setAbsolutePos(const DGL::Point<int>&) const noexcept {} | |||||
void setNeedsFullViewport(bool) const noexcept {} | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UI) | DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UI) | ||||
}; | }; | ||||
@@ -63,6 +63,10 @@ | |||||
# define DISTRHO_PLUGIN_IS_RT_SAFE 1 | # define DISTRHO_PLUGIN_IS_RT_SAFE 1 | ||||
#endif | #endif | ||||
#ifndef DISTRHO_UI_USE_NANOVG | |||||
# define DISTRHO_UI_USE_NANOVG 0 | |||||
#endif | |||||
#define DISTRHO_UI_URI DISTRHO_PLUGIN_URI "#UI" | #define DISTRHO_UI_URI DISTRHO_PLUGIN_URI "#UI" | ||||
#endif // DISTRHO_PLUGIN_CHECKS_H_INCLUDED | #endif // DISTRHO_PLUGIN_CHECKS_H_INCLUDED |
@@ -31,12 +31,14 @@ double d_lastUiSampleRate = 0.0; | |||||
// UI | // UI | ||||
UI::UI() | UI::UI() | ||||
: DGL::Widget(*DGL::dgl_lastUiParent), | |||||
: UIWidget(*DGL::dgl_lastUiParent), | |||||
pData(new PrivateData()) | pData(new PrivateData()) | ||||
{ | { | ||||
DISTRHO_SAFE_ASSERT(DGL::dgl_lastUiParent != nullptr); | DISTRHO_SAFE_ASSERT(DGL::dgl_lastUiParent != nullptr); | ||||
DGL::dgl_lastUiParent = nullptr; | DGL::dgl_lastUiParent = nullptr; | ||||
Widget::setNeedsFullViewport(true); | |||||
} | } | ||||
UI::~UI() | UI::~UI() | ||||