Add mergePointerTargets to create pointer delivery list
This code joins lists of "target item" which are joins of where several touch points should be delivered. Change-Id: I15ab4b7f70b8930d15368bf4cba0893ab339fa2a Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
This commit is contained in:
parent
b4f05d7010
commit
bf2c880b2b
|
@ -2169,6 +2169,28 @@ QVector<QQuickItem *> QQuickWindowPrivate::pointerTargets(QQuickItem *item, cons
|
||||||
return targets;
|
return targets;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// return the joined lists
|
||||||
|
// list1 has priority, common items come last
|
||||||
|
QVector<QQuickItem *> QQuickWindowPrivate::mergePointerTargets(const QVector<QQuickItem *> &list1, const QVector<QQuickItem *> &list2) const
|
||||||
|
{
|
||||||
|
QVector<QQuickItem *> targets = list1;
|
||||||
|
// start at the end of list2
|
||||||
|
// if item not in list, append it
|
||||||
|
// if item found, move to next one, inserting before the last found one
|
||||||
|
int insertPosition = targets.length();
|
||||||
|
for (int i = list2.length() - 1; i >= 0; --i) {
|
||||||
|
int newInsertPosition = targets.lastIndexOf(list2.at(i), insertPosition);
|
||||||
|
if (newInsertPosition >= 0) {
|
||||||
|
Q_ASSERT(newInsertPosition <= insertPosition);
|
||||||
|
insertPosition = newInsertPosition;
|
||||||
|
}
|
||||||
|
// check for duplicates, only insert if the item isn't there already
|
||||||
|
if (insertPosition == targets.size() || list2.at(i) != targets.at(insertPosition))
|
||||||
|
targets.insert(insertPosition, list2.at(i));
|
||||||
|
}
|
||||||
|
return targets;
|
||||||
|
}
|
||||||
|
|
||||||
void QQuickWindowPrivate::deliverTouchEvent(QQuickPointerTouchEvent *event)
|
void QQuickWindowPrivate::deliverTouchEvent(QQuickPointerTouchEvent *event)
|
||||||
{
|
{
|
||||||
qCDebug(DBG_TOUCH) << " - delivering" << event->asTouchEvent();
|
qCDebug(DBG_TOUCH) << " - delivering" << event->asTouchEvent();
|
||||||
|
|
|
@ -175,6 +175,8 @@ public:
|
||||||
bool sendFilteredTouchEvent(QQuickItem *target, QQuickItem *item, QTouchEvent *event, QSet<QQuickItem*> *filtered);
|
bool sendFilteredTouchEvent(QQuickItem *target, QQuickItem *item, QTouchEvent *event, QSet<QQuickItem*> *filtered);
|
||||||
|
|
||||||
QVector<QQuickItem *> pointerTargets(QQuickItem *, const QPointF &) const;
|
QVector<QQuickItem *> pointerTargets(QQuickItem *, const QPointF &) const;
|
||||||
|
QVector<QQuickItem *> mergePointerTargets(const QVector<QQuickItem *> &list1, const QVector<QQuickItem *> &list2) const;
|
||||||
|
|
||||||
// hover delivery
|
// hover delivery
|
||||||
bool deliverHoverEvent(QQuickItem *, const QPointF &scenePos, const QPointF &lastScenePos, Qt::KeyboardModifiers modifiers, bool &accepted);
|
bool deliverHoverEvent(QQuickItem *, const QPointF &scenePos, const QPointF &lastScenePos, Qt::KeyboardModifiers modifiers, bool &accepted);
|
||||||
bool sendHoverEvent(QEvent::Type, QQuickItem *, const QPointF &scenePos, const QPointF &lastScenePos,
|
bool sendHoverEvent(QEvent::Type, QQuickItem *, const QPointF &scenePos, const QPointF &lastScenePos,
|
||||||
|
|
|
@ -303,6 +303,9 @@ private slots:
|
||||||
void touchEvent_reentrant();
|
void touchEvent_reentrant();
|
||||||
void touchEvent_velocity();
|
void touchEvent_velocity();
|
||||||
|
|
||||||
|
void mergeTouchPointLists_data();
|
||||||
|
void mergeTouchPointLists();
|
||||||
|
|
||||||
void mouseFromTouch_basic();
|
void mouseFromTouch_basic();
|
||||||
|
|
||||||
void clearWindow();
|
void clearWindow();
|
||||||
|
@ -903,6 +906,63 @@ void tst_qquickwindow::touchEvent_velocity()
|
||||||
delete item;
|
delete item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_qquickwindow::mergeTouchPointLists_data()
|
||||||
|
{
|
||||||
|
QTest::addColumn<QVector<QQuickItem*>>("list1");
|
||||||
|
QTest::addColumn<QVector<QQuickItem*>>("list2");
|
||||||
|
QTest::addColumn<QVector<QQuickItem*>>("expected");
|
||||||
|
QTest::addColumn<bool>("showItem");
|
||||||
|
|
||||||
|
// FIXME: do not leak all these items
|
||||||
|
auto item1 = new QQuickItem();
|
||||||
|
auto item2 = new QQuickItem();
|
||||||
|
auto item3 = new QQuickItem();
|
||||||
|
auto item4 = new QQuickItem();
|
||||||
|
auto item5 = new QQuickItem();
|
||||||
|
|
||||||
|
QTest::newRow("empty") << QVector<QQuickItem*>() << QVector<QQuickItem*>() << QVector<QQuickItem*>();
|
||||||
|
QTest::newRow("single list left")
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item2 << item3)
|
||||||
|
<< QVector<QQuickItem*>()
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item2 << item3);
|
||||||
|
QTest::newRow("single list right")
|
||||||
|
<< QVector<QQuickItem*>()
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item2 << item3)
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item2 << item3);
|
||||||
|
QTest::newRow("two lists identical")
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item2 << item3)
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item2 << item3)
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item2 << item3);
|
||||||
|
QTest::newRow("two lists 1")
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item2 << item5)
|
||||||
|
<< (QVector<QQuickItem*>() << item3 << item4 << item5)
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item2 << item3 << item4 << item5);
|
||||||
|
QTest::newRow("two lists 2")
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item2 << item5)
|
||||||
|
<< (QVector<QQuickItem*>() << item3 << item4 << item5)
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item2 << item3 << item4 << item5);
|
||||||
|
QTest::newRow("two lists 3")
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item2 << item3)
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item4 << item5)
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item2 << item3 << item4 << item5);
|
||||||
|
QTest::newRow("two lists 3")
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item3 << item4)
|
||||||
|
<< (QVector<QQuickItem*>() << item2 << item3 << item5)
|
||||||
|
<< (QVector<QQuickItem*>() << item1 << item2 << item3 << item4 << item5);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_qquickwindow::mergeTouchPointLists()
|
||||||
|
{
|
||||||
|
QFETCH(QVector<QQuickItem*>, list1);
|
||||||
|
QFETCH(QVector<QQuickItem*>, list2);
|
||||||
|
QFETCH(QVector<QQuickItem*>, expected);
|
||||||
|
|
||||||
|
QQuickWindow win;
|
||||||
|
auto windowPrivate = QQuickWindowPrivate::get(&win);
|
||||||
|
auto targetList = windowPrivate->mergePointerTargets(list1, list2);
|
||||||
|
QCOMPARE(targetList, expected);
|
||||||
|
}
|
||||||
|
|
||||||
void tst_qquickwindow::mouseFromTouch_basic()
|
void tst_qquickwindow::mouseFromTouch_basic()
|
||||||
{
|
{
|
||||||
// Turn off accepting touch events with acceptTouchEvents. This
|
// Turn off accepting touch events with acceptTouchEvents. This
|
||||||
|
|
Loading…
Reference in New Issue