Added class QMLArray()

This commit is contained in:
Micke Prag 2011-01-14 16:12:29 +00:00
parent 2b2cb019fa
commit 3738b3c712
5 changed files with 87 additions and 8 deletions

View file

@ -5,6 +5,7 @@ SET( Plugin_NAME "QMLLoader" )
SET( Plugin_SRCS
scriptfunctionwrapper.cpp
qmlarray.cpp
qmlplugin.cpp
qmlview.cpp
)
@ -15,6 +16,7 @@ SET( Plugin_HDRS
SET( Plugin_MOC_HDRS
scriptfunctionwrapper.h
qmlarray.h
qmlview.h
)

View file

@ -0,0 +1,36 @@
#include "qmlarray.h"
#include <QDebug>
class QMLArray::PrivateData {
public:
QList<QScriptValue> list;
};
QMLArray::QMLArray(QObject *parent) :
QAbstractListModel(parent)
{
d = new PrivateData;
QHash<int, QByteArray> roles;
roles[Qt::UserRole+1] = "modelData";
setRoleNames(roles);
}
QMLArray::~QMLArray() {
delete d;
}
int QMLArray::rowCount(const QModelIndex &parent) const {
return d->list.size();
}
QVariant QMLArray::data(const QModelIndex &index, int role) const {
return d->list.at(index.row()).toVariant();
}
void QMLArray::push(const QScriptValue &v) {
beginInsertRows( QModelIndex(), d->list.size(), d->list.size() );
d->list << v;
endInsertRows();
}

View file

@ -0,0 +1,28 @@
#ifndef QMLARRAY_H
#define QMLARRAY_H
#include <QAbstractListModel>
#include <QScriptValue>
class QMLArray : public QAbstractListModel
{
Q_OBJECT
public:
explicit QMLArray(QObject *parent = 0);
~QMLArray();
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
signals:
public slots:
void push(const QScriptValue &v);
private:
class PrivateData;
PrivateData *d;
};
#endif // QMLARRAY_H

View file

@ -1,10 +1,13 @@
#include "qmlplugin.h"
#include "qmlarray.h"
#include "qmlview.h"
#include <QScriptEngine>
#include <QScriptContextInfo>
#include <QFileInfo>
#include <QDir>
#include <QDebug>
QMLPlugin::QMLPlugin ( QObject * parent )
:QScriptExtensionPlugin( parent )
{
@ -26,9 +29,18 @@ QScriptValue QMLLoadFunction(QScriptContext *context, QScriptEngine *engine) {
return engine->newQObject(new QMLView(dir, context->argument(0)), QScriptEngine::ScriptOwnership);
}
QScriptValue QMLArrayFunction(QScriptContext *context, QScriptEngine *engine) {
if (!context->isCalledAsConstructor()) {
return engine->undefinedValue();
}
return engine->newQObject(new QMLArray(), QScriptEngine::ScriptOwnership);
}
void QMLPlugin::initialize ( const QString & key, QScriptEngine * engine ) {
if (key == "com.telldus.qml") {
engine->globalObject().property("com").property("telldus").property("qml").setProperty("view", engine->newFunction(QMLLoadFunction));
QScriptValue qml = engine->globalObject().property("com").property("telldus").property("qml");
qml.setProperty("view", engine->newFunction(QMLLoadFunction));
qml.setProperty("array", engine->newFunction(QMLArrayFunction));
}
}

View file

@ -7,6 +7,7 @@
class QMLView::PrivateData {
public:
QDir baseDir;
QScriptValue object;
};
QMLView::QMLView(const QDir &dir, const QScriptValue &object) :
@ -14,17 +15,13 @@ QMLView::QMLView(const QDir &dir, const QScriptValue &object) :
{
d = new PrivateData;
d->baseDir = dir;
d->object = object;
QDeclarativeContext *context = this->rootContext();
QScriptValueIterator it(object);
while (it.hasNext()) {
it.next();
if (it.value().isFunction()) {
context->setContextProperty(it.name(), new ScriptFunctionWrapper(object, it.name(), this));
} else {
context->setContextProperty(it.name(), it.value().toVariant());
}
this->setProperty(it.name(), it.value());
}
}
@ -38,5 +35,9 @@ void QMLView::load(const QString &filename) {
void QMLView::setProperty( const QString & name, const QScriptValue &value ) {
QDeclarativeContext *context = this->rootContext();
context->setContextProperty(name, value.toVariant());
if (value.isFunction()) {
context->setContextProperty(name, new ScriptFunctionWrapper(d->object, name, this));
} else {
context->setContextProperty(name, value.toVariant());
}
}