From 4eedf60d76a047f63b0991eee0b623e9be854c76 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Thu, 13 Dec 2018 12:49:28 +0100 Subject: MainWindow: rework menu bar Split off menu bar into its own class out of MainWindow Menu bar now has a 'Find in menus' function --- src/mainwindow/menubar.cpp | 239 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 src/mainwindow/menubar.cpp (limited to 'src/mainwindow/menubar.cpp') diff --git a/src/mainwindow/menubar.cpp b/src/mainwindow/menubar.cpp new file mode 100644 index 0000000..0429ffd --- /dev/null +++ b/src/mainwindow/menubar.cpp @@ -0,0 +1,239 @@ +/* + * 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); +} -- cgit v1.2.1