From 7b00e383231aee2866597031036389e6f11e2645 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Thu, 23 Jul 2009 16:34:37 +1000 Subject: Flesh out FolderListModel --- src/declarative/extra/qmlfolderlistmodel.cpp | 117 ++++++++++++++++++++++++++- src/declarative/extra/qmlfolderlistmodel.h | 10 +++ 2 files changed, 124 insertions(+), 3 deletions(-) diff --git a/src/declarative/extra/qmlfolderlistmodel.cpp b/src/declarative/extra/qmlfolderlistmodel.cpp index 4a71109..1c05a6d 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 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(); -- cgit v0.12 From bb90cec43fbcc410dd357009a284f15c9208c0bf Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Thu, 23 Jul 2009 16:35:30 +1000 Subject: Better not to let animation get ahead of clock. --- src/declarative/util/qmlfollow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/declarative/util/qmlfollow.cpp b/src/declarative/util/qmlfollow.cpp index 63b6307..cfd2dde 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) { -- cgit v0.12 From 752a15ca59b1b209aa67c3fbee53868b3a22df80 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Mon, 27 Jul 2009 15:20:37 +1000 Subject: Make private stuff private --- src/declarative/fx/qfxitem.cpp | 5 +- src/declarative/qml/qmlbasicscript.cpp | 2 +- src/declarative/qml/qmlcomponent.cpp | 10 +-- src/declarative/qml/qmlcomponentjs.cpp | 3 +- src/declarative/qml/qmlcompositetypemanager.cpp | 4 +- src/declarative/qml/qmlcontext.cpp | 4 +- src/declarative/qml/qmlengine.cpp | 112 ++++++++++++------------ src/declarative/qml/qmlengine.h | 21 ----- src/declarative/qml/qmlengine_p.h | 16 +++- src/declarative/qml/qmlexpression.cpp | 19 +--- src/declarative/qml/qmlexpression.h | 2 - src/declarative/qml/qmlexpression_p.h | 2 - src/declarative/qml/qmlvme.cpp | 2 +- src/declarative/util/qmlscript.cpp | 4 +- 14 files changed, 90 insertions(+), 116 deletions(-) diff --git a/src/declarative/fx/qfxitem.cpp b/src/declarative/fx/qfxitem.cpp index 6c6fcd3..247ea53 100644 --- a/src/declarative/fx/qfxitem.cpp +++ b/src/declarative/fx/qfxitem.cpp @@ -49,7 +49,8 @@ #include #include -#include "qmlengine.h" +#include +#include #include "qmlstate.h" #include "qlistmodelinterface.h" #include "qfxanchors_p.h" @@ -819,7 +820,7 @@ void QFxItem::qmlLoaded() QFxItem* ret = qobject_cast(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/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 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(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( - engine->globalObject().property(QLatin1String("qmlEngine")).toQObject()); - QmlContext* context =activeEngine->d_func()->currentExpression->context(); - if(ctxt->argumentCount() != 1 || !activeEngine){ + + QmlEnginePrivate *activeEnginePriv = + static_cast(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( - 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(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 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 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(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 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 ea0e9aa..7394004 100644 --- a/src/declarative/qml/qmlexpression.cpp +++ b/src/declarative/qml/qmlexpression.cpp @@ -51,7 +51,7 @@ Q_DECLARE_METATYPE(QList); 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 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 41b7749..7f086c2 100644 --- a/src/declarative/qml/qmlexpression_p.h +++ b/src/declarative/qml/qmlexpression_p.h @@ -86,8 +86,6 @@ public: QUrl 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 &stack, QmlContext *ctxt, QmlCompiledData QStack 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/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(); -- cgit v0.12 From 2ea4aec304eefa10a554e40c5f9ea948d18617a7 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Mon, 27 Jul 2009 17:07:43 +1000 Subject: Don't crash in Horizontal orientation. --- src/declarative/fx/qfxlistview.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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(); -- cgit v0.12 From fd27c5ac9670b56ccd60e8d8f6791237358f3633 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 27 Jul 2009 15:52:42 +0200 Subject: removing Q_CORE_EXPORT for q_guard_addGuard() and q_guard_removeGuard() I made the functions inline instead and moved them to qobject_p.h Reviewed-by: Aaron Kennedy --- src/corelib/kernel/kernel.pri | 1 - src/corelib/kernel/qguard.cpp | 27 --------------------------- src/corelib/kernel/qguard_p.h | 3 +-- src/corelib/kernel/qobject_p.h | 24 ++++++++++++++++++++++++ 4 files changed, 25 insertions(+), 30 deletions(-) delete mode 100644 src/corelib/kernel/qguard.cpp 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 - -void q_guard_addGuard(QGuard *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 *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..cbc9cca 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,6 @@ protected: virtual void objectDestroyed(T *) {} }; -void Q_CORE_EXPORT q_guard_addGuard(QGuard *); -void Q_CORE_EXPORT q_guard_removeGuard(QGuard *); template QGuard::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 *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 *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); -- cgit v0.12 From ee3c71df7b0a091b078b9b6cbdf60d8f79d95913 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Mon, 27 Jul 2009 16:11:40 +0200 Subject: Added utility methods firstSourceLocation/lastSourceLocation methods to UiImport and UiImportList. --- src/declarative/qml/parser/qmljsast_p.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) 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; -- cgit v0.12 From cc287101308fa606eb4de2597b5309c8099654c3 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Mon, 27 Jul 2009 16:35:38 +0200 Subject: Fixed missing forward declarations, which made gcc fail to compile anything that included qobject.h Reviewed-by: Thomas Hartmann --- src/corelib/kernel/qguard_p.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/corelib/kernel/qguard_p.h b/src/corelib/kernel/qguard_p.h index cbc9cca..a24680b 100644 --- a/src/corelib/kernel/qguard_p.h +++ b/src/corelib/kernel/qguard_p.h @@ -93,6 +93,8 @@ protected: virtual void objectDestroyed(T *) {} }; +void q_guard_addGuard(QGuard *); +void q_guard_removeGuard(QGuard *); template QGuard::QGuard() -- cgit v0.12