From bd1192957248edb189f697da6c4b57bc8e004543 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Tue, 25 Jul 2017 10:53:46 +0200 Subject: BarSeries: Account for labels when hovering over the bar If you hover over a label then it will send a hoverLeaveEvent() because the label is not accounted for. So we set the labels to not accept hover events to ensure they don't interfere with the bar. Task-number: QTBUG-62137 Change-Id: I59097d14a7ce73948eda7a8332f927d1d465b273 Reviewed-by: Miikka Heikkinen --- src/charts/barchart/abstractbarchartitem.cpp | 1 + tests/auto/qbarseries/tst_qbarseries.cpp | 111 +++++++++++++++++---------- 2 files changed, 70 insertions(+), 42 deletions(-) diff --git a/src/charts/barchart/abstractbarchartitem.cpp b/src/charts/barchart/abstractbarchartitem.cpp index f62c0ef7..910066b5 100644 --- a/src/charts/barchart/abstractbarchartitem.cpp +++ b/src/charts/barchart/abstractbarchartitem.cpp @@ -500,6 +500,7 @@ void AbstractBarChartItem::createLabelItems() QGraphicsTextItem *label = bars.at(j)->labelItem(); if (!label) { QGraphicsTextItem *newLabel = new QGraphicsTextItem(this); + newLabel->setAcceptHoverEvents(false); newLabel->document()->setDocumentMargin(ChartPresenter::textMargin()); bars.at(j)->setLabelItem(newLabel); } diff --git a/tests/auto/qbarseries/tst_qbarseries.cpp b/tests/auto/qbarseries/tst_qbarseries.cpp index 8922af25..5fe2808c 100644 --- a/tests/auto/qbarseries/tst_qbarseries.cpp +++ b/tests/auto/qbarseries/tst_qbarseries.cpp @@ -621,16 +621,24 @@ void tst_QBarSeries::mouseclicked() void tst_QBarSeries::mousehovered_data() { - + QTest::addColumn("labelsPosition"); + QTest::addColumn("labelsVisible"); + + QTest::newRow("labelsCenter") << (uint)QAbstractBarSeries::LabelsCenter << true; + QTest::newRow("labelsInsideEnd") << (uint)QAbstractBarSeries::LabelsInsideEnd << true; + QTest::newRow("labelsInsideBase") << (uint)QAbstractBarSeries::LabelsInsideBase << true; + QTest::newRow("labelsOutsideEnd") << (uint)QAbstractBarSeries::LabelsOutsideEnd << true; + QTest::newRow("noLabelsCenter") << (uint)QAbstractBarSeries::LabelsCenter << false; } void tst_QBarSeries::mousehovered() { - SKIP_IF_CANNOT_TEST_MOUSE_EVENTS(); - SKIP_IF_FLAKY_MOUSE_MOVE(); + QFETCH(uint, labelsPosition); + QFETCH(bool, labelsVisible); QBarSeries* series = new QBarSeries(); - + series->setLabelsVisible(labelsVisible); + series->setLabelsPosition(static_cast(labelsPosition)); QBarSet* set1 = new QBarSet(QString("set 1")); *set1 << 10 << 10 << 10; series->append(set1); @@ -683,21 +691,24 @@ void tst_QBarSeries::mousehovered() layout.append(rect); } } + // In order to make it feel like a normal user moving the mouse, we hover across from the edge. + // If we go right to the center, we can hit a label which does not emit hovered then, but that + // would not be a normal use case. //======================================================================= // move mouse to left border QTest::mouseMove(view.viewport(), QPoint(0, layout.at(0).center().y())); - QCoreApplication::processEvents(QEventLoop::AllEvents, 10000); - TRY_COMPARE(seriesIndexSpy.count(), 0); - TRY_COMPARE(setIndexSpy1.count(), 0); - TRY_COMPARE(setIndexSpy2.count(), 0); + QTest::qWait(5000); + QCOMPARE(seriesIndexSpy.count(), 0); + QCOMPARE(setIndexSpy1.count(), 0); + QCOMPARE(setIndexSpy2.count(), 0); //======================================================================= -// move mouse on top of set1 - QTest::mouseMove(view.viewport(), layout.at(0).center().toPoint()); - TRY_COMPARE(seriesIndexSpy.count(), 1); - TRY_COMPARE(setIndexSpy1.count(), 1); - TRY_COMPARE(setIndexSpy2.count(), 0); +// move mouse to just inside left border to account for labels + QTest::mouseMove(view.viewport(), QPoint(layout.at(0).x() + 1, layout.at(0).y() + 1)); + QTRY_COMPARE(seriesIndexSpy.count(), 1); + QTRY_COMPARE(setIndexSpy1.count(), 1); + QTRY_COMPARE(setIndexSpy2.count(), 0); QList seriesIndexSpyArg = seriesIndexSpy.takeFirst(); QCOMPARE(qvariant_cast(seriesIndexSpyArg.at(2)), set1); @@ -708,12 +719,28 @@ void tst_QBarSeries::mousehovered() QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool); QVERIFY(setIndexSpyArg.at(0).toBool() == true); +//======================================================================= +// move mouse to center of set1 + QTest::mouseMove(view.viewport(), layout.at(0).center().toPoint()); + QTest::qWait(5000); + QCOMPARE(seriesIndexSpy.count(), 0); + QCOMPARE(setIndexSpy1.count(), 0); + QCOMPARE(setIndexSpy2.count(), 0); + +//======================================================================= +// move mouse to bottom of set1 + QTest::mouseMove(view.viewport(), QPoint(layout.at(0).center().x(), layout.at(0).bottom())); + QTest::qWait(5000); + QCOMPARE(seriesIndexSpy.count(), 0); + QCOMPARE(setIndexSpy1.count(), 0); + QCOMPARE(setIndexSpy2.count(), 0); + //======================================================================= // move mouse from top of set1 to top of set2 - QTest::mouseMove(view.viewport(), layout.at(1).center().toPoint()); - TRY_COMPARE(seriesIndexSpy.count(), 2); - TRY_COMPARE(setIndexSpy1.count(), 1); - TRY_COMPARE(setIndexSpy2.count(), 1); + QTest::mouseMove(view.viewport(), QPoint(layout.at(1).x() + 1, layout.at(1).y() + 1)); + QTRY_COMPARE(seriesIndexSpy.count(), 2); + QTRY_COMPARE(setIndexSpy1.count(), 1); + QTRY_COMPARE(setIndexSpy2.count(), 1); // should leave set1 seriesIndexSpyArg = seriesIndexSpy.takeFirst(); @@ -738,9 +765,9 @@ void tst_QBarSeries::mousehovered() //======================================================================= // move mouse from top of set2 to background QTest::mouseMove(view.viewport(), QPoint(layout.at(1).center().x(), 0)); - TRY_COMPARE(seriesIndexSpy.count(), 1); - TRY_COMPARE(setIndexSpy1.count(), 0); - TRY_COMPARE(setIndexSpy2.count(), 1); + QTRY_COMPARE(seriesIndexSpy.count(), 1); + QTRY_COMPARE(setIndexSpy1.count(), 0); + QTRY_COMPARE(setIndexSpy2.count(), 1); // should leave set2 seriesIndexSpyArg = seriesIndexSpy.takeFirst(); @@ -754,11 +781,11 @@ void tst_QBarSeries::mousehovered() //======================================================================= // move mouse on top of set1, bar0 to check the index (hover into set1) - QTest::mouseMove(view.viewport(), layout.at(0).center().toPoint()); + QTest::mouseMove(view.viewport(), QPoint(layout.at(0).x() + 1, layout.at(0).y() + 1)); - TRY_COMPARE(seriesIndexSpy.count(), 1); - TRY_COMPARE(setIndexSpy1.count(), 1); - TRY_COMPARE(setIndexSpy2.count(), 0); + QTRY_COMPARE(seriesIndexSpy.count(), 1); + QTRY_COMPARE(setIndexSpy1.count(), 1); + QTRY_COMPARE(setIndexSpy2.count(), 0); //should enter set1, bar0 seriesIndexSpyArg = seriesIndexSpy.takeFirst(); @@ -777,11 +804,11 @@ void tst_QBarSeries::mousehovered() //======================================================================= // move mouse on top of set2, bar0 to check the index (hover out set1, // hover in set1) - QTest::mouseMove(view.viewport(), layout.at(1).center().toPoint()); + QTest::mouseMove(view.viewport(), QPoint(layout.at(1).x() + 1, layout.at(1).y() + 1)); - TRY_COMPARE(seriesIndexSpy.count(), 2); - TRY_COMPARE(setIndexSpy1.count(), 1); - TRY_COMPARE(setIndexSpy2.count(), 1); + QTRY_COMPARE(seriesIndexSpy.count(), 2); + QTRY_COMPARE(setIndexSpy1.count(), 1); + QTRY_COMPARE(setIndexSpy2.count(), 1); // should leave set1, bar0 seriesIndexSpyArg = seriesIndexSpy.takeFirst(); @@ -814,11 +841,11 @@ void tst_QBarSeries::mousehovered() //======================================================================= // move mouse on top of set1, bar1 to check the index (hover out set 2, // hover in set1) - QTest::mouseMove(view.viewport(), layout.at(2).center().toPoint()); + QTest::mouseMove(view.viewport(), QPoint(layout.at(2).x() + 1, layout.at(2).y() + 1)); - TRY_COMPARE(seriesIndexSpy.count(), 2); - TRY_COMPARE(setIndexSpy1.count(), 1); - TRY_COMPARE(setIndexSpy2.count(), 1); + QTRY_COMPARE(seriesIndexSpy.count(), 2); + QTRY_COMPARE(setIndexSpy1.count(), 1); + QTRY_COMPARE(setIndexSpy2.count(), 1); // should leave set2, bar0 seriesIndexSpyArg = seriesIndexSpy.takeFirst(); @@ -853,9 +880,9 @@ void tst_QBarSeries::mousehovered() // (hover out set1) QTest::mouseMove(view.viewport(), QPoint((layout.at(2).right() + layout.at(3).left()) / 2, 0)); - TRY_COMPARE(seriesIndexSpy.count(), 1); - TRY_COMPARE(setIndexSpy1.count(), 1); - TRY_COMPARE(setIndexSpy2.count(), 0); + QTRY_COMPARE(seriesIndexSpy.count(), 1); + QTRY_COMPARE(setIndexSpy1.count(), 1); + QTRY_COMPARE(setIndexSpy2.count(), 0); // should leave set1, bar1 seriesIndexSpyArg = seriesIndexSpy.takeFirst(); @@ -873,11 +900,11 @@ void tst_QBarSeries::mousehovered() //======================================================================= // move mouse on top of set2, bar1 to check the index (hover in set2) - QTest::mouseMove(view.viewport(), layout.at(3).center().toPoint()); + QTest::mouseMove(view.viewport(), QPoint(layout.at(3).x() + 1, layout.at(3).y() + 1)); - TRY_COMPARE(seriesIndexSpy.count(), 1); - TRY_COMPARE(setIndexSpy1.count(), 0); - TRY_COMPARE(setIndexSpy2.count(), 1); + QTRY_COMPARE(seriesIndexSpy.count(), 1); + QTRY_COMPARE(setIndexSpy1.count(), 0); + QTRY_COMPARE(setIndexSpy2.count(), 1); // should enter set2, bar1 seriesIndexSpyArg = seriesIndexSpy.takeFirst(); @@ -898,9 +925,9 @@ void tst_QBarSeries::mousehovered() //(hover out set2) QTest::mouseMove(view.viewport(), QPoint((layout.at(3).right() + layout.at(3).left()) / 2, 0)); - TRY_COMPARE(seriesIndexSpy.count(), 1); - TRY_COMPARE(setIndexSpy1.count(), 0); - TRY_COMPARE(setIndexSpy2.count(), 1); + QTRY_COMPARE(seriesIndexSpy.count(), 1); + QTRY_COMPARE(setIndexSpy1.count(), 0); + QTRY_COMPARE(setIndexSpy2.count(), 1); // should leave set2, bar1 seriesIndexSpyArg = seriesIndexSpy.takeFirst(); -- cgit v1.2.3