@@ -794,7 +794,10 @@ public: | |||||
*/ | */ | ||||
NanoWidget(Window& parent) | NanoWidget(Window& parent) | ||||
: Widget(parent), | : Widget(parent), | ||||
NanoVG() {} | |||||
NanoVG() | |||||
{ | |||||
setNeedsScaling(true); | |||||
} | |||||
protected: | protected: | ||||
/** | /** | ||||
@@ -297,16 +297,25 @@ protected: | |||||
virtual void onResize(const ResizeEvent&); | virtual void onResize(const ResizeEvent&); | ||||
/** | /** | ||||
Tell the parent window this widget this the full viewport. | |||||
Tell the parent window this widget needs the full viewport. | |||||
When enabled, the local widget coordinates are ignored. | When enabled, the local widget coordinates are ignored. | ||||
@note: This is an internal function; | @note: This is an internal function; | ||||
You do not need it under normal circumstances. | You do not need it under normal circumstances. | ||||
*/ | */ | ||||
void setNeedsFullViewport(bool yesNo) noexcept; | void setNeedsFullViewport(bool yesNo) noexcept; | ||||
/** | |||||
Tell the parent window this widget needs scaling. | |||||
When enabled, the widget viewport is scaled to match width&height. | |||||
@note: This is an internal function; | |||||
You do not need it under normal circumstances. | |||||
*/ | |||||
void setNeedsScaling(bool yesNo) noexcept; | |||||
private: | private: | ||||
Window& fParent; | Window& fParent; | ||||
bool fNeedsFullViewport; | bool fNeedsFullViewport; | ||||
bool fNeedsScaling; | |||||
bool fVisible; | bool fVisible; | ||||
Rectangle<int> fArea; | Rectangle<int> fArea; | ||||
@@ -25,6 +25,7 @@ START_NAMESPACE_DGL | |||||
Widget::Widget(Window& parent) | Widget::Widget(Window& parent) | ||||
: fParent(parent), | : fParent(parent), | ||||
fNeedsFullViewport(false), | fNeedsFullViewport(false), | ||||
fNeedsScaling(false), | |||||
fVisible(true) | fVisible(true) | ||||
{ | { | ||||
fParent._addWidget(this); | fParent._addWidget(this); | ||||
@@ -230,6 +231,11 @@ void Widget::setNeedsFullViewport(bool yesNo) noexcept | |||||
fNeedsFullViewport = yesNo; | fNeedsFullViewport = yesNo; | ||||
} | } | ||||
void Widget::setNeedsScaling(bool yesNo) noexcept | |||||
{ | |||||
fNeedsScaling = yesNo; | |||||
} | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
END_NAMESPACE_DGL | END_NAMESPACE_DGL |
@@ -584,21 +584,28 @@ struct Window::PrivateData { | |||||
// display widget | // display widget | ||||
widget->onDisplay(); | widget->onDisplay(); | ||||
} | } | ||||
else if (! widget->fNeedsScaling) | |||||
{ | |||||
// only set viewport pos | |||||
glViewport(widget->getAbsoluteX(), fView->height - widget->getHeight() - widget->getAbsoluteY(), fView->width, fView->height); | |||||
// display widget | |||||
widget->onDisplay(); | |||||
} | |||||
else | else | ||||
{ | { | ||||
// limit viewport to widget bounds | // limit viewport to widget bounds | ||||
//glViewport(widget->getAbsoluteX(), fView->height - widget->getHeight() - widget->getAbsoluteY(), widget->getWidth(), widget->getHeight()); | |||||
glViewport(widget->getAbsoluteX(), fView->height - widget->getHeight() - widget->getAbsoluteY(), fView->width, fView->height); | |||||
glViewport(widget->getAbsoluteX(), fView->height - widget->getHeight() - widget->getAbsoluteY(), widget->getWidth(), widget->getHeight()); | |||||
// scale contents to match viewport size | // scale contents to match viewport size | ||||
//glPushMatrix(); | |||||
//glScalef(float(fView->width)/float(widget->getWidth()), float(fView->height)/float(widget->getHeight()), 1.0f); | |||||
glPushMatrix(); | |||||
glScalef(float(fView->width)/float(widget->getWidth()), float(fView->height)/float(widget->getHeight()), 1.0f); | |||||
// display widget | // display widget | ||||
widget->onDisplay(); | widget->onDisplay(); | ||||
// done | // done | ||||
//glPopMatrix(); | |||||
glPopMatrix(); | |||||
} | } | ||||
} | } | ||||
} | } | ||||