1 /*
2     This file is part of the KDE libraries
3     SPDX-FileCopyrightText: 2000 Carsten Pfeiffer <pfeiffer@kde.org>
4 
5     SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7 
8 #include "kdragwidgetdecorator.h"
9 
10 #include <QApplication>
11 #include <QDrag>
12 #include <QMouseEvent>
13 #include <QWidget>
14 
15 class KDragWidgetDecoratorBasePrivate
16 {
17 public:
18     bool dragEnabled = true;
19     QWidget *decoratedWidget = nullptr;
20     QPoint startPos;
21 };
22 
KDragWidgetDecoratorBase(QWidget * parent)23 KDragWidgetDecoratorBase::KDragWidgetDecoratorBase(QWidget *parent)
24     : QObject(parent)
25     , d(new KDragWidgetDecoratorBasePrivate)
26 {
27     parent->installEventFilter(this);
28     d->decoratedWidget = parent;
29 }
30 
31 KDragWidgetDecoratorBase::~KDragWidgetDecoratorBase() = default;
32 
isDragEnabled() const33 bool KDragWidgetDecoratorBase::isDragEnabled() const
34 {
35     return d->dragEnabled;
36 }
37 
setDragEnabled(bool enable)38 void KDragWidgetDecoratorBase::setDragEnabled(bool enable)
39 {
40     d->dragEnabled = enable;
41 }
42 
eventFilter(QObject * watched,QEvent * event)43 bool KDragWidgetDecoratorBase::eventFilter(QObject *watched, QEvent *event)
44 {
45     Q_UNUSED(watched) // except in Q_ASSERT
46     Q_ASSERT(watched == d->decoratedWidget);
47 
48     if (!d->dragEnabled) {
49         return false;
50     }
51 
52     if (event->type() == QEvent::MouseButtonPress) {
53         QMouseEvent *e = static_cast<QMouseEvent *>(event);
54         d->startPos = e->pos();
55 
56     } else if (event->type() == QEvent::MouseMove) {
57         QMouseEvent *e = static_cast<QMouseEvent *>(event);
58         if ((e->buttons() & Qt::LeftButton) && (e->pos() - d->startPos).manhattanLength() > QApplication::startDragDistance()) {
59             startDrag();
60             d->decoratedWidget->setProperty("down", false);
61             return true;
62         }
63     }
64 
65     return false;
66 }
67 
decoratedWidget() const68 QWidget *KDragWidgetDecoratorBase::decoratedWidget() const
69 {
70     return d->decoratedWidget;
71 }
72 
dragObject()73 QDrag *KDragWidgetDecoratorBase::dragObject()
74 {
75     return nullptr;
76 }
77 
startDrag()78 void KDragWidgetDecoratorBase::startDrag()
79 {
80     QDrag *drag = dragObject();
81     if (drag) {
82         drag->exec(Qt::CopyAction);
83     }
84 }
85