-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDropOverlay.cpp
More file actions
110 lines (95 loc) · 2.59 KB
/
Copy pathDropOverlay.cpp
File metadata and controls
110 lines (95 loc) · 2.59 KB
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
109
110
#include "layout/DropOverlay.h"
#include "layout/PaneWidget.h"
#include <QPaintEvent>
#include <QPainter>
namespace cold {
DropOverlay::DropOverlay(QWidget* parent) : QWidget(parent) {
setAttribute(Qt::WA_TransparentForMouseEvents);
setAttribute(Qt::WA_NoSystemBackground);
hide();
}
void DropOverlay::showPreview(PaneWidget* pane, DropZone zone) {
m_pane = pane;
m_zone = zone;
if (!pane || zone == DropZone::None) {
hide();
return;
}
setGeometry(parentWidget() ? parentWidget()->rect() : QRect());
show();
raise();
update();
}
void DropOverlay::clearPreview() {
m_pane.clear();
m_zone = DropZone::None;
hide();
}
DropZone DropOverlay::zoneForPosition(PaneWidget* pane, const QPoint& globalPos) const {
if (!pane) {
return DropZone::None;
}
const QPoint pos = pane->mapFromGlobal(globalPos);
const QRect rect = pane->rect();
if (!rect.contains(pos)) {
return DropZone::None;
}
const int edgeWidth = qMax(1, rect.width() / 5);
const int edgeHeight = qMax(1, rect.height() / 5);
if (pos.x() < edgeWidth) {
return DropZone::Left;
}
if (pos.x() > rect.width() - edgeWidth) {
return DropZone::Right;
}
if (pos.y() < edgeHeight) {
return DropZone::Top;
}
if (pos.y() > rect.height() - edgeHeight) {
return DropZone::Bottom;
}
return DropZone::Center;
}
void DropOverlay::paintEvent(QPaintEvent* event) {
Q_UNUSED(event);
if (!m_pane || m_zone == DropZone::None) {
return;
}
const QRect rect = previewRectFor(m_pane, m_zone);
if (rect.isEmpty()) {
return;
}
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
QColor fill(64, 128, 255, 80);
QColor stroke(64, 128, 255, 180);
painter.setPen(QPen(stroke, 2));
painter.setBrush(fill);
painter.drawRect(rect.adjusted(1, 1, -2, -2));
}
QRect DropOverlay::previewRectFor(PaneWidget* pane, DropZone zone) const {
if (!pane || !parentWidget()) {
return {};
}
QRect rect(pane->mapTo(parentWidget(), QPoint(0, 0)), pane->size());
switch (zone) {
case DropZone::Left:
rect.setWidth(rect.width() / 2);
break;
case DropZone::Right:
rect.setLeft(rect.center().x());
break;
case DropZone::Top:
rect.setHeight(rect.height() / 2);
break;
case DropZone::Bottom:
rect.setTop(rect.center().y());
break;
case DropZone::Center:
break;
case DropZone::None:
return {};
}
return rect;
}
} // namespace cold