File indexing completed on 2024-04-21 16:18:21

0001 /***************************************************************************
0002  *   SPDX-FileCopyrightText: 2013 Eike Hein <hein@kde.org>
0003  *   SPDX-License-Identifier: GPL-2.0-or-later
0004  ***************************************************************************/
0005 
0006 #include "draghelper.h"
0007 
0008 #include <QApplication>
0009 #include <QDrag>
0010 #include <QMimeData>
0011 #include <QQuickItem>
0012 
0013 using namespace Milou;
0014 
0015 DragHelper::DragHelper(QObject *parent)
0016     : QObject(parent)
0017     , m_dragIconSize(32)
0018 {
0019 }
0020 
0021 DragHelper::~DragHelper()
0022 {
0023 }
0024 
0025 int DragHelper::dragIconSize() const
0026 {
0027     return m_dragIconSize;
0028 }
0029 
0030 void DragHelper::setDragIconSize(int size)
0031 {
0032     if (m_dragIconSize != size) {
0033         m_dragIconSize = size;
0034 
0035         Q_EMIT dragIconSizeChanged();
0036     }
0037 }
0038 
0039 bool DragHelper::isDrag(int oldX, int oldY, int newX, int newY) const
0040 {
0041     return ((QPoint(oldX, oldY) - QPoint(newX, newY)).manhattanLength() >= QApplication::startDragDistance());
0042 }
0043 
0044 void DragHelper::startDrag(QQuickItem *item, QMimeData *mimeData, const QIcon &icon)
0045 {
0046     // This allows the caller to return, making sure we don't crash if
0047     // the caller is destroyed mid-drag
0048     // clang-format off
0049     QMetaObject::invokeMethod(this, "doDrag", Qt::QueuedConnection,
0050         Q_ARG(QQuickItem*, item), Q_ARG(QMimeData*, mimeData), Q_ARG(QIcon, icon));
0051     // clang-format on
0052 }
0053 
0054 void DragHelper::startDrag(QQuickItem *item, QMimeData *mimeData, const QString &iconName)
0055 {
0056     startDrag(item, mimeData, QIcon::fromTheme(iconName));
0057 }
0058 
0059 void DragHelper::doDrag(QQuickItem *item, QMimeData *mimeData, const QIcon &icon)
0060 {
0061     QDrag *drag = new QDrag(item);
0062     drag->setMimeData(mimeData);
0063 
0064     if (!icon.isNull()) {
0065         drag->setPixmap(icon.pixmap(m_dragIconSize, m_dragIconSize));
0066     }
0067 
0068     drag->exec();
0069 
0070     Q_EMIT dropped();
0071 }