diff --git a/dgl/src/SubWidget.cpp b/dgl/src/SubWidget.cpp index 32c93221..d0f38917 100644 --- a/dgl/src/SubWidget.cpp +++ b/dgl/src/SubWidget.cpp @@ -35,8 +35,8 @@ template bool SubWidget::contains(const T x, const T y) const noexcept { return Rectangle(0, 0, - static_cast(getWidth()) - pData->margin.getX(), - static_cast(getHeight()) - pData->margin.getY()).contains(x, y); + static_cast(getWidth()), + static_cast(getHeight())).contains(x, y); } template @@ -67,9 +67,18 @@ Rectangle SubWidget::getAbsoluteArea() const noexcept Rectangle SubWidget::getConstrainedAbsoluteArea() const noexcept { - return Rectangle(static_cast(std::max(0, getAbsoluteX())), - static_cast(std::max(0, getAbsoluteY())), - getSize()); + const int x = getAbsoluteX(); + const int y = getAbsoluteY(); + + if (x >= 0 && y >= 0) + return Rectangle(x, y, getSize()); + + const int xOffset = std::min(0, x); + const int yOffset = std::min(0, y); + const int width = std::max(0, static_cast(getWidth()) + xOffset); + const int height = std::max(0, static_cast(getHeight()) + yOffset); + + return Rectangle(0, 0, static_cast(width), static_cast(height)); } void SubWidget::setAbsoluteX(const int x) noexcept diff --git a/dgl/src/WidgetPrivateData.cpp b/dgl/src/WidgetPrivateData.cpp index 150d11c2..59b87901 100644 --- a/dgl/src/WidgetPrivateData.cpp +++ b/dgl/src/WidgetPrivateData.cpp @@ -119,8 +119,8 @@ bool Widget::PrivateData::giveMouseEventForSubWidgets(MouseEvent& ev) { if (selfw->pData->needsViewportScaling) { - ev.absolutePos.setX(x - selfw->getAbsoluteX()); - ev.absolutePos.setY(y - selfw->getAbsoluteY()); + ev.absolutePos.setX(x - selfw->getAbsoluteX() + selfw->getMargin().getX()); + ev.absolutePos.setY(y - selfw->getAbsoluteY() + selfw->getMargin().getY()); } } @@ -155,8 +155,8 @@ bool Widget::PrivateData::giveMotionEventForSubWidgets(MotionEvent& ev) { if (selfw->pData->needsViewportScaling) { - ev.absolutePos.setX(x - selfw->getAbsoluteX()); - ev.absolutePos.setY(y - selfw->getAbsoluteY()); + ev.absolutePos.setX(x - selfw->getAbsoluteX() + selfw->getMargin().getX()); + ev.absolutePos.setY(y - selfw->getAbsoluteY() + selfw->getMargin().getY()); } } @@ -191,8 +191,8 @@ bool Widget::PrivateData::giveScrollEventForSubWidgets(ScrollEvent& ev) { if (selfw->pData->needsViewportScaling) { - ev.absolutePos.setX(x - selfw->getAbsoluteX()); - ev.absolutePos.setY(y - selfw->getAbsoluteY()); + ev.absolutePos.setX(x - selfw->getAbsoluteX() + selfw->getMargin().getX()); + ev.absolutePos.setY(y - selfw->getAbsoluteY() + selfw->getMargin().getY()); } }