Signed-off-by: falkTX <falktx@falktx.com>pull/292/head
| @@ -111,6 +111,22 @@ public: | |||||
| */ | */ | ||||
| void setAbsolutePos(const Point<int>& pos) noexcept; | void setAbsolutePos(const Point<int>& pos) noexcept; | ||||
| /** | |||||
| Get the margin currently in use for widget coordinates. | |||||
| By default this value is (0,0). | |||||
| */ | |||||
| Point<int> getMargin() const noexcept; | |||||
| /** | |||||
| Set a margin to be used for widget coordinates using @a x and @a y values. | |||||
| */ | |||||
| void setMargin(int x, int y) noexcept; | |||||
| /** | |||||
| Set a margin to be used for widget coordinates. | |||||
| */ | |||||
| void setMargin(const Point<int>& offset) noexcept; | |||||
| /** | /** | ||||
| Get parent Widget, as passed in the constructor. | Get parent Widget, as passed in the constructor. | ||||
| */ | */ | ||||
| @@ -32,9 +32,9 @@ SubWidget::~SubWidget() | |||||
| } | } | ||||
| template<typename T> | template<typename T> | ||||
| bool SubWidget::contains(T x, T y) const noexcept | |||||
| bool SubWidget::contains(const T x, const T y) const noexcept | |||||
| { | { | ||||
| return Rectangle<double>(0, 0, getWidth(), getHeight()).contains(x, y); | |||||
| return Rectangle<double>(0, 0, getWidth()-pData->margin.getX(), getHeight()-pData->margin.getY()).contains(x, y); | |||||
| } | } | ||||
| template<typename T> | template<typename T> | ||||
| @@ -70,17 +70,17 @@ Rectangle<uint> SubWidget::getConstrainedAbsoluteArea() const noexcept | |||||
| getSize()); | getSize()); | ||||
| } | } | ||||
| void SubWidget::setAbsoluteX(int x) noexcept | |||||
| void SubWidget::setAbsoluteX(const int x) noexcept | |||||
| { | { | ||||
| setAbsolutePos(Point<int>(x, getAbsoluteY())); | setAbsolutePos(Point<int>(x, getAbsoluteY())); | ||||
| } | } | ||||
| void SubWidget::setAbsoluteY(int y) noexcept | |||||
| void SubWidget::setAbsoluteY(const int y) noexcept | |||||
| { | { | ||||
| setAbsolutePos(Point<int>(getAbsoluteX(), y)); | setAbsolutePos(Point<int>(getAbsoluteX(), y)); | ||||
| } | } | ||||
| void SubWidget::setAbsolutePos(int x, int y) noexcept | |||||
| void SubWidget::setAbsolutePos(const int x, const int y) noexcept | |||||
| { | { | ||||
| setAbsolutePos(Point<int>(x, y)); | setAbsolutePos(Point<int>(x, y)); | ||||
| } | } | ||||
| @@ -100,6 +100,21 @@ void SubWidget::setAbsolutePos(const Point<int>& pos) noexcept | |||||
| repaint(); | repaint(); | ||||
| } | } | ||||
| Point<int> SubWidget::getMargin() const noexcept | |||||
| { | |||||
| return pData->margin; | |||||
| } | |||||
| void SubWidget::setMargin(const int x, const int y) noexcept | |||||
| { | |||||
| pData->margin = Point<int>(x, y); | |||||
| } | |||||
| void SubWidget::setMargin(const Point<int>& offset) noexcept | |||||
| { | |||||
| pData->margin = offset; | |||||
| } | |||||
| Widget* SubWidget::getParentWidget() const noexcept | Widget* SubWidget::getParentWidget() const noexcept | ||||
| { | { | ||||
| return pData->parentWidget; | return pData->parentWidget; | ||||
| @@ -26,6 +26,7 @@ SubWidget::PrivateData::PrivateData(SubWidget* const s, Widget* const pw) | |||||
| selfw((Widget*)s), | selfw((Widget*)s), | ||||
| parentWidget(pw), | parentWidget(pw), | ||||
| absolutePos(), | absolutePos(), | ||||
| margin(), | |||||
| needsFullViewportForDrawing(false), | needsFullViewportForDrawing(false), | ||||
| needsViewportScaling(false), | needsViewportScaling(false), | ||||
| skipDrawing(false), | skipDrawing(false), | ||||
| @@ -28,6 +28,7 @@ struct SubWidget::PrivateData { | |||||
| Widget* const selfw; | Widget* const selfw; | ||||
| Widget* const parentWidget; | Widget* const parentWidget; | ||||
| Point<int> absolutePos; | Point<int> absolutePos; | ||||
| Point<int> margin; | |||||
| bool needsFullViewportForDrawing; // needed for widgets drawing out of bounds | bool needsFullViewportForDrawing; // needed for widgets drawing out of bounds | ||||
| bool needsViewportScaling; // needed for NanoVG | bool needsViewportScaling; // needed for NanoVG | ||||
| bool skipDrawing; // for context reuse in NanoVG based guis | bool skipDrawing; // for context reuse in NanoVG based guis | ||||
| @@ -152,8 +152,8 @@ bool Widget::PrivateData::giveMouseEventForSubWidgets(MouseEvent& ev) | |||||
| if (! widget->isVisible()) | if (! widget->isVisible()) | ||||
| continue; | continue; | ||||
| ev.pos = Point<double>(x - widget->getAbsoluteX(), | |||||
| y - widget->getAbsoluteY()); | |||||
| ev.pos = Point<double>(x - widget->getAbsoluteX() + widget->getMargin().getX(), | |||||
| y - widget->getAbsoluteY() + widget->getMargin().getY()); | |||||
| if (widget->onMouse(ev)) | if (widget->onMouse(ev)) | ||||
| return true; | return true; | ||||
| @@ -191,8 +191,8 @@ bool Widget::PrivateData::giveMotionEventForSubWidgets(MotionEvent& ev) | |||||
| if (! widget->isVisible()) | if (! widget->isVisible()) | ||||
| continue; | continue; | ||||
| ev.pos = Point<double>(x - widget->getAbsoluteX(), | |||||
| y - widget->getAbsoluteY()); | |||||
| ev.pos = Point<double>(x - widget->getAbsoluteX() + widget->getMargin().getX(), | |||||
| y - widget->getAbsoluteY() + widget->getMargin().getY()); | |||||
| if (widget->onMotion(ev)) | if (widget->onMotion(ev)) | ||||
| return true; | return true; | ||||
| @@ -230,8 +230,8 @@ bool Widget::PrivateData::giveScrollEventForSubWidgets(ScrollEvent& ev) | |||||
| if (! widget->isVisible()) | if (! widget->isVisible()) | ||||
| continue; | continue; | ||||
| ev.pos = Point<double>(x - widget->getAbsoluteX(), | |||||
| y - widget->getAbsoluteY()); | |||||
| ev.pos = Point<double>(x - widget->getAbsoluteX() + widget->getMargin().getX(), | |||||
| y - widget->getAbsoluteY() + widget->getMargin().getY()); | |||||
| if (widget->onScroll(ev)) | if (widget->onScroll(ev)) | ||||
| return true; | return true; | ||||