summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@nokia.com>2009-07-27 22:12:17 (GMT)
committerMichael Brasser <michael.brasser@nokia.com>2009-07-27 22:12:17 (GMT)
commit054032cb8329e387a03cc3dddee66b302890c567 (patch)
treefae0ed1b55ae3065fed55aab995f49d59ac0c577
parent5cda1949899488ce19c4add30a9e0d82326499de (diff)
parentcc287101308fa606eb4de2597b5309c8099654c3 (diff)
downloadQt-054032cb8329e387a03cc3dddee66b302890c567.zip
Qt-054032cb8329e387a03cc3dddee66b302890c567.tar.gz
Qt-054032cb8329e387a03cc3dddee66b302890c567.tar.bz2
Merge branch 'kinetic-declarativeui' of git@scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
-rw-r--r--src/corelib/kernel/kernel.pri1
-rw-r--r--src/corelib/kernel/qguard.cpp27
-rw-r--r--src/corelib/kernel/qguard_p.h5
-rw-r--r--src/corelib/kernel/qobject_p.h24
-rw-r--r--src/declarative/extra/qmlfolderlistmodel.cpp117
-rw-r--r--src/declarative/extra/qmlfolderlistmodel.h10
-rw-r--r--src/declarative/fx/qfxitem.cpp5
-rw-r--r--src/declarative/fx/qfxlistview.cpp8
-rw-r--r--src/declarative/qml/parser/qmljsast_p.h21
-rw-r--r--src/declarative/qml/qmlbasicscript.cpp2
-rw-r--r--src/declarative/qml/qmlcomponent.cpp10
-rw-r--r--src/declarative/qml/qmlcomponentjs.cpp3
-rw-r--r--src/declarative/qml/qmlcompositetypemanager.cpp4
-rw-r--r--src/declarative/qml/qmlcontext.cpp4
-rw-r--r--src/declarative/qml/qmlengine.cpp112
-rw-r--r--src/declarative/qml/qmlengine.h21
-rw-r--r--src/declarative/qml/qmlengine_p.h16
-rw-r--r--src/declarative/qml/qmlexpression.cpp19
-rw-r--r--src/declarative/qml/qmlexpression.h2
-rw-r--r--src/declarative/qml/qmlexpression_p.h2
-rw-r--r--src/declarative/qml/qmlvme.cpp2
-rw-r--r--src/declarative/util/qmlfollow.cpp2
-rw-r--r--src/declarative/util/qmlscript.cpp4
23 files changed, 268 insertions, 153 deletions
diff --git a/src/corelib/kernel/kernel.pri b/src/corelib/kernel/kernel.pri
index d71a22a..53b8b69 100644
--- a/src/corelib/kernel/kernel.pri
+++ b/src/corelib/kernel/kernel.pri
@@ -58,7 +58,6 @@ SOURCES += \
kernel/qsystemsemaphore.cpp \
kernel/qmetaobjectbuilder.cpp \
kernel/qpointer.cpp \
- kernel/qguard.cpp
win32 {
SOURCES += \
diff --git a/src/corelib/kernel/qguard.cpp b/src/corelib/kernel/qguard.cpp
deleted file mode 100644
index ae4f3a5..0000000
--- a/src/corelib/kernel/qguard.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-#include "qguard_p.h"
-#include <private/qobject_p.h>
-
-void q_guard_addGuard(QGuard<QObject> *g)
-{
- QObjectPrivate *p = QObjectPrivate::get(g->o);
- if (p->wasDeleted) {
- qWarning("QGuard: cannot add guard to deleted object");
- g->o = 0;
- return;
- }
-
- g->next = p->objectGuards;
- p->objectGuards = g;
- g->prev = &p->objectGuards;
- if (g->next)
- g->next->prev = &g->next;
-}
-
-void q_guard_removeGuard(QGuard<QObject> *g)
-{
- if (g->next) g->next->prev = g->prev;
- *g->prev = g->next;
- g->next = 0;
- g->prev = 0;
-}
-
diff --git a/src/corelib/kernel/qguard_p.h b/src/corelib/kernel/qguard_p.h
index 7236ed6..a24680b 100644
--- a/src/corelib/kernel/qguard_p.h
+++ b/src/corelib/kernel/qguard_p.h
@@ -54,6 +54,7 @@
//
#include "QtCore/qglobal.h"
+#include "private/qobject_p.h"
QT_BEGIN_NAMESPACE
@@ -92,8 +93,8 @@ protected:
virtual void objectDestroyed(T *) {}
};
-void Q_CORE_EXPORT q_guard_addGuard(QGuard<QObject> *);
-void Q_CORE_EXPORT q_guard_removeGuard(QGuard<QObject> *);
+void q_guard_addGuard(QGuard<QObject> *);
+void q_guard_removeGuard(QGuard<QObject> *);
template<class T>
QGuard<T>::QGuard()
diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h
index 4ac0d2d..850082b 100644
--- a/src/corelib/kernel/qobject_p.h
+++ b/src/corelib/kernel/qobject_p.h
@@ -192,6 +192,30 @@ public:
}
};
+inline void q_guard_addGuard(QGuard<QObject> *g)
+{
+ QObjectPrivate *p = QObjectPrivate::get(g->o);
+ if (p->wasDeleted) {
+ qWarning("QGuard: cannot add guard to deleted object");
+ g->o = 0;
+ return;
+ }
+
+ g->next = p->objectGuards;
+ p->objectGuards = g;
+ g->prev = &p->objectGuards;
+ if (g->next)
+ g->next->prev = &g->next;
+}
+
+inline void q_guard_removeGuard(QGuard<QObject> *g)
+{
+ if (g->next) g->next->prev = g->prev;
+ *g->prev = g->next;
+ g->next = 0;
+ g->prev = 0;
+}
+
Q_DECLARE_TYPEINFO(QObjectPrivate::Connection, Q_MOVABLE_TYPE);
Q_DECLARE_TYPEINFO(QObjectPrivate::Sender, Q_MOVABLE_TYPE);
diff --git a/src/declarative/extra/qmlfolderlistmodel.cpp b/src/declarative/extra/qmlfolderlistmodel.cpp
index d28f7bd..e632f72 100644
--- a/src/declarative/extra/qmlfolderlistmodel.cpp
+++ b/src/declarative/extra/qmlfolderlistmodel.cpp
@@ -49,18 +49,69 @@ QT_BEGIN_NAMESPACE
class QmlFolderListModelPrivate : public QObjectPrivate
{
public:
- QmlFolderListModelPrivate() : count(0) {
+ QmlFolderListModelPrivate()
+ : sortField(QmlFolderListModel::Name), sortReversed(false), count(0) {
folder = QDir::currentPath();
nameFilters << QLatin1String("*");
}
+ void updateSorting() {
+ QDir::SortFlags flags = 0;
+ switch(sortField) {
+ case QmlFolderListModel::Unsorted:
+ flags |= QDir::Unsorted;
+ break;
+ case QmlFolderListModel::Name:
+ flags |= QDir::Name;
+ break;
+ case QmlFolderListModel::Time:
+ flags |= QDir::Time;
+ break;
+ case QmlFolderListModel::Size:
+ flags |= QDir::Size;
+ break;
+ case QmlFolderListModel::Type:
+ flags |= QDir::Type;
+ break;
+ }
+
+ if (sortReversed)
+ flags |= QDir::Reversed;
+
+ model.setSorting(flags);
+ }
+
QDirModel model;
QString folder;
QStringList nameFilters;
QModelIndex folderIndex;
+ QmlFolderListModel::SortField sortField;
+ bool sortReversed;
int count;
};
+/*!
+ \qmlclass FolderListModel
+ \brief The FolderListModel provides a model of the contents of a folder in a filesystem.
+
+ FolderListModel provides access to the local filesystem. The \e folder property
+ specifies the folder to list.
+
+ Qt uses "/" as a universal directory separator in the same way that "/" is
+ used as a path separator in URLs. If you always use "/" as a directory
+ separator, Qt will translate your paths to conform to the underlying
+ operating system.
+
+ The roles available are:
+ \list
+ \o fileName
+ \o filePath
+ \endlist
+
+ Additionally a file entry can be differentiated from a folder entry
+ via the \l isFolder() method.
+*/
+
QmlFolderListModel::QmlFolderListModel(QObject *parent)
: QListModelInterface(*(new QmlFolderListModelPrivate), parent)
{
@@ -73,6 +124,7 @@ QmlFolderListModel::QmlFolderListModel(QObject *parent)
connect(&d->model, SIGNAL(dataChanged(const QModelIndex&,const QModelIndex&))
, this, SLOT(dataChanged(const QModelIndex&,const QModelIndex&)));
connect(&d->model, SIGNAL(modelReset()), this, SLOT(refresh()));
+ connect(&d->model, SIGNAL(layoutChanged()), this, SLOT(refresh()));
}
QmlFolderListModel::~QmlFolderListModel()
@@ -119,6 +171,11 @@ QString QmlFolderListModel::toString(int role) const
return QString();
}
+/*!
+ \qmlproperty string FolderListModel::folder
+
+ The \a folder property holds the folder the model is currently providing.
+*/
QString QmlFolderListModel::folder() const
{
Q_D(const QmlFolderListModel);
@@ -138,6 +195,20 @@ void QmlFolderListModel::setFolder(const QString &folder)
}
}
+/*!
+ \qmlproperty list<string> FolderListModel::nameFilters
+
+ The \a nameFilters property contains a list of filename filters.
+ The filters may include the ? and * wildcards.
+
+ The example below filters on PNG and JPEG files:
+
+ \code
+ FolderListModel {
+ nameFilters: [ "*.png", "*.jpg" ]
+ }
+ \endcode
+*/
QStringList QmlFolderListModel::nameFilters() const
{
Q_D(const QmlFolderListModel);
@@ -158,11 +229,50 @@ void QmlFolderListModel::classComplete()
QMetaObject::invokeMethod(this, "refresh", Qt::QueuedConnection);
}
+QmlFolderListModel::SortField QmlFolderListModel::sortField() const
+{
+ Q_D(const QmlFolderListModel);
+ return d->sortField;
+}
+
+void QmlFolderListModel::setSortField(SortField field)
+{
+ Q_D(QmlFolderListModel);
+ if (field != d->sortField) {
+ d->sortField = field;
+ d->updateSorting();
+ }
+}
+
+bool QmlFolderListModel::sortReversed() const
+{
+ Q_D(const QmlFolderListModel);
+ return d->sortReversed;
+}
+
+void QmlFolderListModel::setSortReversed(bool rev)
+{
+ Q_D(QmlFolderListModel);
+ if (rev != d->sortReversed) {
+ d->sortReversed = rev;
+ d->updateSorting();
+ }
+}
+
+/*!
+ \qmlmethod bool FolderListModel::isFolder(int index)
+
+ Returns true if the entry \a index is a folder; otherwise
+ returns false.
+*/
bool QmlFolderListModel::isFolder(int index) const
{
Q_D(const QmlFolderListModel);
- if (index != -1)
- return d->model.isDir(d->model.index(index, 0, d->folderIndex));
+ if (index != -1) {
+ QModelIndex idx = d->model.index(index, 0, d->folderIndex);
+ if (idx.isValid())
+ return d->model.isDir(idx);
+ }
return false;
}
@@ -203,6 +313,7 @@ void QmlFolderListModel::removed(const QModelIndex &index, int start, int end)
void QmlFolderListModel::dataChanged(const QModelIndex &start, const QModelIndex &end)
{
Q_D(QmlFolderListModel);
+ qDebug() << "data changed";
if (start.parent() == d->folderIndex)
emit itemsChanged(start.row(), end.row() - start.row() + 1, roles());
}
diff --git a/src/declarative/extra/qmlfolderlistmodel.h b/src/declarative/extra/qmlfolderlistmodel.h
index 8c99b22..8708d9a 100644
--- a/src/declarative/extra/qmlfolderlistmodel.h
+++ b/src/declarative/extra/qmlfolderlistmodel.h
@@ -62,6 +62,8 @@ class Q_DECLARATIVE_EXPORT QmlFolderListModel : public QListModelInterface, publ
Q_PROPERTY(QString folder READ folder WRITE setFolder NOTIFY folderChanged)
Q_PROPERTY(QStringList nameFilters READ nameFilters WRITE setNameFilters)
+ Q_PROPERTY(SortField sortField READ sortField WRITE setSortField)
+ Q_PROPERTY(bool sortReversed READ sortReversed WRITE setSortReversed)
public:
QmlFolderListModel(QObject *parent = 0);
@@ -82,6 +84,14 @@ public:
Q_INVOKABLE bool isFolder(int index) const;
+ enum SortField { Unsorted, Name, Time, Size, Type };
+ SortField sortField() const;
+ void setSortField(SortField field);
+ Q_ENUMS(SortField)
+
+ bool sortReversed() const;
+ void setSortReversed(bool rev);
+
Q_SIGNALS:
void folderChanged();
diff --git a/src/declarative/fx/qfxitem.cpp b/src/declarative/fx/qfxitem.cpp
index bf272d0..f8ed7b4 100644
--- a/src/declarative/fx/qfxitem.cpp
+++ b/src/declarative/fx/qfxitem.cpp
@@ -49,7 +49,8 @@
#include <QtScript/qscriptengine.h>
#include <private/qfxperf_p.h>
-#include "qmlengine.h"
+#include <QtDeclarative/qmlengine.h>
+#include <private/qmlengine_p.h>
#include "qmlstate.h"
#include "qlistmodelinterface.h"
#include "qfxanchors_p.h"
@@ -820,7 +821,7 @@ void QFxItem::qmlLoaded()
QFxItem* ret = qobject_cast<QFxItem*>(o);
if (ret) {
ret->setItemParent(this);
- QScriptValue v = qmlEngine(this)->scriptEngine()->newQObject(ret);
+ QScriptValue v = QmlEnginePrivate::getScriptEngine(qmlEngine(this))->newQObject(ret);
emit newChildCreated(d->_qmlnewloading.at(i).toString(),v);
}
diff --git a/src/declarative/fx/qfxlistview.cpp b/src/declarative/fx/qfxlistview.cpp
index db80967..f300d1e 100644
--- a/src/declarative/fx/qfxlistview.cpp
+++ b/src/declarative/fx/qfxlistview.cpp
@@ -808,9 +808,11 @@ void QFxListViewPrivate::fixupX()
if (orient == Qt::Vertical)
return;
if (currItemMode == QFxListView::SnapAuto) {
- moveReason = Mouse;
- _tl.clear();
- _tl.move(_moveX, -(currentItem->position() - snapPos), QEasingCurve(QEasingCurve::InOutQuad), 200);
+ if (currentItem) {
+ moveReason = Mouse;
+ _tl.clear();
+ _tl.move(_moveX, -(currentItem->position() - snapPos), QEasingCurve(QEasingCurve::InOutQuad), 200);
+ }
} else if (currItemMode == QFxListView::Snap) {
moveReason = Mouse;
int idx = snapIndex();
diff --git a/src/declarative/qml/parser/qmljsast_p.h b/src/declarative/qml/parser/qmljsast_p.h
index 9745153..ee2f472 100644
--- a/src/declarative/qml/parser/qmljsast_p.h
+++ b/src/declarative/qml/parser/qmljsast_p.h
@@ -2291,6 +2291,12 @@ public:
: fileName(0), importUri(uri), importId(0)
{ kind = K; }
+ virtual SourceLocation firstSourceLocation() const
+ { return importToken; }
+
+ virtual SourceLocation lastSourceLocation() const
+ { return semicolonToken; }
+
virtual void accept0(Visitor *visitor);
// attributes
@@ -2323,6 +2329,21 @@ public:
previous->next = this;
}
+ virtual SourceLocation firstSourceLocation() const
+ {
+ if (import) return import->firstSourceLocation();
+ else return SourceLocation();
+ }
+
+ virtual SourceLocation lastSourceLocation() const
+ {
+ for (const UiImportList *it = this; it; it = it->next)
+ if (!it->next && it->import)
+ return it->import->lastSourceLocation();
+
+ return SourceLocation();
+ }
+
UiImportList *finish()
{
UiImportList *head = next;
diff --git a/src/declarative/qml/qmlbasicscript.cpp b/src/declarative/qml/qmlbasicscript.cpp
index 8fcb0e1..b940d61 100644
--- a/src/declarative/qml/qmlbasicscript.cpp
+++ b/src/declarative/qml/qmlbasicscript.cpp
@@ -656,7 +656,7 @@ QVariant QmlBasicScript::run(QmlContext *context, void *voidCache, CacheState *c
return QVariant();
QmlContextPrivate *contextPrivate = context->d_func();
- QmlEnginePrivate *enginePrivate = context->engine()->d_func();
+ QmlEnginePrivate *enginePrivate = QmlEnginePrivate::get(context->engine());
QStack<QVariant> stack;
diff --git a/src/declarative/qml/qmlcomponent.cpp b/src/declarative/qml/qmlcomponent.cpp
index 7dcc373..8fb7736 100644
--- a/src/declarative/qml/qmlcomponent.cpp
+++ b/src/declarative/qml/qmlcomponent.cpp
@@ -330,7 +330,7 @@ void QmlComponent::setData(const QByteArray &data, const QUrl &url)
d->url = url;
QmlCompositeTypeData *typeData =
- d->engine->d_func()->typeManager.getImmediate(data, url);
+ QmlEnginePrivate::get(d->engine)->typeManager.getImmediate(data, url);
if (typeData->status == QmlCompositeTypeData::Waiting) {
@@ -361,7 +361,7 @@ void QmlComponent::loadUrl(const QUrl &url)
d->url = url;
QmlCompositeTypeData *data =
- d->engine->d_func()->typeManager.get(d->url);
+ QmlEnginePrivate::get(d->engine)->typeManager.get(d->url);
if (data->status == QmlCompositeTypeData::Waiting) {
@@ -481,8 +481,8 @@ QObject *QmlComponent::beginCreate(QmlContext *context)
return 0;
}
- if (!d->engine->d_func()->rootComponent)
- d->engine->d_func()->rootComponent = this;
+ if (!QmlEnginePrivate::get(d->engine)->rootComponent)
+ QmlEnginePrivate::get(d->engine)->rootComponent = this;
QmlContextPrivate *contextPriv =
static_cast<QmlContextPrivate *>(QObjectPrivate::get(context));
@@ -500,7 +500,7 @@ QObject *QmlComponent::beginCreate(QmlContext *context)
if (vme.isError())
d->errors = vme.errors();
- QmlEnginePrivate *ep = d->engine->d_func();
+ QmlEnginePrivate *ep = QmlEnginePrivate::get(d->engine);
if (ep->rootComponent == this) {
ep->rootComponent = 0;
diff --git a/src/declarative/qml/qmlcomponentjs.cpp b/src/declarative/qml/qmlcomponentjs.cpp
index 89f3851..df3e834 100644
--- a/src/declarative/qml/qmlcomponentjs.cpp
+++ b/src/declarative/qml/qmlcomponentjs.cpp
@@ -41,6 +41,7 @@
#include "qmlcomponentjs_p.h"
#include "qmlcomponentjs_p_p.h"
+#include "qmlengine_p.h"
#include "qmlcomponent.h"
QT_BEGIN_NAMESPACE
@@ -83,7 +84,7 @@ QScriptValue QmlComponentJS::createObject()
{
Q_D(QmlComponentJS);
QObject* ret = create(d->ctxt);
- return QmlEngine::qmlScriptObject(ret, d->engine);
+ return QmlEnginePrivate::qmlScriptObject(ret, d->engine);
}
/*!
diff --git a/src/declarative/qml/qmlcompositetypemanager.cpp b/src/declarative/qml/qmlcompositetypemanager.cpp
index 6f17b70..b0a8642 100644
--- a/src/declarative/qml/qmlcompositetypemanager.cpp
+++ b/src/declarative/qml/qmlcompositetypemanager.cpp
@@ -247,7 +247,7 @@ void QmlCompositeTypeManager::setData(QmlCompositeTypeData *unit,
unit->errors << unit->data.errors();
} else {
foreach (QmlScriptParser::Import imp, unit->data.imports()) {
- if (!engine->d_func()->addToImport(&unit->imports, imp.uri, imp.qualifier, imp.version, imp.type)) {
+ if (!QmlEnginePrivate::get(engine)->addToImport(&unit->imports, imp.uri, imp.qualifier, imp.version, imp.type)) {
QmlError error;
error.setUrl(url);
error.setDescription(tr("Import %1 unavailable").arg(imp.uri));
@@ -323,7 +323,7 @@ void QmlCompositeTypeManager::compile(QmlCompositeTypeData *unit)
}
QUrl url;
- if (!engine->d_func()->resolveType(unit->imports, type, &ref.type, &url)) {
+ if (!QmlEnginePrivate::get(engine)->resolveType(unit->imports, type, &ref.type, &url)) {
// XXX could produce error message here.
}
diff --git a/src/declarative/qml/qmlcontext.cpp b/src/declarative/qml/qmlcontext.cpp
index bc2e6bf..dabaa5e 100644
--- a/src/declarative/qml/qmlcontext.cpp
+++ b/src/declarative/qml/qmlcontext.cpp
@@ -106,9 +106,9 @@ void QmlContextPrivate::init()
parent->d_func()->childContexts.insert(q);
//set scope chain
- QScriptEngine *scriptEngine = engine->scriptEngine();
+ QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
QScriptValue scopeObj =
- scriptEngine->newObject(engine->d_func()->contextClass, scriptEngine->newVariant(QVariant::fromValue((QObject*)q)));
+ scriptEngine->newObject(QmlEnginePrivate::get(engine)->contextClass, scriptEngine->newVariant(QVariant::fromValue((QObject*)q)));
if (!parent)
scopeChain.append(scriptEngine->globalObject());
else
diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp
index b478618..321feb9 100644
--- a/src/declarative/qml/qmlengine.cpp
+++ b/src/declarative/qml/qmlengine.cpp
@@ -94,11 +94,13 @@ struct StaticQtMetaObject : public QObject
};
QmlEnginePrivate::QmlEnginePrivate(QmlEngine *e)
-: rootContext(0), currentBindContext(0), currentExpression(0), q(e),
- isDebugging(false), rootComponent(0), networkAccessManager(0), typeManager(e),
+: rootContext(0), currentBindContext(0), currentExpression(0),
+ isDebugging(false), contextClass(0), objectClass(0), valueTypeClass(0),
+ scriptEngine(this), rootComponent(0), networkAccessManager(0), typeManager(e),
uniqueId(1)
{
- QScriptValue qtObject = scriptEngine.newQMetaObject(StaticQtMetaObject::get());
+ QScriptValue qtObject =
+ scriptEngine.newQMetaObject(StaticQtMetaObject::get());
scriptEngine.globalObject().setProperty(QLatin1String("Qt"), qtObject);
}
@@ -146,6 +148,7 @@ Q_GLOBAL_STATIC(QmlEngineDebugServer, qmlEngineDebugServer);
void QmlEnginePrivate::init()
{
+ Q_Q(QmlEngine);
scriptEngine.installTranslatorFunctions();
contextClass = new QmlContextScriptClass(q);
objectClass = new QmlObjectScriptClass(q);
@@ -157,13 +160,11 @@ void QmlEnginePrivate::init()
debugger->attachTo(&scriptEngine);
}
#endif
- //###needed for the other funcs, but should it be exposed?
- scriptEngine.globalObject().setProperty(QLatin1String("qmlEngine"),
- scriptEngine.newQObject(q));
+
scriptEngine.globalObject().setProperty(QLatin1String("createQmlObject"),
- scriptEngine.newFunction(QmlEngine::createQmlObject, 1));
+ scriptEngine.newFunction(QmlEnginePrivate::createQmlObject, 1));
scriptEngine.globalObject().setProperty(QLatin1String("createComponent"),
- scriptEngine.newFunction(QmlEngine::createComponent, 1));
+ scriptEngine.newFunction(QmlEnginePrivate::createComponent, 1));
if (QCoreApplication::instance()->thread() == q->thread() &&
QmlEngineDebugServer::isDebuggingEnabled()) {
@@ -520,11 +521,13 @@ void QmlInstanceDeclarativeData::destroyed(QObject *object)
}
/*! \internal */
+/*
QScriptEngine *QmlEngine::scriptEngine()
{
Q_D(QmlEngine);
return &d->scriptEngine;
}
+*/
/*!
Creates a QScriptValue allowing you to use \a object in QML script.
@@ -533,17 +536,12 @@ QScriptEngine *QmlEngine::scriptEngine()
The QScriptValue returned is a QtScript Object, not a QtScript QObject, due
to the special needs of QML requiring more functionality than a standard
QtScript QObject.
-
- You'll want to use this function if you are writing C++ code which
- dynamically creates and returns objects when called from QtScript,
- and these objects are visual items in the QML tree.
-
- \sa QScriptEngine::newQObject()
*/
-QScriptValue QmlEngine::qmlScriptObject(QObject* object, QmlEngine* engine)
+QScriptValue QmlEnginePrivate::qmlScriptObject(QObject* object,
+ QmlEngine* engine)
{
- return engine->scriptEngine()->newObject(new QmlObjectScriptClass(engine),
- engine->scriptEngine()->newQObject(object));
+ QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
+ return scriptEngine->newObject(new QmlObjectScriptClass(engine), scriptEngine->newQObject(object));
}
/*!
@@ -598,21 +596,23 @@ QScriptValue QmlEngine::qmlScriptObject(QObject* object, QmlEngine* engine)
If you want to just create an arbitrary string of QML, instead of
loading a qml file, consider the createQmlObject() function.
- \sa QmlComponent::createObject(), QmlEngine::createQmlObject()
*/
-QScriptValue QmlEngine::createComponent(QScriptContext *ctxt, QScriptEngine *engine)
+QScriptValue QmlEnginePrivate::createComponent(QScriptContext *ctxt,
+ QScriptEngine *engine)
{
QmlComponentJS* c;
- QmlEngine* activeEngine = qobject_cast<QmlEngine*>(
- engine->globalObject().property(QLatin1String("qmlEngine")).toQObject());
- QmlContext* context =activeEngine->d_func()->currentExpression->context();
- if(ctxt->argumentCount() != 1 || !activeEngine){
+
+ QmlEnginePrivate *activeEnginePriv =
+ static_cast<QmlScriptEngine*>(engine)->p;
+ QmlEngine* activeEngine = activeEnginePriv->q_func();
+
+ QmlContext* context = activeEnginePriv->currentExpression->context();
+ if(ctxt->argumentCount() != 1) {
c = new QmlComponentJS(activeEngine);
}else{
QUrl url = QUrl(context->resolvedUrl(ctxt->argument(0).toString()));
- if(!url.isValid()){
+ if(!url.isValid())
url = QUrl(ctxt->argument(0).toString());
- }
c = new QmlComponentJS(activeEngine, url, activeEngine);
}
c->setContext(context);
@@ -643,21 +643,15 @@ QScriptValue QmlEngine::createComponent(QScriptContext *ctxt, QScriptEngine *eng
instead. 'New components' refers to external QML files that have not yet
been loaded, and so it is safe to use createQmlObject to load built-in
components.
-
- \sa QmlEngine::createComponent()
*/
-QScriptValue QmlEngine::createQmlObject(QScriptContext *ctxt, QScriptEngine *engine)
+QScriptValue QmlEnginePrivate::createQmlObject(QScriptContext *ctxt, QScriptEngine *engine)
{
- QmlEngine* activeEngine = qobject_cast<QmlEngine*>(
- engine->globalObject().property(QLatin1String("qmlEngine")).toQObject());
- if(ctxt->argumentCount() < 2 || !activeEngine){
- if(ctxt->argumentCount() < 2){
- qWarning() << "createQmlObject requires two arguments, A QML string followed by an existing QML item id.";
- }else{
- qWarning() << "createQmlObject cannot find engine.";
- }
+ QmlEnginePrivate *activeEnginePriv =
+ static_cast<QmlScriptEngine*>(engine)->p;
+ QmlEngine* activeEngine = activeEnginePriv->q_func();
+
+ if(ctxt->argumentCount() < 2)
return engine->nullValue();
- }
QString qml = ctxt->argument(0).toString();
QUrl url;
@@ -669,24 +663,25 @@ QScriptValue QmlEngine::createQmlObject(QScriptContext *ctxt, QScriptEngine *eng
QmlComponent component(activeEngine, qml.toUtf8(), url);
if(component.isError()) {
QList<QmlError> errors = component.errors();
- foreach (const QmlError &error, errors) {
- qWarning() <<"Error in createQmlObject(): "<< error;
- }
+ qWarning() <<"QmlEngine::createQmlObject():";
+ foreach (const QmlError &error, errors)
+ qWarning() << " " << error;
return engine->nullValue();
}
QObject *obj = component.create(qmlCtxt);
+
if(component.isError()) {
QList<QmlError> errors = component.errors();
- foreach (const QmlError &error, errors) {
- qWarning() <<"Error in createQmlObject(): "<< error;
- }
+ qWarning() <<"QmlEngine::createQmlObject():";
+ foreach (const QmlError &error, errors)
+ qWarning() << " " << error;
return engine->nullValue();
}
- if(obj){
+ if(obj) {
obj->setParent(parentArg);
obj->setProperty("parent", QVariant::fromValue<QObject*>(parentArg));
return qmlScriptObject(obj, activeEngine);
@@ -695,7 +690,8 @@ QScriptValue QmlEngine::createQmlObject(QScriptContext *ctxt, QScriptEngine *eng
}
QmlScriptClass::QmlScriptClass(QmlEngine *bindengine)
-: QScriptClass(bindengine->scriptEngine()), engine(bindengine)
+: QScriptClass(QmlEnginePrivate::getScriptEngine(bindengine)),
+ engine(bindengine)
{
}
@@ -762,8 +758,7 @@ QmlContextScriptClass::queryProperty(const QScriptValue &object,
}
for (int ii = 0; !rv && ii < bindContext->d_func()->defaultObjects.count(); ++ii) {
- rv = engine->d_func()->queryObject(propName, id,
- bindContext->d_func()->defaultObjects.at(ii));
+ rv = QmlEnginePrivate::get(engine)->queryObject(propName, id, bindContext->d_func()->defaultObjects.at(ii));
if (rv)
*id |= (ii << 24);
}
@@ -785,7 +780,8 @@ QScriptValue QmlContextScriptClass::property(const QScriptValue &object,
uint basicId = id & QmlScriptClass::ClassIdMask;
- QScriptEngine *scriptEngine = engine->scriptEngine();
+ QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
+ QmlEnginePrivate *ep = QmlEnginePrivate::get(engine);
switch (basicId) {
case VariantPropertyId:
@@ -799,18 +795,18 @@ QScriptValue QmlContextScriptClass::property(const QScriptValue &object,
#endif
QScriptValue rv;
if (QmlMetaType::isObject(value.userType())) {
- rv = scriptEngine->newObject(engine->d_func()->objectClass, scriptEngine->newVariant(value));
+ rv = scriptEngine->newObject(ep->objectClass, scriptEngine->newVariant(value));
} else {
rv = scriptEngine->newVariant(value);
}
- engine->d_func()->capturedProperties << QmlEnginePrivate::CapturedProperty(bindContext, -1, index + bindContext->d_func()->notifyIndex);
+ ep->capturedProperties << QmlEnginePrivate::CapturedProperty(bindContext, -1, index + bindContext->d_func()->notifyIndex);
return rv;
}
default:
{
int objId = (id & ClassIdSelectorMask) >> 24;
QObject *obj = bindContext->d_func()->defaultObjects.at(objId);
- QScriptValue rv = engine->d_func()->propertyObject(name, obj,
+ QScriptValue rv = ep->propertyObject(name, obj,
id & ~QmlScriptClass::ClassIdSelectorMask);
if (rv.isValid()) {
#ifdef PROPERTY_DEBUG
@@ -844,7 +840,7 @@ void QmlContextScriptClass::setProperty(QScriptValue &object,
int objIdx = (id & QmlScriptClass::ClassIdSelectorMask) >> 24;
QObject *obj = bindContext->d_func()->defaultObjects.at(objIdx);
- QScriptEngine *scriptEngine = engine->scriptEngine();
+ QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
QScriptValue oldact = scriptEngine->currentContext()->activationObject();
scriptEngine->currentContext()->setActivationObject(scriptEngine->globalObject());
@@ -952,9 +948,10 @@ QmlObjectScriptClass::QmlObjectScriptClass(QmlEngine *bindEngine)
: QmlScriptClass(bindEngine)
{
engine = bindEngine;
- prototypeObject = engine->scriptEngine()->newObject();
+ QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(bindEngine);
+ prototypeObject = scriptEngine->newObject();
prototypeObject.setProperty(QLatin1String("destroy"),
- engine->scriptEngine()->newFunction(QmlObjectDestroy));
+ scriptEngine->newFunction(QmlObjectDestroy));
}
QmlObjectScriptClass::~QmlObjectScriptClass()
@@ -980,7 +977,7 @@ QScriptClass::QueryFlags QmlObjectScriptClass::queryProperty(const QScriptValue
#endif
if (obj)
- rv = engine->d_func()->queryObject(propName, id, obj);
+ rv = QmlEnginePrivate::get(engine)->queryObject(propName, id, obj);
return rv;
}
@@ -996,7 +993,8 @@ QScriptValue QmlObjectScriptClass::property(const QScriptValue &object,
qWarning() << "QmlObject Property:" << propName << obj;
#endif
- QScriptValue rv = engine->d_func()->propertyObject(name, obj, id);
+ QScriptValue rv =
+ QmlEnginePrivate::get(engine)->propertyObject(name, obj, id);
if (rv.isValid()) {
#ifdef PROPERTY_DEBUG
qWarning() << "~Property: Resolved property" << propName
@@ -1022,7 +1020,7 @@ void QmlObjectScriptClass::setProperty(QScriptValue &object,
qWarning() << "Set QmlObject Property" << name.toString() << value.toVariant();
#endif
- QScriptEngine *scriptEngine = engine->scriptEngine();
+ QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
QScriptValue oldact = scriptEngine->currentContext()->activationObject();
scriptEngine->currentContext()->setActivationObject(scriptEngine->globalObject());
diff --git a/src/declarative/qml/qmlengine.h b/src/declarative/qml/qmlengine.h
index 2faad66..6066059 100644
--- a/src/declarative/qml/qmlengine.h
+++ b/src/declarative/qml/qmlengine.h
@@ -86,28 +86,7 @@ public:
static QmlContext *contextForObject(const QObject *);
static void setContextForObject(QObject *, QmlContext *);
- static QScriptValue qmlScriptObject(QObject*, QmlEngine*);
-
- static QScriptValue createComponent(QScriptContext*, QScriptEngine*);
- static QScriptValue createQmlObject(QScriptContext*, QScriptEngine*);
-
private:
- // LK: move to the private class
- QScriptEngine *scriptEngine();
- friend class QFxItem; // XXX
- friend class QmlScriptPrivate;
- friend class QmlCompositeTypeManager;
- friend class QmlCompiler;
- friend class QmlScriptClass;
- friend class QmlContext;
- friend class QmlContextPrivate;
- friend class QmlExpression;
- friend class QmlExpressionPrivate;
- friend class QmlBasicScript;
- friend class QmlVME;
- friend class QmlComponent;
- friend class QmlContextScriptClass; //###
- friend class QmlObjectScriptClass; //###
Q_DECLARE_PRIVATE(QmlEngine)
};
diff --git a/src/declarative/qml/qmlengine_p.h b/src/declarative/qml/qmlengine_p.h
index b8d49aa..18cdd83 100644
--- a/src/declarative/qml/qmlengine_p.h
+++ b/src/declarative/qml/qmlengine_p.h
@@ -114,7 +114,6 @@ public:
QmlContext *rootContext;
QmlContext *currentBindContext;
QmlExpression *currentExpression;
- QmlEngine *q;
bool isDebugging;
#ifdef QT_SCRIPTTOOLS_LIB
QScriptEngineDebugger *debugger;
@@ -127,7 +126,13 @@ public:
QmlContext *setCurrentBindContext(QmlContext *);
QStack<QmlContext *> activeContexts;
- QScriptEngine scriptEngine;
+ struct QmlScriptEngine : public QScriptEngine
+ {
+ QmlScriptEngine(QmlEnginePrivate *priv)
+ : p(priv) {}
+ QmlEnginePrivate *p;
+ };
+ QmlScriptEngine scriptEngine;
QUrl baseUrl;
@@ -188,6 +193,13 @@ public:
bool resolveType(const Imports&, const QByteArray& type, QmlType** type_return, QUrl* url_return, ImportedNamespace** ns_return=0) const;
void resolveTypeInNamespace(ImportedNamespace*, const QByteArray& type, QmlType** type_return, QUrl* url_return ) const;
+
+ static QScriptValue qmlScriptObject(QObject*, QmlEngine*);
+ static QScriptValue createComponent(QScriptContext*, QScriptEngine*);
+ static QScriptValue createQmlObject(QScriptContext*, QScriptEngine*);
+
+ static QScriptEngine *getScriptEngine(QmlEngine *e) { return &e->d_func()->scriptEngine; }
+ static QmlEnginePrivate *get(QmlEngine *e) { return e->d_func(); }
};
class QmlScriptClass : public QScriptClass
diff --git a/src/declarative/qml/qmlexpression.cpp b/src/declarative/qml/qmlexpression.cpp
index e88766c..2c06efa 100644
--- a/src/declarative/qml/qmlexpression.cpp
+++ b/src/declarative/qml/qmlexpression.cpp
@@ -51,7 +51,7 @@ Q_DECLARE_METATYPE(QList<QObject *>);
QT_BEGIN_NAMESPACE
QmlExpressionPrivate::QmlExpressionPrivate()
-: ctxt(0), expressionFunctionValid(false), sseData(0), me(0), trackChange(true), line(-1), id(0), guardList(0), guardListLength(0)
+: ctxt(0), expressionFunctionValid(false), sseData(0), me(0), trackChange(true), line(-1), guardList(0), guardListLength(0)
{
}
@@ -63,8 +63,6 @@ void QmlExpressionPrivate::init(QmlContext *ctxt, const QString &expr,
expression = expr;
this->ctxt = ctxt;
- if (ctxt && ctxt->engine())
- id = ctxt->engine()->d_func()->getUniqueId();
if (ctxt)
ctxt->d_func()->childExpressions.insert(q);
this->me = me;
@@ -78,8 +76,6 @@ void QmlExpressionPrivate::init(QmlContext *ctxt, void *expr, QmlRefCount *rc,
sse.load((const char *)expr, rc);
this->ctxt = ctxt;
- if (ctxt && ctxt->engine())
- id = ctxt->engine()->d_func()->getUniqueId();
if (ctxt)
ctxt->d_func()->childExpressions.insert(q);
this->me = me;
@@ -244,7 +240,7 @@ QVariant QmlExpressionPrivate::evalQtScript()
if (me)
ctxtPriv->defaultObjects.insert(ctxtPriv->highPriorityCount, me);
- QScriptEngine *scriptEngine = engine->scriptEngine();
+ QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
QScriptValueList oldScopeChain =
scriptEngine->currentContext()->scopeChain();
@@ -346,7 +342,7 @@ QVariant QmlExpression::value()
QmlBasicScript::CacheState cacheState = QmlBasicScript::Reset;
- QmlEnginePrivate *ep = engine()->d_func();
+ QmlEnginePrivate *ep = QmlEnginePrivate::get(engine());
QmlExpression *lastCurrentExpression = ep->currentExpression;
QPODVector<QmlEnginePrivate::CapturedProperty> lastCapturedProperties;
@@ -437,15 +433,6 @@ QObject *QmlExpression::scopeObject() const
return d->me;
}
-/*!
- \internal
-*/
-quint32 QmlExpression::id() const
-{
- Q_D(const QmlExpression);
- return d->id;
-}
-
/*! \internal */
void QmlExpression::__q_notify()
{
diff --git a/src/declarative/qml/qmlexpression.h b/src/declarative/qml/qmlexpression.h
index 6db6ef9..d5f0cbb 100644
--- a/src/declarative/qml/qmlexpression.h
+++ b/src/declarative/qml/qmlexpression.h
@@ -80,8 +80,6 @@ public:
QObject *scopeObject() const;
- quint32 id() const;
-
public Q_SLOTS:
QVariant value();
diff --git a/src/declarative/qml/qmlexpression_p.h b/src/declarative/qml/qmlexpression_p.h
index a20ead4..cb89ce0 100644
--- a/src/declarative/qml/qmlexpression_p.h
+++ b/src/declarative/qml/qmlexpression_p.h
@@ -86,8 +86,6 @@ public:
QString fileName;
int line;
- quint32 id;
-
QVariant evalSSE(QmlBasicScript::CacheState &cacheState);
QVariant evalQtScript();
diff --git a/src/declarative/qml/qmlvme.cpp b/src/declarative/qml/qmlvme.cpp
index ebf0a73..1cfd5e9 100644
--- a/src/declarative/qml/qmlvme.cpp
+++ b/src/declarative/qml/qmlvme.cpp
@@ -143,7 +143,7 @@ QObject *QmlVME::run(QStack<QObject *> &stack, QmlContext *ctxt, QmlCompiledData
QStack<ListInstance> qliststack;
vmeErrors.clear();
- QmlEnginePrivate *ep = ctxt->engine()->d_func();
+ QmlEnginePrivate *ep = QmlEnginePrivate::get(ctxt->engine());
for (int ii = start; !isError() && ii < (start + count); ++ii) {
QmlInstruction &instr = comp->bytecode[ii];
diff --git a/src/declarative/util/qmlfollow.cpp b/src/declarative/util/qmlfollow.cpp
index d8b520f..36e7f14 100644
--- a/src/declarative/util/qmlfollow.cpp
+++ b/src/declarative/util/qmlfollow.cpp
@@ -104,7 +104,7 @@ void QmlFollowPrivate::tick(int time)
return;
// Real men solve the spring DEs using RK4.
// We'll do something much simpler which gives a result that looks fine.
- int count = (elapsed+8) / 16;
+ int count = elapsed / 16;
for (int i = 0; i < count; ++i) {
qreal diff = srcVal - currentValue;
if (modulus != 0.0 && qAbs(diff) > modulus / 2) {
diff --git a/src/declarative/util/qmlscript.cpp b/src/declarative/util/qmlscript.cpp
index cfe5a1e..ca9aad5 100644
--- a/src/declarative/util/qmlscript.cpp
+++ b/src/declarative/util/qmlscript.cpp
@@ -185,9 +185,9 @@ void QmlScriptPrivate::addScriptToEngine(const QString &script, const QString &s
Q_Q(QmlScript);
QmlEngine *engine = qmlEngine(q);
QmlContext *context = qmlContext(q);
- QScriptEngine *scriptEngine = engine->scriptEngine();
+ QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
- QScriptContext *currentContext = engine->scriptEngine()->currentContext();
+ QScriptContext *currentContext = scriptEngine->currentContext();
QScriptValueList oldScopeChain = currentContext->scopeChain();
QScriptValue oldact = currentContext->activationObject();