/* * 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 #include "browser.h" #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); // when changing tabs, give focus to the widget // otherwise when closing tabs, the tabwidget will retain focus connect(this, &TabWidget::currentChanged, this, [this](int index) { if(widget(index)) widget(index)->setFocus(); }); // 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); } }); auto *loadProfile_menu = tabContextMenu->addMenu(tr("Load Profile")); { auto *browser = qobject_cast(qApp); Q_CHECK_PTR(browser); for(const QString &name : browser->profiles()) { auto *profile = browser->profile(name); Q_CHECK_PTR(profile); auto *profileAction = loadProfile_menu->addAction(profile->name()); connect(profileAction, &QAction::triggered, this, [this, profile]() { int index = this->tabBar()->tabAt(mapFromGlobal(tabContextMenu->pos())); auto *view = qobject_cast(this->widget(index)); view->setProfile(profile); }); } } } TabWidget::~TabWidget() { for(int i = count() - 1; i >= 0; i--) { delete widget(i); } } int TabWidget::addTab(WebView *view) { Q_ASSERT_X(view != nullptr, "TabWidget::addTab", "Tried to add null 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()); } void TabWidget::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::MiddleButton) { int index = tabBar()->tabAt(event->pos()); if(index >= 0) { deleteTab(index); } event->accept(); return; } QTabWidget::mousePressEvent(event); }