diff options
Diffstat (limited to 'src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp')
-rw-r--r-- | src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp | 42 |
1 files changed, 37 insertions, 5 deletions
diff --git a/src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp b/src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp index 91ef84960..c085aacd7 100644 --- a/src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp +++ b/src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp @@ -44,8 +44,9 @@ namespace QtWebEngineCore { -RenderWidgetHostViewQtDelegateQuickWindow::RenderWidgetHostViewQtDelegateQuickWindow(RenderWidgetHostViewQtDelegate *realDelegate) +RenderWidgetHostViewQtDelegateQuickWindow::RenderWidgetHostViewQtDelegateQuickWindow(RenderWidgetHostViewQtDelegateQuick *realDelegate) : m_realDelegate(realDelegate) + , m_virtualParent(nullptr) { setFlags(Qt::ToolTip | Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus); } @@ -54,17 +55,43 @@ RenderWidgetHostViewQtDelegateQuickWindow::~RenderWidgetHostViewQtDelegateQuickW { } +void RenderWidgetHostViewQtDelegateQuickWindow::setVirtualParent(QQuickItem *virtualParent) +{ + Q_ASSERT(virtualParent); + m_virtualParent = virtualParent; +} + +static inline QRectF mapRectToGlobal(const QQuickItem *item, const QRectF &rect) +{ + const QPointF p1 = item->mapToGlobal(rect.topLeft()); + const QPointF p2 = item->mapToGlobal(rect.bottomRight()); + return QRectF(p1, p2).normalized(); +} + +static inline QRectF mapRectFromGlobal(const QQuickItem *item, const QRectF &rect) +{ + const QPointF p1 = item->mapFromGlobal(rect.topLeft()); + const QPointF p2 = item->mapFromGlobal(rect.bottomRight()); + return QRectF(p1, p2).normalized(); +} + void RenderWidgetHostViewQtDelegateQuickWindow::initAsPopup(const QRect &screenRect) { - m_realDelegate->initAsPopup(QRect(QPoint(0, 0), screenRect.size())); - setGeometry(screenRect); + QRectF popupRect(screenRect); + popupRect = mapRectFromGlobal(m_virtualParent, popupRect); + popupRect = m_virtualParent->mapRectToScene(popupRect); + popupRect = mapRectToGlobal(m_virtualParent, popupRect); + + m_realDelegate->initAsPopup(QRect(QPoint(0, 0), popupRect.size().toSize())); + popupRect.setSize(screenRect.size()); + setGeometry(popupRect.toAlignedRect()); raise(); show(); } QRectF RenderWidgetHostViewQtDelegateQuickWindow::viewGeometry() const { - return m_realDelegate->viewGeometry(); + return geometry(); } QRect RenderWidgetHostViewQtDelegateQuickWindow::windowGeometry() const @@ -138,7 +165,12 @@ void RenderWidgetHostViewQtDelegateQuickWindow::resize(int width, int height) void RenderWidgetHostViewQtDelegateQuickWindow::move(const QPoint &screenPos) { - QQuickWindow::setPosition(screenPos); + QRectF popupRect(screenPos, size()); + popupRect = mapRectFromGlobal(m_virtualParent, popupRect); + popupRect = m_virtualParent->mapRectToScene(popupRect); + popupRect = mapRectToGlobal(m_virtualParent, popupRect); + + QQuickWindow::setPosition(popupRect.topLeft().toPoint()); } } // namespace QtWebEngineCore |