summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@nokia.com>2009-05-11 03:42:32 (GMT)
committerMichael Brasser <michael.brasser@nokia.com>2009-05-11 03:42:32 (GMT)
commita6fd1205fd5c375d603b0c225f9e03fa57473f29 (patch)
tree99af53ef7f6dc36429092cd19ade597069df2d4c
parent56010993aaa90f39379f38f51b7975d8a72f56f4 (diff)
parenteaee439e28149f1bee141c24b73f3ac58178fcf2 (diff)
downloadQt-a6fd1205fd5c375d603b0c225f9e03fa57473f29.zip
Qt-a6fd1205fd5c375d603b0c225f9e03fa57473f29.tar.gz
Qt-a6fd1205fd5c375d603b0c225f9e03fa57473f29.tar.bz2
Merge branch 'kinetic-declarativeui' of git@scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
-rw-r--r--src/corelib/kernel/qabstractitemmodel.cpp13
-rw-r--r--src/declarative/canvas/qsimplecanvasitem.cpp1
-rw-r--r--src/declarative/fx/qfxvisualitemmodel.cpp1
-rw-r--r--src/declarative/qml/qmlcontext.cpp44
-rw-r--r--src/declarative/qml/qmlcontext.h1
-rw-r--r--src/declarative/qml/qmlcontext_p.h8
-rw-r--r--src/declarative/qml/qmldeclarativedata_p.h1
-rw-r--r--src/declarative/qml/qmlengine.cpp26
-rw-r--r--src/declarative/qml/qmlexpression.h1
-rw-r--r--src/declarative/util/qmlopenmetaobject.cpp120
-rw-r--r--src/declarative/util/qmlopenmetaobject.h17
11 files changed, 160 insertions, 73 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<int,QByteArray> &QAbstractItemModelPrivate::defaultRoleNames()
{
static QHash<int,QByteArray> 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<int,QByteArray> &roleNames)
const QHash<int,QByteArray> &QAbstractItemModel::roleNames() const
{
Q_D(const QAbstractItemModel);
+ qDebug() << "roles" << d->roleNames;
return d->roleNames;
}
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){
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.cpp b/src/declarative/qml/qmlcontext.cpp
index dfcf413..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 =
@@ -231,8 +235,48 @@ QmlContext::QmlContext(QmlContext *parentContext, QObject *parent)
*/
QmlContext::~QmlContext()
{
+ Q_D(QmlContext);
+ if (d->parent)
+ d->parent->d_func()->childContexts.remove(this);
+
+ for (QSet<QmlContext *>::ConstIterator iter = d->childContexts.begin();
+ iter != d->childContexts.end();
+ ++iter) {
+ (*iter)->d_func()->invalidateEngines();
+ (*iter)->d_func()->parent = 0;
+ }
+
+ for (QSet<QmlExpression *>::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<QmlSimpleDeclarativeData *>(p->declarativeData);
+ if(data && (data->flags & QmlSimpleDeclarativeData::Extended)) {
+ data->context = 0;
+ } else {
+ p->declarativeData = 0;
+ }
+ }
+ d->contextObjects.clear();
}
+void QmlContextPrivate::invalidateEngines()
+{
+ if (!engine)
+ return;
+ engine = 0;
+ for (QSet<QmlContext *>::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.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..f527bb8 100644
--- a/src/declarative/qml/qmlcontext_p.h
+++ b/src/declarative/qml/qmlcontext_p.h
@@ -47,10 +47,13 @@
#include <private/qmldeclarativedata_p.h>
#include <qhash.h>
#include <qscriptvalue.h>
+#include <QtCore/qset.h>
QT_BEGIN_NAMESPACE
class QmlContext;
+class QmlExpression;
class QmlEngine;
+class QmlExpression;
class QmlCompiledComponent;
class QmlContextPrivate : public QObjectPrivate
@@ -87,7 +90,12 @@ public:
};
void addDefaultObject(QObject *, Priority);
+ void invalidateEngines();
+ QSet<QmlContext *> childContexts;
+ QSet<QmlExpression *> childExpressions;
+
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..c39a0d5 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;
}
@@ -799,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;
}
@@ -810,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;
}
@@ -827,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;
}
@@ -835,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;
}
@@ -844,7 +858,7 @@ QmlExpression::~QmlExpression()
*/
QmlEngine *QmlExpression::engine() const
{
- return d->ctxt->engine();
+ return d->ctxt?d->ctxt->engine():0;
}
/*!
@@ -921,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;
};
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 <QDebug>
QT_BEGIN_NAMESPACE
+
+class QmlOpenMetaObjectPrivate
+{
+public:
+ QmlOpenMetaObjectPrivate() : parent(0), mem(0) {}
+
+ bool autoCreate;
+ QAbstractDynamicMetaObject *parent;
+ int propertyOffset;
+ int signalOffset;
+ QList<QVariant> data;
+ QHash<QByteArray, int> 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<QMetaObject *>(this) = *mem;
+ d->mem = d->mob.toMetaObject();
+ *static_cast<QMetaObject *>(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<QVariant *>(a[0]) = data[propId];
+ *reinterpret_cast<QVariant *>(a[0]) = d->data[propId];
} else if (c == QMetaObject::WriteProperty) {
- if (data[propId] != *reinterpret_cast<QVariant *>(a[0])) {
+ if (d->data[propId] != *reinterpret_cast<QVariant *>(a[0])) {
propertyWrite(propId);
- data[propId] = *reinterpret_cast<QVariant *>(a[0]);
- activate(_object, _signalOffset + propId, 0);
+ d->data[propId] = *reinterpret_cast<QVariant *>(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<QByteArray, int>::ConstIterator iter = names.find(name);
- if (iter == names.end())
+ QHash<QByteArray, int>::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<QByteArray, int>::ConstIterator iter = names.find(name);
+ QHash<QByteArray, int>::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<QMetaObject *>(this) = *mem;
- names.insert(name, id);
+ d->data << propertyCreated(id, build);
+ qFree(d->mem);
+ d->mem = d->mob.toMetaObject();
+ *static_cast<QMetaObject *>(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 <QMetaObject>
-#include "private/qmetaobjectbuilder_p.h"
-#include <private/qobject_p.h>
+#include <QtCore/private/qobject_p.h>
#include <QObject>
-
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<QVariant> data;
- QHash<QByteArray, int> names;
- QMetaObjectBuilder mob;
- QMetaObject *mem;
- QObject *_object;
+
+ QmlOpenMetaObjectPrivate *d;
};