diff options
author | Michal Klocek <michal.klocek@qt.io> | 2021-02-15 08:38:06 +0100 |
---|---|---|
committer | Michal Klocek <michal.klocek@qt.io> | 2021-06-05 19:33:16 +0200 |
commit | 998fa42ef3b7653fb8a59ad25a30dabb93d491dc (patch) | |
tree | e033ed0bec9abf0a4e3f944c68a4b7f6f31762b2 /src | |
parent | 6e96fcdff40d9222659acd333a1daae053980aa6 (diff) |
Transform/Rotate qml popups in the case of multiwindow support
This is ugly attempt to cover the case for different
screen orientations with qml popups on system with
windowing system in form of:
Item {
anchors.fill: parent
rotation: 90
WebEngineView {
anchors.fill: parent
}
}
This implemented by adding special transformation for rotation
for quickwindow delegate.
Do not support move or resize in that case since chromium is not aware
of this transformation anyway.
Fixes: QTBUG-63888
Fixes: QTBUG-75893
Task-number: QTBUG-73244
Task-number: QTBUG-89358
Pick-to: 5.15
Change-Id: I0a116e0b85dc17e6ad517829a2db1d3f192d32ce
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.cpp | 66 | ||||
-rw-r--r-- | src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.h | 2 |
2 files changed, 58 insertions, 10 deletions
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 c6d866033..48009cdad 100644 --- a/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.cpp +++ b/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.cpp @@ -54,9 +54,22 @@ static inline QPoint getOffset(QQuickItem *item) return offset.toPoint(); } +static inline QPointF transformPoint(const QPointF &point, const QTransform &transform, + const QPointF &offset, const QQuickItem *parent) +{ + // make scene vector + QPointF a = point - offset; + // apply local transformation + a = transform.map(a); + // make screen coordinates + a = parent->mapFromScene(a); + a = parent->mapToGlobal(a); + return a; +} + RenderWidgetHostViewQtDelegateQuickWindow::RenderWidgetHostViewQtDelegateQuickWindow( RenderWidgetHostViewQtDelegateQuick *realDelegate, QWindow *parent) - : QQuickWindow(parent), m_realDelegate(realDelegate), m_virtualParent(nullptr) + : QQuickWindow(parent), m_realDelegate(realDelegate), m_virtualParent(nullptr), m_rotated(false) { setFlags(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus); } @@ -71,24 +84,54 @@ void RenderWidgetHostViewQtDelegateQuickWindow::setVirtualParent(QQuickItem *vir m_virtualParent = virtualParent; } +// 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) { - m_realDelegate->setSize(rect.size()); - QRect geometry(rect); - geometry.moveTo(rect.topLeft() - getOffset(m_virtualParent)); - setGeometry(geometry); + m_rotated = 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 + // to archive that we keep chromium unaware of transformation and we transform + // just the window content. + m_rect = rect; + // get parent window (scene) offset + QPointF offset = m_virtualParent->mapFromScene(QPoint(0, 0)); + offset = m_virtualParent->mapToGlobal(offset); + // get local transform + QTransform transform = m_virtualParent->itemTransform(nullptr, nullptr); + QPointF tl = transformPoint(rect.topLeft(), transform, offset, m_virtualParent); + 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()); + // add offset since screenRect and transformed popupRect one are different and + // we want to rotate in center. + m_realDelegate->setX(-rect.width() / 2.0 + geometry().width() / 2.0); + m_realDelegate->setY(-rect.height() / 2.0 + geometry().height() / 2.0); + 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); + } raise(); show(); } QRectF RenderWidgetHostViewQtDelegateQuickWindow::viewGeometry() const { - return geometry(); + return m_rotated ? m_rect : geometry(); } QRect RenderWidgetHostViewQtDelegateQuickWindow::windowGeometry() const { - return frameGeometry(); + return m_rotated ? m_rect : frameGeometry(); } void RenderWidgetHostViewQtDelegateQuickWindow::show() @@ -120,13 +163,16 @@ void RenderWidgetHostViewQtDelegateQuickWindow::updateCursor(const QCursor &curs void RenderWidgetHostViewQtDelegateQuickWindow::resize(int width, int height) { - QQuickWindow::resize(width, height); - m_realDelegate->resize(width, height); + if (!m_rotated) { + QQuickWindow::resize(width, height); + m_realDelegate->resize(width, height); + } } void RenderWidgetHostViewQtDelegateQuickWindow::move(const QPoint &screenPos) { - QQuickWindow::setPosition(screenPos - getOffset(m_virtualParent)); + if (!m_rotated) + QQuickWindow::setPosition(screenPos - getOffset(m_virtualParent)); } } // namespace QtWebEngineCore diff --git a/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.h b/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.h index 632c59fa5..f81bcc637 100644 --- a/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.h +++ b/src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.h @@ -79,6 +79,8 @@ public: private: QScopedPointer<RenderWidgetHostViewQtDelegateQuick> m_realDelegate; QQuickItem *m_virtualParent; + QRect m_rect; + bool m_rotated; }; } // namespace QtWebEngineCore |