From fddfe065fe1ed91a4883ee93d742f3340a716160 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Wed, 11 Jul 2018 14:15:39 +0200 Subject: Add custom WebView context menu --- src/webengine/webview.cpp | 141 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 115 insertions(+), 26 deletions(-) (limited to 'src/webengine/webview.cpp') diff --git a/src/webengine/webview.cpp b/src/webengine/webview.cpp index 9380b13..a234f3a 100644 --- a/src/webengine/webview.cpp +++ b/src/webengine/webview.cpp @@ -11,12 +11,30 @@ #include "webpage.h" #include "webprofile.h" #include "widgets/pagetoolsmenu.h" +#include #include +#include #include +#include #include -#include +#include +#include #include -#include +#include "profilemanager.h" + +inline QAction *historyAction(QWebEngineView *view, const QWebEngineHistoryItem &item) +{ + QAction *action = new QAction(view); + if(item.title().isEmpty()) + action->setText(item.url().toString()); + else + action->setText(QObject::tr("%1 (%2)").arg(item.title(), item.url().toString())); + + QObject::connect(action, &QAction::triggered, view, [view, item]() { + view->history()->goToItem(item); + }); + return action; +} WebView::WebView(WebProfile *profile, QWidget *parent) : QWebEngineView(parent) @@ -99,32 +117,103 @@ WebView *WebView::createWindow(QWebEnginePage::WebWindowType type) void WebView::contextMenuEvent(QContextMenuEvent *event) { - QMenu *menu = page()->createStandardContextMenu(); - - // zoom widget - menu->addSeparator(); - { - auto *zoomSlider = new QSlider(Qt::Horizontal); - zoomSlider->setMinimum(5); - zoomSlider->setMaximum(50); - zoomSlider->setValue(10); - - auto *zoomAction = menu->addAction(tr("Zoom: %1x").arg(zoomFactor())); - connect(zoomAction, &QAction::triggered, this, [zoomSlider]() { - zoomSlider->setValue(10); - }); - - connect(zoomSlider, &QSlider::valueChanged, this, [this, zoomAction](int value) { - zoomAction->setText(tr("Zoom: %1x").arg(static_cast(value) / 10)); - setZoomFactor(static_cast(value) / 10); - }); - - auto *zoomWidgetAction = new QWidgetAction(this); - zoomWidgetAction->setDefaultWidget(zoomSlider); - - menu->addAction(zoomWidgetAction); + QMenu *menu = nullptr; + const auto ctxdata = page()->contextMenuData(); + + if(ctxdata.mediaType() == QWebEngineContextMenuData::MediaTypeNone) { + menu = new QMenu(this); + + // navigation + { + auto *backMenu = new QMenu(tr("Back"), this); + if(!history()->canGoBack()) { + backMenu->setEnabled(false); + } else { + connect(backMenu, &QMenu::aboutToShow, this, [this, backMenu]() { + backMenu->clear(); + const auto backItems = history()->backItems(10); + for(const QWebEngineHistoryItem &item : backItems) { + backMenu->addAction(historyAction(this, item)); + } + }); + } + menu->addMenu(backMenu); + + auto *forwardMenu = new QMenu(tr("Forward"), this); + if(!history()->canGoForward()) { + forwardMenu->setEnabled(false); + } else { + connect(forwardMenu, &QMenu::aboutToShow, this, [this, forwardMenu]() { + forwardMenu->clear(); + const auto forwardItems = history()->forwardItems(10); + for(const QWebEngineHistoryItem &item : forwardItems) { + forwardMenu->addAction(historyAction(this, item)); + } + }); + } + menu->addMenu(forwardMenu); + + connect(menu->addAction(tr("Reload")), &QAction::triggered, this, [this]() { + page()->triggerAction(QWebEnginePage::Reload); + }); + + connect(menu->addAction(tr("Reload and bypass Cache")), &QAction::triggered, this, [this]() { + page()->triggerAction(QWebEnginePage::ReloadAndBypassCache); + }); + } + + if(!ctxdata.linkUrl().isEmpty()) { + menu->addSeparator(); + connect(menu->addAction(tr("Open link in new tab")), &QAction::triggered, this, [this, ctxdata]() { + createWindow(QWebEnginePage::WebBrowserTab)->load(ctxdata.linkUrl()); + }); + + auto *newTabMenu = new QMenu(tr("Open link in new tab with profile"), this); + ProfileIterator it(ProfileManager::profileList()); + while(it.hasNext()) { + it.next(); + connect(newTabMenu->addAction(it.key()), &QAction::triggered, this, [this, ctxdata, it]() { + auto *view = createWindow(QWebEnginePage::WebBrowserTab); + view->setProfile(it.value()); + view->load(ctxdata.linkUrl()); + }); + } + menu->addMenu(newTabMenu); + + connect(menu->addAction(tr("Open link in new window")), &QAction::triggered, this, [this, ctxdata]() { + createWindow(QWebEnginePage::WebBrowserWindow)->load(ctxdata.linkUrl()); + }); + } + + // zoom widget + { + menu->addSeparator(); + + auto *zoomSlider = new QSlider(Qt::Horizontal); + zoomSlider->setMinimum(5); + zoomSlider->setMaximum(50); + zoomSlider->setValue(zoomFactor() * 10); + + auto *zoomAction = menu->addAction(tr("Zoom: %1x").arg(zoomFactor())); + connect(zoomAction, &QAction::triggered, this, [zoomSlider]() { + zoomSlider->setValue(10); + }); + + connect(zoomSlider, &QSlider::valueChanged, this, [this, zoomAction](int value) { + zoomAction->setText(tr("Zoom: %1x").arg(static_cast(value) / 10)); + setZoomFactor(static_cast(value) / 10); + }); + + auto *zoomWidgetAction = new QWidgetAction(this); + zoomWidgetAction->setDefaultWidget(zoomSlider); + + menu->addAction(zoomWidgetAction); + } + } else { + menu = page()->createStandardContextMenu(); } + menu->setMinimumWidth(250); menu->popup(event->globalPos()); } -- cgit v1.2.1