1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2016 The Qt Company Ltd. 4 ** Contact: https://www.qt.io/licensing/ 5 ** 6 ** This file is part of the QtGui module of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:LGPL$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see https://www.qt.io/terms-conditions. For further 15 ** information use the contact form at https://www.qt.io/contact-us. 16 ** 17 ** GNU Lesser General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU Lesser 19 ** General Public License version 3 as published by the Free Software 20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the 21 ** packaging of this file. Please review the following information to 22 ** ensure the GNU Lesser General Public License version 3 requirements 23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. 24 ** 25 ** GNU General Public License Usage 26 ** Alternatively, this file may be used under the terms of the GNU 27 ** General Public License version 2.0 or (at your option) the GNU General 28 ** Public license version 3 or any later version approved by the KDE Free 29 ** Qt Foundation. The licenses are as published by the Free Software 30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 31 ** included in the packaging of this file. Please review the following 32 ** information to ensure the GNU General Public License requirements will 33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and 34 ** https://www.gnu.org/licenses/gpl-3.0.html. 35 ** 36 ** $QT_END_LICENSE$ 37 ** 38 ****************************************************************************/ 39 40 #include "qdnd_p.h" 41 42 #include "qguiapplication.h" 43 #include <ctype.h> 44 #include <qpa/qplatformdrag.h> 45 #include <qpa/qplatformintegration.h> 46 #include <private/qguiapplication_p.h> 47 48 QT_BEGIN_NAMESPACE 49 50 // the universe's only drag manager 51 QDragManager *QDragManager::m_instance = nullptr; 52 QDragManager()53QDragManager::QDragManager() 54 : QObject(qApp), m_currentDropTarget(nullptr), 55 m_platformDrag(QGuiApplicationPrivate::platformIntegration()->drag()), 56 m_object(nullptr) 57 { 58 Q_ASSERT(!m_instance); 59 } 60 ~QDragManager()61QDragManager::~QDragManager() 62 { 63 m_instance = nullptr; 64 } 65 self()66QDragManager *QDragManager::self() 67 { 68 if (!m_instance && !QGuiApplication::closingDown()) 69 m_instance = new QDragManager; 70 return m_instance; 71 } 72 source() const73QObject *QDragManager::source() const 74 { 75 if (m_object) 76 return m_object->source(); 77 return nullptr; 78 } 79 setCurrentTarget(QObject * target,bool dropped)80void QDragManager::setCurrentTarget(QObject *target, bool dropped) 81 { 82 if (m_currentDropTarget == target) 83 return; 84 85 m_currentDropTarget = target; 86 if (!dropped && m_object) { 87 m_object->d_func()->target = target; 88 emit m_object->targetChanged(target); 89 } 90 } 91 currentTarget() const92QObject *QDragManager::currentTarget() const 93 { 94 return m_currentDropTarget; 95 } 96 drag(QDrag * o)97Qt::DropAction QDragManager::drag(QDrag *o) 98 { 99 if (!o || m_object == o) 100 return Qt::IgnoreAction; 101 102 if (!m_platformDrag || !o->source()) { 103 o->deleteLater(); 104 return Qt::IgnoreAction; 105 } 106 107 if (m_object) { 108 qWarning("QDragManager::drag in possibly invalid state"); 109 return Qt::IgnoreAction; 110 } 111 112 m_object = o; 113 114 m_object->d_func()->target = nullptr; 115 116 QGuiApplicationPrivate::instance()->notifyDragStarted(m_object.data()); 117 const Qt::DropAction result = m_platformDrag->drag(m_object); 118 if (!m_object.isNull() && !m_platformDrag->ownsDragObject()) 119 m_object->deleteLater(); 120 121 m_object.clear(); 122 return result; 123 } 124 125 QT_END_NAMESPACE 126