From 391459210de53e342ba5e9c44360754e86d7625c Mon Sep 17 00:00:00 2001 From: Chris Meyer <cmeyer1969@gmail.com> Date: Mon, 26 Aug 2013 16:15:23 -0700 Subject: [PATCH] Add support for external drag and drop in Quick items. Add dragType enums with values of None, Automatic, Internal (default). Setting to Automatic allows startDrag to be called automatically. Setting to Internal (default) retains old behavior. Add mimeData to Drag item to enable external drags. Call startDrag to start drag manually or change from internal drag to external drag. Added events dragStarted and dragFinished that get invoked from startDrag. Mime data must be specified in the mimeData property as mime-type / data pairs. Moved QQuickDrag from qquickmousearea* files to qquickdrag* files to reduce header interdependencies that caused linking errors in other modules and also to improve code organization. Allow DropArea to receive and process external data. Introduced new variable containsDrag to QQuickDropAreaPrivate. This replaces mimeData which was previously being used to determine if a drop operation was currently occurring. The problem was that mimeData was being externally destructed. Also introduced accessor methods for getting color, html, image, text, and urls out of the drop. This facilitates dropping of external data of those types onto a DropArea. Added example quick/externaldraganddrop. Task-number: QTBUG-27498 Change-Id: I1420df7c161ea3399e49a23305273e106baa246f Reviewed-by: Alan Alpert (Personal) <416365416c@gmail.com> --- .../DragAndDropTextItem.qml | 92 ++++++ .../doc/images/qml-dnd2-example.png | Bin 0 -> 48666 bytes .../doc/src/externaldraganddrop.qdoc | 38 +++ .../externaldraganddrop.pro | 11 + .../externaldraganddrop.qml | 79 +++++ .../externaldraganddrop.qmlproject | 16 + .../externaldraganddrop.qrc | 6 + examples/quick/externaldraganddrop/main.cpp | 41 +++ examples/quick/quick.pro | 1 + src/quick/items/qquickdrag.cpp | 304 +++++++++++++++++- src/quick/items/qquickdrag_p.h | 91 +++++- src/quick/items/qquickdroparea.cpp | 223 +++++++++++-- src/quick/items/qquickdroparea_p.h | 23 ++ src/quick/items/qquickmousearea.cpp | 131 -------- src/quick/items/qquickmousearea_p.h | 77 +---- src/quick/items/qquicktextinput.cpp | 1 + src/quick/items/qquickwindow.cpp | 14 +- src/quick/items/qquickwindow_p.h | 4 +- .../qquickmousearea/tst_qquickmousearea.cpp | 1 + 19 files changed, 900 insertions(+), 253 deletions(-) create mode 100644 examples/quick/externaldraganddrop/DragAndDropTextItem.qml create mode 100644 examples/quick/externaldraganddrop/doc/images/qml-dnd2-example.png create mode 100644 examples/quick/externaldraganddrop/doc/src/externaldraganddrop.qdoc create mode 100644 examples/quick/externaldraganddrop/externaldraganddrop.pro create mode 100644 examples/quick/externaldraganddrop/externaldraganddrop.qml create mode 100644 examples/quick/externaldraganddrop/externaldraganddrop.qmlproject create mode 100644 examples/quick/externaldraganddrop/externaldraganddrop.qrc create mode 100644 examples/quick/externaldraganddrop/main.cpp diff --git a/examples/quick/externaldraganddrop/DragAndDropTextItem.qml b/examples/quick/externaldraganddrop/DragAndDropTextItem.qml new file mode 100644 index 0000000000..390a4b3abe --- /dev/null +++ b/examples/quick/externaldraganddrop/DragAndDropTextItem.qml @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.2 + +Rectangle { + id: item + property string display + color: "#EEE" + Text { + anchors.fill: parent + text: item.display + wrapMode: Text.WordWrap + } + DropArea { + anchors.fill: parent + keys: ["text/plain"] + onEntered: { + item.color = "#FCC" + } + onExited: { + item.color = "#EEE" + } + onDropped: { + item.color = "#EEE" + if (drop.hasText) { + if (drop.proposedAction == Qt.MoveAction || drop.proposedAction == Qt.CopyAction) { + item.display = drop.text + drop.acceptProposedAction() + } + } + } + } + MouseArea { + id: mouseArea + anchors.fill: parent + drag.target: draggable + } + Item { + id: draggable + anchors.fill: parent + Drag.active: mouseArea.drag.active + Drag.hotSpot.x: 0 + Drag.hotSpot.y: 0 + Drag.mimeData: { "text/plain": item.display } + Drag.dragType: Drag.Automatic + Drag.onDragStarted: { + } + Drag.onDragFinished: { + if (dropAction == Qt.MoveAction) { + item.display = "" + } + } + } // Item +} diff --git a/examples/quick/externaldraganddrop/doc/images/qml-dnd2-example.png b/examples/quick/externaldraganddrop/doc/images/qml-dnd2-example.png new file mode 100644 index 0000000000000000000000000000000000000000..e657d81795f4160600c79d74890fc9128f2d6a99 GIT binary patch literal 48666 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≫L}ED~-;e*D355!rUx|0St>7fjOrwKl=oVEb`J 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 literal 0 HcmV?d00001 diff --git a/examples/quick/externaldraganddrop/doc/src/externaldraganddrop.qdoc b/examples/quick/externaldraganddrop/doc/src/externaldraganddrop.qdoc new file mode 100644 index 0000000000..1251e6e1eb --- /dev/null +++ b/examples/quick/externaldraganddrop/doc/src/externaldraganddrop.qdoc @@ -0,0 +1,38 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: http://www.gnu.org/copyleft/fdl.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ +/*! + \title Qt Quick Examples - externaldraganddrop + \example externaldraganddrop + \brief This is an example of drag and drop between Qml and other applications + \image qml-dnd2-example.png + \ingroup qtquickexamples + + This example shows you how to respond to do drag and drop using MouseArea and DropArea. + + Drag text between boxes, out of boxes into other applications, and from other applications into the boxes. Use option/ctrl to copy rather than move text when dragging between boxes. + +*/ diff --git a/examples/quick/externaldraganddrop/externaldraganddrop.pro b/examples/quick/externaldraganddrop/externaldraganddrop.pro new file mode 100644 index 0000000000..646781e7d1 --- /dev/null +++ b/examples/quick/externaldraganddrop/externaldraganddrop.pro @@ -0,0 +1,11 @@ +TEMPLATE = app + +QT += quick qml +SOURCES += main.cpp +RESOURCES += externaldraganddrop.qrc + +EXAMPLE_FILES = \ + DragAndDropTextItem.qml + +target.path = $$[QT_INSTALL_EXAMPLES]/quick/externaldraganddrop +INSTALLS += target diff --git a/examples/quick/externaldraganddrop/externaldraganddrop.qml b/examples/quick/externaldraganddrop/externaldraganddrop.qml new file mode 100644 index 0000000000..f39d33dda7 --- /dev/null +++ b/examples/quick/externaldraganddrop/externaldraganddrop.qml @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.2 +import QtQuick.Layouts 1.0 + +Item { + id: root + width: 320 + height: 480 + + ColumnLayout { + + anchors.fill: parent + anchors.margins: 8 + + Text { + Layout.fillWidth: true + text: "Drag text into, out of, and between the boxes below." + wrapMode: Text.WordWrap + } + + DragAndDropTextItem { + Layout.fillWidth: true + height: 142 + display: "Sample Text" + } + + DragAndDropTextItem { + Layout.fillWidth: true + height: 142 + display: "Option/ctrl drag to copy instead of move text." + } + + DragAndDropTextItem { + Layout.fillWidth: true + height: 142 + display: "Drag out into other applications." + } + + } +} diff --git a/examples/quick/externaldraganddrop/externaldraganddrop.qmlproject b/examples/quick/externaldraganddrop/externaldraganddrop.qmlproject new file mode 100644 index 0000000000..359efae597 --- /dev/null +++ b/examples/quick/externaldraganddrop/externaldraganddrop.qmlproject @@ -0,0 +1,16 @@ +import QmlProject 1.1 + +Project { + mainFile: "externaldraganddrop.qml" + + /* Include .qml, .js, and image files from current directory and subdirectories */ + QmlFiles { + directory: "." + } + JavaScriptFiles { + directory: "." + } + ImageFiles { + directory: "." + } +} diff --git a/examples/quick/externaldraganddrop/externaldraganddrop.qrc b/examples/quick/externaldraganddrop/externaldraganddrop.qrc new file mode 100644 index 0000000000..edac9820c9 --- /dev/null +++ b/examples/quick/externaldraganddrop/externaldraganddrop.qrc @@ -0,0 +1,6 @@ +<RCC> + <qresource prefix="/externaldraganddrop"> + <file>externaldraganddrop.qml</file> + <file>DragAndDropTextItem.qml</file> + </qresource> +</RCC> diff --git a/examples/quick/externaldraganddrop/main.cpp b/examples/quick/externaldraganddrop/main.cpp new file mode 100644 index 0000000000..33600e7983 --- /dev/null +++ b/examples/quick/externaldraganddrop/main.cpp @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "../shared/shared.h" +DECLARATIVE_EXAMPLE_MAIN(externaldraganddrop/externaldraganddrop) diff --git a/examples/quick/quick.pro b/examples/quick/quick.pro index e4c00fffa1..c6b7ee1c34 100644 --- a/examples/quick/quick.pro +++ b/examples/quick/quick.pro @@ -2,6 +2,7 @@ TEMPLATE = subdirs SUBDIRS = quick-accessibility \ animation \ draganddrop \ + externaldraganddrop \ canvas \ imageelements \ keyinteraction \ diff --git a/src/quick/items/qquickdrag.cpp b/src/quick/items/qquickdrag.cpp index f145ce259f..0ae26cb5c3 100644 --- a/src/quick/items/qquickdrag.cpp +++ b/src/quick/items/qquickdrag.cpp @@ -46,7 +46,9 @@ #include <private/qquickitemchangelistener_p.h> #include <private/qv8engine_p.h> #include <QtCore/qcoreapplication.h> +#include <QtCore/qmimedata.h> #include <QtQml/qqmlinfo.h> +#include <QtGui/qdrag.h> #include <QtGui/qevent.h> #ifndef QT_NO_DRAGANDDROP @@ -72,6 +74,7 @@ public: , itemMoved(false) , eventQueued(false) , overrideActions(false) + , dragType(QQuickDrag::Internal) { } @@ -83,8 +86,8 @@ public: void deliverMoveEvent(); void deliverLeaveEvent(); void deliverEvent(QQuickWindow *window, QEvent *event); - void start() { start(supportedActions); } void start(Qt::DropActions supportedActions); + Qt::DropAction startDrag(Qt::DropActions supportedActions); void setTarget(QQuickItem *item); QQuickDragGrabber dragGrabber; @@ -105,6 +108,8 @@ public: bool overrideActions : 1; QPointF hotSpot; QStringList keys; + QVariantMap externalMimeData; + QQuickDrag::DragType dragType; }; /*! @@ -272,7 +277,10 @@ QQuickDragAttached::~QQuickDragAttached() This property holds whether a drag event sequence is currently active. - Setting this property to true will send a QDragEnter event to the scene + Binding this property to the active property of \l MouseArea::drag will + cause \l startDrag to be called when the user starts dragging. + + Setting this property to true will also send a QDragEnter event to the scene with the item's current position. Setting it to false will send a QDragLeave event. @@ -292,8 +300,18 @@ void QQuickDragAttached::setActive(bool active) if (d->active != active) { if (d->inEvent) qmlInfo(this) << "active cannot be changed from within a drag event handler"; - else if (active) - d->start(d->supportedActions); + else if (active) { + if (d->dragType == QQuickDrag::Internal) { + d->start(d->supportedActions); + } + else if (d->dragType == QQuickDrag::Automatic) { + // There are different semantics than start() since startDrag() + // may be called after an internal drag is already started. + active = true; + emit activeChanged(); + d->startDrag(d->supportedActions); + } + } else cancel(); } @@ -410,6 +428,28 @@ void QQuickDragAttached::setKeys(const QStringList &keys) } } +/*! + \qmlattachedproperty stringlist QtQuick2::Drag::mimeData + \since QtQuick 2.2 + + This property holds a map of mimeData that is used during startDrag. +*/ + +QVariantMap QQuickDragAttached::mimeData() const +{ + Q_D(const QQuickDragAttached); + return d->externalMimeData; +} + +void QQuickDragAttached::setMimeData(const QVariantMap &mimeData) +{ + Q_D(QQuickDragAttached); + if (d->externalMimeData != mimeData) { + d->externalMimeData = mimeData; + emit mimeDataChanged(); + } +} + /*! \qmlattachedproperty flags QtQuick2::Drag::supportedActions @@ -465,6 +505,42 @@ void QQuickDragAttached::setProposedAction(Qt::DropAction action) } } +/*! + \qmlattachedproperty enumeration QtQuick2::Drag::dragType + \since QtQuick 2.2 + + This property indicates whether to automatically start drags, do nothing, or + to use backwards compatible internal drags. The default is to use backwards + compatible internal drags. + + A drag can also be started manually using \l startDrag. + + \list + \li Drag.None - do not start drags automatically + \li Drag.Automatic - start drags automatically + \li Drag.Internal (default) - start backwards compatible drags automatically + \endlist + + When using \l Drag.Automatic you should also define \l mimeData and bind the + \active property to the active property of \l MouseArea.drag. + + */ + +QQuickDrag::DragType QQuickDragAttached::dragType() const +{ + Q_D(const QQuickDragAttached); + return d->dragType; +} + +void QQuickDragAttached::setDragType(QQuickDrag::DragType dragType) +{ + Q_D(QQuickDragAttached); + if (d->dragType != dragType) { + d->dragType = dragType; + emit dragTypeChanged(); + } +} + void QQuickDragAttachedPrivate::start(Qt::DropActions supportedActions) { Q_Q(QQuickDragAttached); @@ -496,7 +572,8 @@ void QQuickDragAttachedPrivate::start(Qt::DropActions supportedActions) /*! \qmlattachedmethod void QtQuick2::Drag::start(flags supportedActions) - Starts sending drag events. + Starts sending drag events. Used for starting old-style internal drags. \l startDrag is the + new-style, preferred method of starting drags. The optional \a supportedActions argument can be used to override the \l supportedActions property for the started sequence. @@ -616,6 +693,223 @@ void QQuickDragAttached::cancel() emit activeChanged(); } +/*! + \qmlsignal QtQuick2::DropArea::onDragStarted() + + This handler is called when a drag is started with the \l startDrag method + or when it is started automatically using the \l dragType property. + */ + +/*! + \qmlsignal QtQuick2::DropArea::onDragFinished(DropAction action) + + This handler is called when a drag finishes and the drag was started with the + \l startDrag method or started automatically using the \l dragType property. + */ + +Qt::DropAction QQuickDragAttachedPrivate::startDrag(Qt::DropActions supportedActions) +{ + Q_Q(QQuickDragAttached); + + QDrag *drag = new QDrag(q); + QMimeData *mimeData = new QMimeData(); + + Q_FOREACH (const QString &key, externalMimeData.keys()) { + mimeData->setData(key, externalMimeData[key].toString().toUtf8()); + } + + drag->setMimeData(mimeData); + + // TODO: how to handle drag image? + // drag->setPixmap(iconPixmap); + + emit q->dragStarted(); + + Qt::DropAction dropAction = drag->exec(supportedActions); + + delete drag; + + deliverLeaveEvent(); + + if (target) { + target = 0; + emit q->targetChanged(); + } + + emit q->dragFinished(dropAction); + + active = false; + emit q->activeChanged(); + + return dropAction; +} + + +/*! + \qmlattachedmethod void QtQuick2::Drag::startDrag(flags supportedActions) + + Starts sending drag events. + + The optional \a supportedActions argument can be used to override the \l supportedActions + property for the started sequence. +*/ + +void QQuickDragAttached::startDrag(QQmlV4Function *args) +{ + Q_D(QQuickDragAttached); + + if (d->inEvent) { + qmlInfo(this) << "startDrag() cannot be called from within a drag event handler"; + return; + } + + if (!d->active) { + qmlInfo(this) << "startDrag() drag must be active"; + return; + } + + Qt::DropActions supportedActions = d->supportedActions; + + // check arguments for supportedActions + if (args->length() >= 1) { + QV4::Value v = (*args)[0]; + if (v.isInt32()) { + supportedActions = Qt::DropActions(v.integerValue()); + } + } + + Qt::DropAction dropAction = d->startDrag(supportedActions); + + args->setReturnValue(QV4::Value::fromInt32(dropAction)); +} + +QQuickDrag::QQuickDrag(QObject *parent) +: QObject(parent), _target(0), _axis(XAndYAxis), _xmin(-FLT_MAX), +_xmax(FLT_MAX), _ymin(-FLT_MAX), _ymax(FLT_MAX), _active(false), _filterChildren(false) +{ +} + +QQuickDrag::~QQuickDrag() +{ +} + +QQuickItem *QQuickDrag::target() const +{ + return _target; +} + +void QQuickDrag::setTarget(QQuickItem *t) +{ + if (_target == t) + return; + _target = t; + emit targetChanged(); +} + +void QQuickDrag::resetTarget() +{ + if (_target == 0) + return; + _target = 0; + emit targetChanged(); +} + +QQuickDrag::Axis QQuickDrag::axis() const +{ + return _axis; +} + +void QQuickDrag::setAxis(QQuickDrag::Axis a) +{ + if (_axis == a) + return; + _axis = a; + emit axisChanged(); +} + +qreal QQuickDrag::xmin() const +{ + return _xmin; +} + +void QQuickDrag::setXmin(qreal m) +{ + if (_xmin == m) + return; + _xmin = m; + emit minimumXChanged(); +} + +qreal QQuickDrag::xmax() const +{ + return _xmax; +} + +void QQuickDrag::setXmax(qreal m) +{ + if (_xmax == m) + return; + _xmax = m; + emit maximumXChanged(); +} + +qreal QQuickDrag::ymin() const +{ + return _ymin; +} + +void QQuickDrag::setYmin(qreal m) +{ + if (_ymin == m) + return; + _ymin = m; + emit minimumYChanged(); +} + +qreal QQuickDrag::ymax() const +{ + return _ymax; +} + +void QQuickDrag::setYmax(qreal m) +{ + if (_ymax == m) + return; + _ymax = m; + emit maximumYChanged(); +} + +bool QQuickDrag::active() const +{ + return _active; +} + +void QQuickDrag::setActive(bool drag) +{ + if (_active == drag) + return; + _active = drag; + emit activeChanged(); +} + +bool QQuickDrag::filterChildren() const +{ + return _filterChildren; +} + +void QQuickDrag::setFilterChildren(bool filter) +{ + if (_filterChildren == filter) + return; + _filterChildren = filter; + emit filterChildrenChanged(); +} + +QQuickDragAttached *QQuickDrag::qmlAttachedProperties(QObject *obj) +{ + return new QQuickDragAttached(obj); +} + QT_END_NAMESPACE #endif // QT_NO_DRAGANDDROP diff --git a/src/quick/items/qquickdrag_p.h b/src/quick/items/qquickdrag_p.h index 3680fd5754..098fcc61b9 100644 --- a/src/quick/items/qquickdrag_p.h +++ b/src/quick/items/qquickdrag_p.h @@ -143,18 +143,90 @@ private: }; class QQmlV4Function; +class QQuickDragAttached; +class Q_AUTOTEST_EXPORT QQuickDrag : public QObject +{ + Q_OBJECT + + Q_ENUMS(Axis DragType) + Q_PROPERTY(QQuickItem *target READ target WRITE setTarget NOTIFY targetChanged RESET resetTarget) + Q_PROPERTY(Axis axis READ axis WRITE setAxis NOTIFY axisChanged) + Q_PROPERTY(qreal minimumX READ xmin WRITE setXmin NOTIFY minimumXChanged) + Q_PROPERTY(qreal maximumX READ xmax WRITE setXmax NOTIFY maximumXChanged) + Q_PROPERTY(qreal minimumY READ ymin WRITE setYmin NOTIFY minimumYChanged) + Q_PROPERTY(qreal maximumY READ ymax WRITE setYmax NOTIFY maximumYChanged) + Q_PROPERTY(bool active READ active NOTIFY activeChanged) + Q_PROPERTY(bool filterChildren READ filterChildren WRITE setFilterChildren NOTIFY filterChildrenChanged) + //### consider drag and drop + +public: + QQuickDrag(QObject *parent=0); + ~QQuickDrag(); + + enum DragType { None, Automatic, Internal }; + + QQuickItem *target() const; + void setTarget(QQuickItem *target); + void resetTarget(); + + enum Axis { XAxis=0x01, YAxis=0x02, XAndYAxis=0x03, XandYAxis=XAndYAxis }; + Axis axis() const; + void setAxis(Axis); + + qreal xmin() const; + void setXmin(qreal); + qreal xmax() const; + void setXmax(qreal); + qreal ymin() const; + void setYmin(qreal); + qreal ymax() const; + void setYmax(qreal); + + bool active() const; + void setActive(bool); + + bool filterChildren() const; + void setFilterChildren(bool); + + static QQuickDragAttached *qmlAttachedProperties(QObject *obj); + +Q_SIGNALS: + void targetChanged(); + void axisChanged(); + void minimumXChanged(); + void maximumXChanged(); + void minimumYChanged(); + void maximumYChanged(); + void activeChanged(); + void filterChildrenChanged(); + +private: + QQuickItem *_target; + Axis _axis; + qreal _xmin; + qreal _xmax; + qreal _ymin; + qreal _ymax; + bool _active : 1; + bool _filterChildren: 1; + Q_DISABLE_COPY(QQuickDrag) +}; class QQuickDragAttachedPrivate; class QQuickDragAttached : public QObject { Q_OBJECT + Q_DECLARE_PRIVATE(QQuickDragAttached) + Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged) Q_PROPERTY(QObject *source READ source WRITE setSource NOTIFY sourceChanged RESET resetSource) Q_PROPERTY(QObject *target READ target NOTIFY targetChanged) Q_PROPERTY(QPointF hotSpot READ hotSpot WRITE setHotSpot NOTIFY hotSpotChanged) Q_PROPERTY(QStringList keys READ keys WRITE setKeys NOTIFY keysChanged) + Q_PROPERTY(QVariantMap mimeData READ mimeData WRITE setMimeData NOTIFY mimeDataChanged) Q_PROPERTY(Qt::DropActions supportedActions READ supportedActions WRITE setSupportedActions NOTIFY supportedActionsChanged) Q_PROPERTY(Qt::DropAction proposedAction READ proposedAction WRITE setProposedAction NOTIFY proposedActionChanged) + Q_PROPERTY(QQuickDrag::DragType dragType READ dragType WRITE setDragType NOTIFY dragTypeChanged) public: QQuickDragAttached(QObject *parent); ~QQuickDragAttached(); @@ -174,36 +246,47 @@ public: QStringList keys() const; void setKeys(const QStringList &keys); + QVariantMap mimeData() const; + void setMimeData(const QVariantMap &mimeData); + Qt::DropActions supportedActions() const; void setSupportedActions(Qt::DropActions actions); Qt::DropAction proposedAction() const; void setProposedAction(Qt::DropAction action); + QQuickDrag::DragType dragType() const; + void setDragType(QQuickDrag::DragType dragType); + Q_INVOKABLE int drop(); bool event(QEvent *event); public Q_SLOTS: void start(QQmlV4Function *); + void startDrag(QQmlV4Function *); void cancel(); Q_SIGNALS: + void dragStarted(); + void dragFinished(Qt::DropAction dropAction); + void activeChanged(); void sourceChanged(); void targetChanged(); void hotSpotChanged(); void keysChanged(); + void mimeDataChanged(); void supportedActionsChanged(); void proposedActionChanged(); - -private: - Q_DECLARE_PRIVATE(QQuickDragAttached) + void dragTypeChanged(); }; - QT_END_NAMESPACE +QML_DECLARE_TYPE(QQuickDrag) +QML_DECLARE_TYPEINFO(QQuickDrag, QML_HAS_ATTACHED_PROPERTIES) + #endif // QT_NO_DRAGANDDROP #endif diff --git a/src/quick/items/qquickdroparea.cpp b/src/quick/items/qquickdroparea.cpp index f453c42e5b..09dc7eeebb 100644 --- a/src/quick/items/qquickdroparea.cpp +++ b/src/quick/items/qquickdroparea.cpp @@ -77,11 +77,12 @@ public: QPointF dragPosition; QQuickDropAreaDrag *drag; QPointer<QObject> source; - QPointer<QMimeData> mimeData; + bool containsDrag; }; QQuickDropAreaPrivate::QQuickDropAreaPrivate() : drag(0) + , containsDrag(false) { } @@ -133,7 +134,7 @@ QQuickDropArea::~QQuickDropArea() bool QQuickDropArea::containsDrag() const { Q_D(const QQuickDropArea); - return d->mimeData; + return d->containsDrag; } /*! @@ -217,7 +218,7 @@ qreal QQuickDropAreaDrag::y() const void QQuickDropArea::dragMoveEvent(QDragMoveEvent *event) { Q_D(QQuickDropArea); - if (!d->mimeData) + if (!d->containsDrag) return; d->dragPosition = event->pos(); @@ -259,28 +260,27 @@ void QQuickDropArea::dragEnterEvent(QDragEnterEvent *event) { Q_D(QQuickDropArea); const QMimeData *mimeData = event->mimeData(); - if (!d->effectiveEnable || d->mimeData || !mimeData || !d->hasMatchingKey(d->getKeys(mimeData))) + if (!d->effectiveEnable || d->containsDrag || !mimeData || !d->hasMatchingKey(d->getKeys(mimeData))) return; d->dragPosition = event->pos(); event->accept(); + QQuickDropEvent dragTargetEvent(d, event); emit entered(&dragTargetEvent); - if (event->isAccepted()) { - d->mimeData = const_cast<QMimeData *>(mimeData); - if (QQuickDragMimeData *dragMime = qobject_cast<QQuickDragMimeData *>(d->mimeData)) - d->source = dragMime->source(); - else - d->source = event->source(); - d->dragPosition = event->pos(); - if (d->drag) { - emit d->drag->positionChanged(); - emit d->drag->sourceChanged(); - } - emit containsDragChanged(); + d->containsDrag = true; + if (QQuickDragMimeData *dragMime = qobject_cast<QQuickDragMimeData *>(const_cast<QMimeData *>(mimeData))) + d->source = dragMime->source(); + else + d->source = event->source(); + d->dragPosition = event->pos(); + if (d->drag) { + emit d->drag->positionChanged(); + emit d->drag->sourceChanged(); } + emit containsDragChanged(); } /*! @@ -292,12 +292,12 @@ void QQuickDropArea::dragEnterEvent(QDragEnterEvent *event) void QQuickDropArea::dragLeaveEvent(QDragLeaveEvent *) { Q_D(QQuickDropArea); - if (!d->mimeData) + if (!d->containsDrag) return; emit exited(); - d->mimeData = 0; + d->containsDrag = false; d->source = 0; emit containsDragChanged(); if (d->drag) @@ -314,13 +314,13 @@ void QQuickDropArea::dragLeaveEvent(QDragLeaveEvent *) void QQuickDropArea::dropEvent(QDropEvent *event) { Q_D(QQuickDropArea); - if (!d->mimeData) + if (!d->containsDrag) return; QQuickDropEvent dragTargetEvent(d, event); emit dropped(&dragTargetEvent); - d->mimeData = 0; + d->containsDrag = false; d->source = 0; emit containsDragChanged(); if (d->drag) @@ -337,6 +337,16 @@ void QQuickDropArea::dropEvent(QDropEvent *event) The position of the drag event can be obtained from the \l x and \l y properties, and the \l keys property identifies the drag keys of the event \l source. + + The existence of specific drag types can be determined using the \l hasColor, + \l hasHtml, \l hasText, and \l hasUrls properties. + + The list of all supplied formats can be determined using the \l formats property. + + Specific drag types can be obtained using the \l colorData, \l html, \l text, + and \l urls properties. + + A string version of any available mimeType can be obtained using \l getDataAsString. */ /*! @@ -357,14 +367,6 @@ void QQuickDropArea::dropEvent(QDropEvent *event) This property holds the source of a drag event. */ -QObject *QQuickDropEvent::source() -{ - if (const QQuickDragMimeData *dragMime = qobject_cast<const QQuickDragMimeData *>(event->mimeData())) - return dragMime->source(); - else - return event->source(); -} - /*! \qmlproperty stringlist QtQuick2::DragEvent::keys @@ -372,11 +374,6 @@ QObject *QQuickDropEvent::source() drag event. */ -QStringList QQuickDropEvent::keys() const -{ - return d->getKeys(event->mimeData()); -} - /*! \qmlproperty enumeration QtQuick2::DragEvent::action @@ -399,6 +396,14 @@ QStringList QQuickDropEvent::keys() const drag source. */ +/*! + \qmlproperty flags QtQuick2::DragEvent::proposedAction + \since QtQuick 2.2 + + This property holds the set of \l {action}{actions} proposed by the + drag source. +*/ + /*! \qmlproperty bool QtQuick2::DragEvent::accepted @@ -416,6 +421,157 @@ QStringList QQuickDropEvent::keys() const If an \a action is specified it will overwrite the value of the \l action property. */ +/*! + \qmlmethod QtQuick2::DragEvent::acceptProposedAction() + \since QtQuick 2.2 + + Accepts the drag event with the \l proposedAction. +*/ + +/*! + \qmlproperty bool QtQuick2::DragEvent::hasColor + \since QtQuick 2.2 + + This property holds whether the drag event contains a color item. +*/ + +/*! + \qmlproperty bool QtQuick2::DragEvent::hasHtml + \since QtQuick 2.2 + + This property holds whether the drag event contains a html item. +*/ + +/*! + \qmlproperty bool QtQuick2::DragEvent::hasText + \since QtQuick 2.2 + + This property holds whether the drag event contains a text item. +*/ + +/*! + \qmlproperty bool QtQuick2::DragEvent::hasUrls + \since QtQuick 2.2 + + This property holds whether the drag event contains one or more url items. +*/ + +/*! + \qmlproperty color QtQuick2::DragEvent::colorData + \since QtQuick 2.2 + + This property holds color data, if any. +*/ + +/*! + \qmlproperty string QtQuick2::DragEvent::html + \since QtQuick 2.2 + + This property holds html data, if any. +*/ + +/*! + \qmlproperty string QtQuick2::DragEvent::text + \since QtQuick 2.2 + + This property holds text data, if any. +*/ + +/*! + \qmlproperty urllist QtQuick2::DragEvent::urls + \since QtQuick 2.2 + + This property holds a list of urls, if any. +*/ + +/*! + \qmlproperty stringlist QtQuick2::DragEvent::formats + \since QtQuick 2.2 + + This property holds a list of mime type formats contained in the drag data. +*/ + +/*! + \qmlmethod string QtQuick2::DragEvent::getDataAsString(string format) + \since QtQuick 2.2 + + Returns the data for the given \a format converted to a string. \a format should be one contained in the \l formats property. +*/ + +QObject *QQuickDropEvent::source() +{ + if (const QQuickDragMimeData *dragMime = qobject_cast<const QQuickDragMimeData *>(event->mimeData())) + return dragMime->source(); + else + return event->source(); +} + +QStringList QQuickDropEvent::keys() const +{ + return d->getKeys(event->mimeData()); +} + +bool QQuickDropEvent::hasColor() const +{ + return event->mimeData()->hasColor(); +} + +bool QQuickDropEvent::hasHtml() const +{ + return event->mimeData()->hasHtml(); +} + +bool QQuickDropEvent::hasText() const +{ + return event->mimeData()->hasText(); +} + +bool QQuickDropEvent::hasUrls() const +{ + return event->mimeData()->hasUrls(); +} + +QVariant QQuickDropEvent::colorData() const +{ + return event->mimeData()->colorData(); +} + +QString QQuickDropEvent::html() const +{ + return event->mimeData()->html(); +} + +QString QQuickDropEvent::text() const +{ + return event->mimeData()->text(); +} + +QList<QUrl> QQuickDropEvent::urls() const +{ + return event->mimeData()->urls(); +} + +QStringList QQuickDropEvent::formats() const +{ + return event->mimeData()->formats(); +} + +void QQuickDropEvent::getDataAsString(QQmlV4Function *args) +{ + if (args->length() != 0) { + QV4::Value v = (*args)[0]; + QString format = v.toQString(); + QString rv = QString::fromUtf8(event->mimeData()->data(format)); + QV4::ExecutionEngine *v4 = QV8Engine::getV4(args->engine()); + args->setReturnValue(QV4::Value::fromString(v4, rv)); + } +} + +void QQuickDropEvent::acceptProposedAction(QQmlV4Function *) +{ + event->acceptProposedAction(); +} + void QQuickDropEvent::accept(QQmlV4Function *args) { Qt::DropAction action = event->dropAction(); @@ -425,6 +581,7 @@ void QQuickDropEvent::accept(QQmlV4Function *args) if (v.isInt32()) action = Qt::DropAction(v.integerValue()); } + // get action from arguments. event->setDropAction(action); event->accept(); diff --git a/src/quick/items/qquickdroparea_p.h b/src/quick/items/qquickdroparea_p.h index 3bdbe7f72e..6ba876ef34 100644 --- a/src/quick/items/qquickdroparea_p.h +++ b/src/quick/items/qquickdroparea_p.h @@ -62,8 +62,18 @@ class QQuickDropEvent : public QObject Q_PROPERTY(QObject *source READ source) Q_PROPERTY(QStringList keys READ keys) Q_PROPERTY(Qt::DropActions supportedActions READ supportedActions) + Q_PROPERTY(Qt::DropActions proposedAction READ proposedAction) Q_PROPERTY(Qt::DropAction action READ action WRITE setAction RESET resetAction) Q_PROPERTY(bool accepted READ accepted WRITE setAccepted) + Q_PROPERTY(bool hasColor READ hasColor) + Q_PROPERTY(bool hasHtml READ hasHtml) + Q_PROPERTY(bool hasText READ hasText) + Q_PROPERTY(bool hasUrls READ hasUrls) + Q_PROPERTY(QVariant colorData READ colorData) + Q_PROPERTY(QString html READ html) + Q_PROPERTY(QString text READ text) + Q_PROPERTY(QList<QUrl> urls READ urls) + Q_PROPERTY(QStringList formats READ formats) public: QQuickDropEvent(QQuickDropAreaPrivate *d, QDropEvent *event) : d(d), event(event) {} @@ -73,6 +83,7 @@ public: QObject *source(); Qt::DropActions supportedActions() const { return event->possibleActions(); } + Qt::DropActions proposedAction() const { return event->proposedAction(); } Qt::DropAction action() const { return event->dropAction(); } void setAction(Qt::DropAction action) { event->setDropAction(action); } void resetAction() { event->setDropAction(event->proposedAction()); } @@ -82,6 +93,18 @@ public: bool accepted() const { return event->isAccepted(); } void setAccepted(bool accepted) { event->setAccepted(accepted); } + bool hasColor() const; + bool hasHtml() const; + bool hasText() const; + bool hasUrls() const; + QVariant colorData() const; + QString html() const; + QString text() const; + QList<QUrl> urls() const; + QStringList formats() const; + + Q_INVOKABLE void getDataAsString(QQmlV4Function *); + Q_INVOKABLE void acceptProposedAction(QQmlV4Function *); Q_INVOKABLE void accept(QQmlV4Function *); private: diff --git a/src/quick/items/qquickmousearea.cpp b/src/quick/items/qquickmousearea.cpp index 1970a03bee..8a73a5d73d 100644 --- a/src/quick/items/qquickmousearea.cpp +++ b/src/quick/items/qquickmousearea.cpp @@ -61,137 +61,6 @@ DEFINE_BOOL_CONFIG_OPTION(qmlVisualTouchDebugging, QML_VISUAL_TOUCH_DEBUGGING) static const int PressAndHoldDelay = 800; -#ifndef QT_NO_DRAGANDDROP - -QQuickDrag::QQuickDrag(QObject *parent) -: QObject(parent), _target(0), _axis(XAndYAxis), _xmin(-FLT_MAX), -_xmax(FLT_MAX), _ymin(-FLT_MAX), _ymax(FLT_MAX), _active(false), _filterChildren(false) -{ -} - -QQuickDrag::~QQuickDrag() -{ -} - -QQuickItem *QQuickDrag::target() const -{ - return _target; -} - -void QQuickDrag::setTarget(QQuickItem *t) -{ - if (_target == t) - return; - _target = t; - emit targetChanged(); -} - -void QQuickDrag::resetTarget() -{ - if (_target == 0) - return; - _target = 0; - emit targetChanged(); -} - -QQuickDrag::Axis QQuickDrag::axis() const -{ - return _axis; -} - -void QQuickDrag::setAxis(QQuickDrag::Axis a) -{ - if (_axis == a) - return; - _axis = a; - emit axisChanged(); -} - -qreal QQuickDrag::xmin() const -{ - return _xmin; -} - -void QQuickDrag::setXmin(qreal m) -{ - if (_xmin == m) - return; - _xmin = m; - emit minimumXChanged(); -} - -qreal QQuickDrag::xmax() const -{ - return _xmax; -} - -void QQuickDrag::setXmax(qreal m) -{ - if (_xmax == m) - return; - _xmax = m; - emit maximumXChanged(); -} - -qreal QQuickDrag::ymin() const -{ - return _ymin; -} - -void QQuickDrag::setYmin(qreal m) -{ - if (_ymin == m) - return; - _ymin = m; - emit minimumYChanged(); -} - -qreal QQuickDrag::ymax() const -{ - return _ymax; -} - -void QQuickDrag::setYmax(qreal m) -{ - if (_ymax == m) - return; - _ymax = m; - emit maximumYChanged(); -} - -bool QQuickDrag::active() const -{ - return _active; -} - -void QQuickDrag::setActive(bool drag) -{ - if (_active == drag) - return; - _active = drag; - emit activeChanged(); -} - -bool QQuickDrag::filterChildren() const -{ - return _filterChildren; -} - -void QQuickDrag::setFilterChildren(bool filter) -{ - if (_filterChildren == filter) - return; - _filterChildren = filter; - emit filterChildrenChanged(); -} - -QQuickDragAttached *QQuickDrag::qmlAttachedProperties(QObject *obj) -{ - return new QQuickDragAttached(obj); -} - -#endif // QT_NO_DRAGANDDROP - QQuickMouseAreaPrivate::QQuickMouseAreaPrivate() : enabled(true), hovered(false), longPress(false), moved(false), stealMouse(false), doubleClick(false), preventStealing(false), diff --git a/src/quick/items/qquickmousearea_p.h b/src/quick/items/qquickmousearea_p.h index fa32f32b65..ffe75ad843 100644 --- a/src/quick/items/qquickmousearea_p.h +++ b/src/quick/items/qquickmousearea_p.h @@ -49,78 +49,7 @@ QT_BEGIN_NAMESPACE class QQuickMouseEvent; - -#ifndef QT_NO_DRAGANDDROP - -class QQuickDragAttached; -class Q_AUTOTEST_EXPORT QQuickDrag : public QObject -{ - Q_OBJECT - - Q_ENUMS(Axis) - Q_PROPERTY(QQuickItem *target READ target WRITE setTarget NOTIFY targetChanged RESET resetTarget) - Q_PROPERTY(Axis axis READ axis WRITE setAxis NOTIFY axisChanged) - Q_PROPERTY(qreal minimumX READ xmin WRITE setXmin NOTIFY minimumXChanged) - Q_PROPERTY(qreal maximumX READ xmax WRITE setXmax NOTIFY maximumXChanged) - Q_PROPERTY(qreal minimumY READ ymin WRITE setYmin NOTIFY minimumYChanged) - Q_PROPERTY(qreal maximumY READ ymax WRITE setYmax NOTIFY maximumYChanged) - Q_PROPERTY(bool active READ active NOTIFY activeChanged) - Q_PROPERTY(bool filterChildren READ filterChildren WRITE setFilterChildren NOTIFY filterChildrenChanged) - //### consider drag and drop - -public: - QQuickDrag(QObject *parent=0); - ~QQuickDrag(); - - QQuickItem *target() const; - void setTarget(QQuickItem *target); - void resetTarget(); - - enum Axis { XAxis=0x01, YAxis=0x02, XAndYAxis=0x03, XandYAxis=XAndYAxis }; - Axis axis() const; - void setAxis(Axis); - - qreal xmin() const; - void setXmin(qreal); - qreal xmax() const; - void setXmax(qreal); - qreal ymin() const; - void setYmin(qreal); - qreal ymax() const; - void setYmax(qreal); - - bool active() const; - void setActive(bool); - - bool filterChildren() const; - void setFilterChildren(bool); - - static QQuickDragAttached *qmlAttachedProperties(QObject *obj); - -Q_SIGNALS: - void targetChanged(); - void axisChanged(); - void minimumXChanged(); - void maximumXChanged(); - void minimumYChanged(); - void maximumYChanged(); - void activeChanged(); - void filterChildrenChanged(); - -private: - QQuickItem *_target; - Axis _axis; - qreal _xmin; - qreal _xmax; - qreal _ymin; - qreal _ymax; - bool _active : 1; - bool _filterChildren: 1; - Q_DISABLE_COPY(QQuickDrag) -}; - -#endif // QT_NO_DRAGANDDROP - +class QQuickDrag; class QQuickMouseAreaPrivate; class QQuickWheelEvent; // used in Qt Location @@ -244,10 +173,6 @@ private: QT_END_NAMESPACE -#ifndef QT_NO_DRAGANDDROP -QML_DECLARE_TYPE(QQuickDrag) -QML_DECLARE_TYPEINFO(QQuickDrag, QML_HAS_ATTACHED_PROPERTIES) -#endif QML_DECLARE_TYPE(QQuickMouseArea) #endif // QQUICKMOUSEAREA_P_H diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index 6bdd8dc221..c195994de4 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -48,6 +48,7 @@ #include <QtCore/qcoreapplication.h> +#include <QtCore/qmimedata.h> #include <QtQml/qqmlinfo.h> #include <QtGui/qevent.h> #include <QTextBoundaryFinder> diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 21e1a009b0..41c7cd9618 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -46,6 +46,8 @@ #include "qquickitem_p.h" #include "qquickevents_p_p.h" +#include <private/qquickdrag_p.h> + #include <QtQuick/private/qsgrenderer_p.h> #include <QtQuick/private/qsgtexture_p.h> #include <QtQuick/private/qsgflashnode_p.h> @@ -363,6 +365,9 @@ QQuickWindowPrivate::QQuickWindowPrivate() , mouseGrabberItem(0) #ifndef QT_NO_CURSOR , cursorItem(0) +#endif +#ifndef QT_NO_DRAGANDDROP + , dragGrabber(0) #endif , touchMouseId(-1) , touchMousePressTimestamp(0) @@ -380,6 +385,9 @@ QQuickWindowPrivate::QQuickWindowPrivate() , renderTargetId(0) , incubationController(0) { +#ifndef QT_NO_DRAGANDDROP + dragGrabber = new QQuickDragGrabber; +#endif } QQuickWindowPrivate::~QQuickWindowPrivate() @@ -984,7 +992,9 @@ QQuickWindow::~QQuickWindow() QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); delete d->incubationController; d->incubationController = 0; - +#ifndef QT_NO_DRAGANDDROP + delete d->dragGrabber; d->dragGrabber = 0; +#endif delete d->contentItem; d->contentItem = 0; } @@ -1202,7 +1212,7 @@ bool QQuickWindow::event(QEvent *e) case QEvent::DragLeave: case QEvent::DragMove: case QEvent::Drop: - d->deliverDragEvent(&d->dragGrabber, e); + d->deliverDragEvent(d->dragGrabber, e); break; #endif case QEvent::WindowDeactivate: diff --git a/src/quick/items/qquickwindow_p.h b/src/quick/items/qquickwindow_p.h index aa7d7c5128..ad861754d7 100644 --- a/src/quick/items/qquickwindow_p.h +++ b/src/quick/items/qquickwindow_p.h @@ -57,7 +57,6 @@ #include "qquickwindow.h" #include <QtQuick/private/qsgcontext_p.h> -#include <private/qquickdrag_p.h> #include <QtCore/qthread.h> #include <QtCore/qmutex.h> @@ -73,6 +72,7 @@ QT_BEGIN_NAMESPACE //Make it easy to identify and customize the root item if needed class QSGRenderLoop; +class QQuickDragGrabber; class QQuickRootItem : public QQuickItem { @@ -116,7 +116,7 @@ public: QQuickItem *cursorItem; #endif #ifndef QT_NO_DRAGANDDROP - QQuickDragGrabber dragGrabber; + QQuickDragGrabber *dragGrabber; #endif int touchMouseId; bool checkIfDoubleClicked(ulong newPressEventTimestamp); diff --git a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp index 5e7370f8a5..de1c12097b 100644 --- a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp +++ b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp @@ -41,6 +41,7 @@ #include <QtTest/QtTest> #include <QtTest/QSignalSpy> +#include <QtQuick/private/qquickdrag_p.h> #include <QtQuick/private/qquickmousearea_p.h> #include <QtQuick/private/qquickrectangle_p.h> #include <private/qquickflickable_p.h> -- GitLab