-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindraggablewidget.cpp
108 lines (93 loc) · 2.96 KB
/
indraggablewidget.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "indraggablewidget.h"
#include <QPalette>
#include <QApplication>
#include <QPainter>
#include <QMouseEvent>
#include <QPainterPath>
LDA_BEGIN_NAMESPACE
InDraggableWidget::InDraggableWidget(QWidget *parent) : QWidget(parent)
{
setAttribute(Qt::WA_Hover, true);
setMouseTracking(true);
}
void InDraggableWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::MouseButton::LeftButton) {
holding = true;
m_x = parentWidget()->mapFromGlobal(parentWidget()->mapToGlobal(this->pos())).x() - parentWidget()->mapFromGlobal(event->globalPos()).x();
m_y = parentWidget()->mapFromGlobal(parentWidget()->mapToGlobal(this->pos())).y() - parentWidget()->mapFromGlobal(event->globalPos()).y();
if (autoRaise) {
this->raise();
}
Q_EMIT dragStarted();
} else {
holding = false;
}
QWidget::mousePressEvent(event);
}
void InDraggableWidget::mouseReleaseEvent(QMouseEvent *event)
{
if (holding) {
holding = false;
Q_EMIT dragEnded();
}
QWidget::mouseReleaseEvent(event);
}
void InDraggableWidget::mouseMoveEvent(QMouseEvent *event)
{
if (holding) {
QPoint pos = parentWidget()->mapFromGlobal(event->globalPos());
//Check that WH is in the range to don't make it partially/totally hiden (by nothing)
//when it goes out of parent's area, so its stays completely visible!
if (pos.x()+m_x < 0) {
pos.setX(-m_x);
} else if (pos.x()+(this->width()+m_x) > parentWidget()->width()) {
pos.setX(parentWidget()->width()-this->width()-m_x);
}
if (pos.y()+m_y < 0) {
pos.setY(-m_y);
} else if (pos.y()+(this->height()+m_y) > parentWidget()->height()) {
pos.setY(parentWidget()->height()-this->height()-m_y);
}
this->move(QPoint(pos.x() +m_x, pos.y() +m_y));
} else {
QWidget::mouseMoveEvent(event);
}
}
void InDraggableWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPainterPath path;
path.addRoundedRect(this->rect(), 5, 5);
painter.fillPath(path, qApp->palette().color(QPalette::ColorGroup::Current, QPalette::ColorRole::Window));
}
bool InDraggableWidget::isRaisingEnabled()
{
return autoRaise;
}
void InDraggableWidget::enableRaising(bool enable)
{
autoRaise = enable;
}
void InDraggableWidget::hoverEnterEvent(QHoverEvent *) {}
void InDraggableWidget::hoverLeaveEvent(QHoverEvent *) {}
void InDraggableWidget::hoverMoveEvent(QHoverEvent *) {}
bool InDraggableWidget::event(QEvent * e)
{
switch(e->type())
{
case QEvent::HoverEnter:
hoverEnterEvent(static_cast<QHoverEvent*>(e));
return true;
case QEvent::HoverLeave:
hoverLeaveEvent(static_cast<QHoverEvent*>(e));
return true;
case QEvent::HoverMove:
hoverMoveEvent(static_cast<QHoverEvent*>(e));
return true;
default:
break;
}
return QWidget::event(e);
}
LDA_END_NAMESPACE