diff --git a/autotests/decorationbuttontest.cpp b/autotests/decorationbuttontest.cpp --- a/autotests/decorationbuttontest.cpp +++ b/autotests/decorationbuttontest.cpp @@ -1347,32 +1347,79 @@ void DecorationButtonTest::testContains_data() { QTest::addColumn("pos"); - QTest::addColumn("contains"); - - // Button geometry: QRectF(0, 0, 10, 10). - QTest::newRow("on left edge") << QPointF(0, 5) << true; - QTest::newRow("on top edge") << QPointF(5, 0) << true; - QTest::newRow("on right edge") << QPointF(9, 5) << true; - QTest::newRow("on bottom edge") << QPointF(5, 9) << true; - QTest::newRow("inside") << QPointF(5, 5) << true; - QTest::newRow("outside 1") << QPointF(-1, 5) << false; - QTest::newRow("outside 2") << QPointF(5, -1) << false; - QTest::newRow("outside 3") << QPointF(10, 5) << false; - QTest::newRow("outside 4") << QPointF(5, 10) << false; + QTest::addColumn("containsInt"); + QTest::addColumn("containsFloat"); + QTest::addColumn("containsNegative"); + + + /* + * + * Rect ***: QRectF(0, 0, 10, 10) + * Rect ooo: QRectF(0.1, 0.1, 10.1, 10.1) + * Rect ###: QRectF(10.1, 10, -10, -9.9) + * + * + * (0,0) (0,0.1) (10,0) (10.1,0) x + * ------------BBB------------------------------> + * | * + * | * + * (0,0.1) | o#o#o#DDD#o#o#o#o#o#o#o#o + * | # * # + * AAA CCC INSIDE EEE GGG + * | # * # + * | o * o + * | # * # + * | o * o + * (0,10) |* * *#*#*#*FFF*#*#*#*#*# # # # + * | o o + * | o o + * (0,10.1) | o o o HHH o o o o o o o o + * | + * | + * v + * y + * + */ + + QTest::newRow("INSIDE") << QPointF(5, 5) << true << true << true; + + QTest::newRow("left edge (AAA)") << QPointF(0, 5) << true << false << false; + QTest::newRow("top edge (BBB)") << QPointF(5, 0) << true << false << false; + + QTest::newRow("near left edge (CCC)") << QPointF(0.1, 5) << true << true << true; + QTest::newRow("near top edge (DDD)") << QPointF(5, 0.1) << true << true << true; + + QTest::newRow("near right edge (EEE)") << QPointF(10, 5) << false << true << true; + QTest::newRow("near bottom edge (FFF)") << QPointF(5, 10) << false << true << false; + + QTest::newRow("right edge (GGG)") << QPointF(10.1, 5) << false << false << false; + QTest::newRow("bottom edge (HHH)") << QPointF(5, 10.1) << false << false << false; + + QTest::newRow("outside 1") << QPointF(-1, 5) << false << false << false; + QTest::newRow("outside 2") << QPointF(5, -1) << false << false << false; + QTest::newRow("outside 3") << QPointF(10.101, 5) << false << false << false; + QTest::newRow("outside 4") << QPointF(5, 10.101) << false << false << false; } void DecorationButtonTest::testContains() { MockBridge bridge; MockDecoration mockDecoration(&bridge); + QFETCH(QPointF, pos); + MockButton button(KDecoration2::DecorationButtonType::Custom, &mockDecoration); - button.setGeometry(QRectF(0, 0, 10, 10)); button.setEnabled(true); button.setVisible(true); - QFETCH(QPointF, pos); - QTEST(button.contains(pos), "contains"); + button.setGeometry(QRectF(0, 0, 10, 10)); + QTEST(button.contains(pos), "containsInt"); + + button.setGeometry(QRectF(0.1, 0.1, 10, 10)); + QTEST(button.contains(pos), "containsFloat"); + + button.setGeometry(QRectF(10.1, 10, -10, -9.9)); + QTEST(button.contains(pos), "containsNegative"); } QTEST_MAIN(DecorationButtonTest) diff --git a/src/decorationbutton.cpp b/src/decorationbutton.cpp --- a/src/decorationbutton.cpp +++ b/src/decorationbutton.cpp @@ -447,7 +447,16 @@ bool DecorationButton::contains(const QPointF &pos) const { - return d->geometry.toRect().contains(pos.toPoint()); + if (!d->geometry.contains(pos)) { + return false; + } + + // additional make sure pos is not on the right or bottom edge + const bool horizontalInside = d->geometry.width() < 0 ? pos.x() < d->geometry.x() : + pos.x() < d->geometry.right(); + const bool verticalInside = d->geometry.height() < 0 ? pos.y() < d->geometry.y() : + pos.y() < d->geometry.bottom(); + return horizontalInside && verticalInside; } bool DecorationButton::event(QEvent *event)