2 * SPDX-FileCopyrightText: 2014 Emmanuel Pescosta <emmanuelpescosta099@gmail.com>
4 * SPDX-License-Identifier: GPL-2.0-or-later
7 #include "dolphintabbar.h"
9 #include <KLocalizedString>
11 #include <QDragEnterEvent>
12 #include <QInputDialog>
17 class PreventFocusWhileHidden
: public QObject
20 PreventFocusWhileHidden(QObject
*parent
)
24 bool eventFilter(QObject
*obj
, QEvent
*ev
) override
28 static_cast<QWidget
*>(obj
)->setFocusPolicy(Qt::NoFocus
);
31 static_cast<QWidget
*>(obj
)->setFocusPolicy(Qt::TabFocus
);
39 DolphinTabBar::DolphinTabBar(QWidget
*parent
)
41 , m_autoActivationIndex(-1)
42 , m_tabToBeClosedOnMiddleMouseButtonRelease(-1)
45 setSelectionBehaviorOnRemove(QTabBar::SelectPreviousTab
);
47 setTabsClosable(true);
49 setFocusPolicy(Qt::NoFocus
);
50 installEventFilter(new PreventFocusWhileHidden(this));
52 m_autoActivationTimer
= new QTimer(this);
53 m_autoActivationTimer
->setSingleShot(true);
54 m_autoActivationTimer
->setInterval(800);
55 connect(m_autoActivationTimer
, &QTimer::timeout
, this, &DolphinTabBar::slotAutoActivationTimeout
);
58 void DolphinTabBar::dragEnterEvent(QDragEnterEvent
*event
)
60 const QMimeData
*mimeData
= event
->mimeData();
61 const int index
= tabAt(event
->position().toPoint());
63 if (mimeData
->hasUrls()) {
64 event
->acceptProposedAction();
65 updateAutoActivationTimer(index
);
68 QTabBar::dragEnterEvent(event
);
71 void DolphinTabBar::dragLeaveEvent(QDragLeaveEvent
*event
)
73 updateAutoActivationTimer(-1);
75 QTabBar::dragLeaveEvent(event
);
78 void DolphinTabBar::dragMoveEvent(QDragMoveEvent
*event
)
80 const QMimeData
*mimeData
= event
->mimeData();
81 const int index
= tabAt(event
->position().toPoint());
83 if (mimeData
->hasUrls()) {
84 Q_EMIT
tabDragMoveEvent(index
, event
);
85 updateAutoActivationTimer(index
);
88 QTabBar::dragMoveEvent(event
);
91 void DolphinTabBar::dropEvent(QDropEvent
*event
)
93 // Disable the auto activation timer
94 updateAutoActivationTimer(-1);
96 const QMimeData
*mimeData
= event
->mimeData();
97 const int index
= tabAt(event
->position().toPoint());
99 if (mimeData
->hasUrls()) {
100 Q_EMIT
tabDropEvent(index
, event
);
103 QTabBar::dropEvent(event
);
106 void DolphinTabBar::mousePressEvent(QMouseEvent
*event
)
108 const int index
= tabAt(event
->pos());
110 if (index
>= 0 && event
->button() == Qt::MiddleButton
) {
111 m_tabToBeClosedOnMiddleMouseButtonRelease
= index
;
115 QTabBar::mousePressEvent(event
);
118 void DolphinTabBar::mouseReleaseEvent(QMouseEvent
*event
)
120 const int index
= tabAt(event
->pos());
122 if (index
>= 0 && index
== m_tabToBeClosedOnMiddleMouseButtonRelease
&& event
->button() == Qt::MiddleButton
) {
123 // Mouse middle click on a tab closes this tab.
124 Q_EMIT
tabCloseRequested(index
);
128 QTabBar::mouseReleaseEvent(event
);
131 void DolphinTabBar::mouseDoubleClickEvent(QMouseEvent
*event
)
133 if (event
->buttons() & Qt::LeftButton
) {
134 int index
= tabAt(event
->pos());
137 // empty tabbar area case
138 index
= currentIndex();
140 // Double left click on the tabbar opens a new activated tab
141 // with the url from the doubleclicked tab or currentTab otherwise.
142 Q_EMIT
openNewActivatedTab(index
);
145 QTabBar::mouseDoubleClickEvent(event
);
148 void DolphinTabBar::contextMenuEvent(QContextMenuEvent
*event
)
150 const int index
= tabAt(event
->pos());
156 QAction
*newTabAction
= menu
.addAction(QIcon::fromTheme(QStringLiteral("tab-new")), i18nc("@action:inmenu", "New Tab"));
157 QAction
*detachTabAction
= menu
.addAction(QIcon::fromTheme(QStringLiteral("tab-detach")), i18nc("@action:inmenu", "Detach Tab"));
158 QAction
*closeOtherTabsAction
= menu
.addAction(QIcon::fromTheme(QStringLiteral("tab-close-other")), i18nc("@action:inmenu", "Close Other Tabs"));
159 QAction
*closeTabAction
= menu
.addAction(QIcon::fromTheme(QStringLiteral("tab-close")), i18nc("@action:inmenu", "Close Tab"));
161 QAction
*renameTabAction
= menu
.addAction(QIcon::fromTheme(QStringLiteral("edit-rename")), i18nc("@action:inmenu", "Rename Tab"));
163 QAction
*selectedAction
= menu
.exec(event
->globalPos());
164 if (selectedAction
== newTabAction
) {
165 Q_EMIT
openNewActivatedTab(index
);
166 } else if (selectedAction
== detachTabAction
) {
167 Q_EMIT
tabDetachRequested(index
);
168 } else if (selectedAction
== closeOtherTabsAction
) {
169 const int tabCount
= count();
170 for (int i
= 0; i
< index
; i
++) {
171 Q_EMIT
tabCloseRequested(0);
173 for (int i
= index
+ 1; i
< tabCount
; i
++) {
174 Q_EMIT
tabCloseRequested(1);
176 } else if (selectedAction
== closeTabAction
) {
177 Q_EMIT
tabCloseRequested(index
);
178 } else if (selectedAction
== renameTabAction
) {
179 bool renamed
= false;
180 const QString tabNewName
= QInputDialog::getText(this, i18nc("@title:window for text input", "Rename Tab"), i18n("New tab name:"), QLineEdit::Normal
, tabText(index
), &renamed
);
183 Q_EMIT
tabRenamed(index
, tabNewName
);
190 QTabBar::contextMenuEvent(event
);
193 void DolphinTabBar::slotAutoActivationTimeout()
195 if (m_autoActivationIndex
>= 0) {
196 setCurrentIndex(m_autoActivationIndex
);
197 updateAutoActivationTimer(-1);
201 void DolphinTabBar::updateAutoActivationTimer(const int index
)
203 if (m_autoActivationIndex
!= index
) {
204 m_autoActivationIndex
= index
;
206 if (m_autoActivationIndex
< 0) {
207 m_autoActivationTimer
->stop();
209 m_autoActivationTimer
->start();
214 #include "moc_dolphintabbar.cpp"