diff options
Diffstat (limited to 'src/declarative')
21 files changed, 96 insertions, 66 deletions
diff --git a/src/declarative/extra/qmlsqlconnection.cpp b/src/declarative/extra/qmlsqlconnection.cpp index 3e2032c..7f1fec2 100644 --- a/src/declarative/extra/qmlsqlconnection.cpp +++ b/src/declarative/extra/qmlsqlconnection.cpp @@ -62,7 +62,6 @@ public: int port; QString name, databaseName, connectionOptions; QString hostName, userName, password, driver; - QmlContext *context; }; /*! @@ -177,8 +176,6 @@ public: QmlSqlConnection::QmlSqlConnection(QObject *parent) : QObject(*(new QmlSqlConnectionPrivate), parent) { - Q_D(QmlSqlConnection); - d->context = QmlContext::activeContext(); } /*! @@ -416,10 +413,11 @@ QSqlDatabase QmlSqlConnection::database() const } if (db.isOpen()) return db; - if ((d->driver.isEmpty() || d->driver == QLatin1String("QSQLITE")) && d->context) { + if ((d->driver.isEmpty() || d->driver == QLatin1String("QSQLITE")) && + qmlContext(this)) { // SQLITE uses files for databases, hence use relative pathing // if possible. - QUrl url = d->context->resolvedUrl(d->databaseName); + QUrl url = qmlContext(this)->resolvedUrl(d->databaseName); if (url.isRelative() || url.scheme() == QLatin1String("file")) db.setDatabaseName(url.toLocalFile()); else diff --git a/src/declarative/extra/qmlxmllistmodel.cpp b/src/declarative/extra/qmlxmllistmodel.cpp index 13faab2..44787b5 100644 --- a/src/declarative/extra/qmlxmllistmodel.cpp +++ b/src/declarative/extra/qmlxmllistmodel.cpp @@ -87,7 +87,7 @@ class QmlXmlListModelPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QmlXmlListModel) public: - QmlXmlListModelPrivate() : size(-1), highestRole(Qt::UserRole), reply(0), context(0), roleObjects(this) {} + QmlXmlListModelPrivate() : size(-1), highestRole(Qt::UserRole), reply(0), roleObjects(this) {} QString src; QString query; @@ -100,7 +100,6 @@ public: QNetworkReply *reply; mutable QByteArray xml; QString prefix; - QmlContext *context; struct RoleList : public QmlConcreteList<XmlListModelRole *> { @@ -144,7 +143,6 @@ QmlXmlListModel::QmlXmlListModel(QObject *parent) : QListModelInterface(*(new QmlXmlListModelPrivate), parent) { Q_D(QmlXmlListModel); - d->context = QmlContext::activeContext(); } QmlXmlListModel::~QmlXmlListModel() @@ -249,7 +247,7 @@ void QmlXmlListModel::fetch() QNetworkRequest req((QUrl(d->src))); req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); - d->reply = d->context->engine()->networkAccessManager()->get(req); + d->reply = qmlContext(this)->engine()->networkAccessManager()->get(req); QObject::connect(d->reply, SIGNAL(finished()), this, SLOT(requestFinished())); } diff --git a/src/declarative/fx/qfxhighlightfilter.cpp b/src/declarative/fx/qfxhighlightfilter.cpp index d1ff3d3..d99b9e5 100644 --- a/src/declarative/fx/qfxhighlightfilter.cpp +++ b/src/declarative/fx/qfxhighlightfilter.cpp @@ -56,10 +56,8 @@ class QFxHighlightFilterPrivate { public: QFxHighlightFilterPrivate() - : ctxt(QmlContext::activeContext()), - xOffset(0), yOffset(0), tiled(false) {} + : xOffset(0), yOffset(0), tiled(false) {} - QmlContext *ctxt; QString source; QUrl url; int xOffset; @@ -147,12 +145,12 @@ void QFxHighlightFilter::setSource(const QString &f) if(!d->source.isEmpty()) QFxPixmap::cancelGet(d->url, this, SLOT(imageLoaded())); d->source = f; - d->url = QmlContext::activeContext()->resolvedUrl(f); + d->url = qmlContext(this)->resolvedUrl(f); #if defined(QFX_RENDER_OPENGL2) d->tex.clear(); #endif if(!f.isEmpty()) - QFxPixmap::get(d->ctxt->engine(), d->url, this, SLOT(imageLoaded())); + QFxPixmap::get(qmlEngine(this), d->url, this, SLOT(imageLoaded())); else emit sourceChanged(d->source); } diff --git a/src/declarative/fx/qfxitem.cpp b/src/declarative/fx/qfxitem.cpp index 0ee734b..6e8a07d 100644 --- a/src/declarative/fx/qfxitem.cpp +++ b/src/declarative/fx/qfxitem.cpp @@ -1987,8 +1987,7 @@ void QFxItem::transformChanged(const QSimpleCanvas::Matrix &) */ QmlContext *QFxItem::itemContext() const { - Q_D(const QFxItem); - return d->_ctxt; + return QmlEngine::contextForObject(this); } QmlStateGroup *QFxItemPrivate::states() diff --git a/src/declarative/fx/qfxitem_p.h b/src/declarative/fx/qfxitem_p.h index 1266711..71fc912 100644 --- a/src/declarative/fx/qfxitem_p.h +++ b/src/declarative/fx/qfxitem_p.h @@ -84,7 +84,6 @@ public: void init(QFxItem *parent) { Q_Q(QFxItem); - _ctxt = QmlContext::activeContext(); if(parent) q->setItemParent(parent); @@ -92,7 +91,6 @@ public: q->setAcceptedMouseButtons(Qt::NoButton); } - QmlContext *_ctxt; QString _id; // data property diff --git a/src/declarative/fx/qfxvisualitemmodel.cpp b/src/declarative/fx/qfxvisualitemmodel.cpp index 145e750..dc68026 100644 --- a/src/declarative/fx/qfxvisualitemmodel.cpp +++ b/src/declarative/fx/qfxvisualitemmodel.cpp @@ -285,7 +285,7 @@ QFxVisualItemModelData *QFxVisualItemModelPrivate::data(QObject *item) } QFxVisualItemModel::QFxVisualItemModel() -: QObject(*(new QFxVisualItemModelPrivate(QmlContext::activeContext()))) +: QObject(*(new QFxVisualItemModelPrivate(0))) { } @@ -489,7 +489,9 @@ QFxItem *QFxVisualItemModel::item(int index, const QByteArray &viewId, bool comp if(d->m_cache.contains(index)) { nobj = d->m_cache[index]; } else { - QmlContext *ctxt = new QmlContext(d->m_context); + QmlContext *ccontext = d->m_context; + if(!ccontext) ccontext = qmlContext(this); + QmlContext *ctxt = new QmlContext(ccontext); QFxVisualItemModelData *data = new QFxVisualItemModelData(index, d); ctxt->setContextProperty(QLatin1String("model"), data); ctxt->addDefaultObject(data); @@ -545,7 +547,9 @@ QVariant QFxVisualItemModel::evaluate(int index, const QString &expression, QObj value = e.value(); } } else { - QmlContext *ctxt = new QmlContext(d->m_context); + QmlContext *ccontext = d->m_context; + if(!ccontext) ccontext = qmlContext(this); + QmlContext *ctxt = new QmlContext(ccontext); QFxVisualItemModelData *data = new QFxVisualItemModelData(index, d); ctxt->addDefaultObject(data); QmlExpression e(ctxt, expression, objectContext); diff --git a/src/declarative/qml/qml.h b/src/declarative/qml/qml.h index bf7b6bc..fb288b7 100644 --- a/src/declarative/qml/qml.h +++ b/src/declarative/qml/qml.h @@ -88,6 +88,11 @@ QT_MODULE(Declarative) #define QML_DEFINE_NOCREATE_TYPE(TYPE) \ template<> QmlPrivate::InstanceType QmlPrivate::Define<TYPE *>::instance(qmlRegisterType<TYPE>(#TYPE)); +class QmlContext; +class QmlEngine; +Q_DECLARATIVE_EXPORT QmlContext *qmlContext(const QObject *); +Q_DECLARATIVE_EXPORT QmlEngine *qmlEngine(const QObject *); + QML_DECLARE_TYPE(QObject); Q_DECLARE_METATYPE(QVariant); diff --git a/src/declarative/qml/qmlcompiler.cpp b/src/declarative/qml/qmlcompiler.cpp index f03ce20..5436227 100644 --- a/src/declarative/qml/qmlcompiler.cpp +++ b/src/declarative/qml/qmlcompiler.cpp @@ -1647,12 +1647,15 @@ QmlCompiledData &QmlCompiledData::operator=(const QmlCompiledData &other) return *this; } -QObject *QmlCompiledData::TypeReference::createInstance() const +QObject *QmlCompiledData::TypeReference::createInstance(QmlContext *ctxt) const { if(type) { - return type->create(); + QObject *rv = type->create(); + if(rv) + QmlEngine::setContextForObject(rv, ctxt); + return rv; } else if(component) { - return component->create(QmlContext::activeContext()); + return component->create(ctxt); } else { return 0; } diff --git a/src/declarative/qml/qmlcompiler_p.h b/src/declarative/qml/qmlcompiler_p.h index 754e284..286cda8 100644 --- a/src/declarative/qml/qmlcompiler_p.h +++ b/src/declarative/qml/qmlcompiler_p.h @@ -54,6 +54,7 @@ class QmlXmlParser; class QmlEngine; class QmlComponent; class QmlCompiledComponent; +class QmlContext; namespace QmlParser { class Object; @@ -83,7 +84,7 @@ public: QmlCustomParser *parser; QmlRefCount *ref; - QObject *createInstance() const; + QObject *createInstance(QmlContext *) const; }; QList<TypeReference> types; struct CustomTypeData diff --git a/src/declarative/qml/qmlcontext.cpp b/src/declarative/qml/qmlcontext.cpp index 104f460..40e33c2 100644 --- a/src/declarative/qml/qmlcontext.cpp +++ b/src/declarative/qml/qmlcontext.cpp @@ -96,6 +96,8 @@ void QmlContextPrivate::init() else scopeChain = parent->d_func()->scopeChain; scopeChain.prepend(scopeObj); + + contextData.context = q; } void QmlContextPrivate::addDefaultObject(QObject *object, Priority priority) diff --git a/src/declarative/qml/qmlcontext_p.h b/src/declarative/qml/qmlcontext_p.h index 8c51a6b..aa0bf3e 100644 --- a/src/declarative/qml/qmlcontext_p.h +++ b/src/declarative/qml/qmlcontext_p.h @@ -81,6 +81,13 @@ public: NormalPriority }; void addDefaultObject(QObject *, Priority); + + class ContextData : public QDeclarativeData + { + public: + QmlContext *context; + }; + ContextData contextData; }; QT_END_NAMESPACE diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp index 5cbd02b..66c41f2 100644 --- a/src/declarative/qml/qmlengine.cpp +++ b/src/declarative/qml/qmlengine.cpp @@ -42,6 +42,7 @@ #include <QMetaProperty> #include <private/qmlengine_p.h> #include <private/qmlcontext_p.h> +#include <private/qobject_p.h> #ifdef QT_SCRIPTTOOLS_LIB #include <QScriptEngineDebugger> @@ -595,6 +596,38 @@ QNetworkAccessManager *QmlEngine::networkAccessManager() const return d->networkAccessManager; } +QmlContext *QmlEngine::contextForObject(const QObject *object) +{ + QObjectPrivate *priv = QObjectPrivate::get(const_cast<QObject *>(object)); + if(priv->declarativeData) { + return static_cast<QmlContextPrivate::ContextData *>(priv->declarativeData)->context; + } else { + return 0; + } +} + +QmlContext *qmlContext(const QObject *obj) +{ + return QmlEngine::contextForObject(obj); +} + +QmlEngine *qmlEngine(const QObject *obj) +{ + QmlContext *context = QmlEngine::contextForObject(obj); + return context?context->engine():0; +} + + +void QmlEngine::setContextForObject(QObject *object, QmlContext *context) +{ + QObjectPrivate *priv = QObjectPrivate::get(object); + if(priv->declarativeData) { + qWarning("QmlEngine::setContextForObject(): Object already has a QmlContext"); + return; + } + priv->declarativeData = &context->d_func()->contextData; +} + /*! \internal */ QScriptEngine *QmlEngine::scriptEngine() { diff --git a/src/declarative/qml/qmlengine.h b/src/declarative/qml/qmlengine.h index 086595a..fde84d4 100644 --- a/src/declarative/qml/qmlengine.h +++ b/src/declarative/qml/qmlengine.h @@ -81,6 +81,8 @@ public: void setNetworkAccessManager(QNetworkAccessManager *); QNetworkAccessManager *networkAccessManager() const; + static QmlContext *contextForObject(const QObject *); + static void setContextForObject(QObject *, QmlContext *); private: // LK: move to the private class QScriptEngine *scriptEngine(); diff --git a/src/declarative/qml/qmlvme.cpp b/src/declarative/qml/qmlvme.cpp index 966ef8a..b6d9173 100644 --- a/src/declarative/qml/qmlvme.cpp +++ b/src/declarative/qml/qmlvme.cpp @@ -253,7 +253,7 @@ QObject *QmlVME::run(QmlContext *ctxt, QmlCompiledComponent *comp, int start, in #ifdef Q_ENABLE_PERFORMANCE_LOG QFxCompilerTimer<QFxCompiler::InstrCreateObject> cc; #endif - QObject *o = types.at(instr.create.type).createInstance(); + QObject *o = types.at(instr.create.type).createInstance(QmlContext::activeContext()); if(!o) VME_EXCEPTION("Unable to create object of type" << types.at(instr.create.type).className); @@ -276,6 +276,7 @@ QObject *QmlVME::run(QmlContext *ctxt, QmlCompiledComponent *comp, int start, in QObject *o = QmlMetaType::toQObject(v); if(!o) VME_EXCEPTION("Unable to create" << types.at(instr.create.type).className); + QmlEngine::setContextForObject(o, QmlContext::activeContext()); if(!stack.isEmpty()) { QObject *parent = stack.top(); diff --git a/src/declarative/util/qmlanimation.cpp b/src/declarative/util/qmlanimation.cpp index ede4008..3be714a 100644 --- a/src/declarative/util/qmlanimation.cpp +++ b/src/declarative/util/qmlanimation.cpp @@ -1004,7 +1004,7 @@ void QmlRunScriptActionPrivate::execute() } if(!scriptStr.isEmpty()) { - QmlExpression expr(ctxt, scriptStr, q); + QmlExpression expr(qmlContext(q), scriptStr, q); expr.setTrackChange(false); expr.value(); } diff --git a/src/declarative/util/qmlanimation_p.h b/src/declarative/util/qmlanimation_p.h index db7cb18..e07fa78 100644 --- a/src/declarative/util/qmlanimation_p.h +++ b/src/declarative/util/qmlanimation_p.h @@ -225,13 +225,12 @@ class QmlRunScriptActionPrivate : public QmlAbstractAnimationPrivate Q_DECLARE_PUBLIC(QmlRunScriptAction); public: QmlRunScriptActionPrivate() - : QmlAbstractAnimationPrivate(), ctxt(QmlContext::activeContext()), proxy(this), rsa(0) {} + : QmlAbstractAnimationPrivate(), proxy(this), rsa(0) {} void init(); QString script; QString file; - QmlContext* ctxt; void execute(); diff --git a/src/declarative/util/qmlbehaviour.cpp b/src/declarative/util/qmlbehaviour.cpp index 3169f63..3fff06c 100644 --- a/src/declarative/util/qmlbehaviour.cpp +++ b/src/declarative/util/qmlbehaviour.cpp @@ -76,14 +76,13 @@ class QmlBehaviourPrivate : public QObjectPrivate { public: QmlBehaviourPrivate() - : context(0), oldContext(0), valueData(0), operations(this) {} + : context(0), valueData(0), operations(this) {} QmlMetaProperty property; QVariant currentValue; QVariant fromValue; QVariant toValue; QmlContext *context; - QmlContext *oldContext; QmlBehaviourData *valueData; class AnimationList : public QmlConcreteList<QmlAbstractAnimation *> { @@ -123,8 +122,6 @@ QmlBehaviour::QmlBehaviour(QObject *parent) { Q_D(QmlBehaviour); d->valueData = new QmlBehaviourData(this); - d->context = new QmlContext(QmlContext::activeContext(), this); - d->context->addDefaultObject(d->valueData); d->group = new QSequentialAnimationGroup(this); } @@ -234,6 +231,10 @@ void QmlBehaviour::setTarget(const QmlMetaProperty &property) void QmlBehaviour::classBegin() { Q_D(QmlBehaviour); + if(!d->context) { + d->context = new QmlContext(qmlContext(this), this); + d->context->addDefaultObject(d->valueData); + } d->context->activate(); } diff --git a/src/declarative/util/qmlconnection.cpp b/src/declarative/util/qmlconnection.cpp index df45a31..b2fd450 100644 --- a/src/declarative/util/qmlconnection.cpp +++ b/src/declarative/util/qmlconnection.cpp @@ -51,9 +51,8 @@ QT_BEGIN_NAMESPACE class QmlConnectionPrivate : public QObjectPrivate { public: - QmlConnectionPrivate() : ctxt(0), boundsignal(0), signalSender(0), componentcomplete(false) {} + QmlConnectionPrivate() : boundsignal(0), signalSender(0), componentcomplete(false) {} - QmlContext *ctxt; QmlBoundSignal *boundsignal; QObject *signalSender; QString script; @@ -112,8 +111,6 @@ public: QmlConnection::QmlConnection(QObject *parent) : QObject(*(new QmlConnectionPrivate), parent) { - Q_D(QmlConnection); - d->ctxt = QmlContext::activeContext(); } QmlConnection::~QmlConnection() @@ -192,9 +189,9 @@ void QmlConnection::connectIfValid() } if (sigparams.isEmpty()) - d->boundsignal = new QmlBoundSignal(d->ctxt, d->script, sender, sigIdx, this); + d->boundsignal = new QmlBoundSignal(qmlContext(this), d->script, sender, sigIdx, this); else - d->boundsignal = new QmlBoundSignalProxy(new QmlContext(d->ctxt,this), d->script, sender, sigIdx, this); + d->boundsignal = new QmlBoundSignalProxy(new QmlContext(qmlContext(this),this), d->script, sender, sigIdx, this); } } diff --git a/src/declarative/util/qmllistmodel.cpp b/src/declarative/util/qmllistmodel.cpp index 992185a..24f2d5c 100644 --- a/src/declarative/util/qmllistmodel.cpp +++ b/src/declarative/util/qmllistmodel.cpp @@ -537,7 +537,6 @@ ModelNode::~ModelNode() struct ListModelData { int dataOffset; - int id; int instrCount; ListInstruction *instructions() const { return (ListInstruction *)((char *)this + sizeof(ListModelData)); } }; @@ -546,7 +545,6 @@ QByteArray ListModelParser::compile(QXmlStreamReader& reader, bool *ok) { *ok = true; - QByteArray id; QByteArray data; QList<ListInstruction> instr; int depth=0; @@ -649,10 +647,6 @@ QByteArray ListModelParser::compile(QXmlStreamReader& reader, bool *ok) rv.resize(size); ListModelData *lmd = (ListModelData *)rv.data(); - if(id.count()) - lmd->id = 0; - else - lmd->id = -1; lmd->dataOffset = sizeof(ListModelData) + instr.count() * sizeof(ListInstruction); lmd->instrCount = instr.count(); @@ -709,11 +703,6 @@ QVariant ListModelParser::create(const QByteArray &d) } } - if(lmd->id != -1) { - QmlContext *ctxt = QmlContext::activeContext(); - ctxt->setContextProperty(QLatin1String(data + lmd->id), rv); - } - return QVariant::fromValue(rv); } diff --git a/src/declarative/util/qmlscript.cpp b/src/declarative/util/qmlscript.cpp index 859e21e..73c8c07 100644 --- a/src/declarative/util/qmlscript.cpp +++ b/src/declarative/util/qmlscript.cpp @@ -65,7 +65,7 @@ class QmlScriptPrivate : public QObjectPrivate Q_DECLARE_PUBLIC(QmlScript); public: - QmlScriptPrivate() : reply(0), ctxt(0) {} + QmlScriptPrivate() : reply(0) {} void addScriptToEngine(const QString &, const QString &fileName=QString()); @@ -73,7 +73,6 @@ public: QString source; QNetworkReply *reply; QUrl url; - QmlContext *ctxt; }; /*! @@ -106,8 +105,6 @@ public: QML_DEFINE_TYPE(QmlScript,Script); QmlScript::QmlScript(QObject *parent) : QObject(*(new QmlScriptPrivate), parent) { - Q_D(QmlScript); - d->ctxt = QmlContext::activeContext(); } /*! @@ -154,10 +151,10 @@ void QmlScript::setSource(const QString &source) if (d->source == source) return; d->source = source; - d->url = d->ctxt->resolvedUrl(source); + d->url = qmlContext(this)->resolvedUrl(source); QNetworkRequest req(d->url); req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); - d->reply = d->ctxt->engine()->networkAccessManager()->get(req); + d->reply = qmlEngine(this)->networkAccessManager()->get(req); QObject::connect(d->reply, SIGNAL(finished()), this, SLOT(replyFinished())); } @@ -176,7 +173,8 @@ void QmlScript::replyFinished() void QmlScriptPrivate::addScriptToEngine(const QString &script, const QString &fileName) { Q_Q(QmlScript); - QmlEngine *engine = ctxt->engine(); + QmlEngine *engine = qmlEngine(q); + QmlContext *context = qmlContext(q); QScriptEngine *scriptEngine = engine->scriptEngine(); QScriptContext *currentContext = engine->scriptEngine()->currentContext(); @@ -186,11 +184,11 @@ void QmlScriptPrivate::addScriptToEngine(const QString &script, const QString &f for (int i = 0; i < oldScopeChain.size(); ++i) { currentContext->popScope(); } - for (int i = ctxt->d_func()->scopeChain.size() - 1; i > -1; --i) { - currentContext->pushScope(ctxt->d_func()->scopeChain.at(i)); + for (int i = context->d_func()->scopeChain.size() - 1; i > -1; --i) { + currentContext->pushScope(context->d_func()->scopeChain.at(i)); } - currentContext->setActivationObject(ctxt->d_func()->scopeChain.at(0)); + currentContext->setActivationObject(context->d_func()->scopeChain.at(0)); QScriptValue val = scriptEngine->evaluate(script, fileName); if (scriptEngine->hasUncaughtException()) { @@ -209,7 +207,7 @@ void QmlScriptPrivate::addScriptToEngine(const QString &script, const QString &f currentContext->setActivationObject(oldact); - for (int i = 0; i < ctxt->d_func()->scopeChain.size(); ++i) + for (int i = 0; i < context->d_func()->scopeChain.size(); ++i) currentContext->popScope(); for (int i = oldScopeChain.size() - 1; i > -1; --i) diff --git a/src/declarative/util/qmlstateoperations.cpp b/src/declarative/util/qmlstateoperations.cpp index a8779f9..594e6fa 100644 --- a/src/declarative/util/qmlstateoperations.cpp +++ b/src/declarative/util/qmlstateoperations.cpp @@ -137,9 +137,8 @@ QmlStateOperation::ActionList QmlParentChange::actions() class QmlRunScriptPrivate : public QObjectPrivate { public: - QmlRunScriptPrivate() : ctxt(0) {} + QmlRunScriptPrivate() {} - QmlContext *ctxt; QString script; QString name; }; @@ -152,8 +151,6 @@ QML_DEFINE_TYPE(QmlRunScript,RunScript); QmlRunScript::QmlRunScript(QObject *parent) : QmlStateOperation(*(new QmlRunScriptPrivate), parent) { - Q_D(QmlRunScript); - d->ctxt = QmlContext::activeContext(); } QmlRunScript::~QmlRunScript() @@ -192,7 +189,7 @@ void QmlRunScript::execute() { Q_D(QmlRunScript); if(!d->script.isEmpty()) { - QmlExpression expr(d->ctxt, d->script, this); + QmlExpression expr(qmlContext(this), d->script, this); expr.setTrackChange(false); expr.value(); } |