-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPaneTabBar.cpp
More file actions
113 lines (93 loc) · 2.91 KB
/
Copy pathPaneTabBar.cpp
File metadata and controls
113 lines (93 loc) · 2.91 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
111
112
113
#include "layout/PaneTabBar.h"
#include <QApplication>
#include <QDataStream>
#include <QDrag>
#include <QDragEnterEvent>
#include <QDragMoveEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QMouseEvent>
namespace cold {
PaneTabBar::PaneTabBar(QWidget* parent) : QTabBar(parent) {
setAcceptDrops(true);
setMovable(true);
setTabsClosable(true);
setDocumentMode(true);
setExpanding(false);
}
void PaneTabBar::setPaneId(PaneId paneId) {
m_paneId = paneId;
}
PaneId PaneTabBar::paneId() const {
return m_paneId;
}
void PaneTabBar::mousePressEvent(QMouseEvent* event) {
if (event->button() == Qt::LeftButton) {
m_dragStartPosition = event->pos();
m_dragStartIndex = tabAt(event->pos());
}
QTabBar::mousePressEvent(event);
}
void PaneTabBar::mouseMoveEvent(QMouseEvent* event) {
if (!(event->buttons() & Qt::LeftButton) || m_dragStartIndex < 0) {
QTabBar::mouseMoveEvent(event);
return;
}
if ((event->pos() - m_dragStartPosition).manhattanLength() <
QApplication::startDragDistance()) {
QTabBar::mouseMoveEvent(event);
return;
}
QByteArray payload;
QDataStream out(&payload, QIODevice::WriteOnly);
out << m_paneId << m_dragStartIndex;
auto* mime = new QMimeData();
mime->setData(QString::fromLatin1(kPaneItemMimeType), payload);
auto* drag = new QDrag(this);
drag->setMimeData(mime);
drag->exec(Qt::MoveAction);
m_dragStartIndex = -1;
}
void PaneTabBar::dragEnterEvent(QDragEnterEvent* event) {
if (event->mimeData()->hasFormat(QString::fromLatin1(kPaneItemMimeType))) {
event->acceptProposedAction();
return;
}
QTabBar::dragEnterEvent(event);
}
void PaneTabBar::dragMoveEvent(QDragMoveEvent* event) {
if (event->mimeData()->hasFormat(QString::fromLatin1(kPaneItemMimeType))) {
event->acceptProposedAction();
return;
}
QTabBar::dragMoveEvent(event);
}
void PaneTabBar::dropEvent(QDropEvent* event) {
if (!event->mimeData()->hasFormat(QString::fromLatin1(kPaneItemMimeType))) {
QTabBar::dropEvent(event);
return;
}
QByteArray payload = event->mimeData()->data(QString::fromLatin1(kPaneItemMimeType));
QDataStream in(&payload, QIODevice::ReadOnly);
PaneId sourcePane = -1;
int sourceIndex = -1;
in >> sourcePane >> sourceIndex;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
const QPoint pos = event->position().toPoint();
#else
const QPoint pos = event->pos();
#endif
emit tabMoveRequested(sourcePane, sourceIndex, m_paneId, insertionIndexAt(pos));
event->acceptProposedAction();
}
int PaneTabBar::insertionIndexAt(const QPoint& pos) const {
if (count() == 0) {
return 0;
}
const int hit = tabAt(pos);
if (hit < 0) {
return pos.x() < tabRect(0).center().x() ? 0 : count();
}
return pos.x() < tabRect(hit).center().x() ? hit : hit + 1;
}
} // namespace cold