Qt 6.x
The Qt SDK
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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/qregularexpression.h>
11
13
16 , d(d)
17{
18}
19
21{
22}
23
25{
26 Q_DECLARE_PUBLIC(QQuickDropArea)
27
28public:
31
32 bool hasMatchingKey(const QStringList &keys) const;
33
35
42};
43
45 : drag(nullptr)
46 , containsDrag(false)
47{
48}
49
51{
52 delete drag;
53}
54
80{
82}
83
85{
86}
87
96{
97 Q_D(const QQuickDropArea);
98 return d->containsDrag;
99}
100
113{
114 Q_D(const QQuickDropArea);
115 return d->keys;
116}
117
119{
120 Q_D(QQuickDropArea);
121 if (d->keys != keys) {
122 d->keys = keys;
123
124 if (keys.isEmpty()) {
125 d->keyRegExp = QRegularExpression();
126 } else {
128 for (int i = 1; i < keys.size(); ++i)
130 pattern += QLatin1Char(')');
131 d->keyRegExp = QRegularExpression(
133 QLatin1String(".+"))));
134 }
136 }
137}
138
140{
141 Q_D(QQuickDropArea);
142 if (!d->drag)
143 d->drag = new QQuickDropAreaDrag(d);
144 return d->drag;
145}
146
154{
155 return d->source;
156}
157
167{
168 return d->dragPosition.x();
169}
170
172{
173 return d->dragPosition.y();
174}
175
183{
184 Q_D(QQuickDropArea);
185 if (!d->containsDrag)
186 return;
187
188 d->dragPosition = event->position().toPoint();
189 if (d->drag)
190 emit d->drag->positionChanged();
191
192 event->accept();
193 QQuickDragEvent dragTargetEvent(d, event);
194 emit positionChanged(&dragTargetEvent);
195}
196
198{
199 if (keyRegExp.pattern().isEmpty())
200 return true;
201
202 for (const QString &key : keys) {
203 if (key.contains(keyRegExp))
204 return true;
205 }
206 return false;
207}
208
210{
211 if (const QQuickDragMimeData *dragMime = qobject_cast<const QQuickDragMimeData *>(mimeData))
212 return dragMime->keys();
213 return mimeData->formats();
214}
215
223{
224 Q_D(QQuickDropArea);
225 const QMimeData *mimeData = event->mimeData();
226 if (!d->effectiveEnable || d->containsDrag || !mimeData || !d->hasMatchingKey(d->getKeys(mimeData)))
227 return;
228
229 const QQuickDragMimeData *dragMime = qobject_cast<const QQuickDragMimeData *>(mimeData);
230 auto dragSource = dragMime ? dragMime->source() : event->source();
231
232 // if the source of the drag is an ancestor of the drop area, then dragging
233 // also drags the drop area; see QTBUG-64128
234 if (QQuickItem *dragSourceItem = qobject_cast<QQuickItem *>(dragSource)) {
235 if (dragSourceItem->isAncestorOf(this))
236 return;
237 }
238
239 d->dragPosition = event->position().toPoint();
240
241 event->accept();
242
243 QQuickDragEvent dragTargetEvent(d, event);
244 emit entered(&dragTargetEvent);
245 if (!event->isAccepted())
246 return;
247
248 d->containsDrag = true;
249 d->source = dragSource;
250 d->dragPosition = event->position().toPoint();
251 if (d->drag) {
252 emit d->drag->positionChanged();
253 emit d->drag->sourceChanged();
254 }
256}
257
264void QQuickDropArea::dragLeaveEvent(QDragLeaveEvent *)
265{
266 Q_D(QQuickDropArea);
267 if (!d->containsDrag)
268 return;
269
270 emit exited();
271
272 d->containsDrag = false;
273 d->source = nullptr;
275 if (d->drag)
276 emit d->drag->sourceChanged();
277}
278
287{
288 Q_D(QQuickDropArea);
289 if (!d->containsDrag)
290 return;
291
292 QQuickDragEvent dragTargetEvent(d, event);
293 emit dropped(&dragTargetEvent);
294
295 d->containsDrag = false;
296 d->source = nullptr;
298 if (d->drag)
299 emit d->drag->sourceChanged();
300}
301
480{
481 if (const QQuickDragMimeData *dragMime = qobject_cast<const QQuickDragMimeData *>(event->mimeData()))
482 return dragMime->source();
483 else
484 return event->source();
485}
486
488{
489 return d->getKeys(event->mimeData());
490}
491
493{
494 return event->mimeData()->hasColor();
495}
496
498{
499 return event->mimeData()->hasHtml();
500}
501
503{
504 return event->mimeData()->hasText();
505}
506
508{
509 return event->mimeData()->hasUrls();
510}
511
513{
514 return event->mimeData()->colorData();
515}
516
518{
519 return event->mimeData()->html();
520}
521
523{
524 return event->mimeData()->text();
525}
526
528{
529 return event->mimeData()->urls();
530}
531
533{
534 return event->mimeData()->formats();
535}
536
538{
539 return QString::fromUtf8(event->mimeData()->data(format));
540}
541
543{
544 return event->mimeData()->data(format);
545}
546
548{
549 event->acceptProposedAction();
550}
551
553{
554 Qt::DropAction action = event->dropAction();
555 event->setDropAction(action);
556 event->accept();
557}
558
560{
561 // get action from arguments.
562 event->setDropAction(action);
563 event->accept();
564}
565
566
568
569#include "moc_qquickdroparea_p.cpp"
\inmodule QtCore
Definition qbytearray.h:57
char * data()
\macro QT_NO_CAST_FROM_BYTEARRAY
Definition qbytearray.h:534
Definition qlist.h:74
\inmodule QtCore
Definition qmimedata.h:16
virtual QStringList formats() const
Returns a list of formats supported by the object.
\inmodule QtCore
Definition qobject.h:90
\inmodule QtCore\reentrant
Definition qpoint.h:214
constexpr qreal x() const noexcept
Returns the x coordinate of this point.
Definition qpoint.h:333
constexpr qreal y() const noexcept
Returns the y coordinate of this point.
Definition qpoint.h:338
\inmodule QtCore
Definition qpointer.h:18
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()
QObject * source() const
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:64
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:127
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5857
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:1083
\inmodule QtCore
Definition qvariant.h:64
Combined button and popup list for selecting options.
DropAction
GLuint64 key
GLint GLsizei GLsizei GLenum format
struct _cl_event * event
GLubyte * pattern
QQuickItem * qobject_cast< QQuickItem * >(QObject *o)
Definition qquickitem.h:483
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define emit
double qreal
Definition qtypes.h:92
QStringList keys
QMimeData * mimeData
QObject::connect nullptr
\inmodule QtCore \reentrant
Definition qchar.h:17
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent