diff options
Diffstat (limited to 'src')
28 files changed, 246 insertions, 411 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..f80dbc7 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,69 @@ +# version.h +configure_file(version.h.in version.h) + +add_executable(poi + applicationmenu.cpp + applicationmenu.h + bookmarks/bookmarksform.ui + bookmarks/bookmarkstoolbar.cpp + bookmarks/bookmarkstoolbar.h + bookmarks/bookmarkswidget.cpp + bookmarks/bookmarkswidget.h + #bookmarks/builtins.cpp + bookmarks/editbookmarkdialog.cpp + bookmarks/editbookmarkdialog.h + bookmarks/editbookmarkdialog.ui + browser.cpp + browser.h + #builtins.cpp + #builtins.h + #crashhandler.cpp + #crashhandler.h + #crashhandler_dummy.cpp + main.cpp + mainwindow/addressbar.cpp + mainwindow/addressbar.h + mainwindow/addressbar.ui + mainwindow/mainwindow.cpp + mainwindow/mainwindow.h + mainwindow/menubar.cpp + mainwindow/menubar.h + mainwindow/widgets/completer.cpp + mainwindow/widgets/completer.h + mainwindow/widgets/dockwidget.cpp + mainwindow/widgets/dockwidget.h + mainwindow/widgets/menusearch.cpp + mainwindow/widgets/menusearch.h + mainwindow/widgets/navigationbar.cpp + mainwindow/widgets/navigationbar.h + mainwindow/widgets/searchform.cpp + mainwindow/widgets/searchform.h + mainwindow/widgets/searchform.ui + mainwindow/widgets/urllineedit.cpp + mainwindow/widgets/urllineedit.h + session/savesessiondialog.cpp + session/savesessiondialog.h + session/savesessiondialog.ui + session/sessiondialog.cpp + session/sessiondialog.h + session/sessiondialog.ui + subwindow/subwindow.cpp + subwindow/subwindow.h + subwindow/tabwidget.cpp + subwindow/tabwidget.h + util.cpp + util.h + wallet/wallet.cpp + wallet/wallet.h + + # resources + ${PROJECT_SOURCE_DIR}/data/resources.qrc +) +target_include_directories(poi PRIVATE ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_BINARY_DIR}) +target_enable_warnings(poi) +target_link_libraries(poi + PRIVATE SingleApplication::SingleApplication spdlog::spdlog + PRIVATE bookmarks configuration downloads session_formats urlfilter + PRIVATE about webengine +) + diff --git a/src/about/CMakeLists.txt b/src/about/CMakeLists.txt new file mode 100644 index 0000000..f1e2c41 --- /dev/null +++ b/src/about/CMakeLists.txt @@ -0,0 +1,12 @@ +add_library(about STATIC + aboutdialog.cpp aboutdialog.h aboutdialog.ui + aboutplugin.cpp aboutplugin.h aboutplugin.ui +) +target_link_libraries(about PUBLIC Qt6::Widgets Qt6::SvgWidgets) +target_include_directories(about PUBLIC ${CMAKE_CURRENT_LIST_DIR}) + +# tests +add_executable(test_about test/main.cpp) +target_link_libraries(test_about PRIVATE about) +add_test(NAME about_dialog COMMAND $<TARGET_FILE:test_about> -platform offscreen) +set_property(TEST about_dialog PROPERTY ENVIRONMENT autoclose=1) diff --git a/src/about/aboutdialog.cpp b/src/about/aboutdialog.cpp index 894b1ec..1013866 100644 --- a/src/about/aboutdialog.cpp +++ b/src/about/aboutdialog.cpp @@ -8,7 +8,6 @@ #include "aboutdialog.h" #include "ui_aboutdialog.h" -#include <version.h> // compiler // clang also defines __GNUC__, so we need to check for clang first @@ -59,7 +58,7 @@ AboutDialog::AboutDialog(QWidget *parent) "<p>This program is distributed in the hope that it will be useful, but without any warranty.</p>" "<p>You can read the full terms of the license on <a href='https://www.gnu.org/licenses/gpl-3.0.en.html'>the GNU website</a>.</p>")); - ui->detailsLabel->setText(tr("<p>Version " poi_Version "</p>" + ui->detailsLabel->setText(tr("<p>Version %1</p>" "<p>Compiled with " compiler "</p>" "<p>Libraries: <ul>" "<li><a href='https://www.qt.io/'>Qt5</a> " QT_VERSION_STR "</li>" @@ -69,7 +68,8 @@ AboutDialog::AboutDialog(QWidget *parent) #ifdef CONFIG_USEBREAKPAD "<li><a href='https://chromium.googlesource.com/breakpad/breakpad'>Breakpad</a></li>" #endif - "</ul></p>")); + "</ul></p>") + .arg(qApp->applicationVersion())); } AboutDialog::~AboutDialog() diff --git a/src/about/meson.build b/src/about/meson.build deleted file mode 100644 index 49274a8..0000000 --- a/src/about/meson.build +++ /dev/null @@ -1,21 +0,0 @@ -about_moc = mod_qt5.preprocess( - moc_headers: ['aboutdialog.h', 'aboutplugin.h'], - ui_files: ['aboutdialog.ui', 'aboutplugin.ui'], - dependencies: dep_qt5 -) - -dep_about = declare_dependency( - include_directories: '.', - link_with: static_library('about', - [ 'aboutdialog.cpp', 'aboutplugin.cpp', about_moc, version_h], - dependencies: [dep_qt5]) -) - -poi_sourceset.add(dep_about) - -test('about dialog', executable('about', - sources: 'test/main.cpp', - dependencies: [ dep_qt5, dep_about, dep_catch ]), - args: [ '-platform', 'offscreen' ], - env: 'autoclose=1' -) diff --git a/src/applicationmenu.cpp b/src/applicationmenu.cpp index dc888e7..aff5576 100644 --- a/src/applicationmenu.cpp +++ b/src/applicationmenu.cpp @@ -22,31 +22,31 @@ ApplicationMenu::ApplicationMenu(Browser *app, QWidget *parent) setTitle(qApp->applicationName()); Configuration conf; - const auto sessionPath = conf.value<QString>("session.path").value(); + const auto sessionPath = conf.value<QString>("session/path").value(); auto *actionSaveSession = addAction(tr("Save Session"), this, [sessionPath]() { auto *sessionDialog = new SaveSessionDialog(nullptr); if(sessionDialog->exec() == QDialog::Accepted) { sessionDialog->save(sessionPath); } }); - conf.shortcut<QAction>(*actionSaveSession, "shortcuts.session.save"); + conf.shortcut<QAction>(*actionSaveSession, "shortcuts/session.save"); auto *actionOpenSession = addAction(tr("Open Session"), this, []() { auto *sessionDialog = new SessionDialog(nullptr); sessionDialog->exec(); }); - conf.shortcut<QAction>(*actionOpenSession, "shortcuts.session.open"); + conf.shortcut<QAction>(*actionOpenSession, "shortcuts/session.open"); bottom_pluginSeparator = addSeparator(); auto *actionAbout = addAction(tr("About"), app, &Browser::about); - conf.shortcut<QAction>(*actionAbout, "shortcuts.window.about"); + conf.shortcut<QAction>(*actionAbout, "shortcuts/window.about"); auto *action_aboutPlugins = addAction(tr("About Plugins"), app, &Browser::aboutPlugins); - conf.shortcut(*action_aboutPlugins, "app.shortcuts.about.plugins"); + conf.shortcut(*action_aboutPlugins, "shortcuts/about.plugins"); auto *actionQuit = addAction(tr("Quit"), app, &Browser::quit); - conf.shortcut<QAction>(*actionQuit, "shortcuts.window.quit"); + conf.shortcut<QAction>(*actionQuit, "shortcuts/window.quit"); } void ApplicationMenu::addPlugin(QPluginLoader *plugin) diff --git a/src/bookmarks/bookmarkstoolbar.cpp b/src/bookmarks/bookmarkstoolbar.cpp index 52dcae2..3174874 100644 --- a/src/bookmarks/bookmarkstoolbar.cpp +++ b/src/bookmarks/bookmarkstoolbar.cpp @@ -18,10 +18,10 @@ BookmarksToolbar::BookmarksToolbar(const BookmarkModel *model, MainWindow *paren m_window = parent; Configuration conf; - setObjectName("bookmarks.toolbar"); + setObjectName("bookmarks/toolbar"); setWindowTitle(tr("Bookmarks Toolbar")); - setMovable(conf.value<bool>("bookmarks.toolbar.movable").value()); - setVisible(conf.value<bool>("bookmarks.toolbar.visible").value()); + setMovable(conf.value<bool>("bookmarks/toolbar.movable").value()); + setVisible(conf.value<bool>("bookmarks/toolbar.visible").value()); setToolButtonStyle(Qt::ToolButtonTextBesideIcon); const auto *root = model->root(); diff --git a/src/browser.cpp b/src/browser.cpp index f748e2f..74da540 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -31,7 +31,7 @@ #include <QTimer> #include <QTranslator> #include <QVersionNumber> -#include <pluginloader.h> +// #include <pluginloader.h> #include <spdlog/spdlog.h> #include <version.h> @@ -40,11 +40,11 @@ Browser::Browser(int &argc, char *argv[], bool allowSecondary) { Configuration conf; - setApplicationName(conf.value<QString>("poi.name").value()); - setWindowIcon(QIcon(conf.value<QString>("poi.icon").value())); + setApplicationName(conf.value<QString>("poi/name").value()); + setWindowIcon(QIcon(conf.value<QString>("poi/icon").value())); setApplicationVersion(QVersionNumber::fromString(QLatin1String(poi_Version)).toString()); - if(const auto _translation = conf.value<QString>("browser.translation")) { + if(const auto _translation = conf.value<QString>("browser/translation")) { auto *translator = new QTranslator(this); if(translator->load(_translation.value())) installTranslator(translator); @@ -52,7 +52,7 @@ Browser::Browser(int &argc, char *argv[], bool allowSecondary) delete translator; } - if(const auto _locale = conf.value<QString>("browser.locale")) { + if(const auto _locale = conf.value<QString>("browser/locale")) { auto *locale = new QTranslator(this); if(locale->load("qt_" + _locale.value(), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) installTranslator(locale); @@ -60,11 +60,11 @@ Browser::Browser(int &argc, char *argv[], bool allowSecondary) delete locale; } - if(auto iconTheme = conf.value<QString>("browser.iconTheme")) { + if(auto iconTheme = conf.value<QString>("browser/iconTheme")) { QIcon::setThemeName(iconTheme.value()); } - if(auto stylesheet = conf.value<QString>("browser.stylesheet")) { + if(auto stylesheet = conf.value<QString>("browser/stylesheet")) { QFile f(stylesheet.value()); if(f.open(QIODevice::ReadOnly)) { setStyleSheet(f.readAll()); @@ -74,11 +74,11 @@ Browser::Browser(int &argc, char *argv[], bool allowSecondary) // load profiles { - const auto profiles = Util::files(conf.value<QString>("profile.path").value(), { "*.profile" }); - const auto search = conf.value<QString>("profile.search").value(); - const auto homepage = QUrl::fromUserInput(conf.value<QString>("profile.homepage").value()); - const auto newtab = QUrl::fromUserInput(conf.value<QString>("profile.newtab").value()); - const auto default_id = conf.value<QString>("profile.default").value(); + const auto profiles = Util::files(conf.value<QString>("profile/path").value(), { "*.profile" }); + const auto search = conf.value<QString>("profile/search").value(); + const auto homepage = QUrl::fromUserInput(conf.value<QString>("profile/homepage").value()); + const auto newtab = QUrl::fromUserInput(conf.value<QString>("profile/newtab").value()); + const auto default_id = conf.value<QString>("profile/default").value(); m_profileManager = std::make_unique<WebProfileManager<false>>(profiles, default_id, search, homepage, newtab); m_profileManager->make_global(); @@ -92,13 +92,13 @@ Browser::Browser(int &argc, char *argv[], bool allowSecondary) } // downloads - m_downloads = std::make_unique<DownloadsWidget>(conf.value<QString>("downloads.path").value()); + m_downloads = std::make_unique<DownloadsWidget>(conf.value<QString>("downloads/path").value()); m_profileManager->walk([this](const QString &, WebProfile *profile, QSettings *) { connect(profile, &QWebEngineProfile::downloadRequested, m_downloads.get(), &DownloadsWidget::addDownload); }); // bookmarks - m_bookmarks = std::make_shared<BookmarksWidget>(QString::fromStdString(conf.value<std::string>("bookmarks.path").value())); + m_bookmarks = std::make_shared<BookmarksWidget>(QString::fromStdString(conf.value<std::string>("bookmarks/path").value())); connect(m_bookmarks.get(), &BookmarksWidget::openUrl, this, [this](const QUrl &url) { m_windows.last()->createTab(url); }); @@ -142,22 +142,31 @@ bool Browser::loadPlugin(const QString &path) } Configuration conf; + bool loaded = false; + +#ifdef HAVE_PLUGINLOADER const auto state = PluginLoader::signature_state( conf.value<bool>("plugins.signature.ignored").value(), conf.value<bool>("plugins.signature.checked").value(), conf.value<bool>("plugins.signature.enforced").value()); auto *loader = new PluginLoader(path, state, this); - const bool loaded = loader->load(); + loaded = loader->load(); +#endif if(!loaded) { +#ifdef HAVE_PLUGINLOADER delete loader; +#endif return false; } +#ifdef HAVE_PLUGINLOADER auto *info = new PluginInfo(loader); m_plugins.append(info); emit pluginAdded(loader); +#endif + return true; } diff --git a/src/main.cpp b/src/main.cpp index dad1f73..8cd1d34 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,36 +7,15 @@ */ #include "browser.h" -#include "builtins.h" #include "configuration.h" -#include "crashhandler.h" #include "session/sessiondialog.h" #include "session_json.hpp" -#include "settings.h" -#include "util.h" -#include "version.h" +#include <QCommandLineParser> #include <QFile> #include <QPluginLoader> #include <QStandardPaths> -#include <iostream> -#include <memory> -#include <pluginloader.h> #include <spdlog/spdlog.h> -// a helper function to join the keys of a command_map into a string -inline std::string join_keys(const command_map &map, const std::string sep = ", ") -{ - std::vector<std::string> keys(map.size()); - std::transform(map.begin(), map.end(), keys.begin(), [](auto pair) { return pair.first; }); - std::sort(keys.begin(), keys.end()); - - std::string k; - std::for_each(keys.begin(), keys.end() - 1, [&k, &sep](const std::string &piece) { k += piece + sep; }); - k += keys.back(); - - return k; -} - int main(int argc, char **argv) { // change log pattern @@ -45,104 +24,71 @@ int main(int argc, char **argv) spdlog::set_level(spdlog::level::debug); // Set global log level to debug #endif - const command_map commands{ - { "configuration", builtins::configuration }, - { "bookmarks", builtins::bookmarks }, - }; - - const std::vector<std::string> args(argv + 1, argv + argc); - args::ArgumentParser parser("smolbote: yet another no-frills browser", "Subcommands: " + join_keys(commands)); - parser.Prog(argv[0]); - - args::HelpFlag cmd_help(parser, "help", "Display this help message.", { 'h', "help" }); - args::Flag cmd_version(parser, "version", "Display version information.", { 'v', "version" }); - args::Flag cmd_build(parser, "build", "Display build commit.", { 'b', "build" }); - - args::ValueFlag<std::string> cmd_config(parser, "config", "Set the configuration file.", { 'c', "config" }); - - args::Flag cmd_noRemote(parser, "no-remote", "Do not accept or send remote commands.", { "no-remote" }); - - args::Flag cmd_pickSession(parser, "pick-session", "Show all available sessions and select which one to open", { "pick-session" }); - args::ValueFlag<std::string> cmd_session(parser, "session", "Open the specified session.", { 's', "session" }); - - args::PositionalList<std::string> cmd_args(parser, "URL(s)", "List of URLs to open"); - cmd_args.KickOut(true); - - try { - auto next = parser.ParseArgs(args); - - if(cmd_version) - return builtins::version(); - if(cmd_build) - return builtins::build(); - - // create and load configuration - spdlog::debug("Loading configuration {}", init_conf(args::get(cmd_config))); - - if(cmd_args) { - const auto front = args::get(cmd_args).front(); - const auto cmd = commands.find(front); - if(cmd != commands.end()) { - return cmd->second(argv[0], next, std::end(args)); + QCommandLineParser parser; + parser.addHelpOption(); + parser.addVersionOption(); + parser.addPositionalArgument("url", "URLs to open"); + + // generic options + QCommandLineOption cmd_config({ "c", "config" }, "Set the configuration file.", "path"); + parser.addOption(cmd_config); + + QCommandLineOption cmd_session({ "s", "session" }, "Open the specified session.", "path"); + parser.addOption(cmd_session); + + QCommandLineOption cmd_pick_session("pick-session", "Show all available sessions and select which one to open."); + parser.addOption(cmd_pick_session); + + // Qt options + QCommandLineOption cmd_renderer("renderer", "Select the OpenGL renderer used by the application. Available options are: desktop, gles, software", "value"); + parser.addOption(cmd_renderer); + + // SingleApplication options + QCommandLineOption cmd_no_remote("no-remote", "Start a new instance that won't accept or send remote commands."); + parser.addOption(cmd_no_remote); + + { // handle command line options that need to be set before the QApplication object is created + QStringList args; + for(int i = 0; i < argc; ++i) + args.append(argv[i]); + parser.parse(args); + + // the OpenGL implementation needs to be manually set to software if it's not properly configured + if(parser.isSet(cmd_renderer)) { + const auto value = parser.value(cmd_renderer); + if(value == QLatin1String("desktop")) { + QApplication::setAttribute(Qt::AA_UseDesktopOpenGL, true); + } else if(value == QLatin1String("gles")) { + QApplication::setAttribute(Qt::AA_UseOpenGLES, true); + } else if(value == QLatin1String("software")) { + QApplication::setAttribute(Qt::AA_UseSoftwareOpenGL, true); + } else { + spdlog::error("Unknown cmd_renderer flag: {}", qUtf8Printable(value)); } } - - } catch(args::Help &) { - std::cout << parser; - return 0; - - } catch(args::Error &e) { - std::cerr << e.what() << std::endl; - std::cerr << parser; - return -1; } - // argc, argv, allowSecondary - Browser app(argc, argv); // set this, otherwise the webview becomes black when using a stylesheet - app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true); - - { - Configuration conf; - - if(conf.value<bool>("usebreakpad").value()) { - CrashHandler::Context ctx( - conf.value<std::string>("path.crashdump").value(), - conf.value<std::string>("path.crashhandler").value()); + QApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true); - if(CrashHandler::install_handler(ctx)) { - spdlog::info("Installed breakpad crash handler: {}", ctx.dumppath); - } else { - spdlog::warn("Failed to install breakpad crash handler: {}", ctx.dumppath); - } - } + spdlog::info("Loaded configuration: {}", Configuration::init_global(parser.value(cmd_config).toStdString())); - // load plugins - for(const QString &path : Util::files(conf.value<QString>("plugins.path").value(), { "*.so", "*.dll" })) { - if(app.loadPlugin(path)) { - spdlog::debug("Loaded plugin [{}]", qUtf8Printable(path)); - } else { - spdlog::warn("Failed loading plugin [{}]", qUtf8Printable(path)); - } - } - } + Browser app(argc, argv); + parser.process(app); const auto profile = []() { - Configuration c; - return c.value<QString>("profile.default").value(); + Configuration conf; + return conf.value<QString>("profile/default").value(); }(); - QStringList urls; - for(const auto &u : args::get(cmd_args)) { - urls.append(QString::fromStdString(u)); - } + QStringList urls = parser.positionalArguments(); if(urls.isEmpty()) { urls.append(QString()); } // if app is primary, create new sessions from received messages - if(app.isPrimary() && !cmd_noRemote) { - QObject::connect(&app, &Browser::receivedMessage, &app, [&app](quint32 instanceId, QByteArray message) { + if(app.isPrimary() && !parser.isSet(cmd_no_remote)) { + QObject::connect(&app, &Browser::receivedMessage, &app, [&app](quint32 instanceId, const QByteArray &message) { Q_UNUSED(instanceId); JsonSession session(message); app.open(session.get()); @@ -151,13 +97,13 @@ int main(int argc, char **argv) { const auto session = [&]() { - if(cmd_session) { - QFile sessionJson(QString::fromStdString(args::get(cmd_session))); + if(parser.isSet(cmd_session)) { + QFile sessionJson(parser.value(cmd_session)); if(sessionJson.open(QIODevice::ReadOnly | QIODevice::Text)) { return JsonSession(sessionJson.readAll()); } } - if(cmd_pickSession) { + if(parser.isSet(cmd_pick_session)) { SessionDialog dlg; if(const auto pick = dlg.pickSession()) { return JsonSession(pick.value()); @@ -166,13 +112,13 @@ int main(int argc, char **argv) return JsonSession(profile, urls); }(); - if(app.isPrimary() || cmd_noRemote) { + if(app.isPrimary() || parser.isSet(cmd_no_remote)) { app.open(session.get()); } else { // app is secondary and not standalone - return app.sendMessage(session.serialize()); + return app.sendMessage(session.serialize()) ? EXIT_SUCCESS : EXIT_FAILURE; } } - return app.exec(); + return QApplication::exec(); } diff --git a/src/mainwindow/addressbar.cpp b/src/mainwindow/addressbar.cpp index d37a6a7..ed1cb3e 100644 --- a/src/mainwindow/addressbar.cpp +++ b/src/mainwindow/addressbar.cpp @@ -19,9 +19,9 @@ AddressBar::AddressBar(QWidget *parent) ui->setupUi(this); Configuration conf; - ui->urlBar->menuAction->setShortcut(QKeySequence(conf.value<QString>("shortcuts.address.menu").value())); + ui->urlBar->menuAction->setShortcut(QKeySequence(conf.value<QString>("shortcuts/address.menu").value())); - auto *focusShortcut = new QShortcut(QKeySequence(conf.value<QString>("shortcuts.address.focus").value()), parent); + auto *focusShortcut = new QShortcut(QKeySequence(conf.value<QString>("shortcuts/address.focus").value()), parent); connect(focusShortcut, &QShortcut::activated, ui->urlBar, [this]() { ui->urlBar->setFocus(); ui->urlBar->selectAll(); diff --git a/src/mainwindow/mainwindow.cpp b/src/mainwindow/mainwindow.cpp index 64c149c..bd5d0c2 100644 --- a/src/mainwindow/mainwindow.cpp +++ b/src/mainwindow/mainwindow.cpp @@ -30,16 +30,16 @@ MainWindow::MainWindow(const Session::MainWindow &mainwindow_data, QMenu *appMen Configuration config; // create UI - defaultWindowTitle = config.value<QString>("mainwindow.title").value(); + defaultWindowTitle = config.value<QString>("mainwindow/title").value(); setWindowTitle(defaultWindowTitle); - resize(config.value<int>("mainwindow.width").value(), config.value<int>("mainwindow.height").value()); - if(config.value<bool>("mainwindow.maximized").value_or(false)) { + resize(config.value<int>("mainwindow/width").value(), config.value<int>("mainwindow/height").value()); + if(config.value<bool>("mainwindow/maximized").value_or(false)) { setWindowState(Qt::WindowMaximized); } show(); navigationToolBar = new NavigationBar(this); - navigationToolBar->setMovable(config.value<bool>("navigation.movable").value_or(false)); + navigationToolBar->setMovable(config.value<bool>("navigation/movable").value_or(false)); addToolBar(Qt::TopToolBarArea, navigationToolBar); navigationToolBar->connectWebView(nullptr); diff --git a/src/mainwindow/menubar.cpp b/src/mainwindow/menubar.cpp index 5fc039a..e479e8d 100644 --- a/src/mainwindow/menubar.cpp +++ b/src/mainwindow/menubar.cpp @@ -79,30 +79,30 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent) auto *actionBookmarks = window->addAction(tr("Bookmarks"), browser, [browser, parent]() { browser->showWidget(browser->bookmarks(), parent); }); - conf.shortcut<QAction>(*actionBookmarks, "shortcuts.window.bookmarks.show"); + conf.shortcut<QAction>(*actionBookmarks, "shortcuts/window.bookmarks.show"); auto *actionDownloads = window->addAction(tr("Downloads"), browser, [browser, parent]() { browser->showWidget(browser->downloads(), parent); }); - conf.shortcut<QAction>(*actionDownloads, "shortcuts.window.downloads.show"); + conf.shortcut<QAction>(*actionDownloads, "shortcuts/window.downloads.show"); window->addSeparator(); auto *actionNewWindow = window->addAction(tr("New Window"), browser, [browser]() { const Session::MainWindow window_data; browser->open({ window_data }, false); }); - conf.shortcut<QAction>(*actionNewWindow, "shortcuts.window.newwindow"); + conf.shortcut<QAction>(*actionNewWindow, "shortcuts/window.newwindow"); auto *actionNewSubwindow = window->addAction(tr("New Subwindow"), parent, [parent]() { const Session::SubWindow session; parent->createSubWindow(session); }); - conf.shortcut<QAction>(*actionNewSubwindow, "shortcuts.window.newgroup"); + conf.shortcut<QAction>(*actionNewSubwindow, "shortcuts/window.newgroup"); auto *actionCloseSubwindow = window->addAction(tr("Close Subwindow"), parent, [parent]() { parent->currentSubWindow()->close(); }); - conf.shortcut<QAction>(*actionCloseSubwindow, "shortcuts.subwindow.close"); + conf.shortcut<QAction>(*actionCloseSubwindow, "shortcuts/subwindow.close"); window->addSeparator()->setText(tr("Toolbars")); @@ -140,7 +140,7 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent) _subwindow->setCurrentTab(index); }); }); - conf.shortcut<QAction>(*actionNewTab, "shortcuts.subwindow.newtab"); + conf.shortcut<QAction>(*actionNewTab, "shortcuts/subwindow.newtab"); subwindow->addSeparator(); @@ -150,7 +150,7 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent) _subwindow->setCurrentTab(index); }); }); - conf.shortcut<QAction>(*actionRestoreTab, "shortcuts.subwindow.restoretab"); + conf.shortcut<QAction>(*actionRestoreTab, "shortcuts/subwindow.restoretab"); auto *restoreTabsMenu = subwindow->addMenu(tr("Restore previous tab")); connect(restoreTabsMenu, &QMenu::aboutToShow, parent, [parent, restoreTabsMenu]() { @@ -200,28 +200,28 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent) _subwindow->setCurrentTab(qMax(0, currentIdx - 1)); }); }); - conf.shortcut<QAction>(*leftTab, "shortcuts.subwindow.tableft"); + conf.shortcut<QAction>(*leftTab, "shortcuts/subwindow.tableft"); auto *moveTabLeft = subwindow->addAction(tr("Move tab left"), parent, [parent]() { run_if(parent->currentSubWindow(), [](SubWindow *_subwindow, int currentIdx) { _subwindow->moveTab(currentIdx, currentIdx - 1); }); }); - conf.shortcut<QAction>(*moveTabLeft, "shortcuts.subwindow.movetableft"); + conf.shortcut<QAction>(*moveTabLeft, "shortcuts/subwindow.movetableft"); auto *rightTab = subwindow->addAction(tr("Switch to tab on the right"), parent, [parent]() { run_if(parent->currentSubWindow(), [](SubWindow *_subwindow, int currentIdx) { _subwindow->setCurrentTab(qMin(currentIdx + 1, _subwindow->tabCount() - 1)); }); }); - conf.shortcut<QAction>(*rightTab, "shortcuts.subwindow.tabright"); + conf.shortcut<QAction>(*rightTab, "shortcuts/subwindow.tabright"); auto *moveTabRight = subwindow->addAction(tr("Move tab right"), parent, [parent]() { run_if(parent->currentSubWindow(), [](SubWindow *_subwindow, int currentIdx) { _subwindow->moveTab(currentIdx, currentIdx + 1); }); }); - conf.shortcut<QAction>(*moveTabRight, "shortcuts.subwindow.movetabright"); + conf.shortcut<QAction>(*moveTabRight, "shortcuts/subwindow.movetabright"); subwindow->addSeparator(); @@ -230,7 +230,7 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent) _subwindow->closeTab(currentIdx); }); }); - conf.shortcut<QAction>(*closeTab, "shortcuts.subwindow.closetab"); + conf.shortcut<QAction>(*closeTab, "shortcuts/subwindow.closetab"); subwindow->addAction(tr("Close tabs to the left"), parent, [parent]() { run_if(parent->currentSubWindow(), [](SubWindow *_subwindow, int currentIdx) { @@ -329,10 +329,7 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent) 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; - }); + parent->currentView()->print(printer); } } }); diff --git a/src/mainwindow/widgets/navigationbar.cpp b/src/mainwindow/widgets/navigationbar.cpp index 799ebec..6da6f6c 100644 --- a/src/mainwindow/widgets/navigationbar.cpp +++ b/src/mainwindow/widgets/navigationbar.cpp @@ -29,7 +29,7 @@ NavigationBar::NavigationBar(QWidget *parent) // Back button backAction = addAction(Util::icon(QStyle::SP_ArrowBack), tr("Back")); - config.shortcut<QAction>(*backAction, "shortcuts.navigation.back"); + config.shortcut<QAction>(*backAction, "shortcuts/navigation.back"); connect(backAction, &QAction::triggered, this, [this]() { m_view->history()->back(); }); @@ -47,7 +47,7 @@ NavigationBar::NavigationBar(QWidget *parent) }); backAction->setMenu(backMenu); - auto *backMenuShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts.navigation.backmenu").value()), this); + auto *backMenuShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts/navigation.backmenu").value()), this); connect(backMenuShortcut, &QShortcut::activated, backMenu, [this, backMenu]() { if(backAction->isEnabled()) { auto *widget = this->widgetForAction(backAction); @@ -57,7 +57,7 @@ NavigationBar::NavigationBar(QWidget *parent) // Forward button forwardAction = addAction(Util::icon(QStyle::SP_ArrowForward), tr("Forward")); - config.shortcut<QAction>(*forwardAction, "shortcuts.navigation.forward"); + config.shortcut<QAction>(*forwardAction, "shortcuts/navigation.forward"); connect(forwardAction, &QAction::triggered, this, [this]() { m_view->history()->forward(); }); @@ -75,7 +75,7 @@ NavigationBar::NavigationBar(QWidget *parent) }); forwardAction->setMenu(forwardMenu); - auto *forwardMenuShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts.navigation.forwardmenu").value()), this); + auto *forwardMenuShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts/navigation.forwardmenu").value()), this); connect(forwardMenuShortcut, &QShortcut::activated, forwardMenu, [this, forwardMenu]() { if(forwardAction->isEnabled()) { auto *widget = this->widgetForAction(forwardAction); @@ -85,7 +85,7 @@ NavigationBar::NavigationBar(QWidget *parent) // Stop/Refresh button stopReloadAction = addAction(Util::icon(QStyle::SP_BrowserReload), tr("Refresh")); - config.shortcut<QAction>(*stopReloadAction, "shortcuts.navigation.refresh"); + config.shortcut<QAction>(*stopReloadAction, "shortcuts/navigation.refresh"); connect(stopReloadAction, &QAction::triggered, this, [this]() { if(m_view->isLoaded()) m_view->reload(); @@ -93,14 +93,14 @@ NavigationBar::NavigationBar(QWidget *parent) m_view->stop(); }); - auto *reloadShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts.navigation.reload").value()), this); + auto *reloadShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts/navigation.reload").value()), this); connect(reloadShortcut, &QShortcut::activated, this, [this]() { m_view->triggerPageAction(QWebEnginePage::ReloadAndBypassCache); }); // Home button homeAction = addAction(Util::icon(QStyle::SP_DirHomeIcon), tr("Home")); - config.shortcut<QAction>(*homeAction, "shortcuts.navigation.home"); + config.shortcut<QAction>(*homeAction, "shortcuts/navigation.home"); connect(homeAction, &QAction::triggered, this, [this]() { m_view->load(m_view->profile()->homepage()); }); diff --git a/src/mainwindow/widgets/searchform.cpp b/src/mainwindow/widgets/searchform.cpp index e10933b..af54f5c 100644 --- a/src/mainwindow/widgets/searchform.cpp +++ b/src/mainwindow/widgets/searchform.cpp @@ -10,6 +10,7 @@ #include "ui_searchform.h" #include <QHideEvent> #include <QShowEvent> +#include <QWebEngineFindTextResult> #include <QWebEngineView> SearchForm::SearchForm(QWidget *parent) @@ -26,7 +27,8 @@ SearchForm::SearchForm(QWidget *parent) QWebEnginePage::FindFlags searchFlags; searchFlags.setFlag(QWebEnginePage::FindCaseSensitively, ui->caseSensitivity_checkBox->isChecked()); searchFlags.setFlag(QWebEnginePage::FindBackward, ui->reverseSearch_checkBox->isChecked()); - m_view->findText(ui->lineEdit->text(), searchFlags, [this](bool found) { + m_view->findText(ui->lineEdit->text(), searchFlags, [this](const QWebEngineFindTextResult &result) { + const bool found = result.numberOfMatches() > 0; ui->result_label->setVisible(!found); }); } diff --git a/src/meson.build b/src/meson.build deleted file mode 100644 index 6a4abd8..0000000 --- a/src/meson.build +++ /dev/null @@ -1,60 +0,0 @@ -python = import('python') -python3 = python.find_installation('python3') - -poi_settings_h = custom_target('default_config_value', - input: files('../scripts/gen-default-cfg.py', '../Kconfig', '..'/host_machine.system()/'.config', 'settings.h.in'), - output: 'settings.h', - command: [ python3, '@INPUT0@', '--kconfig=@INPUT1@', '--dotconfig=@INPUT2@', '--input=@INPUT3@', '--output=@OUTPUT@' ] -) - -subdir('about') -subdir('webengine') - -poi_sourceset.add(mod_qt5.preprocess( - moc_headers: ['browser.h', 'applicationmenu.h', - 'mainwindow/mainwindow.h', 'mainwindow/addressbar.h', 'mainwindow/menubar.h', 'mainwindow/widgets/completer.h', 'mainwindow/widgets/urllineedit.h', 'mainwindow/widgets/dockwidget.h', 'mainwindow/widgets/navigationbar.h', 'mainwindow/widgets/searchform.h', - 'bookmarks/bookmarkswidget.h', 'bookmarks/editbookmarkdialog.h', - 'session/savesessiondialog.h', 'session/sessiondialog.h', - 'subwindow/subwindow.h', 'subwindow/tabwidget.h' ], - ui_files: [ - 'mainwindow/addressbar.ui', 'mainwindow/widgets/searchform.ui', - 'bookmarks/bookmarksform.ui', 'bookmarks/editbookmarkdialog.ui', - 'session/savesessiondialog.ui', 'session/sessiondialog.ui' ], - qresources: '../data/resources.qrc', - rcc_extra_arguments: ['--format-version=1'], - dependencies: dep_qt5 -)) - -poi_sourceset.add(files( - 'main.cpp', 'builtins.cpp', - 'browser.cpp', 'applicationmenu.cpp', - 'util.cpp', 'util.h', - - 'mainwindow/mainwindow.cpp', - 'mainwindow/addressbar.cpp', - 'mainwindow/menubar.cpp', - 'mainwindow/widgets/completer.cpp', - 'mainwindow/widgets/urllineedit.cpp', - 'mainwindow/widgets/dockwidget.cpp', - 'mainwindow/widgets/menusearch.cpp', - 'mainwindow/widgets/navigationbar.cpp', - 'mainwindow/widgets/searchform.cpp', - - 'bookmarks/builtins.cpp', 'bookmarks/bookmarkswidget.cpp', 'bookmarks/editbookmarkdialog.cpp', 'bookmarks/bookmarkstoolbar.cpp', - - 'session/savesessiondialog.cpp', - 'session/sessiondialog.cpp', - - 'subwindow/subwindow.cpp', - 'subwindow/tabwidget.cpp', - - 'wallet/wallet.cpp', 'wallet/wallet.h' -), - version_h, poi_settings_h -) - -poi_sourceset.add(when: [dep_breakpad, dep_threads], - if_true: files('crashhandler.cpp'), - if_false: files('crashhandler_dummy.cpp') -) - diff --git a/src/session/sessiondialog.h b/src/session/sessiondialog.h index 0a04940..fc31aa4 100644 --- a/src/session/sessiondialog.h +++ b/src/session/sessiondialog.h @@ -11,6 +11,7 @@ #include "session.hpp" #include <QDialog> +#include <optional> namespace Ui { diff --git a/src/settings.h.in b/src/settings.h.in deleted file mode 100644 index 88fbcf5..0000000 --- a/src/settings.h.in +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include <QStandardPaths> -#include <configuration.h> -#include <fstream> - -inline const std::string init_conf(const std::string &path) -{ - auto value_map = std::make_unique<Configuration, std::initializer_list<std::pair<std::string, conf_value_t>>>({ - @__DEFAULT_CFG__ - }); - - const std::string cfgpath = [&]() { - if(path.empty()) - return value_map->value<std::string>("poi.cfg.path").value(); - - auto p = path; - if(p.front() == '~') - p.replace(0, 1, QStandardPaths::writableLocation(QStandardPaths::HomeLocation).toStdString()); - return p; - }(); - - std::fstream fs; - fs.open(cfgpath, std::fstream::in); - if(fs.is_open()) { - value_map->read(fs); - fs.close(); - } - - Configuration::move_global(std::move(value_map)); - return cfgpath; -} diff --git a/src/subwindow/subwindow.cpp b/src/subwindow/subwindow.cpp index 6e9a713..a2d6138 100644 --- a/src/subwindow/subwindow.cpp +++ b/src/subwindow/subwindow.cpp @@ -57,7 +57,6 @@ SubWindow::SubWindow(QWidget *parent, Qt::WindowFlags flags) close(); } else { auto *view = dynamic_cast<WebView *>(tabWidget->widget(index)); - Q_CHECK_PTR(view); disconnect(titleConnection); disconnect(linkHoveredConnection); @@ -67,12 +66,10 @@ SubWindow::SubWindow(QWidget *parent, Qt::WindowFlags flags) this->setWindowTitle(QString("%1 :%2").arg(title, v->profile()->name())); }); setWindowTitle(QString("%1 :%2").arg(view->title(), view->profile()->name())); - linkHoveredConnection = connect(view->page(), &WebPage::linkHovered, this, [this](const QString &url) { if(!url.isEmpty()) emit showStatusMessage(url, 3000); }); - emit currentViewChanged(view); } }); diff --git a/src/subwindow/tabwidget.cpp b/src/subwindow/tabwidget.cpp index 6f1e348..69f3b8a 100644 --- a/src/subwindow/tabwidget.cpp +++ b/src/subwindow/tabwidget.cpp @@ -42,8 +42,11 @@ TabWidget::TabWidget(SubWindow *parent) // when changing tabs, give focus to the widget // otherwise when closing tabs, the tabwidget will retain focus connect(this, &TabWidget::currentChanged, this, [this](int index) { - if(widget(index)) + previous = current; + current = index; + /*if(widget(index)) { widget(index)->setFocus(); + }*/ }); // context menu @@ -68,12 +71,6 @@ TabWidget::TabWidget(SubWindow *parent) removeTab(i); } }); - - // - connect(this, &TabWidget::currentChanged, this, [this](int index) { - previous = current; - current = index; - }); } TabWidget::~TabWidget() @@ -85,7 +82,9 @@ TabWidget::~TabWidget() int TabWidget::addTab(WebView *view) { - Q_ASSERT_X(view != nullptr, "TabWidget::addTab", "Tried to add null view"); + if(view == nullptr) { + return -1; + } const int idx = QTabWidget::addTab(view, view->title()); connect(view, &WebView::titleChanged, [this, view](const QString &title) { @@ -100,7 +99,6 @@ int TabWidget::addTab(WebView *view) setTabIcon(current_idx, icon); } }); - tabBar()->setTabData(idx, QVariant::fromValue<SubWindow::TabData>(SubWindow::TabData{})); return idx; } diff --git a/src/util.cpp b/src/util.cpp index fe74175..3061c96 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -62,7 +62,7 @@ QIcon Util::icon(QStyle::StandardPixmap id) { return QIcon::fromTheme("go-home", qApp->style()->standardIcon(id)); default: - spdlog::warn("FIXME: unhandled StandardPixmap {}", id); + spdlog::warn("FIXME: unhandled StandardPixmap"); return qApp->style()->standardIcon(id); } } diff --git a/src/version.h.in b/src/version.h.in new file mode 100644 index 0000000..b387811 --- /dev/null +++ b/src/version.h.in @@ -0,0 +1,8 @@ +#ifndef SMOLBOTE_VERSION_H +#define SMOLBOTE_VERSION_H + +// output of 'git describe --long --abbrev=40': +// x.y.z-0-g0123456789012345678901234567890123456789 +#define poi_Version "@CMAKE_PROJECT_VERSION@" + +#endif // SMOLBOTE_VERSION_H diff --git a/src/webengine/CMakeLists.txt b/src/webengine/CMakeLists.txt new file mode 100644 index 0000000..704a6d0 --- /dev/null +++ b/src/webengine/CMakeLists.txt @@ -0,0 +1,10 @@ +add_library(webengine STATIC + urlinterceptor.cpp urlinterceptor.h + webpage.cpp webpage.h + webprofile.cpp webprofile.h + webprofilemanager.cpp webprofilemanager.h + webviewcontextmenu.cpp webviewcontextmenu.h + webview.cpp webview.h +) +target_link_libraries(webengine PUBLIC Qt6::WebEngineCore Qt6::WebEngineWidgets) +target_include_directories(webengine PUBLIC ${CMAKE_CURRENT_LIST_DIR} ${PROJECT_SOURCE_DIR}/include) diff --git a/src/webengine/webpage.cpp b/src/webengine/webpage.cpp index b2b19b5..f8a8f7f 100644 --- a/src/webengine/webpage.cpp +++ b/src/webengine/webpage.cpp @@ -62,6 +62,7 @@ WebPage::WebPage(QWebEngineProfile *profile, QObject *parent) connect(this, &QWebEnginePage::featurePermissionRequested, this, &WebPage::featurePermissionDialog); connect(this, &QWebEnginePage::renderProcessTerminated, this, &WebPage::renderProcessCrashed); + connect(this, &QWebEnginePage::certificateError, this, &WebPage::certificateError); } bool WebPage::certificateError(const QWebEngineCertificateError &certificateError) @@ -77,9 +78,8 @@ bool WebPage::certificateError(const QWebEngineCertificateError &certificateErro messageBox.setText(tr("An SSL error has occurred on <strong>%1</strong>").arg(certificateError.url().toString())); messageBox.setInformativeText(tr("<p>%1</p>" "<p>This error %2 be overridden.</p>") - .arg(certificateError.errorDescription(), + .arg(certificateError.description(), certificateError.isOverridable() ? tr("can") : tr("cannot"))); - messageBox.setDetailedText(tr("Error code: %1").arg(certificateError.error())); if(certificateError.isOverridable()) { messageBox.setStandardButtons(QMessageBox::Ignore | QMessageBox::Abort); diff --git a/src/webengine/webpage.h b/src/webengine/webpage.h index 91ae4f3..bd7d54c 100644 --- a/src/webengine/webpage.h +++ b/src/webengine/webpage.h @@ -19,12 +19,10 @@ public: WebPage(QWebEngineProfile *profile, QObject *parent = nullptr); ~WebPage() override = default; -protected: - bool certificateError(const QWebEngineCertificateError &certificateError) override; - protected slots: void featurePermissionDialog(const QUrl &securityOrigin, QWebEnginePage::Feature feature); void renderProcessCrashed(QWebEnginePage::RenderProcessTerminationStatus terminationStatus, int exitCode); + bool certificateError(const QWebEngineCertificateError &certificateError); }; #endif // SMOLBOTE_WEBPAGE_H diff --git a/src/webengine/webprofile.cpp b/src/webengine/webprofile.cpp index 719ab34..f1e71fb 100644 --- a/src/webengine/webprofile.cpp +++ b/src/webengine/webprofile.cpp @@ -18,12 +18,10 @@ static WebProfile *s_profile = nullptr; void WebProfile::setDefaultProfile(WebProfile *profile) { - Q_CHECK_PTR(profile); s_profile = profile; } WebProfile *WebProfile::defaultProfile() { - Q_CHECK_PTR(s_profile); return s_profile; } diff --git a/src/webengine/webprofilemanager.cpp b/src/webengine/webprofilemanager.cpp index 5cc83f8..9ae2960 100644 --- a/src/webengine/webprofilemanager.cpp +++ b/src/webengine/webprofilemanager.cpp @@ -8,6 +8,7 @@ #include "webprofilemanager.h" #include "webprofile.h" +#include <QActionGroup> static WebProfileManager<false> *s_instance = nullptr; diff --git a/src/webengine/webprofilemanager.h b/src/webengine/webprofilemanager.h index 91dcaf8..a356506 100644 --- a/src/webengine/webprofilemanager.h +++ b/src/webengine/webprofilemanager.h @@ -41,10 +41,11 @@ public: } if(!profiles.contains(default_id)) { - Profile profile; - profile.settings = WebProfile::load(QString(), search, homepage, newtab); - profile.ptr = WebProfile::load(default_id, profile.settings, true); - profiles[default_id] = profile; + auto *settings = WebProfile::load(QString(), search, homepage, newtab); + profiles[default_id] = Profile{ + .settings = settings, + .ptr = WebProfile::load(default_id, settings, true), + }; } WebProfile::setDefaultProfile(profiles[default_id].ptr); } @@ -73,7 +74,7 @@ public: } if(profile != nullptr && settings != nullptr) { - profiles[id] = Profile{ profile, settings, false }; + profiles[id] = Profile{ settings, profile, false }; } } @@ -101,8 +102,8 @@ private: set_typestate(consumed) void consume() {} struct Profile { - WebProfile *ptr = nullptr; QSettings *settings = nullptr; + WebProfile *ptr = nullptr; bool selfDestruct = false; }; diff --git a/src/webengine/webview.cpp b/src/webengine/webview.cpp index 38e564a..bc52102 100644 --- a/src/webengine/webview.cpp +++ b/src/webengine/webview.cpp @@ -37,9 +37,7 @@ WebView::WebView(WebProfile *profile, cb_createWindow_t cb, QWidget *parent) : WebView(parent) { cb_createWindow = cb; - Q_CHECK_PTR(profile); - m_profile = profile; - setPage(new WebPage(profile, this)); + setProfile(profile); } WebView::WebView(const Session::WebView &webview_data, cb_createWindow_t cb, QWidget *parent) @@ -47,11 +45,7 @@ WebView::WebView(const Session::WebView &webview_data, cb_createWindow_t cb, QWi { cb_createWindow = cb; WebProfileManager profileManager; - - auto *profile = profileManager.profile(webview_data.profile); - if(profile != nullptr) { - setProfile(profile); - } + setProfile(profileManager.profile(webview_data.profile)); if(!webview_data.url.isEmpty()) load(QUrl::fromUserInput(webview_data.url)); @@ -64,9 +58,9 @@ WebView::WebView(const Session::WebView &webview_data, cb_createWindow_t cb, QWi void WebView::setProfile(WebProfile *profile) { - m_profile = profile; + m_profile = (profile == nullptr) ? WebProfile::defaultProfile() : profile; const auto url = this->url(); - setPage(new WebPage(profile, this)); + setPage(new WebPage(m_profile, this)); this->load(url); } diff --git a/src/webengine/webviewcontextmenu.cpp b/src/webengine/webviewcontextmenu.cpp index ea5e8c6..0de3b9f 100644 --- a/src/webengine/webviewcontextmenu.cpp +++ b/src/webengine/webviewcontextmenu.cpp @@ -17,7 +17,7 @@ #include <QStyle> #include <QToolButton> #include <QVBoxLayout> -#include <QWebEngineContextMenuData> +#include <QWebEngineContextMenuRequest> #include <QWebEngineHistory> #include <QWidgetAction> @@ -94,100 +94,7 @@ WebViewContextMenu::WebViewContextMenu(WebView *view) this->addAction(navButtons); this->addSeparator(); - const auto ctxdata = view->page()->contextMenuData(); - - if(ctxdata.mediaType() == QWebEngineContextMenuData::MediaTypeNone) { - auto *backMenu = this->addMenu(tr("Back")); - if(!view->history()->canGoBack()) { - backMenu->setEnabled(false); - } else { - connect(backMenu, &QMenu::aboutToShow, view, [view, backMenu]() { - backMenu->clear(); - const auto backItems = view->history()->backItems(10); - for(const QWebEngineHistoryItem &item : backItems) { - backMenu->addAction(historyAction(view, item)); - } - }); - } - - auto *forwardMenu = this->addMenu(tr("Forward")); - if(!view->history()->canGoForward()) { - forwardMenu->setEnabled(false); - } else { - connect(forwardMenu, &QMenu::aboutToShow, view, [view, forwardMenu]() { - forwardMenu->clear(); - const auto forwardItems = view->history()->forwardItems(10); - for(const QWebEngineHistoryItem &item : forwardItems) { - forwardMenu->addAction(historyAction(view, item)); - } - }); - } - - connect(this->addAction(tr("Reload")), &QAction::triggered, view, [view]() { - view->page()->triggerAction(QWebEnginePage::Reload); - }); - connect(this->addAction(tr("Reload and bypass Cache")), &QAction::triggered, view, [view]() { - view->page()->triggerAction(QWebEnginePage::ReloadAndBypassCache); - }); - - this->addSeparator(); - - connect(this->addAction(tr("Select All")), &QAction::triggered, view, [view]() { - view->page()->triggerAction(QWebEnginePage::SelectAll); - }); - connect(this->addAction(tr("Clear Selection")), &QAction::triggered, view, [view]() { - view->page()->triggerAction(QWebEnginePage::Unselect); - }); - connect(this->addAction(tr("Copy to clipboard")), &QAction::triggered, view, [view]() { - view->page()->triggerAction(QWebEnginePage::Copy); - }); - - } else if(ctxdata.mediaType() == QWebEngineContextMenuData::MediaTypeImage) { - connect(this->addAction(tr("Copy image to clipboard")), &QAction::triggered, view, [view]() { - view->page()->triggerAction(QWebEnginePage::CopyImageToClipboard); - }); - connect(this->addAction(tr("Copy image URL to clipboard")), &QAction::triggered, view, [view]() { - view->page()->triggerAction(QWebEnginePage::CopyImageUrlToClipboard); - }); - if(!ctxdata.mediaUrl().isEmpty()) { - if(view->url() != ctxdata.mediaUrl()) { - connect(this->addAction(tr("Open image")), &QAction::triggered, view, [view, ctxdata]() { - view->load(ctxdata.mediaUrl()); - }); - connect(this->addAction(tr("Open image in new tab")), &QAction::triggered, view, [view, ctxdata]() { - view->createWindow(QWebEnginePage::WebBrowserTab)->load(ctxdata.mediaUrl()); - }); - } - connect(this->addAction(tr("Save image")), &QAction::triggered, view, [view, ctxdata]() { - view->page()->download(ctxdata.mediaUrl()); - }); - } - - } else { - addMenu(view->page()->createStandardContextMenu()); - } - - if(!ctxdata.linkUrl().isEmpty()) { - this->addSeparator(); - connect(this->addAction(tr("Open link in new tab")), &QAction::triggered, view, [view, ctxdata]() { - view->createWindow(QWebEnginePage::WebBrowserTab)->load(ctxdata.linkUrl()); - }); - - auto *newTabMenu = this->addMenu(tr("Open link in new tab with profile")); - profileMenu(newTabMenu, [view, ctxdata](WebProfile *profile) { - auto *v = view->createWindow(QWebEnginePage::WebBrowserTab); - v->setProfile(profile); - v->load(ctxdata.linkUrl()); - }); - - connect(this->addAction(tr("Open link in new window")), &QAction::triggered, view, [view, ctxdata]() { - view->createWindow(QWebEnginePage::WebBrowserWindow)->load(ctxdata.linkUrl()); - }); - - connect(this->addAction(tr("Copy link address")), &QAction::triggered, view, [view]() { - view->page()->triggerAction(QWebEnginePage::CopyLinkToClipboard); - }); - } + addMenu(view->createStandardContextMenu()); // zoom widget { |