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