diff --git a/src/lib_gui/qt/element/QtTabBar.cpp b/src/lib_gui/qt/element/QtTabBar.cpp index 51c8f66e..6c0f0103 100644 --- a/src/lib_gui/qt/element/QtTabBar.cpp +++ b/src/lib_gui/qt/element/QtTabBar.cpp @@ -1,5 +1,12 @@ #include "QtTabBar.h" +#include + +#include "QtContextMenu.h" +#include "QtGraphicsView.h" +#include "logging.h" + + QtTabBar::QtTabBar(QWidget* parent): QTabBar(parent) { setFocusPolicy(Qt::NoFocus); @@ -19,3 +26,22 @@ QSize QtTabBar::minimumTabSizeHint(int index) const { return QSize(45, QTabBar::minimumTabSizeHint(index).height()); } + +void QtTabBar::contextMenuEvent(QContextMenuEvent* event) +{ + QtContextMenu menu(event, this); + QAction * m_closeTabsToRight = new QAction("Close tabs to the right", this); + menu.addAction(m_closeTabsToRight); + + connect(m_closeTabsToRight, &QAction::triggered, this, [&]() + { + // We dont want to close tabs right of the current active tab. + // No, our intend is to close tabs right of the currently hovered tab. + auto tabNum = tabAt(event->pos()); + LOG_INFO("Handling closeTabs... emitting signal to close tabs right of tab nr. " + std::to_string(tabNum)); + emit signalCloseTabsToRight(tabNum); + }); + + menu.show(); + return; +} diff --git a/src/lib_gui/qt/element/QtTabBar.h b/src/lib_gui/qt/element/QtTabBar.h index 9a7b4803..72b24912 100644 --- a/src/lib_gui/qt/element/QtTabBar.h +++ b/src/lib_gui/qt/element/QtTabBar.h @@ -5,14 +5,23 @@ class QtTabBar: public QTabBar { + Q_OBJECT + public: QtTabBar(QWidget* parent = nullptr); +signals: + void signalCloseTabsToRight(int tabNum); + protected: QSize minimumSizeHint() const override; QSize tabSizeHint(int index) const override; QSize minimumTabSizeHint(int index) const override; + + // New ContextMenu that lets the user close all tabs to the + // right of current mouse position. + void contextMenuEvent(QContextMenuEvent* event) override; }; #endif // QT_TAB_BAR_H diff --git a/src/lib_gui/qt/view/QtTabsView.cpp b/src/lib_gui/qt/view/QtTabsView.cpp index e03e7d07..2f30d316 100644 --- a/src/lib_gui/qt/view/QtTabsView.cpp +++ b/src/lib_gui/qt/view/QtTabsView.cpp @@ -54,6 +54,7 @@ QtTabsView::QtTabsView(ViewLayout* viewLayout) layout->addWidget(back); connect(addButton, &QPushButton::clicked, this, &QtTabsView::addTab); + connect(m_tabBar, &QtTabBar::signalCloseTabsToRight, this, &QtTabsView::closeTabsToRight); } void QtTabsView::createWidgetWrapper() @@ -271,3 +272,16 @@ void QtTabsView::setStyleSheet() utility::setWidgetBackgroundColor( m_widget, ColorScheme::getInstance()->getColor("tab/bar/background")); } + +void QtTabsView::closeTabsToRight(int tabNum) +{ + LOG_INFO("Closing tabs to the right of tab nr. " + std::to_string(tabNum)); + // We are closing tabs to the right, hence the increase. + tabNum++; + // Now close tabs at position tabNum until count has decreased low enough. + while(tabNum < m_tabBar->count() ) + { + m_tabBar->removeTab(tabNum); + } +} + diff --git a/src/lib_gui/qt/view/QtTabsView.h b/src/lib_gui/qt/view/QtTabsView.h index f11b79f0..3480951b 100644 --- a/src/lib_gui/qt/view/QtTabsView.h +++ b/src/lib_gui/qt/view/QtTabsView.h @@ -36,6 +36,7 @@ private slots: void insertTab(bool showTab, SearchMatch match); void changedTab(int index); void removeTab(int index); + void closeTabsToRight(int index); private: void setTabState(int idx, const std::vector& matches);