commit cac786dcf66488dddd812488a0ee7ed454f99f57
parent 2711cbefa481c3ebed1ca9dbda190bf915d8b0b9
Author: falkTX <falktx@falktx.com>
Date: Sat, 16 Oct 2021 18:51:36 +0100
Fix widget margins for a few special cases
Signed-off-by: falkTX <falktx@falktx.com>
Diffstat:
2 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/dgl/src/SubWidget.cpp b/dgl/src/SubWidget.cpp
@@ -35,8 +35,8 @@ template<typename T>
bool SubWidget::contains(const T x, const T y) const noexcept
{
return Rectangle<double>(0, 0,
- static_cast<double>(getWidth()) - pData->margin.getX(),
- static_cast<double>(getHeight()) - pData->margin.getY()).contains(x, y);
+ static_cast<double>(getWidth()),
+ static_cast<double>(getHeight())).contains(x, y);
}
template<typename T>
@@ -67,9 +67,18 @@ Rectangle<int> SubWidget::getAbsoluteArea() const noexcept
Rectangle<uint> SubWidget::getConstrainedAbsoluteArea() const noexcept
{
- return Rectangle<uint>(static_cast<uint>(std::max(0, getAbsoluteX())),
- static_cast<uint>(std::max(0, getAbsoluteY())),
- getSize());
+ const int x = getAbsoluteX();
+ const int y = getAbsoluteY();
+
+ if (x >= 0 && y >= 0)
+ return Rectangle<uint>(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<int>(getWidth()) + xOffset);
+ const int height = std::max(0, static_cast<int>(getHeight()) + yOffset);
+
+ return Rectangle<uint>(0, 0, static_cast<uint>(width), static_cast<uint>(height));
}
void SubWidget::setAbsoluteX(const int x) noexcept
diff --git 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());
}
}