File indexing completed on 2024-04-28 03:59:04

0001 /*
0002     This file is part of the KDE libraries
0003     SPDX-FileCopyrightText: 2000 Carsten Pfeiffer <pfeiffer@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "kdragwidgetdecorator.h"
0009 
0010 #include <QApplication>
0011 #include <QDrag>
0012 #include <QMouseEvent>
0013 #include <QWidget>
0014 
0015 class KDragWidgetDecoratorBasePrivate
0016 {
0017 public:
0018     bool dragEnabled = true;
0019     QWidget *decoratedWidget = nullptr;
0020     QPoint startPos;
0021 };
0022 
0023 KDragWidgetDecoratorBase::KDragWidgetDecoratorBase(QWidget *parent)
0024     : QObject(parent)
0025     , d(new KDragWidgetDecoratorBasePrivate)
0026 {
0027     parent->installEventFilter(this);
0028     d->decoratedWidget = parent;
0029 }
0030 
0031 KDragWidgetDecoratorBase::~KDragWidgetDecoratorBase() = default;
0032 
0033 bool KDragWidgetDecoratorBase::isDragEnabled() const
0034 {
0035     return d->dragEnabled;
0036 }
0037 
0038 void KDragWidgetDecoratorBase::setDragEnabled(bool enable)
0039 {
0040     d->dragEnabled = enable;
0041 }
0042 
0043 bool KDragWidgetDecoratorBase::eventFilter(QObject *watched, QEvent *event)
0044 {
0045     Q_UNUSED(watched) // except in Q_ASSERT
0046     Q_ASSERT(watched == d->decoratedWidget);
0047 
0048     if (!d->dragEnabled) {
0049         return false;
0050     }
0051 
0052     if (event->type() == QEvent::MouseButtonPress) {
0053         QMouseEvent *e = static_cast<QMouseEvent *>(event);
0054         d->startPos = e->pos();
0055 
0056     } else if (event->type() == QEvent::MouseMove) {
0057         QMouseEvent *e = static_cast<QMouseEvent *>(event);
0058         if ((e->buttons() & Qt::LeftButton) && (e->pos() - d->startPos).manhattanLength() > QApplication::startDragDistance()) {
0059             startDrag();
0060             d->decoratedWidget->setProperty("down", false);
0061             return true;
0062         }
0063     }
0064 
0065     return false;
0066 }
0067 
0068 QWidget *KDragWidgetDecoratorBase::decoratedWidget() const
0069 {
0070     return d->decoratedWidget;
0071 }
0072 
0073 QDrag *KDragWidgetDecoratorBase::dragObject()
0074 {
0075     return nullptr;
0076 }
0077 
0078 void KDragWidgetDecoratorBase::startDrag()
0079 {
0080     QDrag *drag = dragObject();
0081     if (drag) {
0082         drag->exec(Qt::CopyAction);
0083     }
0084 }
0085 
0086 #include "moc_kdragwidgetdecorator.cpp"