diff options
author | Andy Maloney <asmaloney@gmail.com> | 2015-01-04 13:41:25 -0500 |
---|---|---|
committer | Andy Maloney <asmaloney@gmail.com> | 2015-01-13 13:04:40 +0100 |
commit | 75f2a0b4ef721b135c42d8e08d70bbdd0ed04c4c (patch) | |
tree | a6dca5a8babb7fedc2ac89609bc59c8a3fd89235 /tests/auto | |
parent | f0f5beb0e5db5538b38f07e6ecab89cc292ef609 (diff) |
Extend selections in QGraphicsView when selection extension key down
If the user has some objects selected and holds down the "extend selection"
key (Control on Windows, Command on Mac OS X), clicking and dragging a
rubber band selection deselects the current selection. This is
counter-intuitive and confusing for users.
This commit fixes the behavior so users can extend selections using the
rubber band when the proper key is held down.
Task-number: QTBUG-6523
Change-Id: Ieda4aaa50adb351c0405f5cb8aae23332eec58a9
Reviewed-by: Andreas Aardal Hanssen <andreas@hanssen.name>
Diffstat (limited to 'tests/auto')
-rw-r--r-- | tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp | 6 | ||||
-rw-r--r-- | tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp | 56 |
2 files changed, 62 insertions, 0 deletions
diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp index 51efc47094..44d06c6244 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp @@ -1799,6 +1799,12 @@ void tst_QGraphicsItem::selected_multi() // Ctrl-click on scene QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::ControlModifier, view.mapFromScene(0, 0)); QTest::qWait(20); + QVERIFY(item1->isSelected()); + QVERIFY(!item2->isSelected()); + + // Click on scene + QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(0, 0)); + QTest::qWait(20); QVERIFY(!item1->isSelected()); QVERIFY(!item2->isSelected()); diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp index 04852721db..c051f38ffb 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp @@ -164,6 +164,7 @@ private slots: void dragMode_scrollHand(); void dragMode_rubberBand(); void rubberBandSelectionMode(); + void rubberBandExtendSelection(); void rotated_rubberBand(); void backgroundBrush(); void foregroundBrush(); @@ -941,6 +942,61 @@ void tst_QGraphicsView::rubberBandSelectionMode() QCOMPARE(scene.selectedItems(), QList<QGraphicsItem *>() << rect); } +void tst_QGraphicsView::rubberBandExtendSelection() +{ + QWidget toplevel; + setFrameless(&toplevel); + + QGraphicsScene scene(0, 0, 1000, 1000); + + QGraphicsView view(&scene, &toplevel); + view.setDragMode(QGraphicsView::RubberBandDrag); + toplevel.show(); + + // Disable mouse tracking to prevent the window system from sending mouse + // move events to the viewport while we are synthesizing events. If + // QGraphicsView gets a mouse move event with no buttons down, it'll + // terminate the rubber band. + view.viewport()->setMouseTracking(false); + + QGraphicsItem *item1 = scene.addRect(10, 10, 100, 100); + QGraphicsItem *item2 = scene.addRect(10, 120, 100, 100); + QGraphicsItem *item3 = scene.addRect(10, 230, 100, 100); + + item1->setFlag(QGraphicsItem::ItemIsSelectable); + item2->setFlag(QGraphicsItem::ItemIsSelectable); + item3->setFlag(QGraphicsItem::ItemIsSelectable); + + // select first item + item1->setSelected(true); + QCOMPARE(scene.selectedItems(), QList<QGraphicsItem *>() << item1); + + // first rubberband without modifier key + sendMousePress(view.viewport(), view.mapFromScene(20, 115), Qt::LeftButton); + sendMouseMove(view.viewport(), view.mapFromScene(20, 300), Qt::LeftButton, Qt::LeftButton); + QVERIFY(!item1->isSelected()); + QVERIFY(item2->isSelected()); + QVERIFY(item3->isSelected()); + sendMouseRelease(view.viewport(), QPoint(), Qt::LeftButton); + + scene.clearSelection(); + + // select first item + item1->setSelected(true); + QVERIFY(item1->isSelected()); + + // now rubberband with modifier key + { + QPoint clickPoint = view.mapFromScene(20, 115); + QMouseEvent event(QEvent::MouseButtonPress, clickPoint, view.viewport()->mapToGlobal(clickPoint), Qt::LeftButton, 0, Qt::ControlModifier); + QApplication::sendEvent(view.viewport(), &event); + } + sendMouseMove(view.viewport(), view.mapFromScene(20, 300), Qt::LeftButton, Qt::LeftButton); + QVERIFY(item1->isSelected()); + QVERIFY(item2->isSelected()); + QVERIFY(item3->isSelected()); +} + void tst_QGraphicsView::rotated_rubberBand() { QWidget toplevel; |