14.31: drag events built for Qt 6.12 and 6.4 alike
This commit is contained in:
5 files changed
+22
-13
No files matched your search
@@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
#include <QDragMoveEvent>
|
||||
#include <type_traits>
|
||||
|
||||
// Qt 6.12 takes a drag point as QPointF; 6.4, QPoint.
|
||||
using DragAt = std::conditional_t<std::is_constructible_v<QDragMoveEvent, QPointF, Qt::DropActions, const QMimeData *, Qt::MouseButtons, Qt::KeyboardModifiers>,
|
||||
QPointF, QPoint>;
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <QMimeData>
|
||||
#include <QScrollBar>
|
||||
#include <QtTest>
|
||||
#include "DragAt.h"
|
||||
|
||||
// Shared by the drag tests: a shown list, its drops.
|
||||
struct Shown {
|
||||
@@ -43,7 +44,7 @@ struct Shown {
|
||||
bool drop(QMimeData *data, Qt::DropActions offered, QPoint listPoint, Qt::KeyboardModifiers modifiers = Qt::NoModifier)
|
||||
{
|
||||
const QPointF inViewport = list.viewport()->mapFromParent(listPoint);
|
||||
QDragEnterEvent enter(inViewport.toPoint(), offered, data, Qt::LeftButton, modifiers);
|
||||
QDragEnterEvent enter(DragAt(inViewport.toPoint()), offered, data, Qt::LeftButton, modifiers);
|
||||
QApplication::sendEvent(list.viewport(), &enter);
|
||||
QDropEvent drop(inViewport, offered, data, Qt::LeftButton, modifiers);
|
||||
QApplication::sendEvent(list.viewport(), &drop);
|
||||
|
||||
@@ -187,7 +187,7 @@ void LayerDragTests::theIndicatorShowsWhereTheDropLands()
|
||||
QVERIFY(column != nullptr);
|
||||
const auto enter = [&](QMimeData *data, QPoint listPoint) {
|
||||
const QPoint inViewport = shown.list.viewport()->mapFromParent(listPoint);
|
||||
QDragEnterEvent event(inViewport, Qt::MoveAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QDragEnterEvent event(DragAt(inViewport), Qt::MoveAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QApplication::sendEvent(shown.list.viewport(), &event);
|
||||
delete data;
|
||||
return event.isAccepted();
|
||||
@@ -237,17 +237,17 @@ void LayerDragTests::aDragNearTheEdgeScrollsTheList()
|
||||
QTRY_VERIFY(shown.list.verticalScrollBar()->maximum() > 0);
|
||||
QMimeData *data = shown.rows({0});
|
||||
const QPoint edge(100, shown.list.viewport()->height() - 2);
|
||||
QDragEnterEvent enter(edge, Qt::MoveAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QDragEnterEvent enter(DragAt(edge), Qt::MoveAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QApplication::sendEvent(shown.list.viewport(), &enter);
|
||||
// Held at the bottom edge, each move scrolls further.
|
||||
for (int each = 0; each < 3; ++each) {
|
||||
QDragMoveEvent move(edge, Qt::MoveAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QDragMoveEvent move(DragAt(edge), Qt::MoveAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QApplication::sendEvent(shown.list.viewport(), &move);
|
||||
}
|
||||
QCOMPARE(shown.list.verticalScrollBar()->value(), 42);
|
||||
auto *column = shown.list.findChild<LayerColumn *>();
|
||||
QVERIFY(column->indicator.has_value());
|
||||
QDragMoveEvent top(QPoint(100, 1), Qt::MoveAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QDragMoveEvent top(DragAt(QPoint(100, 1)), Qt::MoveAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QApplication::sendEvent(shown.list.viewport(), &top);
|
||||
QCOMPARE(shown.list.verticalScrollBar()->value(), 27);
|
||||
QDragLeaveEvent leave;
|
||||
@@ -263,9 +263,9 @@ void LayerDragTests::aDragHeldAtTheEdgeScrollsOnAndAClipRefreshesTheCursor()
|
||||
QTRY_VERIFY(shown.list.verticalScrollBar()->maximum() > 0);
|
||||
QMimeData *data = shown.rows({0});
|
||||
const QPoint edge(100, shown.list.viewport()->height() - 2);
|
||||
QDragEnterEvent enter(edge, Qt::MoveAction | Qt::CopyAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QDragEnterEvent enter(DragAt(edge), Qt::MoveAction | Qt::CopyAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QApplication::sendEvent(shown.list.viewport(), &enter);
|
||||
QDragMoveEvent move(edge, Qt::MoveAction | Qt::CopyAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QDragMoveEvent move(DragAt(edge), Qt::MoveAction | Qt::CopyAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QApplication::sendEvent(shown.list.viewport(), &move);
|
||||
// One move, then a still pointer: the list scrolls on.
|
||||
QCOMPARE(shown.list.verticalScrollBar()->value(), 14);
|
||||
@@ -274,7 +274,7 @@ void LayerDragTests::aDragHeldAtTheEdgeScrollsOnAndAClipRefreshesTheCursor()
|
||||
auto *column = shown.list.findChild<LayerColumn *>();
|
||||
QVERIFY(column->indicator.has_value());
|
||||
// Back inside the scrolling rests; left, it stops.
|
||||
QDragMoveEvent inside(QPoint(100, 100), Qt::MoveAction | Qt::CopyAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QDragMoveEvent inside(DragAt(QPoint(100, 100)), Qt::MoveAction | Qt::CopyAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QApplication::sendEvent(shown.list.viewport(), &inside);
|
||||
QVERIFY(!shown.list.autoscrolling());
|
||||
const int resting = shown.list.verticalScrollBar()->value();
|
||||
@@ -306,9 +306,9 @@ void LayerDragTests::leavingOrDroppingAtTheEdgeStopsTheScrolling()
|
||||
QTRY_VERIFY(shown.list.verticalScrollBar()->maximum() > 0);
|
||||
const QPoint edge(100, shown.list.viewport()->height() - 2);
|
||||
const auto scrollAtTheEdge = [&](QMimeData *data) {
|
||||
QDragEnterEvent enter(edge, Qt::MoveAction | Qt::CopyAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QDragEnterEvent enter(DragAt(edge), Qt::MoveAction | Qt::CopyAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QApplication::sendEvent(shown.list.viewport(), &enter);
|
||||
QDragMoveEvent move(edge, Qt::MoveAction | Qt::CopyAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QDragMoveEvent move(DragAt(edge), Qt::MoveAction | Qt::CopyAction, data, Qt::LeftButton, Qt::NoModifier);
|
||||
QApplication::sendEvent(shown.list.viewport(), &move);
|
||||
QVERIFY(shown.list.autoscrolling());
|
||||
};
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#include "DragAt.h"
|
||||
#include "IO/ProjectStore.h"
|
||||
#include "SessionFixtures.h"
|
||||
#include "UI/ProjectWorkspaceView.h"
|
||||
@@ -23,7 +24,7 @@ QMimeData *rowsOf(EditorSession &session)
|
||||
bool enter(QWidget &target, QMimeData *data, QPoint at = QPoint(5, 5))
|
||||
{
|
||||
// Shift makes Qt propose the move, as plain drags do.
|
||||
QDragEnterEvent event(at, Qt::MoveAction | Qt::CopyAction, data, Qt::LeftButton, Qt::ShiftModifier);
|
||||
QDragEnterEvent event(DragAt(at), Qt::MoveAction | Qt::CopyAction, data, Qt::LeftButton, Qt::ShiftModifier);
|
||||
QApplication::sendEvent(&target, &event);
|
||||
return event.proposedAction() == Qt::MoveAction && event.isAccepted() && event.dropAction() == Qt::CopyAction;
|
||||
}
|
||||
@@ -41,7 +42,7 @@ bool drop(QWidget &target, QMimeData *data, QPoint at = QPoint(5, 5))
|
||||
// A move after entering; only a valid one stays accepted.
|
||||
bool move(QWidget &target, QMimeData *data, QPoint at = QPoint(5, 5))
|
||||
{
|
||||
QDragMoveEvent event(at, Qt::MoveAction | Qt::CopyAction, data, Qt::LeftButton, Qt::ShiftModifier);
|
||||
QDragMoveEvent event(DragAt(at), Qt::MoveAction | Qt::CopyAction, data, Qt::LeftButton, Qt::ShiftModifier);
|
||||
QApplication::sendEvent(&target, &event);
|
||||
return event.isAccepted() && event.dropAction() == Qt::CopyAction;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user