Git commit 42eb5132e0da4860b9fdd36b916f7d8fe7dbe5b0 by Kurt Hindenburg, on behalf of Shubham Jangra. Committed on 20/02/2019 at 01:50. Pushed by hindenburg into branch 'master'.
Add close tab and create new tab on middle click event Summary: Click with the middle mouse click on a tab: close it Click with the middle click on empty portion of tab bar creates a new tab. This makes konsole more streamlined with default behavior found in other tabbed applications like browsers. GUI option to enable/disable closing tab w/ mouse button. The default is to have closing tab with button disabled to avoid possible data loss. Tomaz Canabrava <[email protected]> also coded portion of this. FEATURE: 398940 FIXED-IN: 19.04 GUI: Test Plan: {F6618852} Reviewers: ngraham, hindenburg, tcanabrava Reviewed By: ngraham, hindenburg Subscribers: emateli, thsurrel, ngraham, hindenburg, shubham, broulik, konsole-devel Tags: #konsole Differential Revision: https://phabricator.kde.org/D15742 M +27 -1 src/DetachableTabBar.cpp M +4 -0 src/DetachableTabBar.h M +4 -0 src/ViewContainer.cpp M +7 -0 src/settings/TabBarSettings.ui M +4 -0 src/settings/konsole.kcfg https://commits.kde.org/konsole/42eb5132e0da4860b9fdd36b916f7d8fe7dbe5b0 diff --git a/src/DetachableTabBar.cpp b/src/DetachableTabBar.cpp index 4508004c..bdbc07b8 100644 --- a/src/DetachableTabBar.cpp +++ b/src/DetachableTabBar.cpp @@ -18,6 +18,7 @@ */ #include "DetachableTabBar.h" +#include "KonsoleSettings.h" #include "ViewContainer.h" #include <QMouseEvent> @@ -28,7 +29,8 @@ namespace Konsole { DetachableTabBar::DetachableTabBar(QWidget *parent) : QTabBar(parent), dragType(DragType::NONE), - _originalCursor(cursor()) + _originalCursor(cursor()), + tabId(-1) {} bool DetachableTabBar::droppedContainerIsNotThis(const QPoint& currentPos) const @@ -43,6 +45,15 @@ bool DetachableTabBar::droppedContainerIsNotThis(const QPoint& currentPos) const return false; } +void DetachableTabBar::middleMouseButtonClickAt(const QPoint& pos) +{ + tabId = tabAt(pos); + + if (tabId != -1) { + emit closeTab(tabId); + } +} + void DetachableTabBar::mousePressEvent(QMouseEvent *event) { QTabBar::mousePressEvent(event); @@ -87,6 +98,21 @@ void DetachableTabBar::mouseMoveEvent(QMouseEvent *event) void DetachableTabBar::mouseReleaseEvent(QMouseEvent *event) { QTabBar::mouseReleaseEvent(event); + + switch(event->button()) { + case Qt::MiddleButton : if (KonsoleSettings::closeTabOnMiddleMouseButton()) { + middleMouseButtonClickAt(event->pos()); + } + + tabId = tabAt(event->pos()); + if (tabId == -1) { + emit newTabRequest(); + } + break; + case Qt::LeftButton: _containers = window()->findChildren<Konsole::TabbedViewContainer*>(); break; + default: break; + } + setCursor(_originalCursor); if (contentsRect().adjusted(-30,-30,30,30).contains(event->pos())) { diff --git a/src/DetachableTabBar.h b/src/DetachableTabBar.h index 488ac409..77288786 100644 --- a/src/DetachableTabBar.h +++ b/src/DetachableTabBar.h @@ -34,7 +34,10 @@ public: Q_SIGNALS: void detachTab(int index); void moveTabToWindow(int tabIndex, QWidget *otherWindow); + void closeTab(int index); + void newTabRequest(); protected: + void middleMouseButtonClickAt(const QPoint& pos); void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent*event) override; void mouseReleaseEvent(QMouseEvent *event) override; @@ -44,6 +47,7 @@ private: DragType dragType; QCursor _originalCursor; QList<TabbedViewContainer*> _containers; + int tabId; }; } diff --git a/src/ViewContainer.cpp b/src/ViewContainer.cpp index caa7abb9..eb934c89 100644 --- a/src/ViewContainer.cpp +++ b/src/ViewContainer.cpp @@ -89,6 +89,10 @@ TabbedViewContainer::TabbedViewContainer(ViewManager *connectedViewManager, QWid connect(tabBarWidget, &DetachableTabBar::detachTab, this, [this](int idx) { emit detachTab(this, terminalAt(idx)); }); + connect(tabBarWidget, &DetachableTabBar::closeTab, + this, &TabbedViewContainer::closeTerminalTab); + connect(tabBarWidget, &DetachableTabBar::newTabRequest, + this, [this]{ emit newViewRequest(this); }); connect(this, &TabbedViewContainer::currentChanged, this, &TabbedViewContainer::currentTabChanged); // The context menu of tab bar diff --git a/src/settings/TabBarSettings.ui b/src/settings/TabBarSettings.ui index 03994eaf..d50b76d2 100644 --- a/src/settings/TabBarSettings.ui +++ b/src/settings/TabBarSettings.ui @@ -151,6 +151,13 @@ </property> </widget> </item> + <item row="6" column="0" colspan="2"> + <widget class="QCheckBox" name="kcfg_CloseTabOnMiddleMouseButton"> + <property name="text"> + <string>Close tab on middle-click</string> + </property> + </widget> + </item> </layout> </widget> </item> diff --git a/src/settings/konsole.kcfg b/src/settings/konsole.kcfg index e1a3ab5d..e878ede6 100644 --- a/src/settings/konsole.kcfg +++ b/src/settings/konsole.kcfg @@ -91,6 +91,10 @@ <label>The .css file to use for the tab bar style</label> <default></default> </entry> + <entry name="CloseTabOnMiddleMouseButton" type="Bool"> + <label>Allow middle-clicking on open tabs to close them</label> + <default>false</default> + </entry> <entry name="NewTabButton" type="Bool"> <label>Control the visibility of 'New Tab' button on the tab bar</label> <default>false</default>
