/* * 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 "window.h" #include "webengine/webprofile.h" #include "webengine/webview.h" #include "widgets/tabwidget.h" #include #include #include #include Window::Window(const QHash &config, QWidget *parent, Qt::WindowFlags flags) : QMdiSubWindow(parent, flags) , tabWidget(new TabWidget(this)) { // delete this window when it closes setAttribute(Qt::WA_DeleteOnClose, true); resize(800, 600); setWidget(tabWidget); // new tab button auto *newTab_button = new QToolButton(this); newTab_button->setIcon(style()->standardIcon(QStyle::SP_FileIcon)); newTab_button->setToolTip(tr("Add tab")); newTab_button->setShortcut(QKeySequence(config.value("window.shortcuts.new"))); connect(newTab_button, &QToolButton::clicked, this, [=]() { addTab(WebProfile::defaultProfile()->newtab()); }); tabWidget->setCornerWidget(newTab_button, Qt::TopRightCorner); // general actions auto *closeTab_action = new QAction(this); closeTab_action->setShortcut(QKeySequence(config.value("window.shortcuts.close"))); connect(closeTab_action, &QAction::triggered, this, [=]() { tabWidget->deleteTab(tabWidget->currentIndex()); }); addAction(closeTab_action); auto *leftTab_action = new QAction(this); leftTab_action->setShortcut(QKeySequence(config.value("window.shortcuts.left"))); connect(leftTab_action, &QAction::triggered, this, [=]() { tabWidget->setCurrentIndex(qMax(0, tabWidget->currentIndex() - 1)); }); addAction(leftTab_action); auto *rightTab_action = new QAction(this); rightTab_action->setShortcut(QKeySequence(config.value("window.shortcuts.right"))); connect(rightTab_action, &QAction::triggered, this, [=]() { tabWidget->setCurrentIndex(qMin(tabWidget->currentIndex() + 1, tabWidget->count() - 1)); }); addAction(rightTab_action); connect(tabWidget, &TabWidget::currentChanged, [this](int index) { if(index < 0) { // last tab has been closed close(); } else { auto *view = dynamic_cast(tabWidget->widget(index)); Q_CHECK_PTR(view); disconnect(titleConnection); disconnect(linkHoveredConnection); connect(view, &WebView::titleChanged, this, &Window::setWindowTitle); setWindowTitle(view->title()); connect(view->page(), &WebPage::linkHovered, this, [this](const QString &url) { if(!url.isEmpty()) emit showStatusMessage(url, 3000); }); emit currentViewChanged(view); } }); } Window::~Window() { delete tabWidget; } WebView *Window::currentView() { return qobject_cast(tabWidget->currentWidget()); } int Window::addTab(WebView *view) { Q_CHECK_PTR(view); return tabWidget->addTab(view); } int Window::addTab(const QUrl &url) { auto *view = new WebView(WebProfile::defaultProfile(), this); view->load(url); return tabWidget->addTab(view); } void Window::swapToTab(int index) { tabWidget->setCurrentIndex(index); }