]> cloud.milkyroute.net Git - dolphin.git/blob - src/dolphintabbar.cpp
Output of licensedigger + manual cleanup afterwards.
[dolphin.git] / src / dolphintabbar.cpp
1 /*
2 * SPDX-FileCopyrightText: 2014 Emmanuel Pescosta <emmanuelpescosta099@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "dolphintabbar.h"
8
9 #include <KLocalizedString>
10
11 #include <QDragEnterEvent>
12 #include <QMenu>
13 #include <QMimeData>
14 #include <QTimer>
15
16 DolphinTabBar::DolphinTabBar(QWidget* parent) :
17 QTabBar(parent),
18 m_autoActivationIndex(-1),
19 m_tabToBeClosedOnMiddleMouseButtonRelease(-1)
20 {
21 setAcceptDrops(true);
22 setSelectionBehaviorOnRemove(QTabBar::SelectPreviousTab);
23 setMovable(true);
24 setTabsClosable(true);
25
26 m_autoActivationTimer = new QTimer(this);
27 m_autoActivationTimer->setSingleShot(true);
28 m_autoActivationTimer->setInterval(800);
29 connect(m_autoActivationTimer, &QTimer::timeout,
30 this, &DolphinTabBar::slotAutoActivationTimeout);
31 }
32
33 void DolphinTabBar::dragEnterEvent(QDragEnterEvent* event)
34 {
35 const QMimeData* mimeData = event->mimeData();
36 const int index = tabAt(event->pos());
37
38 if (mimeData->hasUrls()) {
39 event->acceptProposedAction();
40 updateAutoActivationTimer(index);
41 }
42
43 QTabBar::dragEnterEvent(event);
44 }
45
46 void DolphinTabBar::dragLeaveEvent(QDragLeaveEvent* event)
47 {
48 updateAutoActivationTimer(-1);
49
50 QTabBar::dragLeaveEvent(event);
51 }
52
53 void DolphinTabBar::dragMoveEvent(QDragMoveEvent* event)
54 {
55 const QMimeData* mimeData = event->mimeData();
56 const int index = tabAt(event->pos());
57
58 if (mimeData->hasUrls()) {
59 updateAutoActivationTimer(index);
60 }
61
62 QTabBar::dragMoveEvent(event);
63 }
64
65 void DolphinTabBar::dropEvent(QDropEvent* event)
66 {
67 // Disable the auto activation timer
68 updateAutoActivationTimer(-1);
69
70 const QMimeData* mimeData = event->mimeData();
71 const int index = tabAt(event->pos());
72
73 if (index >= 0 && mimeData->hasUrls()) {
74 emit tabDropEvent(index, event);
75 }
76
77 QTabBar::dropEvent(event);
78 }
79
80 void DolphinTabBar::mousePressEvent(QMouseEvent* event)
81 {
82 const int index = tabAt(event->pos());
83
84 if (index >= 0 && event->button() == Qt::MiddleButton) {
85 m_tabToBeClosedOnMiddleMouseButtonRelease = index;
86 return;
87 }
88
89 QTabBar::mousePressEvent(event);
90 }
91
92 void DolphinTabBar::mouseReleaseEvent(QMouseEvent *event)
93 {
94 const int index = tabAt(event->pos());
95
96 if (index >= 0 && index == m_tabToBeClosedOnMiddleMouseButtonRelease
97 && event->button() == Qt::MiddleButton) {
98 // Mouse middle click on a tab closes this tab.
99 emit tabCloseRequested(index);
100 return;
101 }
102
103 QTabBar::mouseReleaseEvent(event);
104 }
105
106 void DolphinTabBar::mouseDoubleClickEvent(QMouseEvent* event)
107 {
108 const int index = tabAt(event->pos());
109
110 if (index < 0) {
111 // Double click on the empty tabbar area opens a new activated tab
112 // with the url from the current tab.
113 emit openNewActivatedTab(currentIndex());
114 return;
115 }
116
117 QTabBar::mouseDoubleClickEvent(event);
118 }
119
120 void DolphinTabBar::contextMenuEvent(QContextMenuEvent* event)
121 {
122 const int index = tabAt(event->pos());
123
124 if (index >= 0) {
125 // Tab context menu
126 QMenu menu(this);
127
128 QAction* newTabAction = menu.addAction(QIcon::fromTheme(QStringLiteral("tab-new")), i18nc("@action:inmenu", "New Tab"));
129 QAction* detachTabAction = menu.addAction(QIcon::fromTheme(QStringLiteral("tab-detach")), i18nc("@action:inmenu", "Detach Tab"));
130 QAction* closeOtherTabsAction = menu.addAction(QIcon::fromTheme(QStringLiteral("tab-close-other")), i18nc("@action:inmenu", "Close Other Tabs"));
131 QAction* closeTabAction = menu.addAction(QIcon::fromTheme(QStringLiteral("tab-close")), i18nc("@action:inmenu", "Close Tab"));
132
133 QAction* selectedAction = menu.exec(event->globalPos());
134 if (selectedAction == newTabAction) {
135 emit openNewActivatedTab(index);
136 } else if (selectedAction == detachTabAction) {
137 emit tabDetachRequested(index);
138 } else if (selectedAction == closeOtherTabsAction) {
139 const int tabCount = count();
140 for (int i = 0; i < index; i++) {
141 emit tabCloseRequested(0);
142 }
143 for (int i = index + 1; i < tabCount; i++) {
144 emit tabCloseRequested(1);
145 }
146 } else if (selectedAction == closeTabAction) {
147 emit tabCloseRequested(index);
148 }
149
150 return;
151 }
152
153 QTabBar::contextMenuEvent(event);
154 }
155
156 void DolphinTabBar::slotAutoActivationTimeout()
157 {
158 if (m_autoActivationIndex >= 0) {
159 setCurrentIndex(m_autoActivationIndex);
160 updateAutoActivationTimer(-1);
161 }
162 }
163
164 void DolphinTabBar::updateAutoActivationTimer(const int index)
165 {
166 if (m_autoActivationIndex != index) {
167 m_autoActivationIndex = index;
168
169 if (m_autoActivationIndex < 0) {
170 m_autoActivationTimer->stop();
171 } else {
172 m_autoActivationTimer->start();
173 }
174 }
175 }