summaryrefslogtreecommitdiffstats
path: root/lib/widgets
diff options
context:
space:
mode:
authorPierre Rossi <pierre.rossi@digia.com>2013-08-28 14:19:14 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-10-11 14:20:07 +0200
commit3062467e7ae4ca68377216083e015846b307e5a0 (patch)
tree13250a49a7c925524a0d50aa807cc229fa95b1d4 /lib/widgets
parent18e6f0ac27cf53bc21cf8c54887932de116648ff (diff)
Add preliminary context menu support
This is essentially the widgets part, with some tricks to get it to honor the widget's context menu policy. It enables c++11 for the widgets library for the convenience of using lambdas, which admitedly we could do without, but seems reasonable considering our timeline and the fact that we build chromium that way. Change-Id: I6a632a78d2aa48fb0dfecfe491e92651d12407db Reviewed-by: Zeno Albisser <zeno.albisser@digia.com>
Diffstat (limited to 'lib/widgets')
-rw-r--r--lib/widgets/Api/qwebenginepage.cpp76
-rw-r--r--lib/widgets/Api/qwebenginepage_p.h2
-rw-r--r--lib/widgets/Api/qwebengineview.cpp21
-rw-r--r--lib/widgets/Api/qwebengineview.h4
-rw-r--r--lib/widgets/Api/qwebengineview_p.h1
-rw-r--r--lib/widgets/widgets.pro2
6 files changed, 106 insertions, 0 deletions
diff --git a/lib/widgets/Api/qwebenginepage.cpp b/lib/widgets/Api/qwebenginepage.cpp
index 8fafb3c47..b956a8785 100644
--- a/lib/widgets/Api/qwebenginepage.cpp
+++ b/lib/widgets/Api/qwebenginepage.cpp
@@ -31,7 +31,11 @@
#include "web_contents_adapter.h"
#include <QAction>
+#include <QApplication>
+#include <QClipboard>
+#include <QIcon>
#include <QLayout>
+#include <QMenu>
#include <QUrl>
QT_BEGIN_NAMESPACE
@@ -269,6 +273,78 @@ void QWebEnginePage::triggerAction(WebAction action, bool)
}
}
+bool QWebEnginePagePrivate::contextMenuRequested(const WebEngineContextMenuData &data)
+{
+ if (!view)
+ return false;
+
+ QContextMenuEvent event(QContextMenuEvent::Mouse, data.pos, view->mapToGlobal(data.pos));
+ switch (view->contextMenuPolicy()) {
+ case Qt::PreventContextMenu:
+ return false;
+ case Qt::DefaultContextMenu:
+ m_menuData = data;
+ view->contextMenuEvent(&event);
+ break;
+ case Qt::CustomContextMenu:
+ Q_EMIT view->customContextMenuRequested(data.pos);
+ break;
+ case Qt::ActionsContextMenu:
+ if (view->actions().count()) {
+ QMenu::exec(view->actions(), event.globalPos(), 0, view);
+ break;
+ }
+ // fall through
+ default:
+ event.ignore();
+ return false;
+ break;
+ }
+ Q_ASSERT(view->d_func()->m_pendingContextMenuEvent);
+ view->d_func()->m_pendingContextMenuEvent = false;
+ m_menuData = WebEngineContextMenuData();
+ return true;
+}
+
+QMenu *QWebEnginePage::createStandardContextMenu()
+{
+ Q_D(QWebEnginePage);
+ QMenu *menu = new QMenu(d->view);
+ QAction *action = 0;
+ WebEngineContextMenuData contextMenuData(d->m_menuData);
+ if (contextMenuData.selectedText.isEmpty()) {
+ action = new QAction(QIcon::fromTheme(QStringLiteral("go-previous")), tr("&Back"), menu);
+ connect(action, &QAction::triggered, d->view, &QWebEngineView::back);
+ action->setEnabled(d->adapter->canGoBack());
+ menu->addAction(action);
+
+ action = new QAction(QIcon::fromTheme(QStringLiteral("go-next")), tr("&Forward"), menu);
+ connect(action, &QAction::triggered, d->view, &QWebEngineView::forward);
+ action->setEnabled(d->adapter->canGoForward());
+ menu->addAction(action);
+
+ action = new QAction(QIcon::fromTheme(QStringLiteral("view-refresh")), tr("&Reload"), menu);
+ connect(action, &QAction::triggered, d->view, &QWebEngineView::reload);
+ menu->addAction(action);
+ } else {
+ action = new QAction(tr("Copy..."), menu);
+ // FIXME: We probably can't keep "cheating" with lambdas, but for now it keeps this patch smaller ;)
+ connect(action, &QAction::triggered, [=]() { qApp->clipboard()->setText(contextMenuData.selectedText); });
+ menu->addAction(action);
+ }
+
+ if (!contextMenuData.linkText.isEmpty() && contextMenuData.linkUrl.isValid()) {
+ menu->addSeparator();
+ action = new QAction(tr("Navigate to..."), menu);
+ connect(action, &QAction::triggered, [=]() { load(contextMenuData.linkUrl); });
+ menu->addAction(action);
+ action = new QAction(tr("Copy link address"), menu);
+ connect(action, &QAction::triggered, [=]() { qApp->clipboard()->setText(contextMenuData.linkUrl.toString()); });
+ menu->addAction(action);
+ }
+ return menu;
+}
+
void QWebEnginePage::load(const QUrl& url)
{
Q_D(QWebEnginePage);
diff --git a/lib/widgets/Api/qwebenginepage_p.h b/lib/widgets/Api/qwebenginepage_p.h
index e8f511d2d..56080c977 100644
--- a/lib/widgets/Api/qwebenginepage_p.h
+++ b/lib/widgets/Api/qwebenginepage_p.h
@@ -74,6 +74,7 @@ public:
virtual void loadFinished(bool success) Q_DECL_OVERRIDE;
virtual void focusContainer() Q_DECL_OVERRIDE;
virtual void adoptNewWindow(WebContentsAdapter *newWebContents, WindowOpenDisposition disposition) Q_DECL_OVERRIDE;
+ virtual bool contextMenuRequested(const WebEngineContextMenuData &data) Q_DECL_OVERRIDE;
void updateAction(QWebEnginePage::WebAction) const;
void updateNavigationActions();
@@ -84,6 +85,7 @@ public:
QWebEngineView *view;
mutable QAction *actions[QWebEnginePage::WebActionCount];
bool m_isLoading;
+ WebEngineContextMenuData m_menuData;
};
QT_END_NAMESPACE
diff --git a/lib/widgets/Api/qwebengineview.cpp b/lib/widgets/Api/qwebengineview.cpp
index d07e710ab..536f075f3 100644
--- a/lib/widgets/Api/qwebengineview.cpp
+++ b/lib/widgets/Api/qwebengineview.cpp
@@ -44,6 +44,9 @@
#include "qwebenginepage_p.h"
+#include <QAction>
+#include <QMenu>
+#include <QContextMenuEvent>
#include <QStackedLayout>
QT_BEGIN_NAMESPACE
@@ -186,6 +189,24 @@ void QWebEngineView::setZoomFactor(qreal factor)
page()->setZoomFactor(factor);
}
+bool QWebEngineView::event(QEvent *ev)
+{
+ Q_D(QWebEngineView);
+ // We swallow spontaneous contextMenu events and synthethize those back later on when we get the
+ // HandleContextMenu callback from chromium
+ if (ev->type() == QEvent::ContextMenu) {
+ ev->accept();
+ return true;
+ }
+ return QWidget::event(ev);
+}
+
+void QWebEngineView::contextMenuEvent(QContextMenuEvent *event)
+{
+ QMenu *menu = page()->createStandardContextMenu();
+ menu->popup(event->globalPos());
+}
+
QT_END_NAMESPACE
#include "moc_qwebengineview.cpp"
diff --git a/lib/widgets/Api/qwebengineview.h b/lib/widgets/Api/qwebengineview.h
index c3b3067bc..2c649d46f 100644
--- a/lib/widgets/Api/qwebengineview.h
+++ b/lib/widgets/Api/qwebengineview.h
@@ -30,6 +30,7 @@
#include <QtWebEngineWidgets/qwebenginepage.h>
QT_BEGIN_NAMESPACE
+class QContextMenuEvent;
class QIcon;
class QNetworkRequest;
class QPrinter;
@@ -129,11 +130,14 @@ Q_SIGNALS:
protected:
virtual QWebEngineView *createWindow(QWebEnginePage::WebWindowType type);
+ virtual void contextMenuEvent(QContextMenuEvent*) Q_DECL_OVERRIDE;
+ virtual bool event(QEvent*) Q_DECL_OVERRIDE;
private:
Q_DECLARE_PRIVATE(QWebEngineView);
friend class QWebEnginePage;
+ friend class QWebEnginePagePrivate;
};
QT_END_NAMESPACE
diff --git a/lib/widgets/Api/qwebengineview_p.h b/lib/widgets/Api/qwebengineview_p.h
index 73e5d45d8..774386a21 100644
--- a/lib/widgets/Api/qwebengineview_p.h
+++ b/lib/widgets/Api/qwebengineview_p.h
@@ -59,6 +59,7 @@ public:
QWebEngineViewPrivate();
QWebEnginePage *page;
+ bool m_pendingContextMenuEvent;
};
QT_END_NAMESPACE
diff --git a/lib/widgets/widgets.pro b/lib/widgets/widgets.pro
index 272e3568e..60730f880 100644
--- a/lib/widgets/widgets.pro
+++ b/lib/widgets/widgets.pro
@@ -9,6 +9,8 @@ MODULE = webenginewidgets
# For our export macros
DEFINES += QT_BUILD_WEBENGINEWIDGETS_LIB
+CONFIG += c++11
+
QT += widgets
QT_PRIVATE += widgets-private gui-private core-private