diff options
| author | Balazs Egedi <egedib@inf.u-szeged.hu> | 2022-02-18 13:04:19 +0100 |
|---|---|---|
| committer | Kirill Burtsev <kirill.burtsev@qt.io> | 2022-05-04 03:00:16 +0200 |
| commit | 828ee197647a7462c10243c0261e7bced9bbcb65 (patch) | |
| tree | 4c6bc198ea33a753e6af4efa736741ea10cea280 /src/webenginequick/api/qquickwebengineview.cpp | |
| parent | 57a38f05d9a0898bffa077a5caaf48fde370cb02 (diff) | |
Quick: Add support for replacing touch handles with delegates
Task-number: QTBUG-85043
Change-Id: I1c87aff352e07eb309d5ba8747b9e50a191d478e
Reviewed-by: Michal Klocek <michal.klocek@qt.io>
Diffstat (limited to 'src/webenginequick/api/qquickwebengineview.cpp')
| -rw-r--r-- | src/webenginequick/api/qquickwebengineview.cpp | 71 |
1 files changed, 52 insertions, 19 deletions
diff --git a/src/webenginequick/api/qquickwebengineview.cpp b/src/webenginequick/api/qquickwebengineview.cpp index 3aca79672..96b79a5b7 100644 --- a/src/webenginequick/api/qquickwebengineview.cpp +++ b/src/webenginequick/api/qquickwebengineview.cpp @@ -49,6 +49,7 @@ #include "qquickwebenginescriptcollection_p_p.h" #include "qquickwebenginesettings_p.h" #include "qquickwebenginetouchhandleprovider_p_p.h" +#include "qquickwebenginecustomtouchhandle_p.h" #include "qquickwebenginetouchselectionmenurequest_p.h" #include "qquickwebengineview_p.h" #include "qquickwebengineview_p_p.h" @@ -168,6 +169,7 @@ QQuickWebEngineViewPrivate::QQuickWebEngineViewPrivate() , m_zoomFactor(1.0) , m_profileInitialized(false) , m_contextMenuRequest(nullptr) + , m_touchHandleDelegate(nullptr) { memset(actions, 0, sizeof(actions)); @@ -1260,9 +1262,35 @@ void QQuickWebEngineViewPrivate::setToolTip(const QString &toolTipText) ui()->showToolTip(toolTipText); } -QtWebEngineCore::TouchHandleDrawableClient *QQuickWebEngineViewPrivate::createTouchHandle(const QMap<int, QImage> &images) +QtWebEngineCore::TouchHandleDrawableDelegate * +QQuickWebEngineViewPrivate::createTouchHandleDelegate(const QMap<int, QImage> &images) { - return new QQuickWebEngineTouchHandle(ui(), images); + Q_Q(QQuickWebEngineView); + if (m_touchHandleDelegate) { + // lifecycle managed by Chromium's TouchHandleDrawable + QQmlContext *qmlContext = QQmlEngine::contextForObject(q); + QQuickWebEngineCustomTouchHandle *handle = new QQuickWebEngineCustomTouchHandle(); + QQmlContext *context = new QQmlContext(qmlContext, handle); + context->setContextObject(handle); + QObject *delegate = m_touchHandleDelegate->create(context); + Q_ASSERT(delegate); + QQuickItem *item = qobject_cast<QQuickItem *>(delegate); + item->setParentItem(q); + handle->item.reset(item); + return handle; + } else { + QQuickItem *item = ui()->createTouchHandle(); + Q_ASSERT(item); + QQmlEngine *engine = qmlEngine(item); + Q_ASSERT(engine); + QQuickWebEngineTouchHandleProvider *touchHandleProvider = + static_cast<QQuickWebEngineTouchHandleProvider *>( + engine->imageProvider(QQuickWebEngineTouchHandleProvider::identifier())); + Q_ASSERT(touchHandleProvider); + touchHandleProvider->init(images); + return new QQuickWebEngineTouchHandle(item); + } + return nullptr; } void QQuickWebEngineViewPrivate::showTouchSelectionMenu(QtWebEngineCore::TouchSelectionMenuController *menuController, const QRect &selectionBounds, const QSize &handleSize) @@ -2383,18 +2411,9 @@ bool QQuickContextMenuBuilder::isMenuItemEnabled(ContextMenuItem menuItem) Q_UNREACHABLE(); } - -QQuickWebEngineTouchHandle::QQuickWebEngineTouchHandle(QtWebEngineCore::UIDelegatesManager *ui, const QMap<int, QImage> &images) +QQuickWebEngineTouchHandle::QQuickWebEngineTouchHandle(QQuickItem *item) : m_item(item) { - Q_ASSERT(ui); - m_item.reset(ui->createTouchHandle()); - - QQmlEngine *engine = qmlEngine(m_item.data()); - Q_ASSERT(engine); - QQuickWebEngineTouchHandleProvider *touchHandleProvider = - static_cast<QQuickWebEngineTouchHandleProvider *>(engine->imageProvider(QQuickWebEngineTouchHandleProvider::identifier())); - Q_ASSERT(touchHandleProvider); - touchHandleProvider->init(images); + m_item->setProperty("visible", false); } void QQuickWebEngineTouchHandle::setImage(int orientation) @@ -2405,20 +2424,34 @@ void QQuickWebEngineTouchHandle::setImage(int orientation) void QQuickWebEngineTouchHandle::setBounds(const QRect &bounds) { - m_item->setProperty("x", bounds.x()); - m_item->setProperty("y", bounds.y()); - m_item->setProperty("width", bounds.width()); - m_item->setProperty("height", bounds.height()); + m_item->setX(bounds.x()); + m_item->setY(bounds.y()); + m_item->setWidth(bounds.width()); + m_item->setHeight(bounds.height()); } void QQuickWebEngineTouchHandle::setVisible(bool visible) { - m_item->setProperty("visible", visible); + m_item->setVisible(visible); } void QQuickWebEngineTouchHandle::setOpacity(float opacity) { - m_item->setProperty("opacity", opacity); + m_item->setOpacity(opacity); +} + +void QQuickWebEngineView::setTouchHandleDelegate(QQmlComponent *delegate) +{ + if (d_ptr->m_touchHandleDelegate != delegate) { + d_ptr->m_touchHandleDelegate = delegate; + d_ptr->webContentsAdapter()->resetTouchSelectionController(); + emit touchHandleDelegateChanged(); + } +} + +QQmlComponent *QQuickWebEngineView::touchHandleDelegate() const +{ + return d_ptr->m_touchHandleDelegate; } QT_END_NAMESPACE |
