From 5d1ef38f9f6815807596d0606cf7ed06b7930aac Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 9 May 2022 12:04:12 +0200 Subject: Create a RWHV delegate in core This is adapting the Quick code for shared use with widgets, and allows us to use it from QWebEnginePage. Pick-to: 6.4 Fixes: QTBUG-96377 Change-Id: I3f09c1a949eff86d80fbe6c513dc66e3f9f2f611 Reviewed-by: Michal Klocek --- ...er_widget_host_view_qt_delegate_quickwindow.cpp | 64 +++++++++------------- 1 file changed, 27 insertions(+), 37 deletions(-) (limited to 'src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.cpp') diff --git a/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.cpp b/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.cpp index 7cae38b2e..911d10c8a 100644 --- a/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.cpp +++ b/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.cpp @@ -37,10 +37,9 @@ ** ****************************************************************************/ -#include "render_widget_host_view_qt_delegate_quick.h" #include "render_widget_host_view_qt_delegate_quickwindow.h" -#include +#include "api/qquickwebengineview_p_p.h" namespace QtWebEngineCore { @@ -68,14 +67,19 @@ static inline QPointF transformPoint(const QPointF &point, const QTransform &tra } RenderWidgetHostViewQtDelegateQuickWindow::RenderWidgetHostViewQtDelegateQuickWindow( - RenderWidgetHostViewQtDelegateQuick *realDelegate, QWindow *parent) + RenderWidgetHostViewQtDelegateItem *realDelegate, QWindow *parent) : QQuickWindow(parent), m_realDelegate(realDelegate), m_virtualParent(nullptr), m_rotated(false) { setFlags(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus); + realDelegate->setParentItem(contentItem()); } RenderWidgetHostViewQtDelegateQuickWindow::~RenderWidgetHostViewQtDelegateQuickWindow() { + if (m_realDelegate) { + m_realDelegate->setWidgetDelegate(nullptr); + m_realDelegate->setParentItem(nullptr); + } } void RenderWidgetHostViewQtDelegateQuickWindow::setVirtualParent(QQuickItem *virtualParent) @@ -86,9 +90,9 @@ void RenderWidgetHostViewQtDelegateQuickWindow::setVirtualParent(QQuickItem *vir // rect is window geometry in form of parent window offset + offset in scene coordinates // chromium knows nothing about local transformation -void RenderWidgetHostViewQtDelegateQuickWindow::initAsPopup(const QRect &rect) +void RenderWidgetHostViewQtDelegateQuickWindow::InitAsPopup(const QRect &rect) { - m_rotated = m_virtualParent->parentItem()->rotation() > 0; + m_rotated = m_virtualParent->rotation() > 0 || m_virtualParent->parentItem()->rotation() > 0; if (m_rotated) { // code below tries to cover the case where webengine view is rotated, // the code assumes the rotation is in the form of 90, 180, 270 degrees @@ -104,7 +108,6 @@ void RenderWidgetHostViewQtDelegateQuickWindow::initAsPopup(const QRect &rect) QPointF br = transformPoint(rect.bottomRight(), transform, offset, m_virtualParent); QRectF popupRect(tl, br); popupRect = popupRect.normalized(); - m_realDelegate->setSize(rect.size()); // include offset from parent window popupRect.moveTo(popupRect.topLeft() - offset); setGeometry(popupRect.adjusted(0, 0, 1, 1).toRect()); @@ -115,64 +118,51 @@ void RenderWidgetHostViewQtDelegateQuickWindow::initAsPopup(const QRect &rect) m_realDelegate->setTransformOrigin(QQuickItem::Center); m_realDelegate->setRotation(m_virtualParent->parentItem()->rotation()); } else { - m_realDelegate->setSize(rect.size()); QRect geometry(rect); geometry.moveTo(rect.topLeft() - getOffset(m_virtualParent)); setGeometry(geometry); } + m_realDelegate->show(); raise(); show(); } -QRectF RenderWidgetHostViewQtDelegateQuickWindow::viewGeometry() const -{ - return m_rotated ? m_rect : geometry(); -} - -QRect RenderWidgetHostViewQtDelegateQuickWindow::windowGeometry() const +void RenderWidgetHostViewQtDelegateQuickWindow::Resize(int width, int height) { - return m_rotated ? m_rect : frameGeometry(); -} - -void RenderWidgetHostViewQtDelegateQuickWindow::show() -{ - QQuickWindow::show(); - m_realDelegate->show(); + if (!m_rotated) + QQuickWindow::resize(width, height); } -void RenderWidgetHostViewQtDelegateQuickWindow::hide() +void RenderWidgetHostViewQtDelegateQuickWindow::MoveWindow(const QPoint &screenPos) { - QQuickWindow::hide(); - m_realDelegate->hide(); + if (!m_rotated) + QQuickWindow::setPosition(screenPos - getOffset(m_virtualParent)); } -bool RenderWidgetHostViewQtDelegateQuickWindow::isVisible() const +void RenderWidgetHostViewQtDelegateQuickWindow::SetClearColor(const QColor &color) { - return QQuickWindow::isVisible(); + QQuickWindow::setColor(color); } -QWindow *RenderWidgetHostViewQtDelegateQuickWindow::window() const +bool RenderWidgetHostViewQtDelegateQuickWindow::ActiveFocusOnPress() { - return const_cast(this); + return false; } -void RenderWidgetHostViewQtDelegateQuickWindow::updateCursor(const QCursor &cursor) +void RenderWidgetHostViewQtDelegateQuickWindow::Bind(QtWebEngineCore::WebContentsAdapterClient *client) { - setCursor(cursor); + QQuickWebEngineViewPrivate::bindViewAndWidget( + static_cast(client)->q_func(), m_realDelegate.data()); } -void RenderWidgetHostViewQtDelegateQuickWindow::resize(int width, int height) +void RenderWidgetHostViewQtDelegateQuickWindow::Unbind() { - if (!m_rotated) { - QQuickWindow::resize(width, height); - m_realDelegate->resize(width, height); - } + QQuickWebEngineViewPrivate::bindViewAndWidget(nullptr, m_realDelegate.data()); } -void RenderWidgetHostViewQtDelegateQuickWindow::move(const QPoint &screenPos) +void RenderWidgetHostViewQtDelegateQuickWindow::Destroy() { - if (!m_rotated) - QQuickWindow::setPosition(screenPos - getOffset(m_virtualParent)); + deleteLater(); } } // namespace QtWebEngineCore -- cgit v1.2.3