It's unnecessary and can potentially return stale objects.
Change-Id: Ia04b9a58757ef06d3178e6a64e168f68abc1c9d8
Reviewed-by: Martin Jones <martin.jones@nokia.com>
*/
-QSGDragAttached *QSGDragAttached::properties(QObject *obj)
-{
- QSGDragAttached *rv = attachedProperties.value(obj);
- if (!rv) {
- rv = new QSGDragAttached(obj);
- attachedProperties.insert(obj, rv);
- }
- return rv;
-}
-
-QHash<QObject*, QSGDragAttached *> QSGDragAttached::attachedProperties;
-
void QSGDragAttachedPrivate::itemGeometryChanged(QSGItem *, const QRectF &newGeometry, const QRectF &oldGeometry)
{
Q_Q(QSGDragAttached);
Q_INVOKABLE int drop();
- static QSGDragAttached *properties(QObject *obj);
-
public Q_SLOTS:
void start(QDeclarativeV8Function *);
void cancel();
void proposedActionChanged();
private:
- static QHash<QObject*, QSGDragAttached *> attachedProperties;
-
Q_DECLARE_PRIVATE(QSGDragAttached)
};
QSGDragAttached *QSGDrag::qmlAttachedProperties(QObject *obj)
{
- return QSGDragAttached::properties(obj);
+ return new QSGDragAttached(obj);
}
QSGMouseAreaPrivate::QSGMouseAreaPrivate()
"x: 50; y: 50\n"
"width: 10; height: 10\n"
"}", QUrl());
- QSGItem *item = qobject_cast<QSGItem *>(component.create());
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *item = qobject_cast<QSGItem *>(object.data());
QVERIFY(item);
item->setParentItem(&dropTarget);
QCOMPARE(evaluate<QObject *>(item, "Drag.target"), static_cast<QObject *>(0));
QCOMPARE(evaluate<QObject *>(item, "dragTarget"), static_cast<QObject *>(0));
QCOMPARE(dropTarget.enterEvents, 0); QCOMPARE(dropTarget.leaveEvents, 1);
+
+ // Events are sent to hidden or disabled items.
+ dropTarget.accept = true;
+ dropTarget.setVisible(false);
+ dropTarget.reset();
+ evaluate<void>(item, "Drag.active = true");
+ QCOMPARE(evaluate<bool>(item, "Drag.active"), true);
+ QCOMPARE(evaluate<bool>(item, "dragActive"), true);
+ QCOMPARE(evaluate<QObject *>(item, "Drag.target"), static_cast<QObject *>(0));
+ QCOMPARE(evaluate<QObject *>(item, "dragTarget"), static_cast<QObject *>(0));
+ QCOMPARE(dropTarget.enterEvents, 0); QCOMPARE(dropTarget.leaveEvents, 0);
+
+ evaluate<void>(item, "Drag.active = false");
+ dropTarget.setVisible(true);
+
+ dropTarget.setOpacity(0.0);
+ dropTarget.reset();
+ evaluate<void>(item, "Drag.active = true");
+ QCOMPARE(evaluate<bool>(item, "Drag.active"), true);
+ QCOMPARE(evaluate<bool>(item, "dragActive"), true);
+ QCOMPARE(evaluate<QObject *>(item, "Drag.target"), static_cast<QObject *>(0));
+ QCOMPARE(evaluate<QObject *>(item, "dragTarget"), static_cast<QObject *>(0));
+ QCOMPARE(dropTarget.enterEvents, 0); QCOMPARE(dropTarget.leaveEvents, 0);
+
+ evaluate<void>(item, "Drag.active = false");
+ dropTarget.setOpacity(1.0);
+
+ dropTarget.setEnabled(false);
+ dropTarget.reset();
+ evaluate<void>(item, "Drag.active = true");
+ QCOMPARE(evaluate<bool>(item, "Drag.active"), true);
+ QCOMPARE(evaluate<bool>(item, "dragActive"), true);
+ QCOMPARE(evaluate<QObject *>(item, "Drag.target"), static_cast<QObject *>(0));
+ QCOMPARE(evaluate<QObject *>(item, "dragTarget"), static_cast<QObject *>(0));
+ QCOMPARE(dropTarget.enterEvents, 0); QCOMPARE(dropTarget.leaveEvents, 0);
}
void tst_QSGDrag::drop()
"x: 50; y: 50\n"
"width: 10; height: 10\n"
"}", QUrl());
- QSGItem *item = qobject_cast<QSGItem *>(component.create());
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *item = qobject_cast<QSGItem *>(object.data());
QVERIFY(item);
item->setParentItem(&outerTarget);
QCOMPARE(evaluate<QObject *>(item, "dragTarget"), static_cast<QObject *>(0));
QCOMPARE(outerTarget.enterEvents, 0); QCOMPARE(outerTarget.leaveEvents, 0); QCOMPARE(outerTarget.dropEvents, 1);
QCOMPARE(innerTarget.enterEvents, 0); QCOMPARE(innerTarget.leaveEvents, 0); QCOMPARE(innerTarget.dropEvents, 0);
+
+ // drop doesn't send an event and returns Qt.IgnoreAction if not active.
+ innerTarget.accept = true;
+ outerTarget.accept = true;
+ innerTarget.reset(); outerTarget.reset();
+ QCOMPARE(evaluate<bool>(item, "Drag.drop() == Qt.IgnoreAction"), true);
+ QCOMPARE(evaluate<bool>(item, "Drag.active"), false);
+ QCOMPARE(evaluate<bool>(item, "dragActive"), false);
+ QCOMPARE(evaluate<QObject *>(item, "Drag.target"), static_cast<QObject *>(0));
+ QCOMPARE(evaluate<QObject *>(item, "dragTarget"), static_cast<QObject *>(0));
+ QCOMPARE(outerTarget.enterEvents, 0); QCOMPARE(outerTarget.leaveEvents, 0); QCOMPARE(outerTarget.dropEvents, 0);
+ QCOMPARE(innerTarget.enterEvents, 0); QCOMPARE(innerTarget.leaveEvents, 0); QCOMPARE(innerTarget.dropEvents, 0);
}
void tst_QSGDrag::move()
"x: 50; y: 50\n"
"width: 10; height: 10\n"
"}", QUrl());
- QSGItem *item = qobject_cast<QSGItem *>(component.create());
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *item = qobject_cast<QSGItem *>(object.data());
QVERIFY(item);
item->setParentItem(&outerTarget);
"x: 50; y: 50\n"
"width: 10; height: 10\n"
"}", QUrl());
- QSGItem *item = qobject_cast<QSGItem *>(component.create());
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *item = qobject_cast<QSGItem *>(object.data());
QVERIFY(item);
item->setParentItem(&dropTarget);
"x: 50; y: 50\n"
"width: 10; height: 10\n"
"}", QUrl());
- QSGItem *item = qobject_cast<QSGItem *>(component.create());
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *item = qobject_cast<QSGItem *>(object.data());
QVERIFY(item);
item->setParentItem(&dropTarget);
"x: 50; y: 50\n"
"width: 10; height: 10\n"
"}", QUrl());
- QSGItem *item = qobject_cast<QSGItem *>(component.create());
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *item = qobject_cast<QSGItem *>(object.data());
QVERIFY(item);
item->setParentItem(&dropTarget);
+
QCOMPARE(evaluate<bool>(item, "Drag.proposedAction == Qt.MoveAction"), true);
QCOMPARE(evaluate<bool>(item, "proposedAction == Qt.MoveAction"), true);
evaluate<void>(item, "{ Drag.start(); Drag.cancel() }");
"x: 50; y: 50\n"
"width: 10; height: 10\n"
"}", QUrl());
- QSGItem *item = qobject_cast<QSGItem *>(component.create());
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *item = qobject_cast<QSGItem *>(object.data());
QVERIFY(item);
// QCOMPARE(evaluate<QStringList>(item, "Drag.keys"), QStringList());
"width: 10; height: 10\n"
"Item { id: proxySource; objectName: \"proxySource\" }\n"
"}", QUrl());
- QSGItem *item = qobject_cast<QSGItem *>(component.create());
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *item = qobject_cast<QSGItem *>(object.data());
QVERIFY(item);
QCOMPARE(evaluate<QObject *>(item, "Drag.source"), static_cast<QObject *>(item));
evaluate<void>(item, "Drag.source = proxySource");
QCOMPARE(evaluate<QObject *>(item, "Drag.source"), static_cast<QObject *>(proxySource));
QCOMPARE(evaluate<QObject *>(item, "source"), static_cast<QObject *>(proxySource));
+
+ evaluate<void>(item, "Drag.source = undefined");
+ QCOMPARE(evaluate<QObject *>(item, "Drag.source"), static_cast<QObject *>(item));
+ QCOMPARE(evaluate<QObject *>(item, "source"), static_cast<QObject *>(item));
}
QTEST_MAIN(tst_QSGDrag)
"width: 10; height: 10\n"
"}\n"
"}", QUrl());
- QSGItem *dropArea = qobject_cast<QSGItem *>(component.create());
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *dropArea = qobject_cast<QSGItem *>(object.data());
QVERIFY(dropArea);
dropArea->setParentItem(canvas.rootItem());
"onEntered: {++enterEvents}\n"
"onExited: {++exitEvents}\n"
"}", QUrl());
- QSGItem *dropArea = qobject_cast<QSGItem *>(component.create());
- QVERIFY(dropArea);
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *dropArea = qobject_cast<QSGItem *>(object.data());
dropArea->setParentItem(canvas.rootItem());
QMimeData data;
"Drag.keys: [\"red\", \"blue\"]\n"
"}\n"
"}", QUrl());
- QSGItem *dropArea = qobject_cast<QSGItem *>(component.create());
- QVERIFY(dropArea);
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *dropArea = qobject_cast<QSGItem *>(object.data());
dropArea->setParentItem(canvas.rootItem());
QSGItem *dragItem = dropArea->findChild<QSGItem *>("dragItem");
evaluate<void>(dragItem, "Drag.active = true");
QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), false);
QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 0);
+
+ evaluate<void>(dragItem, "Drag.active = false");
+ evaluate<void>(dropArea, "keys = []");
+ QCOMPARE(dropArea->property("keys").toStringList(), QStringList());
+ QCOMPARE(dropArea->property("dropKeys").toStringList(), QStringList());
+ evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }");
+ evaluate<void>(dragItem, "Drag.active = true");
+ QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true);
+ QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1);
+ QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList());
+
+ evaluate<void>(dragItem, "Drag.active = false");
+ evaluate<void>(dropArea, "keys = []");
+ evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }");
+ evaluate<void>(dragItem, "Drag.active = true");
+ QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true);
+ QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1);
+ QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList());
+
+ evaluate<void>(dragItem, "Drag.active = false");
+ evaluate<void>(dragItem, "Drag.keys = [\"red\", \"blue\"]");
+ evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }");
+ evaluate<void>(dragItem, "Drag.active = true");
+ QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true);
+ QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1);
+ QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList() << "red" << "blue");
}
void tst_QSGDropArea::keys_external()
"width: 100; height: 100\n"
"onEntered: {++enterEvents; dragKeys = drag.keys }\n"
"}", QUrl());
- QSGItem *dropArea = qobject_cast<QSGItem *>(component.create());
- QVERIFY(dropArea);
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *dropArea = qobject_cast<QSGItem *>(object.data());
dropArea->setParentItem(canvas.rootItem());
QMimeData data;
QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), false);
QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 0);
+ QWindowSystemInterface::handleDrag(&alternateCanvas, &data, QPoint(50, 50));
+ evaluate<void>(dropArea, "keys = []");
+ QCOMPARE(dropArea->property("keys").toStringList(), QStringList());
+ QCOMPARE(dropArea->property("dropKeys").toStringList(), QStringList());
+ evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }");
+ QWindowSystemInterface::handleDrag(&canvas, &data, QPoint(50, 50));
+ QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true);
+ QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1);
+ QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList());
+
+ QWindowSystemInterface::handleDrag(&alternateCanvas, &data, QPoint(50, 50));
+ data.setData("text/x-red", "red");
+ data.setData("text/x-blue", "blue");
+ QCOMPARE(dropArea->property("keys").toStringList(), QStringList());
+ QCOMPARE(dropArea->property("dropKeys").toStringList(), QStringList());
+ evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }");
+ QWindowSystemInterface::handleDrag(&canvas, &data, QPoint(50, 50));
+ QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true);
+ QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1);
+ QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList() << "text/x-red" << "text/x-blue");
+
QWindowSystemInterface::handleDrop(&canvas, &data, QPoint(50, 50));
}
"}\n"
"Item { id: dragSource; objectName: \"dragSource\" }\n"
"}", QUrl());
- QSGItem *dropArea = qobject_cast<QSGItem *>(component.create());
- QVERIFY(dropArea);
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *dropArea = qobject_cast<QSGItem *>(object.data());
dropArea->setParentItem(canvas.rootItem());
QSGItem *dragItem = dropArea->findChild<QSGItem *>("dragItem");
"width: 10; height: 10\n"
"}\n"
"}", QUrl());
- QSGItem *dropArea = qobject_cast<QSGItem *>(component.create());
- QVERIFY(dropArea);
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *dropArea = qobject_cast<QSGItem *>(object.data());
dropArea->setParentItem(canvas.rootItem());
QSGItem *dragItem = dropArea->findChild<QSGItem *>("dragItem");
"onEntered: {++enterEvents; eventX = drag.x; eventY = drag.y}\n"
"onPositionChanged: {++moveEvents; eventX = drag.x; eventY = drag.y}\n"
"}", QUrl());
- QSGItem *dropArea = qobject_cast<QSGItem *>(component.create());
- QVERIFY(dropArea);
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *dropArea = qobject_cast<QSGItem *>(object.data());
dropArea->setParentItem(canvas.rootItem());
QMimeData data;
"width: 10; height: 10\n"
"}\n"
"}", QUrl());
- QSGItem *dropArea = qobject_cast<QSGItem *>(component.create());
- QVERIFY(dropArea);
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *dropArea = qobject_cast<QSGItem *>(object.data());
dropArea->setParentItem(canvas.rootItem());
QSGItem *dragItem = dropArea->findChild<QSGItem *>("dragItem");
"}\n"
"}", QUrl());
- QSGItem *dropArea1 = qobject_cast<QSGItem *>(component.create());
- QVERIFY(dropArea1);
+ QScopedPointer<QObject> object(component.create());
+ QSGItem *dropArea1 = qobject_cast<QSGItem *>(object.data());
dropArea1->setParentItem(canvas.rootItem());
QSGItem *dropArea2 = dropArea1->findChild<QSGItem *>("dropArea2");