summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2021-02-15 08:38:06 +0100
committerMichal Klocek <michal.klocek@qt.io>2021-06-05 19:33:16 +0200
commit998fa42ef3b7653fb8a59ad25a30dabb93d491dc (patch)
treee033ed0bec9abf0a4e3f944c68a4b7f6f31762b2 /src
parent6e96fcdff40d9222659acd333a1daae053980aa6 (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.cpp66
-rw-r--r--src/webenginequick/render_widget_host_view_qt_delegate_quickwindow.h2
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