summaryrefslogtreecommitdiffstats
path: root/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp')
-rw-r--r--src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp1103
1 files changed, 0 insertions, 1103 deletions
diff --git a/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp b/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp
deleted file mode 100644
index 1928195..0000000
--- a/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp
+++ /dev/null
@@ -1,1103 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qmlgraphicsvisualitemmodel_p.h"
-
-#include "qmlgraphicsitem.h"
-
-#include <qmlcontext.h>
-#include <qmlengine.h>
-#include <qmlexpression.h>
-#include <qmlpackage_p.h>
-#include <qmlopenmetaobject_p.h>
-#include <qmllistaccessor_p.h>
-#include <qmlinfo.h>
-#include <qmldeclarativedata_p.h>
-#include <qmlpropertycache_p.h>
-#include <qmlguard_p.h>
-
-#include <qlistmodelinterface_p.h>
-#include <qhash.h>
-#include <qlist.h>
-#include <qmetaobjectbuilder_p.h>
-#include <QtCore/qdebug.h>
-
-#include <private/qobject_p.h>
-
-QT_BEGIN_NAMESPACE
-
-QHash<QObject*, QmlGraphicsVisualItemModelAttached*> QmlGraphicsVisualItemModelAttached::attachedProperties;
-
-
-class QmlGraphicsVisualItemModelPrivate : public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QmlGraphicsVisualItemModel)
-public:
- QmlGraphicsVisualItemModelPrivate() : QObjectPrivate() {}
-
- static void children_append(QmlListProperty<QmlGraphicsItem> *prop, QmlGraphicsItem *item) {
- item->QObject::setParent(prop->object);
- static_cast<QmlGraphicsVisualItemModelPrivate *>(prop->data)->children.append(item);
- static_cast<QmlGraphicsVisualItemModelPrivate *>(prop->data)->itemAppended();
- static_cast<QmlGraphicsVisualItemModelPrivate *>(prop->data)->emitChildrenChanged();
- }
-
- void itemAppended() {
- Q_Q(QmlGraphicsVisualItemModel);
- QmlGraphicsVisualItemModelAttached *attached = QmlGraphicsVisualItemModelAttached::properties(children.last());
- attached->setIndex(children.count()-1);
- emit q->itemsInserted(children.count()-1, 1);
- emit q->countChanged();
- }
-
- void emitChildrenChanged() {
- Q_Q(QmlGraphicsVisualItemModel);
- emit q->childrenChanged();
- }
-
- QList<QmlGraphicsItem *> children;
-};
-
-
-/*!
- \qmlclass VisualItemModel QmlGraphicsVisualItemModel
- \since 4.7
- \brief The VisualItemModel allows items to be provided to a view.
-
- The children of the VisualItemModel are provided in a model which
- can be used in a view. Note that no delegate should be
- provided to a view since the VisualItemModel contains the
- visual delegate (items).
-
- An item can determine its index within the
- model via the VisualItemModel.index attached property.
-
- The example below places three colored rectangles in a ListView.
- \code
- Item {
- VisualItemModel {
- id: itemModel
- Rectangle { height: 30; width: 80; color: "red" }
- Rectangle { height: 30; width: 80; color: "green" }
- Rectangle { height: 30; width: 80; color: "blue" }
- }
-
- ListView {
- anchors.fill: parent
- model: itemModel
- }
- }
- \endcode
-*/
-QmlGraphicsVisualItemModel::QmlGraphicsVisualItemModel()
- : QmlGraphicsVisualModel(*(new QmlGraphicsVisualItemModelPrivate))
-{
-}
-
-QmlListProperty<QmlGraphicsItem> QmlGraphicsVisualItemModel::children()
-{
- Q_D(QmlGraphicsVisualItemModel);
- return QmlListProperty<QmlGraphicsItem>(this, d, QmlGraphicsVisualItemModelPrivate::children_append);
-}
-
-/*!
- \qmlproperty int VisualItemModel::count
-
- The number of items in the model. This property is readonly.
-*/
-int QmlGraphicsVisualItemModel::count() const
-{
- Q_D(const QmlGraphicsVisualItemModel);
- return d->children.count();
-}
-
-bool QmlGraphicsVisualItemModel::isValid() const
-{
- return true;
-}
-
-QmlGraphicsItem *QmlGraphicsVisualItemModel::item(int index, bool)
-{
- Q_D(QmlGraphicsVisualItemModel);
- return d->children.at(index);
-}
-
-QmlGraphicsVisualModel::ReleaseFlags QmlGraphicsVisualItemModel::release(QmlGraphicsItem *)
-{
- // Nothing to do
- return 0;
-}
-
-void QmlGraphicsVisualItemModel::completeItem()
-{
- // Nothing to do
-}
-
-QString QmlGraphicsVisualItemModel::stringValue(int index, const QString &name)
-{
- Q_D(QmlGraphicsVisualItemModel);
- if (index < 0 || index >= d->children.count())
- return QString();
- return QmlEngine::contextForObject(d->children.at(index))->contextProperty(name).toString();
-}
-
-QVariant QmlGraphicsVisualItemModel::evaluate(int index, const QString &expression, QObject *objectContext)
-{
- Q_D(QmlGraphicsVisualItemModel);
- if (index < 0 || index >= d->children.count())
- return QVariant();
- QmlContext *ccontext = qmlContext(this);
- QmlContext *ctxt = new QmlContext(ccontext);
- ctxt->addDefaultObject(d->children.at(index));
- QmlExpression e(ctxt, expression, objectContext);
- e.setTrackChange(false);
- QVariant value = e.value();
- delete ctxt;
- return value;
-}
-
-int QmlGraphicsVisualItemModel::indexOf(QmlGraphicsItem *item, QObject *) const
-{
- Q_D(const QmlGraphicsVisualItemModel);
- return d->children.indexOf(item);
-}
-
-QmlGraphicsVisualItemModelAttached *QmlGraphicsVisualItemModel::qmlAttachedProperties(QObject *obj)
-{
- return QmlGraphicsVisualItemModelAttached::properties(obj);
-}
-
-//============================================================================
-
-class VDMDelegateDataType : public QmlOpenMetaObjectType
-{
-public:
- VDMDelegateDataType(const QMetaObject *base, QmlEngine *engine) : QmlOpenMetaObjectType(base, engine) {}
-
- void propertyCreated(int, QMetaPropertyBuilder &prop) {
- prop.setWritable(false);
- }
-};
-
-class QmlGraphicsVisualDataModelParts;
-class QmlGraphicsVisualDataModelData;
-class QmlGraphicsVisualDataModelPrivate : public QObjectPrivate
-{
-public:
- QmlGraphicsVisualDataModelPrivate(QmlContext *);
-
- static QmlGraphicsVisualDataModelPrivate *get(QmlGraphicsVisualDataModel *m) {
- return static_cast<QmlGraphicsVisualDataModelPrivate *>(QObjectPrivate::get(m));
- }
-
- QmlGuard<QListModelInterface> m_listModelInterface;
- QmlGuard<QAbstractItemModel> m_abstractItemModel;
- QmlGuard<QmlGraphicsVisualDataModel> m_visualItemModel;
- QString m_part;
-
- QmlComponent *m_delegate;
- QmlContext *m_context;
- QList<int> m_roles;
- QHash<QByteArray,int> m_roleNames;
- void ensureRoles() {
- if (m_roleNames.isEmpty()) {
- if (m_listModelInterface) {
- m_roles = m_listModelInterface->roles();
- for (int ii = 0; ii < m_roles.count(); ++ii)
- m_roleNames.insert(m_listModelInterface->toString(m_roles.at(ii)).toUtf8(), m_roles.at(ii));
- if (m_roles.count() == 1)
- m_roleNames.insert("modelData", m_roles.at(0));
- } else if (m_abstractItemModel) {
- for (QHash<int,QByteArray>::const_iterator it = m_abstractItemModel->roleNames().begin();
- it != m_abstractItemModel->roleNames().end(); ++it) {
- m_roles.append(it.key());
- m_roleNames.insert(*it, it.key());
- }
- if (m_roles.count() == 1)
- m_roleNames.insert("modelData", m_roles.at(0));
- } else if (m_listAccessor) {
- m_roleNames.insert("modelData", 0);
- if (m_listAccessor->type() == QmlListAccessor::Instance) {
- if (QObject *object = m_listAccessor->at(0).value<QObject*>()) {
- int count = object->metaObject()->propertyCount();
- for (int ii = 1; ii < count; ++ii) {
- const QMetaProperty &prop = object->metaObject()->property(ii);
- m_roleNames.insert(prop.name(), 0);
- }
- }
- }
- }
- }
- }
-
- void createMetaData() {
- if (!m_metaDataCreated) {
- ensureRoles();
- QHash<QByteArray, int>::const_iterator it = m_roleNames.begin();
- while (it != m_roleNames.end()) {
- m_delegateDataType->createProperty(it.key());
- ++it;
- }
- m_metaDataCreated = true;
- }
- }
-
- struct ObjectRef {
- ObjectRef(QObject *object=0) : obj(object), ref(1) {}
- QObject *obj;
- int ref;
- };
- class Cache : public QHash<int, ObjectRef> {
- public:
- QObject *getItem(int index) {
- QObject *item = 0;
- QHash<int,ObjectRef>::iterator it = find(index);
- if (it != end()) {
- (*it).ref++;
- item = (*it).obj;
- }
- return item;
- }
- QObject *item(int index) {
- QObject *item = 0;
- QHash<int, ObjectRef>::const_iterator it = find(index);
- if (it != end())
- item = (*it).obj;
- return item;
- }
- void insertItem(int index, QObject *obj) {
- insert(index, ObjectRef(obj));
- }
- bool releaseItem(QObject *obj) {
- QHash<int, ObjectRef>::iterator it = begin();
- for (; it != end(); ++it) {
- ObjectRef &objRef = *it;
- if (objRef.obj == obj) {
- if (--objRef.ref == 0) {
- erase(it);
- return true;
- }
- break;
- }
- }
- return false;
- }
- };
-
- int modelCount() const {
- if (m_visualItemModel)
- return m_visualItemModel->count();
- if (m_listModelInterface)
- return m_listModelInterface->count();
- if (m_abstractItemModel)
- return m_abstractItemModel->rowCount();
- if (m_listAccessor)
- return m_listAccessor->count();
- return 0;
- }
-
- Cache m_cache;
- QHash<QObject *, QmlPackage*> m_packaged;
-
- QmlGraphicsVisualDataModelParts *m_parts;
- friend class QmlGraphicsVisualItemParts;
-
- VDMDelegateDataType *m_delegateDataType;
- friend class QmlGraphicsVisualDataModelData;
- bool m_metaDataCreated;
- bool m_metaDataCacheable;
-
- QmlGraphicsVisualDataModelData *data(QObject *item);
-
- QVariant m_modelVariant;
- QmlListAccessor *m_listAccessor;
-};
-
-class QmlGraphicsVisualDataModelDataMetaObject : public QmlOpenMetaObject
-{
-public:
- QmlGraphicsVisualDataModelDataMetaObject(QObject *parent, QmlOpenMetaObjectType *type)
- : QmlOpenMetaObject(parent, type) {}
-
- virtual QVariant initialValue(int);
- virtual int createProperty(const char *, const char *);
-
-private:
- friend class QmlGraphicsVisualDataModelData;
- QHash<int,int> roleToProp;
-};
-
-class QmlGraphicsVisualDataModelData : public QObject
-{
-Q_OBJECT
-public:
- QmlGraphicsVisualDataModelData(int index, QmlGraphicsVisualDataModel *model);
- ~QmlGraphicsVisualDataModelData();
-
- Q_PROPERTY(int index READ index NOTIFY indexChanged)
- int index() const;
- void setIndex(int index);
-
- int propForRole(int) const;
- void setValue(int, const QVariant &);
-
-Q_SIGNALS:
- void indexChanged();
-
-private:
- friend class QmlGraphicsVisualDataModelDataMetaObject;
- int m_index;
- QmlGuard<QmlGraphicsVisualDataModel> m_model;
- QmlGraphicsVisualDataModelDataMetaObject *m_meta;
-};
-
-int QmlGraphicsVisualDataModelData::propForRole(int id) const
-{
- QHash<int,int>::const_iterator it = m_meta->roleToProp.find(id);
- if (it != m_meta->roleToProp.end())
- return m_meta->roleToProp[id];
- return -1;
-}
-
-void QmlGraphicsVisualDataModelData::setValue(int id, const QVariant &val)
-{
- m_meta->setValue(id, val);
-}
-
-int QmlGraphicsVisualDataModelDataMetaObject::createProperty(const char *name, const char *type)
-{
- QmlGraphicsVisualDataModelData *data =
- static_cast<QmlGraphicsVisualDataModelData *>(object());
-
- if (!data->m_model)
- return -1;
-
- QmlGraphicsVisualDataModelPrivate *model = QmlGraphicsVisualDataModelPrivate::get(data->m_model);
-
- if ((!model->m_listModelInterface || !model->m_abstractItemModel) && model->m_listAccessor) {
- if (model->m_listAccessor->type() == QmlListAccessor::ListProperty) {
- model->ensureRoles();
- QObject *object = model->m_listAccessor->at(data->m_index).value<QObject*>();
- if (object && object->property(name).isValid())
- return QmlOpenMetaObject::createProperty(name, type);
- }
- }
- return -1;
-}
-
-QVariant QmlGraphicsVisualDataModelDataMetaObject::initialValue(int propId)
-{
- QmlGraphicsVisualDataModelData *data =
- static_cast<QmlGraphicsVisualDataModelData *>(object());
-
- Q_ASSERT(data->m_model);
- QmlGraphicsVisualDataModelPrivate *model = QmlGraphicsVisualDataModelPrivate::get(data->m_model);
-
- QByteArray propName = name(propId);
- if ((!model->m_listModelInterface || !model->m_abstractItemModel) && model->m_listAccessor) {
- if (propName == "modelData") {
- if (model->m_listAccessor->type() == QmlListAccessor::Instance) {
- QObject *object = model->m_listAccessor->at(0).value<QObject*>();
- return object->metaObject()->property(1).read(object); // the first property after objectName
- }
- return model->m_listAccessor->at(data->m_index);
- } else {
- // return any property of a single object instance.
- QObject *object = model->m_listAccessor->at(data->m_index).value<QObject*>();
- return object->property(propName);
- }
- } else if (model->m_listModelInterface) {
- model->ensureRoles();
- QHash<QByteArray,int>::const_iterator it = model->m_roleNames.find(propName);
- if (it != model->m_roleNames.end()) {
- roleToProp.insert(*it, propId);
- QVariant value = model->m_listModelInterface->data(data->m_index, *it);
- return value;
- } else if (model->m_roles.count() == 1 && propName == "modelData") {
- //for compatability with other lists, assign modelData if there is only a single role
- roleToProp.insert(model->m_roles.first(), propId);
- QVariant value = model->m_listModelInterface->data(data->m_index, model->m_roles.first());
- return value;
- }
- } else if (model->m_abstractItemModel) {
- model->ensureRoles();
- QHash<QByteArray,int>::const_iterator it = model->m_roleNames.find(propName);
- if (it != model->m_roleNames.end()) {
- roleToProp.insert(*it, propId);
- QModelIndex index = model->m_abstractItemModel->index(data->m_index, 0);
- return model->m_abstractItemModel->data(index, *it);
- }
- }
- Q_ASSERT(!"Can never be reached");
- return QVariant();
-}
-
-QmlGraphicsVisualDataModelData::QmlGraphicsVisualDataModelData(int index,
- QmlGraphicsVisualDataModel *model)
-: m_index(index), m_model(model),
-m_meta(new QmlGraphicsVisualDataModelDataMetaObject(this, QmlGraphicsVisualDataModelPrivate::get(model)->m_delegateDataType))
-{
- QmlGraphicsVisualDataModelPrivate *modelPriv = QmlGraphicsVisualDataModelPrivate::get(model);
- if (modelPriv->m_metaDataCacheable) {
- if (!modelPriv->m_metaDataCreated)
- modelPriv->createMetaData();
- m_meta->setCached(true);
- }
-}
-
-QmlGraphicsVisualDataModelData::~QmlGraphicsVisualDataModelData()
-{
-}
-
-int QmlGraphicsVisualDataModelData::index() const
-{
- return m_index;
-}
-
-// This is internal only - it should not be set from qml
-void QmlGraphicsVisualDataModelData::setIndex(int index)
-{
- m_index = index;
- emit indexChanged();
-}
-
-//---------------------------------------------------------------------------
-
-class QmlGraphicsVisualDataModelPartsMetaObject : public QmlOpenMetaObject
-{
-public:
- QmlGraphicsVisualDataModelPartsMetaObject(QObject *parent)
- : QmlOpenMetaObject(parent) {}
-
- virtual void propertyCreated(int, QMetaPropertyBuilder &);
- virtual QVariant initialValue(int);
-};
-
-class QmlGraphicsVisualDataModelParts : public QObject
-{
-Q_OBJECT
-public:
- QmlGraphicsVisualDataModelParts(QmlGraphicsVisualDataModel *parent);
-
-private:
- friend class QmlGraphicsVisualDataModelPartsMetaObject;
- QmlGraphicsVisualDataModel *model;
-};
-
-void QmlGraphicsVisualDataModelPartsMetaObject::propertyCreated(int, QMetaPropertyBuilder &prop)
-{
- prop.setWritable(false);
-}
-
-QVariant QmlGraphicsVisualDataModelPartsMetaObject::initialValue(int id)
-{
- QmlGraphicsVisualDataModel *m = new QmlGraphicsVisualDataModel;
- m->setParent(object());
- m->setPart(QString::fromUtf8(name(id)));
- m->setModel(QVariant::fromValue(static_cast<QmlGraphicsVisualDataModelParts *>(object())->model));
-
- QVariant var = QVariant::fromValue((QObject *)m);
- return var;
-}
-
-QmlGraphicsVisualDataModelParts::QmlGraphicsVisualDataModelParts(QmlGraphicsVisualDataModel *parent)
-: QObject(parent), model(parent)
-{
- new QmlGraphicsVisualDataModelPartsMetaObject(this);
-}
-
-QmlGraphicsVisualDataModelPrivate::QmlGraphicsVisualDataModelPrivate(QmlContext *ctxt)
-: m_listModelInterface(0), m_abstractItemModel(0), m_visualItemModel(0), m_delegate(0)
-, m_context(ctxt), m_parts(0), m_delegateDataType(0), m_metaDataCreated(false)
-, m_metaDataCacheable(false), m_listAccessor(0)
-{
-}
-
-QmlGraphicsVisualDataModelData *QmlGraphicsVisualDataModelPrivate::data(QObject *item)
-{
- QmlGraphicsVisualDataModelData *dataItem =
- item->findChild<QmlGraphicsVisualDataModelData *>();
- Q_ASSERT(dataItem);
- return dataItem;
-}
-
-//---------------------------------------------------------------------------
-
-QmlGraphicsVisualDataModel::QmlGraphicsVisualDataModel()
-: QmlGraphicsVisualModel(*(new QmlGraphicsVisualDataModelPrivate(0)))
-{
-}
-
-QmlGraphicsVisualDataModel::QmlGraphicsVisualDataModel(QmlContext *ctxt)
-: QmlGraphicsVisualModel(*(new QmlGraphicsVisualDataModelPrivate(ctxt)))
-{
-}
-
-QmlGraphicsVisualDataModel::~QmlGraphicsVisualDataModel()
-{
- Q_D(QmlGraphicsVisualDataModel);
- if (d->m_listAccessor)
- delete d->m_listAccessor;
- if (d->m_delegateDataType)
- d->m_delegateDataType->release();
-}
-
-QVariant QmlGraphicsVisualDataModel::model() const
-{
- Q_D(const QmlGraphicsVisualDataModel);
- return d->m_modelVariant;
-}
-
-void QmlGraphicsVisualDataModel::setModel(const QVariant &model)
-{
- Q_D(QmlGraphicsVisualDataModel);
- delete d->m_listAccessor;
- d->m_listAccessor = 0;
- d->m_modelVariant = model;
- if (d->m_listModelInterface) {
- // Assume caller has released all items.
- QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsChanged(int,int,QList<int>)),
- this, SLOT(_q_itemsChanged(int,int,QList<int>)));
- QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsInserted(int,int)),
- this, SLOT(_q_itemsInserted(int,int)));
- QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsRemoved(int,int)),
- this, SLOT(_q_itemsRemoved(int,int)));
- QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsMoved(int,int,int)),
- this, SLOT(_q_itemsMoved(int,int,int)));
- d->m_listModelInterface = 0;
- } else if (d->m_abstractItemModel) {
- QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsInserted(const QModelIndex &,int,int)),
- this, SLOT(_q_rowsInserted(const QModelIndex &,int,int)));
- QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsRemoved(const QModelIndex &,int,int)),
- this, SLOT(_q_rowsRemoved(const QModelIndex &,int,int)));
- QObject::disconnect(d->m_abstractItemModel, SIGNAL(dataChanged(const QModelIndex&,const QModelIndex&)),
- this, SLOT(_q_dataChanged(const QModelIndex&,const QModelIndex&)));
- QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsMoved(const QModelIndex&,int,int,const QModelIndex&,int)),
- this, SLOT(_q_rowsMoved(const QModelIndex&,int,int,const QModelIndex&,int)));
- } else if (d->m_visualItemModel) {
- QObject::disconnect(d->m_visualItemModel, SIGNAL(itemsInserted(int,int)),
- this, SIGNAL(itemsInserted(int,int)));
- QObject::disconnect(d->m_visualItemModel, SIGNAL(itemsRemoved(int,int)),
- this, SIGNAL(itemsRemoved(int,int)));
- QObject::disconnect(d->m_visualItemModel, SIGNAL(itemsMoved(int,int,int)),
- this, SIGNAL(itemsMoved(int,int,int)));
- QObject::disconnect(d->m_visualItemModel, SIGNAL(createdPackage(int,QmlPackage*)),
- this, SLOT(_q_createdPackage(int,QmlPackage*)));
- QObject::disconnect(d->m_visualItemModel, SIGNAL(destroyingPackage(QmlPackage*)),
- this, SLOT(_q_destroyingPackage(QmlPackage*)));
- d->m_visualItemModel = 0;
- }
-
- d->m_roles.clear();
- d->m_roleNames.clear();
- if (d->m_delegateDataType)
- d->m_delegateDataType->release();
- d->m_metaDataCreated = 0;
- d->m_metaDataCacheable = false;
- d->m_delegateDataType = new VDMDelegateDataType(&QmlGraphicsVisualDataModelData::staticMetaObject, d->m_context?d->m_context->engine():qmlEngine(this));
-
- QObject *object = qvariant_cast<QObject *>(model);
- if (object && (d->m_listModelInterface = qobject_cast<QListModelInterface *>(object))) {
- QObject::connect(d->m_listModelInterface, SIGNAL(itemsChanged(int,int,QList<int>)),
- this, SLOT(_q_itemsChanged(int,int,QList<int>)));
- QObject::connect(d->m_listModelInterface, SIGNAL(itemsInserted(int,int)),
- this, SLOT(_q_itemsInserted(int,int)));
- QObject::connect(d->m_listModelInterface, SIGNAL(itemsRemoved(int,int)),
- this, SLOT(_q_itemsRemoved(int,int)));
- QObject::connect(d->m_listModelInterface, SIGNAL(itemsMoved(int,int,int)),
- this, SLOT(_q_itemsMoved(int,int,int)));
- d->m_metaDataCacheable = true;
- if (d->m_delegate && d->m_listModelInterface->count())
- emit itemsInserted(0, d->m_listModelInterface->count());
- return;
- } else if (object && (d->m_abstractItemModel = qobject_cast<QAbstractItemModel *>(object))) {
- QObject::connect(d->m_abstractItemModel, SIGNAL(rowsInserted(const QModelIndex &,int,int)),
- this, SLOT(_q_rowsInserted(const QModelIndex &,int,int)));
- QObject::connect(d->m_abstractItemModel, SIGNAL(rowsRemoved(const QModelIndex &,int,int)),
- this, SLOT(_q_rowsRemoved(const QModelIndex &,int,int)));
- QObject::connect(d->m_abstractItemModel, SIGNAL(dataChanged(const QModelIndex&,const QModelIndex&)),
- this, SLOT(_q_dataChanged(const QModelIndex&,const QModelIndex&)));
- QObject::connect(d->m_abstractItemModel, SIGNAL(rowsMoved(const QModelIndex&,int,int,const QModelIndex&,int)),
- this, SLOT(_q_rowsMoved(const QModelIndex&,int,int,const QModelIndex&,int)));
- d->m_metaDataCacheable = true;
- return;
- }
- if ((d->m_visualItemModel = qvariant_cast<QmlGraphicsVisualDataModel *>(model))) {
- QObject::connect(d->m_visualItemModel, SIGNAL(itemsInserted(int,int)),
- this, SIGNAL(itemsInserted(int,int)));
- QObject::connect(d->m_visualItemModel, SIGNAL(itemsRemoved(int,int)),
- this, SIGNAL(itemsRemoved(int,int)));
- QObject::connect(d->m_visualItemModel, SIGNAL(itemsMoved(int,int,int)),
- this, SIGNAL(itemsMoved(int,int,int)));
- QObject::connect(d->m_visualItemModel, SIGNAL(createdPackage(int,QmlPackage*)),
- this, SLOT(_q_createdPackage(int,QmlPackage*)));
- QObject::connect(d->m_visualItemModel, SIGNAL(destroyingPackage(QmlPackage*)),
- this, SLOT(_q_destroyingPackage(QmlPackage*)));
- return;
- }
- d->m_listAccessor = new QmlListAccessor;
- d->m_listAccessor->setList(model, d->m_context?d->m_context->engine():qmlEngine(this));
- if (d->m_listAccessor->type() != QmlListAccessor::ListProperty)
- d->m_metaDataCacheable = true;
- if (d->m_delegate && d->modelCount()) {
- emit itemsInserted(0, d->modelCount());
- emit countChanged();
- }
-}
-
-QmlComponent *QmlGraphicsVisualDataModel::delegate() const
-{
- Q_D(const QmlGraphicsVisualDataModel);
- if (d->m_visualItemModel)
- return d->m_visualItemModel->delegate();
- return d->m_delegate;
-}
-
-void QmlGraphicsVisualDataModel::setDelegate(QmlComponent *delegate)
-{
- Q_D(QmlGraphicsVisualDataModel);
- bool wasValid = d->m_delegate != 0;
- d->m_delegate = delegate;
- if (!wasValid && d->modelCount() && d->m_delegate) {
- emit itemsInserted(0, d->modelCount());
- emit countChanged();
- }
- if (wasValid && !d->m_delegate && d->modelCount()) {
- emit itemsRemoved(0, d->modelCount());
- emit countChanged();
- }
-}
-
-QString QmlGraphicsVisualDataModel::part() const
-{
- Q_D(const QmlGraphicsVisualDataModel);
- return d->m_part;
-}
-
-void QmlGraphicsVisualDataModel::setPart(const QString &part)
-{
- Q_D(QmlGraphicsVisualDataModel);
- d->m_part = part;
-}
-
-int QmlGraphicsVisualDataModel::count() const
-{
- Q_D(const QmlGraphicsVisualDataModel);
- return d->modelCount();
-}
-
-QmlGraphicsItem *QmlGraphicsVisualDataModel::item(int index, bool complete)
-{
- Q_D(QmlGraphicsVisualDataModel);
- if (d->m_visualItemModel)
- return d->m_visualItemModel->item(index, d->m_part.toUtf8(), complete);
- return item(index, QByteArray(), complete);
-}
-
-/*
- Returns ReleaseStatus flags.
-*/
-QmlGraphicsVisualDataModel::ReleaseFlags QmlGraphicsVisualDataModel::release(QmlGraphicsItem *item)
-{
- Q_D(QmlGraphicsVisualDataModel);
- if (d->m_visualItemModel)
- return d->m_visualItemModel->release(item);
-
- ReleaseFlags stat = 0;
- QObject *obj = item;
- bool inPackage = false;
-
- QHash<QObject*,QmlPackage*>::iterator it = d->m_packaged.find(item);
- if (it != d->m_packaged.end()) {
- QmlPackage *package = *it;
- d->m_packaged.erase(it);
- if (d->m_packaged.contains(item))
- stat |= Referenced;
- inPackage = true;
- obj = package; // fall through and delete
- }
-
- if (d->m_cache.releaseItem(obj)) {
- if (inPackage) {
- emit destroyingPackage(qobject_cast<QmlPackage*>(obj));
- } else {
- item->setVisible(false);
- static_cast<QGraphicsItem*>(item)->setParentItem(0);
- }
- stat |= Destroyed;
- obj->deleteLater();
- } else if (!inPackage) {
- stat |= Referenced;
- }
-
- return stat;
-}
-
-QObject *QmlGraphicsVisualDataModel::parts()
-{
- Q_D(QmlGraphicsVisualDataModel);
- if (!d->m_parts)
- d->m_parts = new QmlGraphicsVisualDataModelParts(this);
- return d->m_parts;
-}
-
-QmlGraphicsItem *QmlGraphicsVisualDataModel::item(int index, const QByteArray &viewId, bool complete)
-{
- Q_D(QmlGraphicsVisualDataModel);
- if (d->m_visualItemModel)
- return d->m_visualItemModel->item(index, viewId, complete);
-
- if (d->modelCount() <= 0 || !d->m_delegate)
- return 0;
-
- QObject *nobj = d->m_cache.getItem(index);
- if (!nobj) {
- QmlContext *ccontext = d->m_context;
- if (!ccontext) ccontext = qmlContext(this);
- QmlContext *ctxt = new QmlContext(ccontext);
- QmlGraphicsVisualDataModelData *data = new QmlGraphicsVisualDataModelData(index, this);
- ctxt->setContextProperty(QLatin1String("model"), data);
- ctxt->addDefaultObject(data);
- nobj = d->m_delegate->beginCreate(ctxt);
- if (complete)
- d->m_delegate->completeCreate();
- if (nobj) {
- ctxt->setParent(nobj);
- data->setParent(nobj);
- d->m_cache.insertItem(index, nobj);
- if (QmlPackage *package = qobject_cast<QmlPackage *>(nobj))
- emit createdPackage(index, package);
- } else {
- delete data;
- delete ctxt;
- qWarning() << d->m_delegate->errors();
- }
- }
- QmlGraphicsItem *item = qobject_cast<QmlGraphicsItem *>(nobj);
- if (!item) {
- QmlPackage *package = qobject_cast<QmlPackage *>(nobj);
- if (package) {
- QObject *o = package->part(QString::fromUtf8(viewId));
- item = qobject_cast<QmlGraphicsItem *>(o);
- if (item)
- d->m_packaged.insertMulti(item, package);
- }
- }
- if (!item) {
- d->m_cache.releaseItem(nobj);
- qmlInfo(d->m_delegate) << QmlGraphicsVisualDataModel::tr("Delegate component must be Item type.");
- }
-
- return item;
-}
-
-void QmlGraphicsVisualDataModel::completeItem()
-{
- Q_D(QmlGraphicsVisualDataModel);
- if (d->m_visualItemModel) {
- d->m_visualItemModel->completeItem();
- return;
- }
-
- d->m_delegate->completeCreate();
-}
-
-QString QmlGraphicsVisualDataModel::stringValue(int index, const QString &name)
-{
- Q_D(QmlGraphicsVisualDataModel);
- if (d->m_visualItemModel)
- return d->m_visualItemModel->stringValue(index, name);
-
- if ((!d->m_listModelInterface && !d->m_abstractItemModel) || !d->m_delegate)
- return QString();
-
- QString val;
- QObject *data = 0;
- bool tempData = false;
-
- if (QObject *nobj = d->m_cache.item(index))
- data = d->data(nobj);
- if (!data) {
- data = new QmlGraphicsVisualDataModelData(index, this);
- tempData = true;
- }
-
- QmlDeclarativeData *ddata = QmlDeclarativeData::get(data);
- if (ddata && ddata->propertyCache) {
- QmlPropertyCache::Data *prop = ddata->propertyCache->property(name);
- if (prop) {
- if (prop->propType == QVariant::String) {
- void *args[] = { &val, 0 };
- QMetaObject::metacall(data, QMetaObject::ReadProperty, prop->coreIndex, args);
- } else if (prop->propType == qMetaTypeId<QVariant>()) {
- QVariant v;
- void *args[] = { &v, 0 };
- QMetaObject::metacall(data, QMetaObject::ReadProperty, prop->coreIndex, args);
- val = v.toString();
- }
- } else {
- val = data->property(name.toUtf8()).toString();
- }
- } else {
- val = data->property(name.toUtf8()).toString();
- }
-
- if (tempData)
- delete data;
-
- return val;
-}
-
-QVariant QmlGraphicsVisualDataModel::evaluate(int index, const QString &expression, QObject *objectContext)
-{
- Q_D(QmlGraphicsVisualDataModel);
- if (d->m_visualItemModel)
- return d->m_visualItemModel->evaluate(index, expression, objectContext);
-
- if ((!d->m_listModelInterface && !d->m_abstractItemModel) || !d->m_delegate)
- return QVariant();
-
- QVariant value;
- QObject *nobj = d->m_cache.item(index);
- if (nobj) {
- QmlGraphicsItem *item = qobject_cast<QmlGraphicsItem *>(nobj);
- if (item) {
- QmlExpression e(qmlContext(item), expression, objectContext);
- e.setTrackChange(false);
- value = e.value();
- }
- } else {
- QmlContext *ccontext = d->m_context;
- if (!ccontext) ccontext = qmlContext(this);
- QmlContext *ctxt = new QmlContext(ccontext);
- QmlGraphicsVisualDataModelData *data = new QmlGraphicsVisualDataModelData(index, this);
- ctxt->addDefaultObject(data);
- QmlExpression e(ctxt, expression, objectContext);
- e.setTrackChange(false);
- value = e.value();
- delete data;
- delete ctxt;
- }
-
- return value;
-}
-
-int QmlGraphicsVisualDataModel::indexOf(QmlGraphicsItem *item, QObject *) const
-{
- QVariant val = QmlEngine::contextForObject(item)->contextProperty(QLatin1String("index"));
- return val.toInt();
- return -1;
-}
-
-void QmlGraphicsVisualDataModel::_q_itemsChanged(int index, int count,
- const QList<int> &roles)
-{
- Q_D(QmlGraphicsVisualDataModel);
- // XXX - highly inefficient
- for (int ii = index; ii < index + count; ++ii) {
-
- if (QObject *item = d->m_cache.item(ii)) {
- QmlGraphicsVisualDataModelData *data = d->data(item);
-
- for (int roleIdx = 0; roleIdx < roles.count(); ++roleIdx) {
- int role = roles.at(roleIdx);
- int propId = data->propForRole(role);
- if (propId != -1) {
- if (d->m_listModelInterface) {
- data->setValue(propId, d->m_listModelInterface->data(ii, QList<int>() << role).value(role));
- } else if (d->m_abstractItemModel) {
- QModelIndex index = d->m_abstractItemModel->index(ii, 0);
- data->setValue(propId, d->m_abstractItemModel->data(index, role));
- }
- }
- }
- }
- }
-}
-
-void QmlGraphicsVisualDataModel::_q_itemsInserted(int index, int count)
-{
- Q_D(QmlGraphicsVisualDataModel);
- // XXX - highly inefficient
- QHash<int,QmlGraphicsVisualDataModelPrivate::ObjectRef> items;
- for (QHash<int,QmlGraphicsVisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
- iter != d->m_cache.end(); ) {
-
- if (iter.key() >= index) {
- QmlGraphicsVisualDataModelPrivate::ObjectRef objRef = *iter;
- int index = iter.key() + count;
- iter = d->m_cache.erase(iter);
-
- items.insert(index, objRef);
-
- QmlGraphicsVisualDataModelData *data = d->data(objRef.obj);
- data->setIndex(index);
- } else {
- ++iter;
- }
- }
- d->m_cache.unite(items);
-
- emit itemsInserted(index, count);
- emit countChanged();
-}
-
-void QmlGraphicsVisualDataModel::_q_itemsRemoved(int index, int count)
-{
- Q_D(QmlGraphicsVisualDataModel);
- // XXX - highly inefficient
- QHash<int, QmlGraphicsVisualDataModelPrivate::ObjectRef> items;
- for (QHash<int, QmlGraphicsVisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
- iter != d->m_cache.end(); ) {
- if (iter.key() >= index && iter.key() < index + count) {
- QmlGraphicsVisualDataModelPrivate::ObjectRef objRef = *iter;
- iter = d->m_cache.erase(iter);
- items.insertMulti(-1, objRef); //XXX perhaps better to maintain separately
- QmlGraphicsVisualDataModelData *data = d->data(objRef.obj);
- data->setIndex(-1);
- } else if (iter.key() >= index + count) {
- QmlGraphicsVisualDataModelPrivate::ObjectRef objRef = *iter;
- int index = iter.key() - count;
- iter = d->m_cache.erase(iter);
- items.insert(index, objRef);
- QmlGraphicsVisualDataModelData *data = d->data(objRef.obj);
- data->setIndex(index);
- } else {
- ++iter;
- }
- }
-
- d->m_cache.unite(items);
- emit itemsRemoved(index, count);
- emit countChanged();
-}
-
-void QmlGraphicsVisualDataModel::_q_itemsMoved(int from, int to, int count)
-{
- Q_D(QmlGraphicsVisualDataModel);
- // XXX - highly inefficient
- QHash<int,QmlGraphicsVisualDataModelPrivate::ObjectRef> items;
- for (QHash<int,QmlGraphicsVisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
- iter != d->m_cache.end(); ) {
-
- if (iter.key() >= from && iter.key() < from + count) {
- QmlGraphicsVisualDataModelPrivate::ObjectRef objRef = *iter;
- int index = iter.key() - from + to;
- iter = d->m_cache.erase(iter);
-
- items.insert(index, objRef);
-
- QmlGraphicsVisualDataModelData *data = d->data(objRef.obj);
- data->setIndex(index);
- } else {
- ++iter;
- }
- }
- for (QHash<int,QmlGraphicsVisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
- iter != d->m_cache.end(); ) {
-
- int diff = from > to ? count : -count;
- if (iter.key() >= qMin(from,to) && iter.key() < qMax(from+count,to+count)) {
- QmlGraphicsVisualDataModelPrivate::ObjectRef objRef = *iter;
- int index = iter.key() + diff;
- iter = d->m_cache.erase(iter);
-
- items.insert(index, objRef);
-
- QmlGraphicsVisualDataModelData *data = d->data(objRef.obj);
- data->setIndex(index);
- } else {
- ++iter;
- }
- }
- d->m_cache.unite(items);
-
- emit itemsMoved(from, to, count);
-}
-
-void QmlGraphicsVisualDataModel::_q_rowsInserted(const QModelIndex &parent, int begin, int end)
-{
- if (!parent.isValid())
- _q_itemsInserted(begin, end - begin + 1);
-}
-
-void QmlGraphicsVisualDataModel::_q_rowsRemoved(const QModelIndex &parent, int begin, int end)
-{
- if (!parent.isValid())
- _q_itemsRemoved(begin, end - begin + 1);
-}
-
-void QmlGraphicsVisualDataModel::_q_rowsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)
-{
- const int count = sourceEnd - sourceStart + 1;
- if (!destinationParent.isValid() && !sourceParent.isValid()) {
- _q_itemsMoved(sourceStart, destinationRow, count);
- } else if (!sourceParent.isValid()) {
- _q_itemsRemoved(sourceStart, count);
- } else if (!destinationParent.isValid()) {
- _q_itemsInserted(destinationRow, count);
- }
-}
-
-void QmlGraphicsVisualDataModel::_q_dataChanged(const QModelIndex &begin, const QModelIndex &end)
-{
- Q_D(QmlGraphicsVisualDataModel);
- if (!begin.parent().isValid())
- _q_itemsChanged(begin.row(), end.row() - begin.row() + 1, d->m_roles);
-}
-
-void QmlGraphicsVisualDataModel::_q_createdPackage(int index, QmlPackage *package)
-{
- Q_D(QmlGraphicsVisualDataModel);
- emit createdItem(index, qobject_cast<QmlGraphicsItem*>(package->part(d->m_part)));
-}
-
-void QmlGraphicsVisualDataModel::_q_destroyingPackage(QmlPackage *package)
-{
- Q_D(QmlGraphicsVisualDataModel);
- emit destroyingItem(qobject_cast<QmlGraphicsItem*>(package->part(d->m_part)));
-}
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QListModelInterface)
-
-#include <qmlgraphicsvisualitemmodel.moc>