14.31: drag events built for Qt 6.12 and 6.4 alike

This commit is contained in:
ZacharyZhang-NY committed 2026-10-11 16:52:23 -04:00
1 parent 3762166f09
commit 3fa7ffcc13
5 files changed
+22 -13

No files matched your search

+7
View File
@@ -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>;
+2 -1
View File
@@ -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);
+9 -9
View File
@@ -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());
};
+3 -2
View File
@@ -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;
}