aboutsummaryrefslogtreecommitdiff
path: root/src/mainwindow/menubar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mainwindow/menubar.cpp')
-rw-r--r--src/mainwindow/menubar.cpp239
1 files changed, 239 insertions, 0 deletions
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 <QApplication>
+#include <QDir>
+#include <QFileDialog>
+#include <QLineEdit>
+#include <QMdiArea>
+#include <QPrintDialog>
+#include <QPrinter>
+#include <QPrinterInfo>
+#include <QWidgetAction>
+
+MenuBar::MenuBar(const Configuration *config, MainWindow *parent)
+ : QMenuBar(parent)
+{
+ auto *browser = qobject_cast<Browser *>(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<QAction *>()) {
+ if(a->text().contains(text))
+ findMenu->addAction(a);
+ }
+ });
+
+ smolbote->addSeparator();
+
+ const QString sessionPath = config->value<QString>("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<Browser *>(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);
+}