diff options
-rw-r--r-- | src/core/api/qwebenginepage.cpp | 6 | ||||
-rw-r--r-- | src/core/api/qwebenginepage_p.h | 4 | ||||
-rw-r--r-- | src/webenginewidgets/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview.cpp | 8 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview_p.h | 3 | ||||
-rw-r--r-- | src/webenginewidgets/ui/touchhandlewidget.cpp | 59 | ||||
-rw-r--r-- | src/webenginewidgets/ui/touchhandlewidget_p.h | 50 |
7 files changed, 131 insertions, 1 deletions
diff --git a/src/core/api/qwebenginepage.cpp b/src/core/api/qwebenginepage.cpp index 3b83a0b97..2b94c7ab8 100644 --- a/src/core/api/qwebenginepage.cpp +++ b/src/core/api/qwebenginepage.cpp @@ -1658,6 +1658,12 @@ void QWebEnginePagePrivate::printRequested() view->printRequested(); } +QtWebEngineCore::TouchHandleDrawableDelegate * +QWebEnginePagePrivate::createTouchHandleDelegate(const QMap<int, QImage> &images) +{ + return view->createTouchHandleDelegate(images); +} + void QWebEnginePagePrivate::lifecycleStateChanged(LifecycleState state) { Q_Q(QWebEnginePage); diff --git a/src/core/api/qwebenginepage_p.h b/src/core/api/qwebenginepage_p.h index 8bdf6de5c..fa5ee135d 100644 --- a/src/core/api/qwebenginepage_p.h +++ b/src/core/api/qwebenginepage_p.h @@ -77,6 +77,8 @@ public: virtual void showAutofillPopup(QtWebEngineCore::AutofillPopupController *controller, const QRect &bounds, bool autoselectFirstSuggestion) = 0; virtual void hideAutofillPopup() = 0; + virtual QtWebEngineCore::TouchHandleDrawableDelegate * + createTouchHandleDelegate(const QMap<int, QImage> &) = 0; }; class Q_WEBENGINECORE_PRIVATE_EXPORT QWebEnginePagePrivate : public QtWebEngineCore::WebContentsAdapterClient @@ -157,7 +159,7 @@ public: void setToolTip(const QString &toolTipText) override; void printRequested() override; QtWebEngineCore::TouchHandleDrawableDelegate * - createTouchHandleDelegate(const QMap<int, QImage> &) override { return nullptr; } + createTouchHandleDelegate(const QMap<int, QImage> &) override; void showTouchSelectionMenu(QtWebEngineCore::TouchSelectionMenuController *, const QRect &, const QSize &) override { } void hideTouchSelectionMenu() override { } const QObject *holdingQObject() const override; diff --git a/src/webenginewidgets/CMakeLists.txt b/src/webenginewidgets/CMakeLists.txt index 99a8592ac..b6de53a04 100644 --- a/src/webenginewidgets/CMakeLists.txt +++ b/src/webenginewidgets/CMakeLists.txt @@ -13,11 +13,13 @@ qt_internal_add_module(WebEngineWidgets api/qwebengineview.cpp api/qwebengineview.h api/qwebengineview_p.h qwebengine_accessible.cpp qwebengine_accessible.h ui/autofillpopupwidget.cpp ui/autofillpopupwidget_p.h + ui/touchhandlewidget.cpp ui/touchhandlewidget_p.h DEFINES QT_BUILD_WEBENGINEWIDGETS_LIB INCLUDE_DIRECTORIES ../core api + ui LIBRARIES Qt::CorePrivate Qt::GuiPrivate diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index ba82b9573..0e5e9d077 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -8,6 +8,7 @@ #include "render_widget_host_view_qt_delegate_item.h" #include "qwebengine_accessible.h" #include "ui/autofillpopupwidget_p.h" +#include "touchhandlewidget_p.h" #include <QtWebEngineCore/private/qwebenginepage_p.h> #include <QtWebEngineCore/qwebenginecontextmenurequest.h> @@ -1583,6 +1584,13 @@ bool QContextMenuBuilder::isMenuItemEnabled(ContextMenuItem menuItem) } #endif // QT_CONFIG(action) +QtWebEngineCore::TouchHandleDrawableDelegate * +QWebEngineViewPrivate::createTouchHandleDelegate(const QMap<int, QImage> &images) +{ + Q_Q(QWebEngineView); + return new QtWebEngineWidgetUI::TouchHandleWidget(q, images); +} + QT_END_NAMESPACE #include "moc_qwebengineview.cpp" diff --git a/src/webenginewidgets/api/qwebengineview_p.h b/src/webenginewidgets/api/qwebengineview_p.h index 7855f9ef3..9e0a40799 100644 --- a/src/webenginewidgets/api/qwebengineview_p.h +++ b/src/webenginewidgets/api/qwebengineview_p.h @@ -29,6 +29,7 @@ class RenderWidgetHostViewQtDelegateClient; namespace QtWebEngineWidgetUI { class AutofillPopupWidget; +class TouchHandleDrawableDelegate; } QT_BEGIN_NAMESPACE @@ -71,6 +72,8 @@ public: void showAutofillPopup(QtWebEngineCore::AutofillPopupController *controller, const QRect &bounds, bool autoselectFirstSuggestion) override; void hideAutofillPopup() override; + QtWebEngineCore::TouchHandleDrawableDelegate * + createTouchHandleDelegate(const QMap<int, QImage> &images) override; QWebEngineViewPrivate(); virtual ~QWebEngineViewPrivate(); diff --git a/src/webenginewidgets/ui/touchhandlewidget.cpp b/src/webenginewidgets/ui/touchhandlewidget.cpp new file mode 100644 index 000000000..88af0ff36 --- /dev/null +++ b/src/webenginewidgets/ui/touchhandlewidget.cpp @@ -0,0 +1,59 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "touchhandlewidget_p.h" +#include "qwebengineview.h" + +#include <QBoxLayout> +#include <QGraphicsOpacityEffect> +#include <QLabel> +#include <QWidget> + +namespace QtWebEngineWidgetUI { +TouchHandleWidget::TouchHandleWidget(QWebEngineView *view, const QMap<int, QImage> &images) + : m_widget(new QWidget(view)) + , m_label(new QLabel(m_widget)) + , m_opacityEffect(new QGraphicsOpacityEffect(m_widget)) + , m_images(images) +{ + m_widget->setAttribute(Qt::WA_AcceptTouchEvents, true); + m_widget->setAttribute(Qt::WA_TransparentForMouseEvents, true); +} + +TouchHandleWidget::~TouchHandleWidget() +{ +} + +void TouchHandleWidget::setImage(int orientation) +{ + const QImage &img = m_images[orientation]; + m_label->setPixmap(QPixmap::fromImage(img)); + m_label->setFrameStyle(QFrame::NoFrame); + m_label->resize(img.size()); + m_label->setVisible(true); + + QVBoxLayout layout; + layout.setSpacing(0); + layout.setContentsMargins(QMargins()); + layout.addWidget(m_label); + layout.setParent(m_widget); + m_widget->setLayout(&layout); + m_widget->resize(img.size()); +} + +void TouchHandleWidget::setBounds(const QRect &bounds) +{ + m_widget->setGeometry(bounds); +} + +void TouchHandleWidget::setVisible(bool visible) +{ + m_widget->setVisible(visible); +} + +void TouchHandleWidget::setOpacity(float opacity) +{ + m_opacityEffect->setOpacity(opacity); + m_widget->setGraphicsEffect(m_opacityEffect); +} +} // namespace QtWebEngineWidgetUI diff --git a/src/webenginewidgets/ui/touchhandlewidget_p.h b/src/webenginewidgets/ui/touchhandlewidget_p.h new file mode 100644 index 000000000..9f181c935 --- /dev/null +++ b/src/webenginewidgets/ui/touchhandlewidget_p.h @@ -0,0 +1,50 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef TOUCHHANDLEWIDGET_P_H +#define TOUCHHANDLEWIDGET_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "touch_handle_drawable_client.h" + +#include <QImage> +#include <QMap> + +QT_BEGIN_NAMESPACE +class QGraphicsOpacityEffect; +class QLabel; +class QWebEngineView; +class QWidget; +QT_END_NAMESPACE + +namespace QtWebEngineWidgetUI { +class TouchHandleWidget : public QtWebEngineCore::TouchHandleDrawableDelegate +{ +public: + TouchHandleWidget(QWebEngineView *view, const QMap<int, QImage> &images); + ~TouchHandleWidget(); + + void setImage(int orientation) override; + void setBounds(const QRect &bounds) override; + void setVisible(bool visible) override; + void setOpacity(float opacity) override; + +private: + QWidget *m_widget; + QLabel *m_label; + QGraphicsOpacityEffect *m_opacityEffect; + QMap<int, QImage> m_images; +}; +} // namespace QtWebEngineWidgetUI + +#endif // TOUCHHANDLEWIDGET_P_H |