/* * 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 "mainwindow.h" #include "addressbar/addressbar.h" #include "webengine/webview.h" #include "widgets/navigationbar.h" #include "widgets/searchform.h" #include "window.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include MainWindow::MainWindow(std::shared_ptr &config, QWidget *parent) : QMainWindow(parent) , mdiArea(new QMdiArea(this)) { Q_ASSERT(config); m_config = config; // create UI resize(config->value("mainwindow.width").value(), config->value("mainwindow.height").value()); setWindowTitle(QString::fromStdString(config->value("mainwindow.title").value())); if(config->value("mainwindow.maximized").value()) showMaximized(); else show(); createMenuBar(); navigationToolBar = new NavigationBar(config->section("navigation"), this); navigationToolBar->setMovable(config->value("navigation.movable").value()); addToolBar(Qt::TopToolBarArea, navigationToolBar); navigationToolBar->connectWebView(nullptr); addressBar = new AddressBar(config->section("addressbar"), this); navigationToolBar->addWidget(addressBar); setCentralWidget(mdiArea); mdiArea->setFocus(); // status bar searchBox = new SearchForm(this); statusBar()->addPermanentWidget(searchBox); searchBox->setVisible(false); // connect signlas connect(mdiArea, &QMdiArea::subWindowActivated, this, [this](QMdiSubWindow *window) { disconnect(viewChangedConnection); disconnect(searchBoxConnection); disconnect(statusBarConnection); subWindowAction->setMenu(nullptr); auto *w = qobject_cast(window); if(w == nullptr) { // no current subwindow, clear everything setView(nullptr); subWindowAction->setMenu(nullptr); } else { setView(w->currentView()); subWindowAction->setMenu(w->systemMenu()); viewChangedConnection = connect(w, &Window::currentViewChanged, this, &MainWindow::setView); statusBarConnection = connect(w, &Window::showStatusMessage, statusBar(), &QStatusBar::showMessage); } }); auto *searchShortcut = new QShortcut(QKeySequence(config->value("mainwindow.shortcuts.search").value().c_str()), this); connect(searchShortcut, &QShortcut::activated, this, [=]() { searchBox->setVisible(!searchBox->isVisible()); }); } MainWindow::~MainWindow() { disconnect(viewChangedConnection); disconnect(searchConnection); disconnect(searchBoxConnection); disconnect(statusBarConnection); } void MainWindow::createMenuBar() { Q_CHECK_PTR(mdiArea); auto *smolboteMenu = menuBar()->addMenu(qApp->applicationDisplayName()); smolboteMenu->addAction(tr("New tab group"), this, [this]() { createSubWindow(QUrl::fromUserInput("about:blank")); }, QKeySequence(m_config->value("mainwindow.shortcuts.newGroup").value().c_str())); smolboteMenu->addAction(tr("New window"))->setEnabled(false); smolboteMenu->addSeparator(); smolboteMenu->addAction(tr("About"), this, [this]() { auto *dlg = new AboutDialog(this); dlg->exec(); }, QKeySequence(m_config->value("mainwindow.shortcuts.about").value().c_str())); smolboteMenu->addAction(tr("About Qt"), qApp, &QApplication::aboutQt); smolboteMenu->addSeparator(); smolboteMenu->addAction(tr("Quit"), qApp, &QApplication::quit, QKeySequence(m_config->value("mainwindow.shortcuts.quit").value().c_str())); auto *windowMenu = menuBar()->addMenu(tr("Window")); windowMenu->addAction(tr("Tile windows"), mdiArea, &QMdiArea::tileSubWindows, QKeySequence(m_config->value("mainwindow.shortcuts.tileWindows").value().c_str())); windowMenu->addAction(tr("Cascade windows"), mdiArea, &QMdiArea::cascadeSubWindows, QKeySequence(m_config->value("mainwindow.shortcuts.cascadeWindows").value().c_str())); subWindowAction = windowMenu->addAction(tr("Current window")); toolsMenu = menuBar()->addMenu(tr("Tools")); } void MainWindow::addAction(ActionLocation where, QAction *action) { switch(where) { case ToolsMenu: toolsMenu->addAction(action); break; default: QMainWindow::addAction(action); break; } } void MainWindow::addDockWidget(Qt::DockWidgetArea area, QWidget *widget) { QDockWidget *dock = new QDockWidget(widget->windowTitle(), this); dock->setAttribute(Qt::WA_DeleteOnClose, true); dock->setWidget(widget); connect(dock, &QDockWidget::visibilityChanged, [dock](bool visible) { if(!visible && dock->widget()) { dock->widget()->setParent(nullptr); } }); QMainWindow::addDockWidget(area, dock); } void MainWindow::createTab(const QUrl &url) { auto *w = qobject_cast(mdiArea->currentSubWindow()); if(w == nullptr) { w = createSubWindow(url); } else { w->addTab(url); } } Window *MainWindow::createSubWindow(const QUrl &url) { auto *w = new Window(m_config->section("window"), this); mdiArea->addSubWindow(w); w->showMaximized(); w->setFocus(); QJsonObject session; session.insert("profile", ""); QJsonArray urls; urls.append(url.toString()); session.insert("tabs", urls); //w->addTab(url); //w->restoreSession(session); return w; } void MainWindow::setView(WebView *view) { disconnect(searchConnection); addressBar->setView(view); if(view) { addressBar->setPageMenu(view->pageMenu()); addressBar->setToolsMenu(view->toolsMenu()); searchConnection = connect(addressBar, &AddressBar::search, view, &WebView::search); } else { addressBar->setPageMenu(nullptr); addressBar->setToolsMenu(nullptr); } navigationToolBar->connectWebView(view); searchBox->setView(view); } void MainWindow::closeEvent(QCloseEvent *event) { if(mdiArea->subWindowList().count() > 1) { int choice = QMessageBox::question(this, tr("Close multiple subwindows?"), tr("Do you want to close all subwindows?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No); if(choice == QMessageBox::No) { event->ignore(); return; } } mdiArea->closeAllSubWindows(); if(mdiArea->currentSubWindow()) event->ignore(); else event->accept(); }