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