From 817cd03a5f437c9e8862646cca5ea016b1223bc7 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Fri, 23 Jan 2015 16:21:14 +0100 Subject: Let ApplicationWindow inherit QQuickWindowQmlImpl Inheriting QQuickWindow would mean that ApplicationWindow would have to duplicate all that visibility and root item marker related code. Change-Id: I3b58631011a88d6a079c091db08215f2eef6df84 Reviewed-by: Alan Alpert Reviewed-by: Shawn Rutledge --- src/quick/items/qquickwindowmodule.cpp | 211 ++++++++++++++++----------------- src/quick/items/qquickwindowmodule_p.h | 36 ++++++ 2 files changed, 140 insertions(+), 107 deletions(-) (limited to 'src') diff --git a/src/quick/items/qquickwindowmodule.cpp b/src/quick/items/qquickwindowmodule.cpp index 065c50c8f6..58bc598559 100644 --- a/src/quick/items/qquickwindowmodule.cpp +++ b/src/quick/items/qquickwindowmodule.cpp @@ -45,127 +45,126 @@ QT_BEGIN_NAMESPACE -class QQuickWindowQmlImpl : public QQuickWindow, public QQmlParserStatus +class QQuickWindowQmlImplPrivate : public QQuickWindowPrivate { - Q_INTERFACES(QQmlParserStatus) - Q_OBJECT - - Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged) - Q_PROPERTY(Visibility visibility READ visibility WRITE setVisibility NOTIFY visibilityChanged) - public: - QQuickWindowQmlImpl(QWindow *parent = 0) - : QQuickWindow(parent) - , m_complete(false) - , m_visible(isVisible()) - , m_visibility(AutomaticVisibility) + QQuickWindowQmlImplPrivate() + : complete(false) + , visible(false) + , visibility(QQuickWindow::AutomaticVisibility) { - connect(this, &QWindow::visibleChanged, this, &QQuickWindowQmlImpl::visibleChanged); - connect(this, &QWindow::visibilityChanged, this, &QQuickWindowQmlImpl::visibilityChanged); } - void setVisible(bool visible) { - if (!m_complete) - m_visible = visible; - else if (!transientParent() || transientParent()->isVisible()) - QQuickWindow::setVisible(visible); - } + bool complete; + bool visible; + QQuickWindow::Visibility visibility; + QV4::PersistentValue rootItemMarker; +}; - void setVisibility(Visibility visibility) - { - if (!m_complete) - m_visibility = visibility; - else - QQuickWindow::setVisibility(visibility); - } +QQuickWindowQmlImpl::QQuickWindowQmlImpl(QWindow *parent) + : QQuickWindow(*(new QQuickWindowQmlImplPrivate), parent) +{ + connect(this, &QWindow::visibleChanged, this, &QQuickWindowQmlImpl::visibleChanged); + connect(this, &QWindow::visibilityChanged, this, &QQuickWindowQmlImpl::visibilityChanged); +} + +void QQuickWindowQmlImpl::setVisible(bool visible) +{ + Q_D(QQuickWindowQmlImpl); + if (!d->complete) + d->visible = visible; + else if (!transientParent() || transientParent()->isVisible()) + QQuickWindow::setVisible(visible); +} + +void QQuickWindowQmlImpl::setVisibility(Visibility visibility) +{ + Q_D(QQuickWindowQmlImpl); + if (!d->complete) + d->visibility = visibility; + else + QQuickWindow::setVisibility(visibility); +} + +QQuickWindowAttached *QQuickWindowQmlImpl::qmlAttachedProperties(QObject *object) +{ + return new QQuickWindowAttached(object); +} - static QQuickWindowAttached *qmlAttachedProperties(QObject *object) +void QQuickWindowQmlImpl::classBegin() +{ + Q_D(QQuickWindowQmlImpl); + QQmlEngine* e = qmlEngine(this); + //Give QQuickView behavior when created from QML with QQmlApplicationEngine + if (QCoreApplication::instance()->property("__qml_using_qqmlapplicationengine") == QVariant(true)) { + if (e && !e->incubationController()) + e->setIncubationController(incubationController()); + } + Q_ASSERT(e); { - return new QQuickWindowAttached(object); + QV4::ExecutionEngine *v4 = QQmlEnginePrivate::getV4Engine(e); + QV4::Scope scope(v4); + QV4::ScopedObject v(scope, QV4::QQuickRootItemMarker::create(e, this)); + d->rootItemMarker = v; } +} -Q_SIGNALS: - void visibleChanged(bool arg); - void visibilityChanged(QWindow::Visibility visibility); - -protected: - void classBegin() Q_DECL_OVERRIDE { - QQmlEngine* e = qmlEngine(this); - //Give QQuickView behavior when created from QML with QQmlApplicationEngine - if (QCoreApplication::instance()->property("__qml_using_qqmlapplicationengine") == QVariant(true)) { - if (e && !e->incubationController()) - e->setIncubationController(incubationController()); - } - Q_ASSERT(e); - { - QV4::ExecutionEngine *v4 = QQmlEnginePrivate::getV4Engine(e); - QV4::Scope scope(v4); - QV4::ScopedObject v(scope, QV4::QQuickRootItemMarker::create(e, this)); - rootItemMarker = v; - } +void QQuickWindowQmlImpl::componentComplete() +{ + Q_D(QQuickWindowQmlImpl); + d->complete = true; + if (transientParent() && !transientParent()->isVisible()) { + connect(transientParent(), &QQuickWindow::visibleChanged, this, + &QQuickWindowQmlImpl::setWindowVisibility, Qt::QueuedConnection); + } else { + setWindowVisibility(); } +} - void componentComplete() Q_DECL_OVERRIDE { - m_complete = true; - if (transientParent() && !transientParent()->isVisible()) { - connect(transientParent(), &QQuickWindow::visibleChanged, this, - &QQuickWindowQmlImpl::setWindowVisibility, Qt::QueuedConnection); - } else { - setWindowVisibility(); - } +void QQuickWindowQmlImpl::setWindowVisibility() +{ + Q_D(QQuickWindowQmlImpl); + if (transientParent() && !transientParent()->isVisible()) + return; + + if (sender()) { + disconnect(transientParent(), &QWindow::visibleChanged, this, + &QQuickWindowQmlImpl::setWindowVisibility); } -private Q_SLOTS: - void setWindowVisibility() - { - if (transientParent() && !transientParent()->isVisible()) - return; - - if (sender()) { - disconnect(transientParent(), &QWindow::visibleChanged, this, - &QQuickWindowQmlImpl::setWindowVisibility); - } - - // We have deferred window creation until we have the full picture of what - // the user wanted in terms of window state, geometry, visibility, etc. - - if ((m_visibility == Hidden && m_visible) || (m_visibility > AutomaticVisibility && !m_visible)) { - QQmlData *data = QQmlData::get(this); - Q_ASSERT(data && data->context); - - QQmlError error; - error.setObject(this); - - const QQmlContextData* urlContext = data->context; - while (urlContext && urlContext->url.isEmpty()) - urlContext = urlContext->parent; - error.setUrl(urlContext ? urlContext->url : QUrl()); - - QString objectId = data->context->findObjectId(this); - if (!objectId.isEmpty()) - error.setDescription(QCoreApplication::translate("QQuickWindowQmlImpl", - "Conflicting properties 'visible' and 'visibility' for Window '%1'").arg(objectId)); - else - error.setDescription(QCoreApplication::translate("QQuickWindowQmlImpl", - "Conflicting properties 'visible' and 'visibility'")); - - QQmlEnginePrivate::get(data->context->engine)->warning(error); - } - - if (m_visibility == AutomaticVisibility) { - setWindowState(QGuiApplicationPrivate::platformIntegration()->defaultWindowState(flags())); - setVisible(m_visible); - } else { - setVisibility(m_visibility); - } + // We have deferred window creation until we have the full picture of what + // the user wanted in terms of window state, geometry, visibility, etc. + + if ((d->visibility == Hidden && d->visible) || (d->visibility > AutomaticVisibility && !d->visible)) { + QQmlData *data = QQmlData::get(this); + Q_ASSERT(data && data->context); + + QQmlError error; + error.setObject(this); + + const QQmlContextData* urlContext = data->context; + while (urlContext && urlContext->url.isEmpty()) + urlContext = urlContext->parent; + error.setUrl(urlContext ? urlContext->url : QUrl()); + + QString objectId = data->context->findObjectId(this); + if (!objectId.isEmpty()) + error.setDescription(QCoreApplication::translate("QQuickWindowQmlImpl", + "Conflicting properties 'visible' and 'visibility' for Window '%1'").arg(objectId)); + else + error.setDescription(QCoreApplication::translate("QQuickWindowQmlImpl", + "Conflicting properties 'visible' and 'visibility'")); + + QQmlEnginePrivate::get(data->context->engine)->warning(error); } -private: - bool m_complete; - bool m_visible; - Visibility m_visibility; - QV4::PersistentValue rootItemMarker; -}; + if (d->visibility == AutomaticVisibility) { + setWindowState(QGuiApplicationPrivate::platformIntegration()->defaultWindowState(flags())); + setVisible(d->visible); + } else { + setVisibility(d->visibility); + } +} void QQuickWindowModule::defineModule() { @@ -181,8 +180,6 @@ void QQuickWindowModule::defineModule() qmlRegisterUncreatableType(uri, 2, 0, "Screen", QStringLiteral("Screen can only be used via the attached property.")); } -#include "qquickwindowmodule.moc" - QT_END_NAMESPACE QML_DECLARE_TYPEINFO(QQuickWindowQmlImpl, QML_HAS_ATTACHED_PROPERTIES) diff --git a/src/quick/items/qquickwindowmodule_p.h b/src/quick/items/qquickwindowmodule_p.h index 41f263a1ec..d45367982f 100644 --- a/src/quick/items/qquickwindowmodule_p.h +++ b/src/quick/items/qquickwindowmodule_p.h @@ -35,9 +35,45 @@ #define QQUICKWINDOWMODULE_H #include +#include +#include QT_BEGIN_NAMESPACE +class QQuickWindowAttached; +class QQuickWindowQmlImplPrivate; + +class Q_QUICK_PRIVATE_EXPORT QQuickWindowQmlImpl : public QQuickWindow, public QQmlParserStatus +{ + Q_OBJECT + Q_INTERFACES(QQmlParserStatus) + + Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged) + Q_PROPERTY(Visibility visibility READ visibility WRITE setVisibility NOTIFY visibilityChanged) + +public: + QQuickWindowQmlImpl(QWindow *parent = Q_NULLPTR); + + void setVisible(bool visible); + void setVisibility(Visibility visibility); + + static QQuickWindowAttached *qmlAttachedProperties(QObject *object); + +Q_SIGNALS: + void visibleChanged(bool arg); + void visibilityChanged(QWindow::Visibility visibility); + +protected: + void classBegin() Q_DECL_OVERRIDE; + void componentComplete() Q_DECL_OVERRIDE; + +private Q_SLOTS: + void setWindowVisibility(); + +private: + Q_DISABLE_COPY(QQuickWindowQmlImpl) + Q_DECLARE_PRIVATE(QQuickWindowQmlImpl) +}; class Q_QUICK_PRIVATE_EXPORT QQuickWindowModule { -- cgit v1.2.3