1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: http://www.qt-project.org/
7 ** This file is part of the QtDeclarative module of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
42 #include "QtQuick1/private/qdeclarativevisualitemmodel_p.h"
44 #include "QtQuick1/qdeclarativeitem.h"
46 #include <QtDeclarative/qdeclarativecontext.h>
47 #include <QtDeclarative/private/qdeclarativecontext_p.h>
48 #include <QtDeclarative/qdeclarativeengine.h>
49 #include <QtDeclarative/qdeclarativeexpression.h>
50 #include <QtQuick1/private/qdeclarativepackage_p.h>
51 #include <QtQuick1/private/qdeclarativeopenmetaobject_p.h>
52 #include <QtQuick1/private/qdeclarativelistaccessor_p.h>
53 #include <QtDeclarative/qdeclarativeinfo.h>
54 #include <QtDeclarative/private/qdeclarativedata_p.h>
55 #include <QtDeclarative/private/qdeclarativepropertycache_p.h>
56 #include <QtDeclarative/private/qdeclarativeguard_p.h>
57 #include <QtDeclarative/private/qdeclarativeglobal_p.h>
59 #include <qgraphicsscene.h>
60 #include <QtDeclarative/private/qlistmodelinterface_p.h>
63 #include <private/qmetaobjectbuilder_p.h>
64 #include <QtCore/qdebug.h>
66 #include <private/qobject_p.h>
72 QHash<QObject*, QDeclarative1VisualItemModelAttached*> QDeclarative1VisualItemModelAttached::attachedProperties;
75 class QDeclarative1VisualItemModelPrivate : public QObjectPrivate
77 Q_DECLARE_PUBLIC(QDeclarative1VisualItemModel)
79 QDeclarative1VisualItemModelPrivate() : QObjectPrivate() {}
81 static void children_append(QDeclarativeListProperty<QDeclarativeItem> *prop, QDeclarativeItem *item) {
82 QDeclarative_setParent_noEvent(item, prop->object);
83 static_cast<QDeclarative1VisualItemModelPrivate *>(prop->data)->children.append(Item(item));
84 static_cast<QDeclarative1VisualItemModelPrivate *>(prop->data)->itemAppended();
85 static_cast<QDeclarative1VisualItemModelPrivate *>(prop->data)->emitChildrenChanged();
88 static int children_count(QDeclarativeListProperty<QDeclarativeItem> *prop) {
89 return static_cast<QDeclarative1VisualItemModelPrivate *>(prop->data)->children.count();
92 static QDeclarativeItem *children_at(QDeclarativeListProperty<QDeclarativeItem> *prop, int index) {
93 return static_cast<QDeclarative1VisualItemModelPrivate *>(prop->data)->children.at(index).item;
97 Q_Q(QDeclarative1VisualItemModel);
98 QDeclarative1VisualItemModelAttached *attached = QDeclarative1VisualItemModelAttached::properties(children.last().item);
99 attached->setIndex(children.count()-1);
100 emit q->itemsInserted(children.count()-1, 1);
101 emit q->countChanged();
104 void emitChildrenChanged() {
105 Q_Q(QDeclarative1VisualItemModel);
106 emit q->childrenChanged();
109 int indexOf(QDeclarativeItem *item) const {
110 for (int i = 0; i < children.count(); ++i)
111 if (children.at(i).item == item)
118 Item(QDeclarativeItem *i) : item(i), ref(0) {}
120 void addRef() { ++ref; }
121 bool deref() { return --ref == 0; }
123 QDeclarativeItem *item;
127 QList<Item> children;
132 \qmlclass VisualItemModel QDeclarative1VisualItemModel
133 \inqmlmodule QtQuick 1
134 \ingroup qml-working-with-data
136 \brief The VisualItemModel allows items to be provided to a view.
138 A VisualItemModel contains the visual items to be used in a view.
139 When a VisualItemModel is used in a view, the view does not require
140 a delegate since the VisualItemModel already contains the visual
143 An item can determine its index within the
144 model via the \l{VisualItemModel::index}{index} attached property.
146 The example below places three colored rectangles in a ListView.
153 Rectangle { height: 30; width: 80; color: "red" }
154 Rectangle { height: 30; width: 80; color: "green" }
155 Rectangle { height: 30; width: 80; color: "blue" }
165 \image visualitemmodel.png
167 \sa {declarative/modelviews/visualitemmodel}{VisualItemModel example}
169 QDeclarative1VisualItemModel::QDeclarative1VisualItemModel(QObject *parent)
170 : QDeclarative1VisualModel(*(new QDeclarative1VisualItemModelPrivate), parent)
175 \qmlattachedproperty int VisualItemModel::index
176 This attached property holds the index of this delegate's item within the model.
178 It is attached to each instance of the delegate.
181 QDeclarativeListProperty<QDeclarativeItem> QDeclarative1VisualItemModel::children()
183 Q_D(QDeclarative1VisualItemModel);
184 return QDeclarativeListProperty<QDeclarativeItem>(this, d, d->children_append,
185 d->children_count, d->children_at);
189 \qmlproperty int QtQuick1::VisualItemModel::count
191 The number of items in the model. This property is readonly.
193 int QDeclarative1VisualItemModel::count() const
195 Q_D(const QDeclarative1VisualItemModel);
196 return d->children.count();
199 bool QDeclarative1VisualItemModel::isValid() const
204 QDeclarativeItem *QDeclarative1VisualItemModel::item(int index, bool)
206 Q_D(QDeclarative1VisualItemModel);
207 QDeclarative1VisualItemModelPrivate::Item &item = d->children[index];
212 QDeclarative1VisualModel::ReleaseFlags QDeclarative1VisualItemModel::release(QDeclarativeItem *item)
214 Q_D(QDeclarative1VisualItemModel);
215 int idx = d->indexOf(item);
217 if (d->children[idx].deref()) {
219 item->scene()->removeItem(item);
220 QDeclarative_setParent_noEvent(item, this);
226 bool QDeclarative1VisualItemModel::completePending() const
231 void QDeclarative1VisualItemModel::completeItem()
236 QString QDeclarative1VisualItemModel::stringValue(int index, const QString &name)
238 Q_D(QDeclarative1VisualItemModel);
239 if (index < 0 || index >= d->children.count())
241 return QDeclarativeEngine::contextForObject(d->children.at(index).item)->contextProperty(name).toString();
244 int QDeclarative1VisualItemModel::indexOf(QDeclarativeItem *item, QObject *) const
246 Q_D(const QDeclarative1VisualItemModel);
247 return d->indexOf(item);
250 QDeclarative1VisualItemModelAttached *QDeclarative1VisualItemModel::qmlAttachedProperties(QObject *obj)
252 return QDeclarative1VisualItemModelAttached::properties(obj);
255 //============================================================================
257 class VDMDelegateDataType : public QDeclarative1OpenMetaObjectType
260 VDMDelegateDataType(const QMetaObject *base, QDeclarativeEngine *engine) : QDeclarative1OpenMetaObjectType(base, engine) {}
262 void propertyCreated(int, QMetaPropertyBuilder &prop) {
263 prop.setWritable(false);
267 class QDeclarative1VisualDataModelParts;
268 class QDeclarative1VisualDataModelData;
269 class QDeclarative1VisualDataModelPrivate : public QObjectPrivate
272 QDeclarative1VisualDataModelPrivate(QDeclarativeContext *);
274 static QDeclarative1VisualDataModelPrivate *get(QDeclarative1VisualDataModel *m) {
275 return static_cast<QDeclarative1VisualDataModelPrivate *>(QObjectPrivate::get(m));
278 QDeclarativeGuard<QListModelInterface> m_listModelInterface;
279 QDeclarativeGuard<QAbstractItemModel> m_abstractItemModel;
280 QDeclarativeGuard<QDeclarative1VisualDataModel> m_visualItemModel;
283 QDeclarativeComponent *m_delegate;
284 QDeclarativeGuard<QDeclarativeContext> m_context;
286 QHash<QByteArray,int> m_roleNames;
288 if (m_roleNames.isEmpty()) {
289 if (m_listModelInterface) {
290 m_roles = m_listModelInterface->roles();
291 for (int ii = 0; ii < m_roles.count(); ++ii)
292 m_roleNames.insert(m_listModelInterface->toString(m_roles.at(ii)).toUtf8(), m_roles.at(ii));
293 } else if (m_abstractItemModel) {
294 QHash<int,QByteArray> roles = m_abstractItemModel->roleNames();
295 for (QHash<int,QByteArray>::const_iterator it = roles.begin();
296 it != roles.end(); ++it) {
297 m_roles.append(it.key());
298 m_roleNames.insert(*it, it.key());
301 m_roleNames.insert("hasModelChildren", -1);
302 } else if (m_listAccessor) {
303 m_roleNames.insert("modelData", 0);
304 if (m_listAccessor->type() == QDeclarative1ListAccessor::Instance) {
305 if (QObject *object = m_listAccessor->at(0).value<QObject*>()) {
306 int count = object->metaObject()->propertyCount();
307 for (int ii = 1; ii < count; ++ii) {
308 const QMetaProperty &prop = object->metaObject()->property(ii);
309 m_roleNames.insert(prop.name(), 0);
317 QHash<int,int> m_roleToPropId;
318 int m_modelDataPropId;
319 void createMetaData() {
320 if (!m_metaDataCreated) {
322 if (m_roleNames.count()) {
323 QHash<QByteArray, int>::const_iterator it = m_roleNames.begin();
324 while (it != m_roleNames.end()) {
325 int propId = m_delegateDataType->createProperty(it.key()) - m_delegateDataType->propertyOffset();
326 m_roleToPropId.insert(*it, propId);
329 // Add modelData property
330 if (m_roles.count() == 1)
331 m_modelDataPropId = m_delegateDataType->createProperty("modelData") - m_delegateDataType->propertyOffset();
332 m_metaDataCreated = true;
338 ObjectRef(QObject *object=0) : obj(object), ref(1) {}
342 class Cache : public QHash<int, ObjectRef> {
344 QObject *getItem(int index) {
346 QHash<int,ObjectRef>::iterator it = find(index);
353 QObject *item(int index) {
355 QHash<int, ObjectRef>::const_iterator it = find(index);
360 void insertItem(int index, QObject *obj) {
361 insert(index, ObjectRef(obj));
363 bool releaseItem(QObject *obj) {
364 QHash<int, ObjectRef>::iterator it = begin();
365 for (; it != end(); ++it) {
366 ObjectRef &objRef = *it;
367 if (objRef.obj == obj) {
368 if (--objRef.ref == 0) {
379 int modelCount() const {
380 if (m_visualItemModel)
381 return m_visualItemModel->count();
382 if (m_listModelInterface)
383 return m_listModelInterface->count();
384 if (m_abstractItemModel)
385 return m_abstractItemModel->rowCount(m_root);
387 return m_listAccessor->count();
392 QHash<QObject *, QDeclarative1Package*> m_packaged;
394 QDeclarative1VisualDataModelParts *m_parts;
395 friend class QDeclarative1VisualItemParts;
397 VDMDelegateDataType *m_delegateDataType;
398 friend class QDeclarative1VisualDataModelData;
399 bool m_metaDataCreated : 1;
400 bool m_metaDataCacheable : 1;
401 bool m_delegateValidated : 1;
402 bool m_completePending : 1;
404 QDeclarative1VisualDataModelData *data(QObject *item);
406 QVariant m_modelVariant;
407 QDeclarative1ListAccessor *m_listAccessor;
410 QList<QByteArray> watchedRoles;
411 QList<int> watchedRoleIds;
414 class QDeclarative1VisualDataModelDataMetaObject : public QDeclarative1OpenMetaObject
417 QDeclarative1VisualDataModelDataMetaObject(QObject *parent, QDeclarative1OpenMetaObjectType *type)
418 : QDeclarative1OpenMetaObject(parent, type) {}
420 virtual QVariant initialValue(int);
421 virtual int createProperty(const char *, const char *);
424 friend class QDeclarative1VisualDataModelData;
427 class QDeclarative1VisualDataModelData : public QObject
431 QDeclarative1VisualDataModelData(int index, QDeclarative1VisualDataModel *model);
432 ~QDeclarative1VisualDataModelData();
434 Q_PROPERTY(int index READ index NOTIFY indexChanged)
436 void setIndex(int index);
438 int propForRole(int) const;
439 int modelDataPropertyId() const {
440 QDeclarative1VisualDataModelPrivate *model = QDeclarative1VisualDataModelPrivate::get(m_model);
441 return model->m_modelDataPropId;
444 void setValue(int, const QVariant &);
445 bool hasValue(int id) const {
446 return m_meta->hasValue(id);
449 void ensureProperties();
455 friend class QDeclarative1VisualDataModelDataMetaObject;
457 QDeclarativeGuard<QDeclarative1VisualDataModel> m_model;
458 QDeclarative1VisualDataModelDataMetaObject *m_meta;
461 int QDeclarative1VisualDataModelData::propForRole(int id) const
463 QDeclarative1VisualDataModelPrivate *model = QDeclarative1VisualDataModelPrivate::get(m_model);
464 QHash<int,int>::const_iterator it = model->m_roleToPropId.find(id);
465 if (it != model->m_roleToPropId.end())
471 void QDeclarative1VisualDataModelData::setValue(int id, const QVariant &val)
473 m_meta->setValue(id, val);
476 int QDeclarative1VisualDataModelDataMetaObject::createProperty(const char *name, const char *type)
478 QDeclarative1VisualDataModelData *data =
479 static_cast<QDeclarative1VisualDataModelData *>(object());
484 QDeclarative1VisualDataModelPrivate *model = QDeclarative1VisualDataModelPrivate::get(data->m_model);
485 if (data->m_index < 0 || data->m_index >= model->modelCount())
488 if ((!model->m_listModelInterface || !model->m_abstractItemModel) && model->m_listAccessor) {
489 if (model->m_listAccessor->type() == QDeclarative1ListAccessor::ListProperty) {
490 model->ensureRoles();
491 if (qstrcmp(name,"modelData") == 0)
492 return QDeclarative1OpenMetaObject::createProperty(name, type);
498 QVariant QDeclarative1VisualDataModelDataMetaObject::initialValue(int propId)
500 QDeclarative1VisualDataModelData *data =
501 static_cast<QDeclarative1VisualDataModelData *>(object());
503 Q_ASSERT(data->m_model);
504 QDeclarative1VisualDataModelPrivate *model = QDeclarative1VisualDataModelPrivate::get(data->m_model);
506 QByteArray propName = name(propId);
507 if ((!model->m_listModelInterface || !model->m_abstractItemModel) && model->m_listAccessor) {
508 if (propName == "modelData") {
509 if (model->m_listAccessor->type() == QDeclarative1ListAccessor::Instance) {
510 QObject *object = model->m_listAccessor->at(0).value<QObject*>();
511 return object->metaObject()->property(1).read(object); // the first property after objectName
513 return model->m_listAccessor->at(data->m_index);
515 // return any property of a single object instance.
516 QObject *object = model->m_listAccessor->at(data->m_index).value<QObject*>();
517 return object->property(propName);
519 } else if (model->m_listModelInterface) {
520 model->ensureRoles();
521 QHash<QByteArray,int>::const_iterator it = model->m_roleNames.find(propName);
522 if (it != model->m_roleNames.end()) {
523 QVariant value = model->m_listModelInterface->data(data->m_index, *it);
525 } else if (model->m_roles.count() == 1 && propName == "modelData") {
526 //for compatibility with other lists, assign modelData if there is only a single role
527 QVariant value = model->m_listModelInterface->data(data->m_index, model->m_roles.first());
530 } else if (model->m_abstractItemModel) {
531 model->ensureRoles();
532 QModelIndex index = model->m_abstractItemModel->index(data->m_index, 0, model->m_root);
533 if (propName == "hasModelChildren") {
534 return model->m_abstractItemModel->hasChildren(index);
536 QHash<QByteArray,int>::const_iterator it = model->m_roleNames.find(propName);
537 if (it != model->m_roleNames.end()) {
538 return model->m_abstractItemModel->data(index, *it);
539 } else if (model->m_roles.count() == 1 && propName == "modelData") {
540 //for compatibility with other lists, assign modelData if there is only a single role
541 return model->m_abstractItemModel->data(index, model->m_roles.first());
545 Q_ASSERT(!"Can never be reached");
549 QDeclarative1VisualDataModelData::QDeclarative1VisualDataModelData(int index,
550 QDeclarative1VisualDataModel *model)
551 : m_index(index), m_model(model),
552 m_meta(new QDeclarative1VisualDataModelDataMetaObject(this, QDeclarative1VisualDataModelPrivate::get(model)->m_delegateDataType))
557 QDeclarative1VisualDataModelData::~QDeclarative1VisualDataModelData()
561 void QDeclarative1VisualDataModelData::ensureProperties()
563 QDeclarative1VisualDataModelPrivate *modelPriv = QDeclarative1VisualDataModelPrivate::get(m_model);
564 if (modelPriv->m_metaDataCacheable) {
565 if (!modelPriv->m_metaDataCreated)
566 modelPriv->createMetaData();
567 if (modelPriv->m_metaDataCreated)
568 m_meta->setCached(true);
572 int QDeclarative1VisualDataModelData::index() const
577 // This is internal only - it should not be set from qml
578 void QDeclarative1VisualDataModelData::setIndex(int index)
584 //---------------------------------------------------------------------------
586 class QDeclarative1VisualDataModelPartsMetaObject : public QDeclarative1OpenMetaObject
589 QDeclarative1VisualDataModelPartsMetaObject(QObject *parent)
590 : QDeclarative1OpenMetaObject(parent) {}
592 virtual void propertyCreated(int, QMetaPropertyBuilder &);
593 virtual QVariant initialValue(int);
596 class QDeclarative1VisualDataModelParts : public QObject
600 QDeclarative1VisualDataModelParts(QDeclarative1VisualDataModel *parent);
603 friend class QDeclarative1VisualDataModelPartsMetaObject;
604 QDeclarative1VisualDataModel *model;
607 void QDeclarative1VisualDataModelPartsMetaObject::propertyCreated(int, QMetaPropertyBuilder &prop)
609 prop.setWritable(false);
612 QVariant QDeclarative1VisualDataModelPartsMetaObject::initialValue(int id)
614 QDeclarative1VisualDataModel *m = new QDeclarative1VisualDataModel;
615 m->setParent(object());
616 m->setPart(QString::fromUtf8(name(id)));
617 m->setModel(QVariant::fromValue(static_cast<QDeclarative1VisualDataModelParts *>(object())->model));
619 QVariant var = QVariant::fromValue((QObject *)m);
623 QDeclarative1VisualDataModelParts::QDeclarative1VisualDataModelParts(QDeclarative1VisualDataModel *parent)
624 : QObject(parent), model(parent)
626 new QDeclarative1VisualDataModelPartsMetaObject(this);
629 QDeclarative1VisualDataModelPrivate::QDeclarative1VisualDataModelPrivate(QDeclarativeContext *ctxt)
630 : m_listModelInterface(0), m_abstractItemModel(0), m_visualItemModel(0), m_delegate(0)
631 , m_context(ctxt), m_modelDataPropId(-1), m_parts(0), m_delegateDataType(0), m_metaDataCreated(false)
632 , m_metaDataCacheable(false), m_delegateValidated(false), m_completePending(false), m_listAccessor(0)
636 QDeclarative1VisualDataModelData *QDeclarative1VisualDataModelPrivate::data(QObject *item)
638 QDeclarative1VisualDataModelData *dataItem =
639 item->findChild<QDeclarative1VisualDataModelData *>();
644 //---------------------------------------------------------------------------
647 \qmlclass VisualDataModel QDeclarative1VisualDataModel
648 \inqmlmodule QtQuick 1
649 \ingroup qml-working-with-data
650 \brief The VisualDataModel encapsulates a model and delegate
652 A VisualDataModel encapsulates a model and the delegate that will
653 be instantiated for items in the model.
655 It is usually not necessary to create VisualDataModel elements.
656 However, it can be useful for manipulating and accessing the \l modelIndex
657 when a QAbstractItemModel subclass is used as the
658 model. Also, VisualDataModel is used together with \l Package to
659 provide delegates to multiple views.
661 The example below illustrates using a VisualDataModel with a ListView.
663 \snippet doc/src/snippets/qtquick1/visualdatamodel.qml 0
666 QDeclarative1VisualDataModel::QDeclarative1VisualDataModel()
667 : QDeclarative1VisualModel(*(new QDeclarative1VisualDataModelPrivate(0)))
671 QDeclarative1VisualDataModel::QDeclarative1VisualDataModel(QDeclarativeContext *ctxt, QObject *parent)
672 : QDeclarative1VisualModel(*(new QDeclarative1VisualDataModelPrivate(ctxt)), parent)
676 QDeclarative1VisualDataModel::~QDeclarative1VisualDataModel()
678 Q_D(QDeclarative1VisualDataModel);
679 if (d->m_listAccessor)
680 delete d->m_listAccessor;
681 if (d->m_delegateDataType)
682 d->m_delegateDataType->release();
686 \qmlproperty model QtQuick1::VisualDataModel::model
687 This property holds the model providing data for the VisualDataModel.
689 The model provides a set of data that is used to create the items
690 for a view. For large or dynamic datasets the model is usually
691 provided by a C++ model object. The C++ model object must be a \l
692 {QAbstractItemModel} subclass or a simple list.
694 Models can also be created directly in QML, using a \l{ListModel} or
697 \sa {qmlmodels}{Data Models}
699 QVariant QDeclarative1VisualDataModel::model() const
701 Q_D(const QDeclarative1VisualDataModel);
702 return d->m_modelVariant;
705 void QDeclarative1VisualDataModel::setModel(const QVariant &model)
707 Q_D(QDeclarative1VisualDataModel);
708 delete d->m_listAccessor;
709 d->m_listAccessor = 0;
710 d->m_modelVariant = model;
711 if (d->m_listModelInterface) {
712 // Assume caller has released all items.
713 QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsChanged(int,int,QList<int>)),
714 this, SLOT(_q_itemsChanged(int,int,QList<int>)));
715 QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsInserted(int,int)),
716 this, SLOT(_q_itemsInserted(int,int)));
717 QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsRemoved(int,int)),
718 this, SLOT(_q_itemsRemoved(int,int)));
719 QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsMoved(int,int,int)),
720 this, SLOT(_q_itemsMoved(int,int,int)));
721 d->m_listModelInterface = 0;
722 } else if (d->m_abstractItemModel) {
723 QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
724 this, SLOT(_q_rowsInserted(QModelIndex,int,int)));
725 QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsRemoved(QModelIndex,int,int)),
726 this, SLOT(_q_rowsRemoved(QModelIndex,int,int)));
727 QObject::disconnect(d->m_abstractItemModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
728 this, SLOT(_q_dataChanged(QModelIndex,QModelIndex)));
729 QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
730 this, SLOT(_q_rowsMoved(QModelIndex,int,int,QModelIndex,int)));
731 QObject::disconnect(d->m_abstractItemModel, SIGNAL(modelReset()), this, SLOT(_q_modelReset()));
732 QObject::disconnect(d->m_abstractItemModel, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged()));
733 d->m_abstractItemModel = 0;
734 } else if (d->m_visualItemModel) {
735 QObject::disconnect(d->m_visualItemModel, SIGNAL(itemsInserted(int,int)),
736 this, SIGNAL(itemsInserted(int,int)));
737 QObject::disconnect(d->m_visualItemModel, SIGNAL(itemsRemoved(int,int)),
738 this, SIGNAL(itemsRemoved(int,int)));
739 QObject::disconnect(d->m_visualItemModel, SIGNAL(itemsMoved(int,int,int)),
740 this, SIGNAL(itemsMoved(int,int,int)));
741 QObject::disconnect(d->m_visualItemModel, SIGNAL(createdPackage(int,QDeclarative1Package*)),
742 this, SLOT(_q_createdPackage(int,QDeclarative1Package*)));
743 QObject::disconnect(d->m_visualItemModel, SIGNAL(destroyingPackage(QDeclarative1Package*)),
744 this, SLOT(_q_destroyingPackage(QDeclarative1Package*)));
745 d->m_visualItemModel = 0;
749 d->m_roleNames.clear();
750 if (d->m_delegateDataType)
751 d->m_delegateDataType->release();
752 d->m_metaDataCreated = 0;
753 d->m_metaDataCacheable = false;
754 d->m_delegateDataType = new VDMDelegateDataType(&QDeclarative1VisualDataModelData::staticMetaObject, d->m_context?d->m_context->engine():qmlEngine(this));
756 QObject *object = qvariant_cast<QObject *>(model);
757 if (object && (d->m_listModelInterface = qobject_cast<QListModelInterface *>(object))) {
758 QObject::connect(d->m_listModelInterface, SIGNAL(itemsChanged(int,int,QList<int>)),
759 this, SLOT(_q_itemsChanged(int,int,QList<int>)));
760 QObject::connect(d->m_listModelInterface, SIGNAL(itemsInserted(int,int)),
761 this, SLOT(_q_itemsInserted(int,int)));
762 QObject::connect(d->m_listModelInterface, SIGNAL(itemsRemoved(int,int)),
763 this, SLOT(_q_itemsRemoved(int,int)));
764 QObject::connect(d->m_listModelInterface, SIGNAL(itemsMoved(int,int,int)),
765 this, SLOT(_q_itemsMoved(int,int,int)));
766 d->m_metaDataCacheable = true;
767 if (d->m_delegate && d->m_listModelInterface->count())
768 emit itemsInserted(0, d->m_listModelInterface->count());
770 } else if (object && (d->m_abstractItemModel = qobject_cast<QAbstractItemModel *>(object))) {
771 QObject::connect(d->m_abstractItemModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
772 this, SLOT(_q_rowsInserted(QModelIndex,int,int)));
773 QObject::connect(d->m_abstractItemModel, SIGNAL(rowsRemoved(QModelIndex,int,int)),
774 this, SLOT(_q_rowsRemoved(QModelIndex,int,int)));
775 QObject::connect(d->m_abstractItemModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
776 this, SLOT(_q_dataChanged(QModelIndex,QModelIndex)));
777 QObject::connect(d->m_abstractItemModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
778 this, SLOT(_q_rowsMoved(QModelIndex,int,int,QModelIndex,int)));
779 QObject::connect(d->m_abstractItemModel, SIGNAL(modelReset()), this, SLOT(_q_modelReset()));
780 QObject::connect(d->m_abstractItemModel, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged()));
781 d->m_metaDataCacheable = true;
782 if (d->m_abstractItemModel->canFetchMore(d->m_root))
783 d->m_abstractItemModel->fetchMore(d->m_root);
786 if ((d->m_visualItemModel = qvariant_cast<QDeclarative1VisualDataModel *>(model))) {
787 QObject::connect(d->m_visualItemModel, SIGNAL(itemsInserted(int,int)),
788 this, SIGNAL(itemsInserted(int,int)));
789 QObject::connect(d->m_visualItemModel, SIGNAL(itemsRemoved(int,int)),
790 this, SIGNAL(itemsRemoved(int,int)));
791 QObject::connect(d->m_visualItemModel, SIGNAL(itemsMoved(int,int,int)),
792 this, SIGNAL(itemsMoved(int,int,int)));
793 QObject::connect(d->m_visualItemModel, SIGNAL(createdPackage(int,QDeclarative1Package*)),
794 this, SLOT(_q_createdPackage(int,QDeclarative1Package*)));
795 QObject::connect(d->m_visualItemModel, SIGNAL(destroyingPackage(QDeclarative1Package*)),
796 this, SLOT(_q_destroyingPackage(QDeclarative1Package*)));
799 d->m_listAccessor = new QDeclarative1ListAccessor;
800 d->m_listAccessor->setList(model, d->m_context?d->m_context->engine():qmlEngine(this));
801 if (d->m_listAccessor->type() != QDeclarative1ListAccessor::ListProperty)
802 d->m_metaDataCacheable = true;
803 if (d->m_delegate && d->modelCount()) {
804 emit itemsInserted(0, d->modelCount());
810 \qmlproperty Component QtQuick1::VisualDataModel::delegate
812 The delegate provides a template defining each item instantiated by a view.
813 The index is exposed as an accessible \c index property. Properties of the
814 model are also available depending upon the type of \l {qmlmodels}{Data Model}.
816 QDeclarativeComponent *QDeclarative1VisualDataModel::delegate() const
818 Q_D(const QDeclarative1VisualDataModel);
819 if (d->m_visualItemModel)
820 return d->m_visualItemModel->delegate();
821 return d->m_delegate;
824 void QDeclarative1VisualDataModel::setDelegate(QDeclarativeComponent *delegate)
826 Q_D(QDeclarative1VisualDataModel);
827 bool wasValid = d->m_delegate != 0;
828 d->m_delegate = delegate;
829 d->m_delegateValidated = false;
830 if (!wasValid && d->modelCount() && d->m_delegate) {
831 emit itemsInserted(0, d->modelCount());
834 if (wasValid && !d->m_delegate && d->modelCount()) {
835 emit itemsRemoved(0, d->modelCount());
841 \qmlproperty QModelIndex QtQuick1::VisualDataModel::rootIndex
843 QAbstractItemModel provides a hierarchical tree of data, whereas
844 QML only operates on list data. \c rootIndex allows the children of
845 any node in a QAbstractItemModel to be provided by this model.
847 This property only affects models of type QAbstractItemModel that
848 are hierarchical (e.g, a tree model).
850 For example, here is a simple interactive file system browser.
851 When a directory name is clicked, the view's \c rootIndex is set to the
852 QModelIndex node of the clicked directory, thus updating the view to show
853 the new directory's contents.
856 \snippet doc/src/snippets/qtquick1/visualdatamodel_rootindex/main.cpp 0
859 \snippet doc/src/snippets/qtquick1/visualdatamodel_rootindex/view.qml 0
861 If the \l model is a QAbstractItemModel subclass, the delegate can also
862 reference a \c hasModelChildren property (optionally qualified by a
863 \e model. prefix) that indicates whether the delegate's model item has
867 \sa modelIndex(), parentModelIndex()
869 QVariant QDeclarative1VisualDataModel::rootIndex() const
871 Q_D(const QDeclarative1VisualDataModel);
872 return QVariant::fromValue(d->m_root);
875 void QDeclarative1VisualDataModel::setRootIndex(const QVariant &root)
877 Q_D(QDeclarative1VisualDataModel);
878 QModelIndex modelIndex = qvariant_cast<QModelIndex>(root);
879 if (d->m_root != modelIndex) {
880 int oldCount = d->modelCount();
881 d->m_root = modelIndex;
882 if (d->m_abstractItemModel && d->m_abstractItemModel->canFetchMore(modelIndex))
883 d->m_abstractItemModel->fetchMore(modelIndex);
884 int newCount = d->modelCount();
885 if (d->m_delegate && oldCount)
886 emit itemsRemoved(0, oldCount);
887 if (d->m_delegate && newCount)
888 emit itemsInserted(0, newCount);
889 if (newCount != oldCount)
891 emit rootIndexChanged();
897 \qmlmethod QModelIndex QtQuick1::VisualDataModel::modelIndex(int index)
899 QAbstractItemModel provides a hierarchical tree of data, whereas
900 QML only operates on list data. This function assists in using
903 Returns a QModelIndex for the specified index.
904 This value can be assigned to rootIndex.
908 QVariant QDeclarative1VisualDataModel::modelIndex(int idx) const
910 Q_D(const QDeclarative1VisualDataModel);
911 if (d->m_abstractItemModel)
912 return QVariant::fromValue(d->m_abstractItemModel->index(idx, 0, d->m_root));
913 return QVariant::fromValue(QModelIndex());
917 \qmlmethod QModelIndex QtQuick1::VisualDataModel::parentModelIndex()
919 QAbstractItemModel provides a hierarchical tree of data, whereas
920 QML only operates on list data. This function assists in using
923 Returns a QModelIndex for the parent of the current rootIndex.
924 This value can be assigned to rootIndex.
928 QVariant QDeclarative1VisualDataModel::parentModelIndex() const
930 Q_D(const QDeclarative1VisualDataModel);
931 if (d->m_abstractItemModel)
932 return QVariant::fromValue(d->m_abstractItemModel->parent(d->m_root));
933 return QVariant::fromValue(QModelIndex());
936 QString QDeclarative1VisualDataModel::part() const
938 Q_D(const QDeclarative1VisualDataModel);
942 void QDeclarative1VisualDataModel::setPart(const QString &part)
944 Q_D(QDeclarative1VisualDataModel);
948 int QDeclarative1VisualDataModel::count() const
950 Q_D(const QDeclarative1VisualDataModel);
951 if (d->m_visualItemModel)
952 return d->m_visualItemModel->count();
955 return d->modelCount();
958 QDeclarativeItem *QDeclarative1VisualDataModel::item(int index, bool complete)
960 Q_D(QDeclarative1VisualDataModel);
961 if (d->m_visualItemModel)
962 return d->m_visualItemModel->item(index, d->m_part.toUtf8(), complete);
963 return item(index, QByteArray(), complete);
967 Returns ReleaseStatus flags.
969 QDeclarative1VisualDataModel::ReleaseFlags QDeclarative1VisualDataModel::release(QDeclarativeItem *item)
971 Q_D(QDeclarative1VisualDataModel);
972 if (d->m_visualItemModel)
973 return d->m_visualItemModel->release(item);
975 ReleaseFlags stat = 0;
977 bool inPackage = false;
979 QHash<QObject*,QDeclarative1Package*>::iterator it = d->m_packaged.find(item);
980 if (it != d->m_packaged.end()) {
981 QDeclarative1Package *package = *it;
982 d->m_packaged.erase(it);
983 if (d->m_packaged.contains(item))
986 obj = package; // fall through and delete
989 if (d->m_cache.releaseItem(obj)) {
990 // Remove any bindings to avoid warnings due to parent change.
991 QObjectPrivate *p = QObjectPrivate::get(obj);
992 Q_ASSERT(p->declarativeData);
993 QDeclarativeData *d = static_cast<QDeclarativeData*>(p->declarativeData);
994 if (d->ownContext && d->context)
995 d->context->clearContext();
998 emit destroyingPackage(qobject_cast<QDeclarative1Package*>(obj));
1001 item->scene()->removeItem(item);
1005 } else if (!inPackage) {
1013 \qmlproperty object QtQuick1::VisualDataModel::parts
1015 The \a parts property selects a VisualDataModel which creates
1016 delegates from the part named. This is used in conjunction with
1017 the \l Package element.
1019 For example, the code below selects a model which creates
1020 delegates named \e list from a \l Package:
1026 Item { Package.name: "list" }
1032 width: 200; height:200
1033 model: visualModel.parts.list
1039 QObject *QDeclarative1VisualDataModel::parts()
1041 Q_D(QDeclarative1VisualDataModel);
1043 d->m_parts = new QDeclarative1VisualDataModelParts(this);
1047 QDeclarativeItem *QDeclarative1VisualDataModel::item(int index, const QByteArray &viewId, bool complete)
1049 Q_D(QDeclarative1VisualDataModel);
1050 if (d->m_visualItemModel)
1051 return d->m_visualItemModel->item(index, viewId, complete);
1053 if (d->modelCount() <= 0 || !d->m_delegate)
1055 QObject *nobj = d->m_cache.getItem(index);
1056 bool needComplete = false;
1058 QDeclarativeContext *ccontext = d->m_context;
1059 if (!ccontext) ccontext = qmlContext(this);
1060 QDeclarativeContext *ctxt = new QDeclarativeContext(ccontext);
1061 QDeclarative1VisualDataModelData *data = new QDeclarative1VisualDataModelData(index, this);
1062 if ((!d->m_listModelInterface || !d->m_abstractItemModel) && d->m_listAccessor
1063 && d->m_listAccessor->type() == QDeclarative1ListAccessor::ListProperty) {
1064 ctxt->setContextObject(d->m_listAccessor->at(index).value<QObject*>());
1065 ctxt = new QDeclarativeContext(ctxt, ctxt);
1067 ctxt->setContextProperty(QLatin1String("model"), data);
1068 ctxt->setContextObject(data);
1069 d->m_completePending = false;
1070 nobj = d->m_delegate->beginCreate(ctxt);
1072 d->m_delegate->completeCreate();
1074 d->m_completePending = true;
1075 needComplete = true;
1078 QDeclarative_setParent_noEvent(ctxt, nobj);
1079 QDeclarative_setParent_noEvent(data, nobj);
1080 d->m_cache.insertItem(index, nobj);
1081 if (QDeclarative1Package *package = qobject_cast<QDeclarative1Package *>(nobj))
1082 emit createdPackage(index, package);
1086 qmlInfo(this, d->m_delegate->errors()) << "Error creating delegate";
1089 QDeclarativeItem *item = qobject_cast<QDeclarativeItem *>(nobj);
1091 QDeclarative1Package *package = qobject_cast<QDeclarative1Package *>(nobj);
1093 QObject *o = package->part(QString::fromUtf8(viewId));
1094 item = qobject_cast<QDeclarativeItem *>(o);
1096 d->m_packaged.insertMulti(item, package);
1101 d->m_delegate->completeCreate();
1102 d->m_cache.releaseItem(nobj);
1103 if (!d->m_delegateValidated) {
1104 qmlInfo(d->m_delegate) << QDeclarative1VisualDataModel::tr("Delegate component must be Item type.");
1105 d->m_delegateValidated = true;
1108 if (d->modelCount()-1 == index && d->m_abstractItemModel && d->m_abstractItemModel->canFetchMore(d->m_root))
1109 d->m_abstractItemModel->fetchMore(d->m_root);
1114 bool QDeclarative1VisualDataModel::completePending() const
1116 Q_D(const QDeclarative1VisualDataModel);
1117 if (d->m_visualItemModel)
1118 return d->m_visualItemModel->completePending();
1119 return d->m_completePending;
1122 void QDeclarative1VisualDataModel::completeItem()
1124 Q_D(QDeclarative1VisualDataModel);
1125 if (d->m_visualItemModel) {
1126 d->m_visualItemModel->completeItem();
1130 d->m_delegate->completeCreate();
1131 d->m_completePending = false;
1134 QString QDeclarative1VisualDataModel::stringValue(int index, const QString &name)
1136 Q_D(QDeclarative1VisualDataModel);
1137 if (d->m_visualItemModel)
1138 return d->m_visualItemModel->stringValue(index, name);
1140 if ((!d->m_listModelInterface || !d->m_abstractItemModel) && d->m_listAccessor) {
1141 if (QObject *object = d->m_listAccessor->at(index).value<QObject*>())
1142 return object->property(name.toUtf8()).toString();
1145 if ((!d->m_listModelInterface && !d->m_abstractItemModel) || !d->m_delegate)
1150 bool tempData = false;
1152 if (QObject *nobj = d->m_cache.item(index))
1153 data = d->data(nobj);
1155 data = new QDeclarative1VisualDataModelData(index, this);
1159 QDeclarativeData *ddata = QDeclarativeData::get(data);
1160 if (ddata && ddata->propertyCache) {
1161 QDeclarativePropertyData *prop = ddata->propertyCache->property(name);
1163 if (prop->propType == QVariant::String) {
1164 void *args[] = { &val, 0 };
1165 QMetaObject::metacall(data, QMetaObject::ReadProperty, prop->coreIndex, args);
1166 } else if (prop->propType == qMetaTypeId<QVariant>()) {
1168 void *args[] = { &v, 0 };
1169 QMetaObject::metacall(data, QMetaObject::ReadProperty, prop->coreIndex, args);
1173 val = data->property(name.toUtf8()).toString();
1176 val = data->property(name.toUtf8()).toString();
1185 int QDeclarative1VisualDataModel::indexOf(QDeclarativeItem *item, QObject *) const
1187 QVariant val = QDeclarativeEngine::contextForObject(item)->contextProperty(QLatin1String("index"));
1192 void QDeclarative1VisualDataModel::setWatchedRoles(QList<QByteArray> roles)
1194 Q_D(QDeclarative1VisualDataModel);
1195 d->watchedRoles = roles;
1196 d->watchedRoleIds.clear();
1199 void QDeclarative1VisualDataModel::_q_itemsChanged(int index, int count,
1200 const QList<int> &roles)
1202 Q_D(QDeclarative1VisualDataModel);
1203 bool changed = false;
1204 if (!d->watchedRoles.isEmpty() && d->watchedRoleIds.isEmpty()) {
1205 foreach (QByteArray r, d->watchedRoles) {
1206 if (d->m_roleNames.contains(r))
1207 d->watchedRoleIds << d->m_roleNames.value(r);
1211 for (QHash<int,QDeclarative1VisualDataModelPrivate::ObjectRef>::ConstIterator iter = d->m_cache.begin();
1212 iter != d->m_cache.end(); ++iter) {
1213 const int idx = iter.key();
1215 if (idx >= index && idx < index+count) {
1216 QDeclarative1VisualDataModelPrivate::ObjectRef objRef = *iter;
1217 QDeclarative1VisualDataModelData *data = d->data(objRef.obj);
1218 for (int roleIdx = 0; roleIdx < roles.count(); ++roleIdx) {
1219 int role = roles.at(roleIdx);
1220 if (!changed && !d->watchedRoleIds.isEmpty() && d->watchedRoleIds.contains(role))
1222 int propId = data->propForRole(role);
1224 if (data->hasValue(propId)) {
1225 if (d->m_listModelInterface) {
1226 data->setValue(propId, d->m_listModelInterface->data(idx, role));
1227 } else if (d->m_abstractItemModel) {
1228 QModelIndex index = d->m_abstractItemModel->index(idx, 0, d->m_root);
1229 data->setValue(propId, d->m_abstractItemModel->data(index, role));
1234 if (d->m_listModelInterface)
1235 roleName = d->m_listModelInterface->toString(role);
1236 else if (d->m_abstractItemModel)
1237 roleName = QString::fromUtf8(d->m_abstractItemModel->roleNames().value(role));
1238 qmlInfo(this) << "Changing role not present in item: " << roleName;
1241 if (d->m_roles.count() == 1) {
1242 // Handle the modelData role we add if there is just one role.
1243 int propId = data->modelDataPropertyId();
1244 if (data->hasValue(propId)) {
1245 int role = d->m_roles.at(0);
1246 if (d->m_listModelInterface) {
1247 data->setValue(propId, d->m_listModelInterface->data(idx, role));
1248 } else if (d->m_abstractItemModel) {
1249 QModelIndex index = d->m_abstractItemModel->index(idx, 0, d->m_root);
1250 data->setValue(propId, d->m_abstractItemModel->data(index, role));
1257 emit itemsChanged(index, count);
1260 void QDeclarative1VisualDataModel::_q_itemsInserted(int index, int count)
1262 Q_D(QDeclarative1VisualDataModel);
1265 // XXX - highly inefficient
1266 QHash<int,QDeclarative1VisualDataModelPrivate::ObjectRef> items;
1267 for (QHash<int,QDeclarative1VisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
1268 iter != d->m_cache.end(); ) {
1270 if (iter.key() >= index) {
1271 QDeclarative1VisualDataModelPrivate::ObjectRef objRef = *iter;
1272 int index = iter.key() + count;
1273 iter = d->m_cache.erase(iter);
1275 items.insert(index, objRef);
1277 QDeclarative1VisualDataModelData *data = d->data(objRef.obj);
1278 data->setIndex(index);
1283 d->m_cache.unite(items);
1285 emit itemsInserted(index, count);
1286 emit countChanged();
1289 void QDeclarative1VisualDataModel::_q_itemsRemoved(int index, int count)
1291 Q_D(QDeclarative1VisualDataModel);
1294 // XXX - highly inefficient
1295 QHash<int, QDeclarative1VisualDataModelPrivate::ObjectRef> items;
1296 for (QHash<int, QDeclarative1VisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
1297 iter != d->m_cache.end(); ) {
1298 if (iter.key() >= index && iter.key() < index + count) {
1299 QDeclarative1VisualDataModelPrivate::ObjectRef objRef = *iter;
1300 iter = d->m_cache.erase(iter);
1301 items.insertMulti(-1, objRef); //XXX perhaps better to maintain separately
1302 QDeclarative1VisualDataModelData *data = d->data(objRef.obj);
1304 } else if (iter.key() >= index + count) {
1305 QDeclarative1VisualDataModelPrivate::ObjectRef objRef = *iter;
1306 int index = iter.key() - count;
1307 iter = d->m_cache.erase(iter);
1308 items.insert(index, objRef);
1309 QDeclarative1VisualDataModelData *data = d->data(objRef.obj);
1310 data->setIndex(index);
1316 d->m_cache.unite(items);
1317 emit itemsRemoved(index, count);
1318 emit countChanged();
1321 void QDeclarative1VisualDataModel::_q_itemsMoved(int from, int to, int count)
1323 Q_D(QDeclarative1VisualDataModel);
1324 // XXX - highly inefficient
1325 QHash<int,QDeclarative1VisualDataModelPrivate::ObjectRef> items;
1326 for (QHash<int,QDeclarative1VisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
1327 iter != d->m_cache.end(); ) {
1329 if (iter.key() >= from && iter.key() < from + count) {
1330 QDeclarative1VisualDataModelPrivate::ObjectRef objRef = *iter;
1331 int index = iter.key() - from + to;
1332 iter = d->m_cache.erase(iter);
1334 items.insert(index, objRef);
1336 QDeclarative1VisualDataModelData *data = d->data(objRef.obj);
1337 data->setIndex(index);
1342 for (QHash<int,QDeclarative1VisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
1343 iter != d->m_cache.end(); ) {
1345 int diff = from > to ? count : -count;
1346 if (iter.key() >= qMin(from,to) && iter.key() < qMax(from+count,to+count)) {
1347 QDeclarative1VisualDataModelPrivate::ObjectRef objRef = *iter;
1348 int index = iter.key() + diff;
1349 iter = d->m_cache.erase(iter);
1351 items.insert(index, objRef);
1353 QDeclarative1VisualDataModelData *data = d->data(objRef.obj);
1354 data->setIndex(index);
1359 d->m_cache.unite(items);
1361 emit itemsMoved(from, to, count);
1364 void QDeclarative1VisualDataModel::_q_rowsInserted(const QModelIndex &parent, int begin, int end)
1366 Q_D(QDeclarative1VisualDataModel);
1367 if (parent == d->m_root)
1368 _q_itemsInserted(begin, end - begin + 1);
1371 void QDeclarative1VisualDataModel::_q_rowsRemoved(const QModelIndex &parent, int begin, int end)
1373 Q_D(QDeclarative1VisualDataModel);
1374 if (parent == d->m_root)
1375 _q_itemsRemoved(begin, end - begin + 1);
1378 void QDeclarative1VisualDataModel::_q_rowsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)
1380 Q_D(QDeclarative1VisualDataModel);
1381 const int count = sourceEnd - sourceStart + 1;
1382 if (destinationParent == d->m_root && sourceParent == d->m_root) {
1383 _q_itemsMoved(sourceStart, sourceStart > destinationRow ? destinationRow : destinationRow-count, count);
1384 } else if (sourceParent == d->m_root) {
1385 _q_itemsRemoved(sourceStart, count);
1386 } else if (destinationParent == d->m_root) {
1387 _q_itemsInserted(destinationRow, count);
1391 void QDeclarative1VisualDataModel::_q_dataChanged(const QModelIndex &begin, const QModelIndex &end)
1393 Q_D(QDeclarative1VisualDataModel);
1394 if (begin.parent() == d->m_root)
1395 _q_itemsChanged(begin.row(), end.row() - begin.row() + 1, d->m_roles);
1398 void QDeclarative1VisualDataModel::_q_layoutChanged()
1400 Q_D(QDeclarative1VisualDataModel);
1401 _q_itemsChanged(0, count(), d->m_roles);
1404 void QDeclarative1VisualDataModel::_q_modelReset()
1406 Q_D(QDeclarative1VisualDataModel);
1407 d->m_root = QModelIndex();
1409 emit rootIndexChanged();
1410 if (d->m_abstractItemModel && d->m_abstractItemModel->canFetchMore(d->m_root))
1411 d->m_abstractItemModel->fetchMore(d->m_root);
1414 void QDeclarative1VisualDataModel::_q_createdPackage(int index, QDeclarative1Package *package)
1416 Q_D(QDeclarative1VisualDataModel);
1417 emit createdItem(index, qobject_cast<QDeclarativeItem*>(package->part(d->m_part)));
1420 void QDeclarative1VisualDataModel::_q_destroyingPackage(QDeclarative1Package *package)
1422 Q_D(QDeclarative1VisualDataModel);
1423 emit destroyingItem(qobject_cast<QDeclarativeItem*>(package->part(d->m_part)));
1430 QML_DECLARE_TYPE(QListModelInterface)
1432 #include <qdeclarativevisualitemmodel.moc>