diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-09-21 13:55:25 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2016-09-21 21:39:35 +0000 |
commit | aae5b793666091a780e63b68b2a0426f8edd6174 (patch) | |
tree | dc45dc3dca56b30360c733a1d36c7bfcb8d6ef0b /src | |
parent | 3ed4944a7e21191ee726ca31c4e50bd055f9d25b (diff) |
Make ApplicationWindow.overlay attached property work with QML Window
Since 14dd934c, we're using QQuickOverlay even with plain QML Window.
Now that the overlay is guaranteed to always exist, we can make the
attached property to give a reliable access to the overlay.
Change-Id: I707fc52f6dfc7a0dbc9a3467646fb5feb36b9572
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/quicktemplates2/qquickapplicationwindow.cpp | 88 |
1 files changed, 49 insertions, 39 deletions
diff --git a/src/quicktemplates2/qquickapplicationwindow.cpp b/src/quicktemplates2/qquickapplicationwindow.cpp index 2afdf15c..67fcd78b 100644 --- a/src/quicktemplates2/qquickapplicationwindow.cpp +++ b/src/quicktemplates2/qquickapplicationwindow.cpp @@ -615,47 +615,49 @@ public: void windowChange(QQuickWindow *wnd); - QQuickApplicationWindow *window; + QQuickWindow *window; }; void QQuickApplicationWindowAttachedPrivate::windowChange(QQuickWindow *wnd) { Q_Q(QQuickApplicationWindowAttached); - if (window && !QQuickApplicationWindowPrivate::get(window)) - window = nullptr; // being deleted (QTBUG-52731) + if (window == wnd) + return; - QQuickApplicationWindow *newWindow = qobject_cast<QQuickApplicationWindow *>(wnd); - if (window != newWindow) { - QQuickApplicationWindow *oldWindow = window; - if (oldWindow) { - QObject::disconnect(oldWindow, &QQuickApplicationWindow::activeFocusControlChanged, - q, &QQuickApplicationWindowAttached::activeFocusControlChanged); - QObject::disconnect(oldWindow, &QQuickApplicationWindow::headerChanged, - q, &QQuickApplicationWindowAttached::headerChanged); - QObject::disconnect(oldWindow, &QQuickApplicationWindow::footerChanged, - q, &QQuickApplicationWindowAttached::footerChanged); - } - if (newWindow) { - QObject::connect(newWindow, &QQuickApplicationWindow::activeFocusControlChanged, - q, &QQuickApplicationWindowAttached::activeFocusControlChanged); - QObject::connect(newWindow, &QQuickApplicationWindow::headerChanged, - q, &QQuickApplicationWindowAttached::headerChanged); - QObject::connect(newWindow, &QQuickApplicationWindow::footerChanged, - q, &QQuickApplicationWindowAttached::footerChanged); - } + QQuickApplicationWindow *oldWindow = qobject_cast<QQuickApplicationWindow *>(window); + if (oldWindow && !QQuickApplicationWindowPrivate::get(oldWindow)) + oldWindow = nullptr; // being deleted (QTBUG-52731) + + if (oldWindow) { + QObject::disconnect(oldWindow, &QQuickApplicationWindow::activeFocusControlChanged, + q, &QQuickApplicationWindowAttached::activeFocusControlChanged); + QObject::disconnect(oldWindow, &QQuickApplicationWindow::headerChanged, + q, &QQuickApplicationWindowAttached::headerChanged); + QObject::disconnect(oldWindow, &QQuickApplicationWindow::footerChanged, + q, &QQuickApplicationWindowAttached::footerChanged); + } - window = newWindow; - emit q->windowChanged(); - emit q->contentItemChanged(); - emit q->overlayChanged(); - - if ((oldWindow && oldWindow->activeFocusControl()) || (newWindow && newWindow->activeFocusControl())) - emit q->activeFocusControlChanged(); - if ((oldWindow && oldWindow->header()) || (newWindow && newWindow->header())) - emit q->headerChanged(); - if ((oldWindow && oldWindow->footer()) || (newWindow && newWindow->footer())) - emit q->footerChanged(); + QQuickApplicationWindow *newWindow = qobject_cast<QQuickApplicationWindow *>(wnd); + if (newWindow) { + QObject::connect(newWindow, &QQuickApplicationWindow::activeFocusControlChanged, + q, &QQuickApplicationWindowAttached::activeFocusControlChanged); + QObject::connect(newWindow, &QQuickApplicationWindow::headerChanged, + q, &QQuickApplicationWindowAttached::headerChanged); + QObject::connect(newWindow, &QQuickApplicationWindow::footerChanged, + q, &QQuickApplicationWindowAttached::footerChanged); } + + window = wnd; + emit q->windowChanged(); + emit q->contentItemChanged(); + emit q->overlayChanged(); + + if ((oldWindow && oldWindow->activeFocusControl()) || (newWindow && newWindow->activeFocusControl())) + emit q->activeFocusControlChanged(); + if ((oldWindow && oldWindow->header()) || (newWindow && newWindow->header())) + emit q->headerChanged(); + if ((oldWindow && oldWindow->footer()) || (newWindow && newWindow->footer())) + emit q->footerChanged(); } QQuickApplicationWindowAttached::QQuickApplicationWindowAttached(QObject *parent) @@ -691,7 +693,7 @@ QQuickApplicationWindowAttached::QQuickApplicationWindowAttached(QObject *parent QQuickApplicationWindow *QQuickApplicationWindowAttached::window() const { Q_D(const QQuickApplicationWindowAttached); - return d->window; + return qobject_cast<QQuickApplicationWindow *>(d->window); } /*! @@ -704,7 +706,9 @@ QQuickApplicationWindow *QQuickApplicationWindowAttached::window() const QQuickItem *QQuickApplicationWindowAttached::contentItem() const { Q_D(const QQuickApplicationWindowAttached); - return d->window ? d->window->contentItem() : nullptr; + if (QQuickApplicationWindow *window = qobject_cast<QQuickApplicationWindow *>(d->window)) + return window->contentItem(); + return nullptr; } /*! @@ -721,7 +725,9 @@ QQuickItem *QQuickApplicationWindowAttached::contentItem() const QQuickItem *QQuickApplicationWindowAttached::activeFocusControl() const { Q_D(const QQuickApplicationWindowAttached); - return d->window ? d->window->activeFocusControl() : nullptr; + if (QQuickApplicationWindow *window = qobject_cast<QQuickApplicationWindow *>(d->window)) + return window->activeFocusControl(); + return nullptr; } /*! @@ -735,7 +741,9 @@ QQuickItem *QQuickApplicationWindowAttached::activeFocusControl() const QQuickItem *QQuickApplicationWindowAttached::header() const { Q_D(const QQuickApplicationWindowAttached); - return d->window ? d->window->header() : nullptr; + if (QQuickApplicationWindow *window = qobject_cast<QQuickApplicationWindow *>(d->window)) + return window->header(); + return nullptr; } /*! @@ -749,7 +757,9 @@ QQuickItem *QQuickApplicationWindowAttached::header() const QQuickItem *QQuickApplicationWindowAttached::footer() const { Q_D(const QQuickApplicationWindowAttached); - return d->window ? d->window->footer() : nullptr; + if (QQuickApplicationWindow *window = qobject_cast<QQuickApplicationWindow *>(d->window)) + return window->footer(); + return nullptr; } /*! @@ -762,7 +772,7 @@ QQuickItem *QQuickApplicationWindowAttached::footer() const QQuickOverlay *QQuickApplicationWindowAttached::overlay() const { Q_D(const QQuickApplicationWindowAttached); - return d->window ? d->window->overlay() : nullptr; + return QQuickOverlay::overlay(d->window); } QT_END_NAMESPACE |