diff --git a/examples/quick/externaldraganddrop/DragAndDropTextItem.qml b/examples/quick/externaldraganddrop/DragAndDropTextItem.qml new file mode 100644 index 0000000000000000000000000000000000000000..390a4b3abe23ee247bc6d1ecb18d87b45a480308 --- /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 Binary files /dev/null and b/examples/quick/externaldraganddrop/doc/images/qml-dnd2-example.png differ diff --git a/examples/quick/externaldraganddrop/doc/src/externaldraganddrop.qdoc b/examples/quick/externaldraganddrop/doc/src/externaldraganddrop.qdoc new file mode 100644 index 0000000000000000000000000000000000000000..1251e6e1eb13f2986b0892e67d3705e170a7d734 --- /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 0000000000000000000000000000000000000000..646781e7d1d0453c4f4e74f904149439b2eee88f --- /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 0000000000000000000000000000000000000000..f39d33dda7572940f06c0591dc81307cfec1c2b3 --- /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 0000000000000000000000000000000000000000..359efae5977279c3e558fd106f9f6e261f72ecd3 --- /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 0000000000000000000000000000000000000000..edac9820c9a107cbc275da4a54293bb6d909607b --- /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 0000000000000000000000000000000000000000..33600e79837dcea85f6da3aabca62f56c87e3166 --- /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 e4c00fffa1d95f17b679c2b69c81e3659382b36e..c6b7ee1c3482c007303884a8d1d824f844a224b5 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 f145ce259f9d5a8b70ddd790a5c43667db7c065b..0ae26cb5c3c9ebbb9f01a4643aa8fbfaadb001fc 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 3680fd5754574935d5a27d355c3eacc7532147c4..098fcc61b9d08e7c1273afd29a094aa6dd74a2fe 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 f453c42e5ba5cb33d9db043582ba35d7768e4527..09dc7eeebb85d9a8ed2305888c732bda80c1a8f5 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 3bdbe7f72e5772489b6f731a82bee97e3dbd4ec9..6ba876ef346b6d0a5d070db5ff9f1c17c1ee2da0 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 1970a03bee947c5dbb20734327ae6b971eb5dab9..8a73a5d73d8a34c2ded5da06c688347a9d7063aa 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 fa32f32b657c3dbd222084fb166b726b932aafcb..ffe75ad84325a9597e1ea8f535ff4ff8cd0845cb 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 6bdd8dc221717165dd5ae98468a3a4b0d1deca54..c195994de41ac24969e0f1584d1c4af311c000d0 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 21e1a009b00e18e569170c688f3c37da39e72c80..41c7cd9618fd6fc155731dadf3a2c01a6a6ed5bb 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 aa7d7c51289cd1b19a8e6592a696a26b3dfd0d29..ad861754d747845e0f78b2024dcb15f4f7360176 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 5e7370f8a58f2463430e5730400f84c15718e8c1..de1c12097b8aef87dbc61f219051cc0e177f1c37 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>