2020-08-25 17:07:38 +00:00
|
|
|
/*
|
|
|
|
* SPDX-FileCopyrightText: 2014 Emmanuel Pescosta <emmanuelpescosta099@gmail.com>
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
*/
|
2014-07-08 17:38:18 +00:00
|
|
|
|
|
|
|
#include "dolphintabbar.h"
|
|
|
|
|
|
|
|
#include <KLocalizedString>
|
2018-03-04 13:38:16 +00:00
|
|
|
|
|
|
|
#include <QDragEnterEvent>
|
2014-10-10 21:36:36 +00:00
|
|
|
#include <QMenu>
|
2014-10-21 19:18:43 +00:00
|
|
|
#include <QMimeData>
|
2018-03-04 13:38:16 +00:00
|
|
|
#include <QTimer>
|
2014-07-08 17:38:18 +00:00
|
|
|
|
|
|
|
DolphinTabBar::DolphinTabBar(QWidget* parent) :
|
|
|
|
QTabBar(parent),
|
2017-02-13 12:20:07 +00:00
|
|
|
m_autoActivationIndex(-1),
|
|
|
|
m_tabToBeClosedOnMiddleMouseButtonRelease(-1)
|
2014-07-08 17:38:18 +00:00
|
|
|
{
|
|
|
|
setAcceptDrops(true);
|
|
|
|
setSelectionBehaviorOnRemove(QTabBar::SelectPreviousTab);
|
|
|
|
setMovable(true);
|
|
|
|
setTabsClosable(true);
|
|
|
|
|
|
|
|
m_autoActivationTimer = new QTimer(this);
|
|
|
|
m_autoActivationTimer->setSingleShot(true);
|
|
|
|
m_autoActivationTimer->setInterval(800);
|
2016-03-16 21:17:37 +00:00
|
|
|
connect(m_autoActivationTimer, &QTimer::timeout,
|
|
|
|
this, &DolphinTabBar::slotAutoActivationTimeout);
|
2014-07-08 17:38:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void DolphinTabBar::dragEnterEvent(QDragEnterEvent* event)
|
|
|
|
{
|
|
|
|
const QMimeData* mimeData = event->mimeData();
|
|
|
|
const int index = tabAt(event->pos());
|
|
|
|
|
2014-10-21 19:18:43 +00:00
|
|
|
if (mimeData->hasUrls()) {
|
2022-01-20 11:38:47 +00:00
|
|
|
if (index >= 0) {
|
|
|
|
event->acceptProposedAction();
|
|
|
|
} else {
|
|
|
|
event->setDropAction(Qt::IgnoreAction);
|
|
|
|
// Still need to accept it to receive dragMoveEvent
|
|
|
|
event->accept();
|
|
|
|
}
|
2014-07-08 17:38:18 +00:00
|
|
|
updateAutoActivationTimer(index);
|
|
|
|
}
|
|
|
|
|
|
|
|
QTabBar::dragEnterEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DolphinTabBar::dragLeaveEvent(QDragLeaveEvent* event)
|
|
|
|
{
|
|
|
|
updateAutoActivationTimer(-1);
|
|
|
|
|
|
|
|
QTabBar::dragLeaveEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DolphinTabBar::dragMoveEvent(QDragMoveEvent* event)
|
|
|
|
{
|
|
|
|
const QMimeData* mimeData = event->mimeData();
|
|
|
|
const int index = tabAt(event->pos());
|
|
|
|
|
2014-10-21 19:18:43 +00:00
|
|
|
if (mimeData->hasUrls()) {
|
2022-01-20 11:38:47 +00:00
|
|
|
if (index >= 0) {
|
|
|
|
event->acceptProposedAction();
|
|
|
|
} else {
|
|
|
|
event->setDropAction(Qt::IgnoreAction);
|
|
|
|
}
|
2014-07-08 17:38:18 +00:00
|
|
|
updateAutoActivationTimer(index);
|
|
|
|
}
|
|
|
|
|
|
|
|
QTabBar::dragMoveEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DolphinTabBar::dropEvent(QDropEvent* event)
|
|
|
|
{
|
|
|
|
// Disable the auto activation timer
|
|
|
|
updateAutoActivationTimer(-1);
|
|
|
|
|
|
|
|
const QMimeData* mimeData = event->mimeData();
|
|
|
|
const int index = tabAt(event->pos());
|
|
|
|
|
2014-10-21 19:18:43 +00:00
|
|
|
if (index >= 0 && mimeData->hasUrls()) {
|
2020-10-23 17:51:33 +00:00
|
|
|
Q_EMIT tabDropEvent(index, event);
|
2014-07-08 17:38:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
QTabBar::dropEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DolphinTabBar::mousePressEvent(QMouseEvent* event)
|
|
|
|
{
|
|
|
|
const int index = tabAt(event->pos());
|
|
|
|
|
|
|
|
if (index >= 0 && event->button() == Qt::MiddleButton) {
|
2017-02-13 12:20:07 +00:00
|
|
|
m_tabToBeClosedOnMiddleMouseButtonRelease = index;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
QTabBar::mousePressEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DolphinTabBar::mouseReleaseEvent(QMouseEvent *event)
|
|
|
|
{
|
|
|
|
const int index = tabAt(event->pos());
|
|
|
|
|
|
|
|
if (index >= 0 && index == m_tabToBeClosedOnMiddleMouseButtonRelease
|
|
|
|
&& event->button() == Qt::MiddleButton) {
|
2014-07-08 17:38:18 +00:00
|
|
|
// Mouse middle click on a tab closes this tab.
|
2020-10-23 17:51:33 +00:00
|
|
|
Q_EMIT tabCloseRequested(index);
|
2014-07-08 17:38:18 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-02-13 12:20:07 +00:00
|
|
|
QTabBar::mouseReleaseEvent(event);
|
2014-07-08 17:38:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void DolphinTabBar::mouseDoubleClickEvent(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.
|
2020-10-23 17:51:33 +00:00
|
|
|
Q_EMIT openNewActivatedTab(currentIndex());
|
2014-07-08 17:38:18 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
QTabBar::mouseDoubleClickEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DolphinTabBar::contextMenuEvent(QContextMenuEvent* event)
|
|
|
|
{
|
|
|
|
const int index = tabAt(event->pos());
|
|
|
|
|
|
|
|
if (index >= 0) {
|
|
|
|
// Tab context menu
|
2014-10-10 21:36:36 +00:00
|
|
|
QMenu menu(this);
|
2014-07-08 17:38:18 +00:00
|
|
|
|
2016-03-16 21:17:37 +00:00
|
|
|
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"));
|
2014-07-08 17:38:18 +00:00
|
|
|
|
|
|
|
QAction* selectedAction = menu.exec(event->globalPos());
|
|
|
|
if (selectedAction == newTabAction) {
|
2020-10-23 17:51:33 +00:00
|
|
|
Q_EMIT openNewActivatedTab(index);
|
2014-07-08 17:38:18 +00:00
|
|
|
} else if (selectedAction == detachTabAction) {
|
2020-10-23 17:51:33 +00:00
|
|
|
Q_EMIT tabDetachRequested(index);
|
2014-07-08 17:38:18 +00:00
|
|
|
} else if (selectedAction == closeOtherTabsAction) {
|
|
|
|
const int tabCount = count();
|
|
|
|
for (int i = 0; i < index; i++) {
|
2020-10-23 17:51:33 +00:00
|
|
|
Q_EMIT tabCloseRequested(0);
|
2014-07-08 17:38:18 +00:00
|
|
|
}
|
|
|
|
for (int i = index + 1; i < tabCount; i++) {
|
2020-10-23 17:51:33 +00:00
|
|
|
Q_EMIT tabCloseRequested(1);
|
2014-07-08 17:38:18 +00:00
|
|
|
}
|
|
|
|
} else if (selectedAction == closeTabAction) {
|
2020-10-23 17:51:33 +00:00
|
|
|
Q_EMIT tabCloseRequested(index);
|
2014-07-08 17:38:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
QTabBar::contextMenuEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DolphinTabBar::slotAutoActivationTimeout()
|
|
|
|
{
|
|
|
|
if (m_autoActivationIndex >= 0) {
|
|
|
|
setCurrentIndex(m_autoActivationIndex);
|
|
|
|
updateAutoActivationTimer(-1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DolphinTabBar::updateAutoActivationTimer(const int index)
|
|
|
|
{
|
|
|
|
if (m_autoActivationIndex != index) {
|
|
|
|
m_autoActivationIndex = index;
|
|
|
|
|
|
|
|
if (m_autoActivationIndex < 0) {
|
|
|
|
m_autoActivationTimer->stop();
|
|
|
|
} else {
|
|
|
|
m_autoActivationTimer->start();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|