/* * 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/gitea/aqua/smolbote * * SPDX-License-Identifier: GPL-3.0 */ #include "menubar.h" #include "bookmarkswidget.h" #include "browser.h" #include "configuration.h" #include "downloadswidget.h" #include "mainwindow.h" #include "profilemanager.h" #include "session/sessiondialog.h" #include "subwindow/subwindow.h" #include "webengine/webview.h" #include "widgets/menusearch.h" #include #include #include #include #include #include #include #include #include MenuBar::MenuBar(const Configuration *config, MainWindow *parent) : QMenuBar(parent) { auto *browser = qobject_cast(qApp); Q_CHECK_PTR(browser); smolbote = this->addMenu(qApp->applicationName()); { auto *findMenu = smolbote->addMenu(tr("Find in menus")); auto *findWidget = new QWidgetAction(this); auto *find_lineEdit = new MenuSearch(this); findWidget->setDefaultWidget(find_lineEdit); findMenu->addAction(findWidget); connect(findMenu, &QMenu::aboutToShow, [findMenu, find_lineEdit]() { find_lineEdit->clear(); const auto actions = findMenu->actions(); for(int i = 1; i < actions.length(); i++) findMenu->removeAction(actions.at(i)); find_lineEdit->setFocus(); }); connect(find_lineEdit, &QLineEdit::textEdited, [this, findMenu](const QString &text) { // clear menu const auto actions = findMenu->actions(); for(int i = 1; i < actions.length(); i++) findMenu->removeAction(actions.at(i)); if(text.isEmpty()) return; // findChildren for(QAction *a : this->findChildren()) { if(a->text().contains(text)) findMenu->addAction(a); } }); smolbote->addSeparator(); const QString sessionPath = config->value("browser.session.path").value(); smolbote->addAction(tr("Save Session"), parent, [parent, sessionPath]() { const QString filename = QFileDialog::getSaveFileName(parent, tr("Save Session"), sessionPath, tr("JSON (*.json)")); QFile output(filename); if(output.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) { auto *browser = qobject_cast(qApp); auto data = Session::_session(browser->windows()); output.write(QJsonDocument(data).toJson()); output.close(); } }); smolbote->addAction(tr("Open Session"), parent, [parent]() { auto *sessionDialog = new SessionDialog(parent); sessionDialog->exec(); }); smolbote->addSeparator(); auto *actionBookmarks = smolbote->addAction(tr("Bookmarks"), browser, [browser, parent]() { browser->showWidget(browser->bookmarks(), parent); }); config->setShortcut(actionBookmarks, "bookmarks.shortcut"); auto *actionDownloads = smolbote->addAction(tr("Downloads"), browser, [browser, parent]() { browser->showWidget(browser->downloads(), parent); }); config->setShortcut(actionDownloads, "downloads.shortcut"); smolbote->addSeparator(); smolbote->addAction(tr("Load Plugin"), browser, [browser]() { const QString path = QFileDialog::getOpenFileName(nullptr, tr("Select Plugin"), QDir::homePath(), tr("Plugins (*.so)")); browser->addPlugin(path); }); pluginInsertLocation = smolbote->addSeparator(); auto *actionAbout = smolbote->addAction(tr("About"), browser, &Browser::about); config->setShortcut(actionAbout, "mainwindow.shortcuts.about"); smolbote->addAction(tr("Help")); //smolbote->addAction(tr("Check for updates")); smolbote->addSeparator(); auto *actionQuit = smolbote->addAction(tr("Quit"), qApp, &QApplication::quit); config->setShortcut(actionQuit, "mainwindow.shortcuts.quit"); } auto *window = this->addMenu(tr("Window")); { auto *actionNewWindow = window->addAction(tr("New Window"), browser, &Browser::createWindow); config->setShortcut(actionNewWindow, "mainwindow.shortcuts.newWindow"); auto *actionNewSubwindow = window->addAction(tr("New Subwindow"), parent, [parent]() { parent->createSubWindow(nullptr, true); }); config->setShortcut(actionNewSubwindow, "mainwindow.shortcuts.newGroup"); window->addSeparator(); auto *actionTileSubwindows = window->addAction(tr("Tile Subwindows"), parent->mdiArea, &QMdiArea::tileSubWindows); config->setShortcut(actionTileSubwindows, "mainwindow.shortcuts.tileWindows"); auto *actionCascadeSubwindows = window->addAction(tr("Cascade Subwindows"), parent->mdiArea, &QMdiArea::cascadeSubWindows); config->setShortcut(actionCascadeSubwindows, "mainwindow.shortcuts.cascadeWindows"); } auto *subwindow = this->addMenu(tr("Subwindow")); { auto *actionNewTab = subwindow->addAction(tr("New Tab"), parent, [parent]() { auto *_subwindow = parent->currentSubWindow(); if(_subwindow != nullptr) { const int index = _subwindow->addTab(); _subwindow->setCurrentTab(index); } }); config->setShortcut(actionNewTab, "subwindow.shortcuts.new"); subwindow->addSeparator(); subwindow->addAction(tr("Restore last tab"), parent, [parent]() { auto *_subwindow = parent->currentSubWindow(); if(_subwindow != nullptr) { const int index = _subwindow->restoreLastTab(); _subwindow->setCurrentTab(index); } }); auto *restoreTabsMenu = subwindow->addMenu(tr("Restore previous tab")); connect(restoreTabsMenu, &QMenu::aboutToShow, parent, [parent, restoreTabsMenu]() { restoreTabsMenu->clear(); auto *_subwindow = parent->currentSubWindow(); if(_subwindow != nullptr) { _subwindow->restoreTabMenu(restoreTabsMenu); } }); subwindow->addSeparator(); auto *subwindowProfile = subwindow->addMenu(tr("Subwindow Profile")); connect(subwindowProfile, &QMenu::aboutToShow, subwindowProfile, [=]() { subwindowProfile->clear(); auto *_subwindow = parent->currentSubWindow(); if(_subwindow != nullptr) { browser->getProfileManager()->profilePickerMenu(subwindowProfile, _subwindow->profile(), [_subwindow](WebProfile *profile) { _subwindow->setProfile(profile); }); } }); } auto *page = this->addMenu(tr("Page")); { page->addAction(tr("Create Bookmark"), parent, [browser, parent]() { if(parent->currentView != nullptr) browser->bookmarks()->addBookmark(parent->currentView->title(), parent->currentView->url().toString()); }); page->addSeparator(); page->addAction(tr("Save"), parent, [parent]() { if(parent->currentView != nullptr) parent->currentView->triggerPageAction(QWebEnginePage::SavePage); }); page->addAction(tr("Print"), parent, [parent]() { if(parent->currentView != nullptr) { auto *printer = new QPrinter(QPrinterInfo::defaultPrinter()); QPrintDialog dlg(printer, parent); if(dlg.exec() == QDialog::Accepted) { parent->currentView->page()->print(printer, [printer](bool success) { Q_UNUSED(success); delete printer; }); } } }); page->addAction(tr("Print to PDF"), parent, [parent]() { if(parent->currentView != nullptr) { const QString path = QFileDialog::getSaveFileName(parent, tr("Print to PDF"), QDir::homePath(), tr("PDF files (*.pdf)")); parent->currentView->page()->printToPdf(path); } }); page->addSeparator(); auto pageProfile = page->addMenu(tr("Page Profile")); connect(pageProfile, &QMenu::aboutToShow, pageProfile, [=]() { pageProfile->clear(); if(parent->currentView != nullptr) { browser->getProfileManager()->profilePickerMenu(pageProfile, parent->currentView->profile(), [parent](WebProfile *profile) { parent->currentView->setProfile(profile); }); } }); page->addSeparator(); page->addAction(tr("Developer Tools")); page->addAction(tr("View Source")); } } QAction *MenuBar::insertPlugin(QMenu *menu) { return smolbote->insertMenu(pluginInsertLocation, menu); }