diff options
author | Andy Shaw <andy.shaw@qt.io> | 2017-07-25 10:53:46 +0200 |
---|---|---|
committer | Andy Shaw <andy.shaw@qt.io> | 2017-08-08 09:07:30 +0000 |
commit | bd1192957248edb189f697da6c4b57bc8e004543 (patch) | |
tree | b682c4e56b4d03526e073dd33e5a04eb71493e31 | |
parent | c5af1dd3af0a59166672fa30f24c3039c532cd7d (diff) |
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 <miikka.heikkinen@qt.io>
-rw-r--r-- | src/charts/barchart/abstractbarchartitem.cpp | 1 | ||||
-rw-r--r-- | 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<uint>("labelsPosition"); + QTest::addColumn<bool>("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<QAbstractBarSeries::LabelsPosition>(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<QVariant> seriesIndexSpyArg = seriesIndexSpy.takeFirst(); QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1); @@ -709,11 +720,27 @@ void tst_QBarSeries::mousehovered() 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(); |