-/***************************************************************************
- * Copyright (C) 2014 by Emmanuel Pescosta <emmanuelpescosta099@gmail.com> *
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
- ***************************************************************************/
+/*
+ * SPDX-FileCopyrightText: 2014 Emmanuel Pescosta <emmanuelpescosta099@gmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
#include "dolphintabbar.h"
-#include <QTimer>
-#include <QDragEnterEvent>
#include <KLocalizedString>
+
+#include <QDragEnterEvent>
+#include <QInputDialog>
#include <QMenu>
-#include <QIcon>
-#include <QUrl>
#include <QMimeData>
+#include <QTimer>
-DolphinTabBar::DolphinTabBar(QWidget* parent) :
- QTabBar(parent),
- m_autoActivationIndex(-1)
+class PreventFocusWhileHidden : public QObject
+{
+public:
+ PreventFocusWhileHidden(QObject *parent)
+ : QObject(parent){};
+
+protected:
+ bool eventFilter(QObject *obj, QEvent *ev) override
+ {
+ switch (ev->type()) {
+ case QEvent::Hide:
+ static_cast<QWidget *>(obj)->setFocusPolicy(Qt::NoFocus);
+ return false;
+ case QEvent::Show:
+ static_cast<QWidget *>(obj)->setFocusPolicy(Qt::TabFocus);
+ return false;
+ default:
+ return false;
+ }
+ };
+};
+
+DolphinTabBar::DolphinTabBar(QWidget *parent)
+ : QTabBar(parent)
+ , m_autoActivationIndex(-1)
+ , m_tabToBeClosedOnMiddleMouseButtonRelease(-1)
{
setAcceptDrops(true);
setSelectionBehaviorOnRemove(QTabBar::SelectPreviousTab);
setMovable(true);
setTabsClosable(true);
+ setFocusPolicy(Qt::NoFocus);
+ installEventFilter(new PreventFocusWhileHidden(this));
+
m_autoActivationTimer = new QTimer(this);
m_autoActivationTimer->setSingleShot(true);
m_autoActivationTimer->setInterval(800);
- connect(m_autoActivationTimer, SIGNAL(timeout()),
- this, SLOT(slotAutoActivationTimeout()));
+ connect(m_autoActivationTimer, &QTimer::timeout, this, &DolphinTabBar::slotAutoActivationTimeout);
}
-void DolphinTabBar::dragEnterEvent(QDragEnterEvent* event)
+void DolphinTabBar::dragEnterEvent(QDragEnterEvent *event)
{
- const QMimeData* mimeData = event->mimeData();
- const int index = tabAt(event->pos());
+ const QMimeData *mimeData = event->mimeData();
+ const int index = tabAt(event->position().toPoint());
if (mimeData->hasUrls()) {
event->acceptProposedAction();
QTabBar::dragEnterEvent(event);
}
-void DolphinTabBar::dragLeaveEvent(QDragLeaveEvent* event)
+void DolphinTabBar::dragLeaveEvent(QDragLeaveEvent *event)
{
updateAutoActivationTimer(-1);
QTabBar::dragLeaveEvent(event);
}
-void DolphinTabBar::dragMoveEvent(QDragMoveEvent* event)
+void DolphinTabBar::dragMoveEvent(QDragMoveEvent *event)
{
- const QMimeData* mimeData = event->mimeData();
- const int index = tabAt(event->pos());
+ const QMimeData *mimeData = event->mimeData();
+ const int index = tabAt(event->position().toPoint());
if (mimeData->hasUrls()) {
+ Q_EMIT tabDragMoveEvent(index, event);
updateAutoActivationTimer(index);
}
QTabBar::dragMoveEvent(event);
}
-void DolphinTabBar::dropEvent(QDropEvent* event)
+void DolphinTabBar::dropEvent(QDropEvent *event)
{
// Disable the auto activation timer
updateAutoActivationTimer(-1);
- const QMimeData* mimeData = event->mimeData();
- const int index = tabAt(event->pos());
+ const QMimeData *mimeData = event->mimeData();
+ const int index = tabAt(event->position().toPoint());
- if (index >= 0 && mimeData->hasUrls()) {
- emit tabDropEvent(index, event);
+ if (mimeData->hasUrls()) {
+ Q_EMIT tabDropEvent(index, event);
}
QTabBar::dropEvent(event);
}
-void DolphinTabBar::mousePressEvent(QMouseEvent* event)
+void DolphinTabBar::mousePressEvent(QMouseEvent *event)
{
const int index = tabAt(event->pos());
if (index >= 0 && event->button() == Qt::MiddleButton) {
- // Mouse middle click on a tab closes this tab.
- emit tabCloseRequested(index);
+ m_tabToBeClosedOnMiddleMouseButtonRelease = index;
return;
}
QTabBar::mousePressEvent(event);
}
-void DolphinTabBar::mouseDoubleClickEvent(QMouseEvent* event)
+void DolphinTabBar::mouseReleaseEvent(QMouseEvent *event)
{
const int index = tabAt(event->pos());
- if (index < 0) {
- // Double click on the empty tabbar area opens a new activated tab
- // with the url from the current tab.
- emit openNewActivatedTab(currentIndex());
+ if (index >= 0 && index == m_tabToBeClosedOnMiddleMouseButtonRelease && event->button() == Qt::MiddleButton) {
+ // Mouse middle click on a tab closes this tab.
+ Q_EMIT tabCloseRequested(index);
return;
}
+ QTabBar::mouseReleaseEvent(event);
+}
+
+void DolphinTabBar::mouseDoubleClickEvent(QMouseEvent *event)
+{
+ if (event->buttons() & Qt::LeftButton) {
+ int index = tabAt(event->pos());
+
+ if (index < 0) {
+ // empty tabbar area case
+ index = currentIndex();
+ }
+ // Double left click on the tabbar opens a new activated tab
+ // with the url from the doubleclicked tab or currentTab otherwise.
+ Q_EMIT openNewActivatedTab(index);
+ }
+
QTabBar::mouseDoubleClickEvent(event);
}
-void DolphinTabBar::contextMenuEvent(QContextMenuEvent* event)
+void DolphinTabBar::contextMenuEvent(QContextMenuEvent *event)
{
const int index = tabAt(event->pos());
// Tab context menu
QMenu menu(this);
- QAction* newTabAction = menu.addAction(QIcon::fromTheme("tab-new"), i18nc("@action:inmenu", "New Tab"));
- QAction* detachTabAction = menu.addAction(QIcon::fromTheme("tab-detach"), i18nc("@action:inmenu", "Detach Tab"));
- QAction* closeOtherTabsAction = menu.addAction(QIcon::fromTheme("tab-close-other"), i18nc("@action:inmenu", "Close Other Tabs"));
- QAction* closeTabAction = menu.addAction(QIcon::fromTheme("tab-close"), i18nc("@action:inmenu", "Close Tab"));
+ QAction *newTabAction = menu.addAction(QIcon::fromTheme(QStringLiteral("tab-new")), i18nc("@action:inmenu", "New Tab"));
+ QAction *detachTabAction = menu.addAction(QIcon::fromTheme(QStringLiteral("tab-detach")), i18nc("@action:inmenu", "Detach Tab"));
+ QAction *closeOtherTabsAction = menu.addAction(QIcon::fromTheme(QStringLiteral("tab-close-other")), i18nc("@action:inmenu", "Close Other Tabs"));
+ QAction *closeTabAction = menu.addAction(QIcon::fromTheme(QStringLiteral("tab-close")), i18nc("@action:inmenu", "Close Tab"));
+
+ QAction *renameTabAction = menu.addAction(QIcon::fromTheme(QStringLiteral("edit-rename")), i18nc("@action:inmenu", "Rename Tab"));
- QAction* selectedAction = menu.exec(event->globalPos());
+ QAction *selectedAction = menu.exec(event->globalPos());
if (selectedAction == newTabAction) {
- emit openNewActivatedTab(index);
+ Q_EMIT openNewActivatedTab(index);
} else if (selectedAction == detachTabAction) {
- emit tabDetachRequested(index);
+ Q_EMIT tabDetachRequested(index);
} else if (selectedAction == closeOtherTabsAction) {
const int tabCount = count();
for (int i = 0; i < index; i++) {
- emit tabCloseRequested(0);
+ Q_EMIT tabCloseRequested(0);
}
for (int i = index + 1; i < tabCount; i++) {
- emit tabCloseRequested(1);
+ Q_EMIT tabCloseRequested(1);
}
} else if (selectedAction == closeTabAction) {
- emit tabCloseRequested(index);
+ Q_EMIT tabCloseRequested(index);
+ } else if (selectedAction == renameTabAction) {
+ bool renamed = false;
+ const QString tabNewName = QInputDialog::getText(this, i18nc("@title:window for text input", "Rename Tab"), i18n("New tab name:"), QLineEdit::Normal, tabText(index), &renamed);
+
+ if (renamed) {
+ Q_EMIT tabRenamed(index, tabNewName);
+ }
}
return;
}
}
}
+
+#include "moc_dolphintabbar.cpp"