Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qdnd.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// Qt-Security score:significant reason:default
4
5#include "qdnd_p.h"
6
8#include <ctype.h>
9#include <qpa/qplatformdrag.h>
10#include <qpa/qplatformintegration.h>
11#include <private/qguiapplication_p.h>
12
14
15// the universe's only drag manager
16QDragManager *QDragManager::m_instance = nullptr;
17
18QDragManager::QDragManager()
19 : QObject(qApp), m_currentDropTarget(nullptr),
20 m_platformDrag(QGuiApplicationPrivate::platformIntegration()->drag()),
21 m_object(nullptr)
22{
23 Q_ASSERT(!m_instance);
24}
25
26QDragManager::~QDragManager()
27{
28 m_instance = nullptr;
29}
30
31QDragManager *QDragManager::self()
32{
33 if (!m_instance && !QGuiApplication::closingDown())
34 m_instance = new QDragManager;
35 return m_instance;
36}
37
38QObject *QDragManager::source() const
39{
40 if (m_object)
41 return m_object->source();
42 return nullptr;
43}
44
45void QDragManager::setCurrentTarget(QObject *target, bool dropped)
46{
47 if (m_currentDropTarget == target)
48 return;
49
50 m_currentDropTarget = target;
51 if (!dropped && m_object) {
52 m_object->d_func()->target = target;
53 emit m_object->targetChanged(target);
54 }
55}
56
57QObject *QDragManager::currentTarget() const
58{
59 return m_currentDropTarget;
60}
61
62Qt::DropAction QDragManager::drag(QDrag *o)
63{
64 if (!o || m_object == o)
65 return Qt::IgnoreAction;
66
67 if (!m_platformDrag || !o->source()) {
68 o->deleteLater();
69 return Qt::IgnoreAction;
70 }
71
72 if (m_object) {
73 qWarning("QDragManager::drag in possibly invalid state");
74 return Qt::IgnoreAction;
75 }
76
77 m_object = o;
78
79 m_object->d_func()->target = nullptr;
80
81 QGuiApplicationPrivate::instance()->notifyDragStarted(m_object.data());
82 const Qt::DropAction result = m_platformDrag->drag(m_object);
83 if (!m_object.isNull() && !m_platformDrag->ownsDragObject())
84 m_object->deleteLater();
85
86 m_object.clear();
87 return result;
88}
89
90QT_END_NAMESPACE
91
92#include "moc_qdnd_p.cpp"
#define qApp