Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquickdroparea.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qquickdroparea_p.h"
5#include "qquickdrag_p.h"
6#include "qquickitem_p.h"
7
8#include <private/qv4arraybuffer_p.h>
9
10#include <QtCore/qpointer.h>
11#include <QtCore/qregularexpression.h>
12
14
20
24
44
46 : drag(nullptr)
47 , containsDrag(false)
48{
49}
50
55
84
88
97{
98 Q_D(const QQuickDropArea);
99 return d->containsDrag;
100}
101
114{
115 Q_D(const QQuickDropArea);
116 return d->keys;
117}
118
120{
121 Q_D(QQuickDropArea);
122 if (d->keys != keys) {
123 d->keys = keys;
124
125 if (keys.isEmpty()) {
126 d->keyRegExp = QRegularExpression();
127 } else {
129 for (int i = 1; i < keys.size(); ++i)
131 pattern += QLatin1Char(')');
132 d->keyRegExp = QRegularExpression(
134 QLatin1String(".+"))));
135 }
137 }
138}
139
141{
142 Q_D(QQuickDropArea);
143 if (!d->drag)
144 d->drag = new QQuickDropAreaDrag(d);
145 return d->drag;
146}
147
155{
156 return d->source;
157}
158
168{
169 return d->dragPosition.x();
170}
171
173{
174 return d->dragPosition.y();
175}
176
184{
185 Q_D(QQuickDropArea);
186 if (!d->containsDrag)
187 return;
188
189 d->dragPosition = event->position().toPoint();
190 if (d->drag)
191 emit d->drag->positionChanged();
192
193 event->accept();
194 QQuickDragEvent dragTargetEvent(d, event);
195 emit positionChanged(&dragTargetEvent);
196}
197
199{
200 if (keyRegExp.pattern().isEmpty())
201 return true;
202
203 for (const QString &key : keys) {
204 if (key.contains(keyRegExp))
205 return true;
206 }
207 return false;
208}
209
211{
212 if (const QQuickDragMimeData *dragMime = qobject_cast<const QQuickDragMimeData *>(mimeData))
213 return dragMime->keys();
214 return mimeData->formats();
215}
216
224{
225 Q_D(QQuickDropArea);
226 const QMimeData *mimeData = event->mimeData();
227 if (!d->effectiveEnable || d->containsDrag || !mimeData || !d->hasMatchingKey(d->getKeys(mimeData)))
228 return;
229
230 const QQuickDragMimeData *dragMime = qobject_cast<const QQuickDragMimeData *>(mimeData);
231 auto dragSource = dragMime ? dragMime->source() : event->source();
232
233 // if the source of the drag is an ancestor of the drop area, then dragging
234 // also drags the drop area; see QTBUG-64128
235 if (QQuickItem *dragSourceItem = qobject_cast<QQuickItem *>(dragSource)) {
236 if (dragSourceItem->isAncestorOf(this))
237 return;
238 }
239
240 d->dragPosition = event->position().toPoint();
241
242 event->accept();
243
244 QQuickDragEvent dragTargetEvent(d, event);
245 emit entered(&dragTargetEvent);
246 if (!event->isAccepted())
247 return;
248
249 d->containsDrag = true;
250 d->source = dragSource;
251 d->dragPosition = event->position().toPoint();
252 if (d->drag) {
253 emit d->drag->positionChanged();
254 emit d->drag->sourceChanged();
255 }
257}
258
265void QQuickDropArea::dragLeaveEvent(QDragLeaveEvent *)
266{
267 Q_D(QQuickDropArea);
268 if (!d->containsDrag)
269 return;
270
271 emit exited();
272
273 d->containsDrag = false;
274 d->source = nullptr;
276 if (d->drag)
277 emit d->drag->sourceChanged();
278}
279
288{
289 Q_D(QQuickDropArea);
290 if (!d->containsDrag)
291 return;
292
293 QQuickDragEvent dragTargetEvent(d, event);
294 emit dropped(&dragTargetEvent);
295
296 d->containsDrag = false;
297 d->source = nullptr;
299 if (d->drag)
300 emit d->drag->sourceChanged();
301}
302
481{
482 if (const QQuickDragMimeData *dragMime = qobject_cast<const QQuickDragMimeData *>(event->mimeData()))
483 return dragMime->source();
484 else
485 return event->source();
486}
487
489{
490 return d->getKeys(event->mimeData());
491}
492
494{
495 return event->mimeData()->hasColor();
496}
497
499{
500 return event->mimeData()->hasHtml();
501}
502
504{
505 return event->mimeData()->hasText();
506}
507
509{
510 return event->mimeData()->hasUrls();
511}
512
514{
515 return event->mimeData()->colorData();
516}
517
519{
520 return event->mimeData()->html();
521}
522
524{
525 return event->mimeData()->text();
526}
527
528QList<QUrl> QQuickDragEvent::urls() const
529{
530 return event->mimeData()->urls();
531}
532
534{
535 return event->mimeData()->formats();
536}
537
539{
540 return QString::fromUtf8(event->mimeData()->data(format));
541}
542
544{
545 return event->mimeData()->data(format);
546}
547
549{
550 event->acceptProposedAction();
551}
552
554{
555 Qt::DropAction action = event->dropAction();
556 event->setDropAction(action);
557 event->accept();
558}
559
561{
562 // get action from arguments.
563 event->setDropAction(action);
564 event->accept();
565}
566
567
569
570#include "moc_qquickdroparea_p.cpp"
\inmodule QtCore
Definition qbytearray.h:57
char * data()
\macro QT_NO_CAST_FROM_BYTEARRAY
Definition qbytearray.h:611
\inmodule QtCore
Definition qmimedata.h:16
virtual QStringList formats() const
Returns a list of formats supported by the object.
\inmodule QtCore
Definition qobject.h:103
\inmodule QtCore\reentrant
Definition qpoint.h:217
constexpr qreal x() const noexcept
Returns the x coordinate of this point.
Definition qpoint.h:343
constexpr qreal y() const noexcept
Returns the y coordinate of this point.
Definition qpoint.h:348
Q_INVOKABLE void accept()
Q_INVOKABLE QByteArray getDataAsArrayBuffer(const QString &format) const
QStringList formats
Qt::DropAction action
Q_INVOKABLE QString getDataAsString(const QString &format) const
QList< QUrl > urls
Q_INVOKABLE void acceptProposedAction()
QQuickDropAreaDrag(QQuickDropAreaPrivate *d, QObject *parent=nullptr)
QQuickDropAreaDrag * drag
QStringList getKeys(const QMimeData *mimeData) const
QPointer< QObject > source
QRegularExpression keyRegExp
bool hasMatchingKey(const QStringList &keys) const
void dragEnterEvent(QDragEnterEvent *event) override
\qmlsignal QtQuick::DropArea::entered(DragEvent drag)
void setKeys(const QStringList &keys)
void dropEvent(QDropEvent *event) override
\qmlsignal QtQuick::DropArea::dropped(DragEvent drop)
void containsDragChanged()
void dropped(QQuickDragEvent *drop)
void dragLeaveEvent(QDragLeaveEvent *event) override
\qmlsignal QtQuick::DropArea::exited()
void keysChanged()
void entered(QQuickDragEvent *drag)
QQuickDropAreaDrag * drag
void dragMoveEvent(QDragMoveEvent *event) override
\qmlsignal QtQuick::DropArea::positionChanged(DragEvent drag)
QQuickDropArea(QQuickItem *parent=0)
\qmltype DropArea \instantiates QQuickDropArea \inherits Item \inqmlmodule QtQuick
void positionChanged(QQuickDragEvent *drag)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition qquickitem.h:63
void setFlags(Flags flags)
Enables the specified flags for this item.
\inmodule QtCore \reentrant
static QString escape(const QString &str)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QString pattern() const
Returns the pattern string of the regular expression.
static QString anchoredPattern(const QString &expression)
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:6018
\inmodule QtCore
Definition qvariant.h:65
Combined button and popup list for selecting options.
DropAction
GLuint64 key
GLint GLsizei GLsizei GLenum format
struct _cl_event * event
GLubyte * pattern
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define emit
double qreal
Definition qtypes.h:187
QStringList keys
QMimeData * mimeData
QObject::connect nullptr
\inmodule QtCore \reentrant
Definition qchar.h:18