From 2c0907297938e1c948774b0e02b9ee6a26c3984b Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Mon, 11 May 2009 11:43:56 +1000 Subject: Lower case role names are needed. --- src/corelib/kernel/qabstractitemmodel.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/corelib/kernel/qabstractitemmodel.cpp b/src/corelib/kernel/qabstractitemmodel.cpp index a23c137..00a3306 100644 --- a/src/corelib/kernel/qabstractitemmodel.cpp +++ b/src/corelib/kernel/qabstractitemmodel.cpp @@ -471,12 +471,12 @@ const QHash &QAbstractItemModelPrivate::defaultRoleNames() { static QHash roleNames; if (roleNames.isEmpty()) { - roleNames[Qt::DisplayRole] = "Display"; - roleNames[Qt::DecorationRole] = "Decoration"; - roleNames[Qt::EditRole] = "Edit"; - roleNames[Qt::ToolTipRole] = "ToolTip"; - roleNames[Qt::StatusTipRole] = "StatusTip"; - roleNames[Qt::WhatsThisRole] = "WhatsThis"; + roleNames[Qt::DisplayRole] = "display"; + roleNames[Qt::DecorationRole] = "decoration"; + roleNames[Qt::EditRole] = "edit"; + roleNames[Qt::ToolTipRole] = "toolTip"; + roleNames[Qt::StatusTipRole] = "statusTip"; + roleNames[Qt::WhatsThisRole] = "whatsThis"; } return roleNames; @@ -1859,6 +1859,7 @@ void QAbstractItemModel::setRoleNames(const QHash &roleNames) const QHash &QAbstractItemModel::roleNames() const { Q_D(const QAbstractItemModel); + qDebug() << "roles" << d->roleNames; return d->roleNames; } -- cgit v0.12 From 5c69031b23f349d199ed43e484a608a2b691bb95 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Mon, 11 May 2009 11:56:34 +1000 Subject: When a QmlContext is destroyed, associated objects must be disassociated --- src/declarative/qml/qmlcontext.cpp | 12 ++++++++++++ src/declarative/qml/qmlcontext.h | 1 + src/declarative/qml/qmlcontext_p.h | 1 + src/declarative/qml/qmldeclarativedata_p.h | 1 + src/declarative/qml/qmlengine.cpp | 14 ++++++++++---- 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/declarative/qml/qmlcontext.cpp b/src/declarative/qml/qmlcontext.cpp index dfcf413..16399bc 100644 --- a/src/declarative/qml/qmlcontext.cpp +++ b/src/declarative/qml/qmlcontext.cpp @@ -231,6 +231,18 @@ QmlContext::QmlContext(QmlContext *parentContext, QObject *parent) */ QmlContext::~QmlContext() { + Q_D(QmlContext); + for(int ii = 0; ii < d->contextObjects.count(); ++ii) { + QObjectPrivate *p = QObjectPrivate::get(d->contextObjects.at(ii)); + QmlSimpleDeclarativeData *data = + static_cast(p->declarativeData); + if(data && (data->flags & QmlSimpleDeclarativeData::Extended)) { + data->context = 0; + } else { + p->declarativeData = 0; + } + } + d->contextObjects.clear(); } diff --git a/src/declarative/qml/qmlcontext.h b/src/declarative/qml/qmlcontext.h index 39d565a..935c7ca 100644 --- a/src/declarative/qml/qmlcontext.h +++ b/src/declarative/qml/qmlcontext.h @@ -95,6 +95,7 @@ private: friend class QmlComponent; friend class QmlScriptPrivate; friend class QmlBoundSignalProxy; + friend class QmlSimpleDeclarativeData; QmlContext(QmlEngine *); }; diff --git a/src/declarative/qml/qmlcontext_p.h b/src/declarative/qml/qmlcontext_p.h index d7c6d29..9faa7b7 100644 --- a/src/declarative/qml/qmlcontext_p.h +++ b/src/declarative/qml/qmlcontext_p.h @@ -88,6 +88,7 @@ public: void addDefaultObject(QObject *, Priority); QmlSimpleDeclarativeData contextData; + QObjectList contextObjects; }; QT_END_NAMESPACE diff --git a/src/declarative/qml/qmldeclarativedata_p.h b/src/declarative/qml/qmldeclarativedata_p.h index a934442..fb7a015 100644 --- a/src/declarative/qml/qmldeclarativedata_p.h +++ b/src/declarative/qml/qmldeclarativedata_p.h @@ -51,6 +51,7 @@ class QmlSimpleDeclarativeData : public QDeclarativeData public: QmlSimpleDeclarativeData() : flags(0), context(0) {} + virtual void destroyed(QObject *); enum Flag { Extended = 0x00000001 }; quint32 flags; QmlContext *context; diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp index f0ec334..fc209c6 100644 --- a/src/declarative/qml/qmlengine.cpp +++ b/src/declarative/qml/qmlengine.cpp @@ -659,11 +659,10 @@ void QmlEngine::setContextForObject(QObject *object, QmlContext *context) if (!data) { priv->declarativeData = &context->d_func()->contextData; } else { - // ### - Don't have to use extended data here - QmlExtendedDeclarativeData *data = new QmlExtendedDeclarativeData; data->context = context; - priv->declarativeData = data; } + + context->d_func()->contextObjects.append(object); } QmlContext *qmlContext(const QObject *obj) @@ -713,8 +712,15 @@ QObject *qmlAttachedPropertiesObjectById(int id, const QObject *object) return rv; } -void QmlExtendedDeclarativeData::destroyed(QObject *) +void QmlSimpleDeclarativeData::destroyed(QObject *object) +{ + if (context) + context->d_func()->contextObjects.removeAll(object); +} + +void QmlExtendedDeclarativeData::destroyed(QObject *object) { + QmlSimpleDeclarativeData::destroyed(object); delete this; } -- cgit v0.12 From b9f263eb1e5871ed724452e7454b8414e554ead6 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Mon, 11 May 2009 12:13:04 +1000 Subject: Clean up QmlContext's and QmlExpression's when a context gets deleted --- src/declarative/qml/qmlcontext.cpp | 34 +++++++++++++++++++++++++++++++++- src/declarative/qml/qmlcontext_p.h | 5 +++++ src/declarative/qml/qmlengine.cpp | 12 ++++++++++-- src/declarative/qml/qmlexpression.h | 1 + 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/declarative/qml/qmlcontext.cpp b/src/declarative/qml/qmlcontext.cpp index 16399bc..df5f90e 100644 --- a/src/declarative/qml/qmlcontext.cpp +++ b/src/declarative/qml/qmlcontext.cpp @@ -86,6 +86,10 @@ void QmlContextPrivate::destroyed(QObject *obj) void QmlContextPrivate::init() { Q_Q(QmlContext); + + if (parent) + parent->d_func()->childContexts.insert(q); + //set scope chain QScriptEngine *scriptEngine = engine->scriptEngine(); QScriptValue scopeObj = @@ -232,7 +236,24 @@ QmlContext::QmlContext(QmlContext *parentContext, QObject *parent) QmlContext::~QmlContext() { Q_D(QmlContext); - for(int ii = 0; ii < d->contextObjects.count(); ++ii) { + if (d->parent) + d->parent->d_func()->childContexts.remove(this); + + for (QSet::ConstIterator iter = d->childContexts.begin(); + iter != d->childContexts.end(); + ++iter) { + (*iter)->d_func()->invalidateEngines(); + (*iter)->d_func()->parent = 0; + } + + for (QSet::ConstIterator iter = + d->childExpressions.begin(); + iter != d->childExpressions.end(); + ++iter) { + (*iter)->d->ctxt = 0; + } + + for (int ii = 0; ii < d->contextObjects.count(); ++ii) { QObjectPrivate *p = QObjectPrivate::get(d->contextObjects.at(ii)); QmlSimpleDeclarativeData *data = static_cast(p->declarativeData); @@ -245,6 +266,17 @@ QmlContext::~QmlContext() d->contextObjects.clear(); } +void QmlContextPrivate::invalidateEngines() +{ + if (!engine) + return; + engine = 0; + for (QSet::ConstIterator iter = childContexts.begin(); + iter != childContexts.end(); + ++iter) { + (*iter)->d_func()->invalidateEngines(); + } +} /*! Return the context's QmlEngine, or 0 if the context has no QmlEngine or the diff --git a/src/declarative/qml/qmlcontext_p.h b/src/declarative/qml/qmlcontext_p.h index 9faa7b7..c265474 100644 --- a/src/declarative/qml/qmlcontext_p.h +++ b/src/declarative/qml/qmlcontext_p.h @@ -47,6 +47,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE class QmlContext; @@ -87,6 +88,10 @@ public: }; void addDefaultObject(QObject *, Priority); + void invalidateEngines(); + QSet childContexts; + QSet childExpressions; + QmlSimpleDeclarativeData contextData; QObjectList contextObjects; }; diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp index fc209c6..c39a0d5 100644 --- a/src/declarative/qml/qmlengine.cpp +++ b/src/declarative/qml/qmlengine.cpp @@ -805,6 +805,8 @@ QmlExpression::QmlExpression(QmlContext *ctxt, void *expr, d->ctxt = ctxt; if(ctxt && ctxt->engine()) d->id = ctxt->engine()->d_func()->getUniqueId(); + if(ctxt) + ctxt->d_func()->childExpressions.insert(this); d->me = me; } @@ -816,6 +818,8 @@ QmlExpression::QmlExpression(QmlContext *ctxt, const QString &expr, d->ctxt = ctxt; if(ctxt && ctxt->engine()) d->id = ctxt->engine()->d_func()->getUniqueId(); + if(ctxt) + ctxt->d_func()->childExpressions.insert(this); d->me = me; } @@ -833,6 +837,8 @@ QmlExpression::QmlExpression(QmlContext *ctxt, const QString &expression, d->ctxt = ctxt; if(ctxt && ctxt->engine()) d->id = ctxt->engine()->d_func()->getUniqueId(); + if(ctxt) + ctxt->d_func()->childExpressions.insert(this); d->me = scope; } @@ -841,6 +847,8 @@ QmlExpression::QmlExpression(QmlContext *ctxt, const QString &expression, */ QmlExpression::~QmlExpression() { + if (d->ctxt) + d->ctxt->d_func()->childExpressions.remove(this); delete d; d = 0; } @@ -850,7 +858,7 @@ QmlExpression::~QmlExpression() */ QmlEngine *QmlExpression::engine() const { - return d->ctxt->engine(); + return d->ctxt?d->ctxt->engine():0; } /*! @@ -927,7 +935,7 @@ void BindExpressionProxy::changed() QVariant QmlExpression::value() { QVariant rv; - if (!d->ctxt || (!d->sse.isValid() && d->expression.isEmpty())) + if (!d->ctxt || !engine() || (!d->sse.isValid() && d->expression.isEmpty())) return rv; #ifdef Q_ENABLE_PERFORMANCE_LOG diff --git a/src/declarative/qml/qmlexpression.h b/src/declarative/qml/qmlexpression.h index bb6980a..2c6b1ad 100644 --- a/src/declarative/qml/qmlexpression.h +++ b/src/declarative/qml/qmlexpression.h @@ -87,6 +87,7 @@ protected: private: friend class BindExpressionProxy; friend class QmlDebugger; + friend class QmlContext; QmlExpressionPrivate *d; }; -- cgit v0.12 From 9edfcd1ecd905ca27fbe9f241e37ab5fb204f89a Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Mon, 11 May 2009 13:10:28 +1000 Subject: Update repaint region when removing items --- src/declarative/canvas/qsimplecanvasitem.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/declarative/canvas/qsimplecanvasitem.cpp b/src/declarative/canvas/qsimplecanvasitem.cpp index ba33a41..90ee688 100644 --- a/src/declarative/canvas/qsimplecanvasitem.cpp +++ b/src/declarative/canvas/qsimplecanvasitem.cpp @@ -1332,6 +1332,7 @@ QSimpleCanvasItem::~QSimpleCanvasItem() parent()->remChild(this); delete d->graphicsItem; } else { + update(); setOptions(MouseFilter, false); if (d->canvas){ -- cgit v0.12 From 8bb9edaeda5e14df3402c5990a0630a664048ac9 Mon Sep 17 00:00:00 2001 From: Yann Bodson Date: Mon, 11 May 2009 13:15:05 +1000 Subject: Compile --- src/declarative/qml/qmlcontext_p.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/declarative/qml/qmlcontext_p.h b/src/declarative/qml/qmlcontext_p.h index c265474..99dc669 100644 --- a/src/declarative/qml/qmlcontext_p.h +++ b/src/declarative/qml/qmlcontext_p.h @@ -51,6 +51,7 @@ QT_BEGIN_NAMESPACE class QmlContext; +class QmlExpression; class QmlEngine; class QmlCompiledComponent; -- cgit v0.12 From 865c022c2df25496055de897f37f8206cb4fc730 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Mon, 11 May 2009 13:21:05 +1000 Subject: d-pointerize QmlOpenMetaObject --- src/declarative/fx/qfxvisualitemmodel.cpp | 1 + src/declarative/qml/qmlcontext_p.h | 1 + src/declarative/util/qmlopenmetaobject.cpp | 120 +++++++++++++++++------------ src/declarative/util/qmlopenmetaobject.h | 17 ++-- 4 files changed, 78 insertions(+), 61 deletions(-) diff --git a/src/declarative/fx/qfxvisualitemmodel.cpp b/src/declarative/fx/qfxvisualitemmodel.cpp index 9428281..61f08de 100644 --- a/src/declarative/fx/qfxvisualitemmodel.cpp +++ b/src/declarative/fx/qfxvisualitemmodel.cpp @@ -47,6 +47,7 @@ #include "qhash.h" #include "qlist.h" #include "private/qobject_p.h" +#include "private/qmetaobjectbuilder_p.h" #include "qmlopenmetaobject.h" #include "qmllistaccessor.h" #include "qfxvisualitemmodel.h" diff --git a/src/declarative/qml/qmlcontext_p.h b/src/declarative/qml/qmlcontext_p.h index c265474..97a816c 100644 --- a/src/declarative/qml/qmlcontext_p.h +++ b/src/declarative/qml/qmlcontext_p.h @@ -52,6 +52,7 @@ QT_BEGIN_NAMESPACE class QmlContext; class QmlEngine; +class QmlExpression; class QmlCompiledComponent; class QmlContextPrivate : public QObjectPrivate diff --git a/src/declarative/util/qmlopenmetaobject.cpp b/src/declarative/util/qmlopenmetaobject.cpp index fc20fa9..d0dd817 100644 --- a/src/declarative/util/qmlopenmetaobject.cpp +++ b/src/declarative/util/qmlopenmetaobject.cpp @@ -40,102 +40,124 @@ ****************************************************************************/ #include "qmlopenmetaobject.h" +#include "private/qmetaobjectbuilder_p.h" #include QT_BEGIN_NAMESPACE + +class QmlOpenMetaObjectPrivate +{ +public: + QmlOpenMetaObjectPrivate() : parent(0), mem(0) {} + + bool autoCreate; + QAbstractDynamicMetaObject *parent; + int propertyOffset; + int signalOffset; + QList data; + QHash names; + QMetaObjectBuilder mob; + QMetaObject *mem; + QObject *object; +}; + QmlOpenMetaObject::QmlOpenMetaObject(QObject *obj, bool automatic) -: autoCreate(automatic), parent(0), mem(0), _object(obj) +: d(new QmlOpenMetaObjectPrivate) { - mob.setSuperClass(obj->metaObject()); - mob.setClassName(obj->metaObject()->className()); - mob.setFlags(QMetaObjectBuilder::DynamicMetaObject); + d->autoCreate = automatic; + d->object = obj; + + d->mob.setSuperClass(obj->metaObject()); + d->mob.setClassName(obj->metaObject()->className()); + d->mob.setFlags(QMetaObjectBuilder::DynamicMetaObject); QObjectPrivate *op = QObjectPrivate::get(obj); if (op->metaObject) - mob.setSuperClass(op->metaObject); + d->mob.setSuperClass(op->metaObject); - mem = mob.toMetaObject(); - *static_cast(this) = *mem; + d->mem = d->mob.toMetaObject(); + *static_cast(this) = *d->mem; op->metaObject = this; - _propertyOffset = propertyOffset(); - _signalOffset = methodOffset(); + d->propertyOffset = propertyOffset(); + d->signalOffset = methodOffset(); } QmlOpenMetaObject::~QmlOpenMetaObject() { - if (parent) - delete parent; - qFree(mem); + if (d->parent) + delete d->parent; + qFree(d->mem); + delete d; } int QmlOpenMetaObject::metaCall(QMetaObject::Call c, int id, void **a) { if (( c == QMetaObject::ReadProperty || c == QMetaObject::WriteProperty) - && id >= _propertyOffset) { - int propId = id - _propertyOffset; + && id >= d->propertyOffset) { + int propId = id - d->propertyOffset; if (c == QMetaObject::ReadProperty) { propertyRead(propId); - *reinterpret_cast(a[0]) = data[propId]; + *reinterpret_cast(a[0]) = d->data[propId]; } else if (c == QMetaObject::WriteProperty) { - if (data[propId] != *reinterpret_cast(a[0])) { + if (d->data[propId] != *reinterpret_cast(a[0])) { propertyWrite(propId); - data[propId] = *reinterpret_cast(a[0]); - activate(_object, _signalOffset + propId, 0); + d->data[propId] = *reinterpret_cast(a[0]); + activate(d->object, d->signalOffset + propId, 0); } } return -1; } else { - if (parent) - return parent->metaCall(c, id, a); + if (d->parent) + return d->parent->metaCall(c, id, a); else - return _object->qt_metacall(c, id, a); + return d->object->qt_metacall(c, id, a); } } QVariant QmlOpenMetaObject::value(int id) const { - Q_ASSERT(id >= 0 && id < data.count()); - return data.at(id); + Q_ASSERT(id >= 0 && id < d->data.count()); + return d->data.at(id); } void QmlOpenMetaObject::setValue(int id, const QVariant &value) { - Q_ASSERT(id >= 0 && id < data.count()); - data[id] = value; - activate(_object, id + _signalOffset, 0); + Q_ASSERT(id >= 0 && id < d->data.count()); + d->data[id] = value; + activate(d->object, id + d->signalOffset, 0); } QVariant QmlOpenMetaObject::value(const QByteArray &name) const { - QHash::ConstIterator iter = names.find(name); - if (iter == names.end()) + QHash::ConstIterator iter = d->names.find(name); + if (iter == d->names.end()) return QVariant(); - return data.at(*iter); + return d->data.at(*iter); } void QmlOpenMetaObject::setValue(const QByteArray &name, const QVariant &val) { - QHash::ConstIterator iter = names.find(name); + QHash::ConstIterator iter = d->names.find(name); int id = -1; - if (iter == names.end()) { - id = doCreateProperty(name.constData()) - _propertyOffset; + if (iter == d->names.end()) { + id = doCreateProperty(name.constData()) - d->propertyOffset; } else { id = *iter; } - if (data[id] == val) + if (d->data[id] == val) return; - data[id] = val; - activate(_object, id + _signalOffset, 0); + d->data[id] = val; + activate(d->object, id + d->signalOffset, 0); } int QmlOpenMetaObject::createProperty(const char *name, const char *) { - if (autoCreate) + if (d->autoCreate) return doCreateProperty(name); else return -1; @@ -143,17 +165,17 @@ int QmlOpenMetaObject::createProperty(const char *name, const char *) int QmlOpenMetaObject::doCreateProperty(const char *name) { - int id = mob.propertyCount(); - mob.addSignal("__" + QByteArray::number(id) + "()"); - QMetaPropertyBuilder build = mob.addProperty(name, "QVariant", id); + int id = d->mob.propertyCount(); + d->mob.addSignal("__" + QByteArray::number(id) + "()"); + QMetaPropertyBuilder build = d->mob.addProperty(name, "QVariant", id); build.setDynamic(true); - data << propertyCreated(id, build); - qFree(mem); - mem = mob.toMetaObject(); - *static_cast(this) = *mem; - names.insert(name, id); + d->data << propertyCreated(id, build); + qFree(d->mem); + d->mem = d->mob.toMetaObject(); + *static_cast(this) = *d->mem; + d->names.insert(name, id); - return _propertyOffset + id; + return d->propertyOffset + id; } void QmlOpenMetaObject::propertyRead(int) @@ -171,19 +193,19 @@ QVariant QmlOpenMetaObject::propertyCreated(int, QMetaPropertyBuilder &) int QmlOpenMetaObject::count() const { - return data.count(); + return d->data.count(); } QByteArray QmlOpenMetaObject::name(int idx) const { - Q_ASSERT(idx >= 0 && idx < data.count()); + Q_ASSERT(idx >= 0 && idx < d->data.count()); - return mob.property(idx).name(); + return d->mob.property(idx).name(); } QObject *QmlOpenMetaObject::object() const { - return _object; + return d->object; } QT_END_NAMESPACE diff --git a/src/declarative/util/qmlopenmetaobject.h b/src/declarative/util/qmlopenmetaobject.h index 17cecd87..f842f96 100644 --- a/src/declarative/util/qmlopenmetaobject.h +++ b/src/declarative/util/qmlopenmetaobject.h @@ -43,16 +43,16 @@ #define QMLOPENMETAOBJECT_H #include -#include "private/qmetaobjectbuilder_p.h" -#include +#include #include - QT_BEGIN_HEADER QT_BEGIN_NAMESPACE QT_MODULE(Declarative) +class QmlOpenMetaObjectPrivate; +class QMetaPropertyBuilder; class Q_DECLARATIVE_EXPORT QmlOpenMetaObject : public QAbstractDynamicMetaObject { public: @@ -78,15 +78,8 @@ protected: private: int doCreateProperty(const char *); - bool autoCreate; - QAbstractDynamicMetaObject *parent; - int _propertyOffset; - int _signalOffset; - QList data; - QHash names; - QMetaObjectBuilder mob; - QMetaObject *mem; - QObject *_object; + + QmlOpenMetaObjectPrivate *d; }; -- cgit v0.12