Added class QMLArray()
This commit is contained in:
parent
2b2cb019fa
commit
3738b3c712
5 changed files with 87 additions and 8 deletions
|
@ -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
|
||||
)
|
||||
|
||||
|
|
36
telldus-gui/Plugins/QML/qmlarray.cpp
Normal file
36
telldus-gui/Plugins/QML/qmlarray.cpp
Normal 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();
|
||||
}
|
28
telldus-gui/Plugins/QML/qmlarray.h
Normal file
28
telldus-gui/Plugins/QML/qmlarray.h
Normal 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
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue