/* * This file is part of smolbote. It's copyrighted by the contributors recorded * in the version control history of the file, available from its original * location: https://neueland.iserlohn-fortress.net/smolbote.hg * * SPDX-License-Identifier: GPL-3.0 */ #include "tabwidget.h" #include "webengine/webview.h" #include #include #include #include TabWidget::TabWidget(QWidget *parent) : QTabWidget(parent) { setStyleSheet("QTabBar::tab { width: 200px; }"); setTabsClosable(true); setTabBarAutoHide(true); setElideMode(Qt::ElideRight); setMovable(true); connect(this, &TabWidget::tabCloseRequested, this, &TabWidget::deleteTab); // context menu tabContextMenu = new QMenu(this); auto *closeTab = tabContextMenu->addAction(tr("Close Tab")); connect(closeTab, &QAction::triggered, this, [this]() { deleteTab(this->tabBar()->tabAt(mapFromGlobal(tabContextMenu->pos()))); }); auto *closeTabsLeft = tabContextMenu->addAction(tr("Close Tabs left")); connect(closeTabsLeft, &QAction::triggered, this, [this]() { int idx = this->tabBar()->tabAt(mapFromGlobal(tabContextMenu->pos())); for(int i = idx - 1; i >= 0; --i) { deleteTab(i); } }); auto *closeTabsRight = tabContextMenu->addAction(tr("Close Tabs right")); connect(closeTabsRight, &QAction::triggered, this, [this]() { int idx = this->tabBar()->tabAt(mapFromGlobal(tabContextMenu->pos())); for(int i = count() - 1; i > idx; --i) { deleteTab(i); } }); } TabWidget::~TabWidget() { for(int i = count() - 1; i >= 0; i--) { delete widget(i); } } int TabWidget::addTab(WebView *view) { Q_CHECK_PTR(view); int idx = QTabWidget::addTab(view, view->title()); connect(view, &WebView::titleChanged, [this, view](const QString &title) { int idx = this->indexOf(view); Q_ASSERT(idx != -1); this->setTabText(idx, title); }); connect(view, &WebView::iconChanged, [this, view](const QIcon &icon) { int idx = this->indexOf(view); Q_ASSERT(idx != -1); this->setTabIcon(idx, icon); }); return idx; } void TabWidget::deleteTab(int index) { // deleting the widget automatically removes the tab? if(count() > 1) { widget(index)->deleteLater(); removeTab(index); } else parentWidget()->close(); } void TabWidget::contextMenuEvent(QContextMenuEvent *event) { // check if the context menu was called on a tab int tabIndex = tabBar()->tabAt(event->pos()); if(tabIndex < 0) { return; } tabContextMenu->exec(event->globalPos()); }