1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
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 <QtDeclarative/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 for (QHash<int,QByteArray>::const_iterator it = m_abstractItemModel->roleNames().begin();
295 it != m_abstractItemModel->roleNames().end(); ++it) {
296 m_roles.append(it.key());
297 m_roleNames.insert(*it, it.key());
300 m_roleNames.insert("hasModelChildren", -1);
301 } else if (m_listAccessor) {
302 m_roleNames.insert("modelData", 0);
303 if (m_listAccessor->type() == QDeclarative1ListAccessor::Instance) {
304 if (QObject *object = m_listAccessor->at(0).value<QObject*>()) {
305 int count = object->metaObject()->propertyCount();
306 for (int ii = 1; ii < count; ++ii) {
307 const QMetaProperty &prop = object->metaObject()->property(ii);
308 m_roleNames.insert(prop.name(), 0);
316 QHash<int,int> m_roleToPropId;
317 int m_modelDataPropId;
318 void createMetaData() {
319 if (!m_metaDataCreated) {
321 if (m_roleNames.count()) {
322 QHash<QByteArray, int>::const_iterator it = m_roleNames.begin();
323 while (it != m_roleNames.end()) {
324 int propId = m_delegateDataType->createProperty(it.key()) - m_delegateDataType->propertyOffset();
325 m_roleToPropId.insert(*it, propId);
328 // Add modelData property
329 if (m_roles.count() == 1)
330 m_modelDataPropId = m_delegateDataType->createProperty("modelData") - m_delegateDataType->propertyOffset();
331 m_metaDataCreated = true;
337 ObjectRef(QObject *object=0) : obj(object), ref(1) {}
341 class Cache : public QHash<int, ObjectRef> {
343 QObject *getItem(int index) {
345 QHash<int,ObjectRef>::iterator it = find(index);
352 QObject *item(int index) {
354 QHash<int, ObjectRef>::const_iterator it = find(index);
359 void insertItem(int index, QObject *obj) {
360 insert(index, ObjectRef(obj));
362 bool releaseItem(QObject *obj) {
363 QHash<int, ObjectRef>::iterator it = begin();
364 for (; it != end(); ++it) {
365 ObjectRef &objRef = *it;
366 if (objRef.obj == obj) {
367 if (--objRef.ref == 0) {
378 int modelCount() const {
379 if (m_visualItemModel)
380 return m_visualItemModel->count();
381 if (m_listModelInterface)
382 return m_listModelInterface->count();
383 if (m_abstractItemModel)
384 return m_abstractItemModel->rowCount(m_root);
386 return m_listAccessor->count();
391 QHash<QObject *, QDeclarative1Package*> m_packaged;
393 QDeclarative1VisualDataModelParts *m_parts;
394 friend class QDeclarative1VisualItemParts;
396 VDMDelegateDataType *m_delegateDataType;
397 friend class QDeclarative1VisualDataModelData;
398 bool m_metaDataCreated : 1;
399 bool m_metaDataCacheable : 1;
400 bool m_delegateValidated : 1;
401 bool m_completePending : 1;
403 QDeclarative1VisualDataModelData *data(QObject *item);
405 QVariant m_modelVariant;
406 QDeclarative1ListAccessor *m_listAccessor;
409 QList<QByteArray> watchedRoles;
410 QList<int> watchedRoleIds;
413 class QDeclarative1VisualDataModelDataMetaObject : public QDeclarative1OpenMetaObject
416 QDeclarative1VisualDataModelDataMetaObject(QObject *parent, QDeclarative1OpenMetaObjectType *type)
417 : QDeclarative1OpenMetaObject(parent, type) {}
419 virtual QVariant initialValue(int);
420 virtual int createProperty(const char *, const char *);
423 friend class QDeclarative1VisualDataModelData;
426 class QDeclarative1VisualDataModelData : public QObject
430 QDeclarative1VisualDataModelData(int index, QDeclarative1VisualDataModel *model);
431 ~QDeclarative1VisualDataModelData();
433 Q_PROPERTY(int index READ index NOTIFY indexChanged)
435 void setIndex(int index);
437 int propForRole(int) const;
438 int modelDataPropertyId() const {
439 QDeclarative1VisualDataModelPrivate *model = QDeclarative1VisualDataModelPrivate::get(m_model);
440 return model->m_modelDataPropId;
443 void setValue(int, const QVariant &);
444 bool hasValue(int id) const {
445 return m_meta->hasValue(id);
448 void ensureProperties();
454 friend class QDeclarative1VisualDataModelDataMetaObject;
456 QDeclarativeGuard<QDeclarative1VisualDataModel> m_model;
457 QDeclarative1VisualDataModelDataMetaObject *m_meta;
460 int QDeclarative1VisualDataModelData::propForRole(int id) const
462 QDeclarative1VisualDataModelPrivate *model = QDeclarative1VisualDataModelPrivate::get(m_model);
463 QHash<int,int>::const_iterator it = model->m_roleToPropId.find(id);
464 if (it != model->m_roleToPropId.end())
470 void QDeclarative1VisualDataModelData::setValue(int id, const QVariant &val)
472 m_meta->setValue(id, val);
475 int QDeclarative1VisualDataModelDataMetaObject::createProperty(const char *name, const char *type)
477 QDeclarative1VisualDataModelData *data =
478 static_cast<QDeclarative1VisualDataModelData *>(object());
483 QDeclarative1VisualDataModelPrivate *model = QDeclarative1VisualDataModelPrivate::get(data->m_model);
484 if (data->m_index < 0 || data->m_index >= model->modelCount())
487 if ((!model->m_listModelInterface || !model->m_abstractItemModel) && model->m_listAccessor) {
488 if (model->m_listAccessor->type() == QDeclarative1ListAccessor::ListProperty) {
489 model->ensureRoles();
490 if (qstrcmp(name,"modelData") == 0)
491 return QDeclarative1OpenMetaObject::createProperty(name, type);
497 QVariant QDeclarative1VisualDataModelDataMetaObject::initialValue(int propId)
499 QDeclarative1VisualDataModelData *data =
500 static_cast<QDeclarative1VisualDataModelData *>(object());
502 Q_ASSERT(data->m_model);
503 QDeclarative1VisualDataModelPrivate *model = QDeclarative1VisualDataModelPrivate::get(data->m_model);
505 QByteArray propName = name(propId);
506 if ((!model->m_listModelInterface || !model->m_abstractItemModel) && model->m_listAccessor) {
507 if (propName == "modelData") {
508 if (model->m_listAccessor->type() == QDeclarative1ListAccessor::Instance) {
509 QObject *object = model->m_listAccessor->at(0).value<QObject*>();
510 return object->metaObject()->property(1).read(object); // the first property after objectName
512 return model->m_listAccessor->at(data->m_index);
514 // return any property of a single object instance.
515 QObject *object = model->m_listAccessor->at(data->m_index).value<QObject*>();
516 return object->property(propName);
518 } else if (model->m_listModelInterface) {
519 model->ensureRoles();
520 QHash<QByteArray,int>::const_iterator it = model->m_roleNames.find(propName);
521 if (it != model->m_roleNames.end()) {
522 QVariant value = model->m_listModelInterface->data(data->m_index, *it);
524 } else if (model->m_roles.count() == 1 && propName == "modelData") {
525 //for compatibility with other lists, assign modelData if there is only a single role
526 QVariant value = model->m_listModelInterface->data(data->m_index, model->m_roles.first());
529 } else if (model->m_abstractItemModel) {
530 model->ensureRoles();
531 QModelIndex index = model->m_abstractItemModel->index(data->m_index, 0, model->m_root);
532 if (propName == "hasModelChildren") {
533 return model->m_abstractItemModel->hasChildren(index);
535 QHash<QByteArray,int>::const_iterator it = model->m_roleNames.find(propName);
536 if (it != model->m_roleNames.end()) {
537 return model->m_abstractItemModel->data(index, *it);
538 } else if (model->m_roles.count() == 1 && propName == "modelData") {
539 //for compatibility with other lists, assign modelData if there is only a single role
540 return model->m_abstractItemModel->data(index, model->m_roles.first());
544 Q_ASSERT(!"Can never be reached");
548 QDeclarative1VisualDataModelData::QDeclarative1VisualDataModelData(int index,
549 QDeclarative1VisualDataModel *model)
550 : m_index(index), m_model(model),
551 m_meta(new QDeclarative1VisualDataModelDataMetaObject(this, QDeclarative1VisualDataModelPrivate::get(model)->m_delegateDataType))
556 QDeclarative1VisualDataModelData::~QDeclarative1VisualDataModelData()
560 void QDeclarative1VisualDataModelData::ensureProperties()
562 QDeclarative1VisualDataModelPrivate *modelPriv = QDeclarative1VisualDataModelPrivate::get(m_model);
563 if (modelPriv->m_metaDataCacheable) {
564 if (!modelPriv->m_metaDataCreated)
565 modelPriv->createMetaData();
566 if (modelPriv->m_metaDataCreated)
567 m_meta->setCached(true);
571 int QDeclarative1VisualDataModelData::index() const
576 // This is internal only - it should not be set from qml
577 void QDeclarative1VisualDataModelData::setIndex(int index)
583 //---------------------------------------------------------------------------
585 class QDeclarative1VisualDataModelPartsMetaObject : public QDeclarative1OpenMetaObject
588 QDeclarative1VisualDataModelPartsMetaObject(QObject *parent)
589 : QDeclarative1OpenMetaObject(parent) {}
591 virtual void propertyCreated(int, QMetaPropertyBuilder &);
592 virtual QVariant initialValue(int);
595 class QDeclarative1VisualDataModelParts : public QObject
599 QDeclarative1VisualDataModelParts(QDeclarative1VisualDataModel *parent);
602 friend class QDeclarative1VisualDataModelPartsMetaObject;
603 QDeclarative1VisualDataModel *model;
606 void QDeclarative1VisualDataModelPartsMetaObject::propertyCreated(int, QMetaPropertyBuilder &prop)
608 prop.setWritable(false);
611 QVariant QDeclarative1VisualDataModelPartsMetaObject::initialValue(int id)
613 QDeclarative1VisualDataModel *m = new QDeclarative1VisualDataModel;
614 m->setParent(object());
615 m->setPart(QString::fromUtf8(name(id)));
616 m->setModel(QVariant::fromValue(static_cast<QDeclarative1VisualDataModelParts *>(object())->model));
618 QVariant var = QVariant::fromValue((QObject *)m);
622 QDeclarative1VisualDataModelParts::QDeclarative1VisualDataModelParts(QDeclarative1VisualDataModel *parent)
623 : QObject(parent), model(parent)
625 new QDeclarative1VisualDataModelPartsMetaObject(this);
628 QDeclarative1VisualDataModelPrivate::QDeclarative1VisualDataModelPrivate(QDeclarativeContext *ctxt)
629 : m_listModelInterface(0), m_abstractItemModel(0), m_visualItemModel(0), m_delegate(0)
630 , m_context(ctxt), m_modelDataPropId(-1), m_parts(0), m_delegateDataType(0), m_metaDataCreated(false)
631 , m_metaDataCacheable(false), m_delegateValidated(false), m_completePending(false), m_listAccessor(0)
635 QDeclarative1VisualDataModelData *QDeclarative1VisualDataModelPrivate::data(QObject *item)
637 QDeclarative1VisualDataModelData *dataItem =
638 item->findChild<QDeclarative1VisualDataModelData *>();
643 //---------------------------------------------------------------------------
646 \qmlclass VisualDataModel QDeclarative1VisualDataModel
647 \inqmlmodule QtQuick 1
648 \ingroup qml-working-with-data
649 \brief The VisualDataModel encapsulates a model and delegate
651 A VisualDataModel encapsulates a model and the delegate that will
652 be instantiated for items in the model.
654 It is usually not necessary to create VisualDataModel elements.
655 However, it can be useful for manipulating and accessing the \l modelIndex
656 when a QAbstractItemModel subclass is used as the
657 model. Also, VisualDataModel is used together with \l Package to
658 provide delegates to multiple views.
660 The example below illustrates using a VisualDataModel with a ListView.
662 \snippet doc/src/snippets/declarative/visualdatamodel.qml 0
665 QDeclarative1VisualDataModel::QDeclarative1VisualDataModel()
666 : QDeclarative1VisualModel(*(new QDeclarative1VisualDataModelPrivate(0)))
670 QDeclarative1VisualDataModel::QDeclarative1VisualDataModel(QDeclarativeContext *ctxt, QObject *parent)
671 : QDeclarative1VisualModel(*(new QDeclarative1VisualDataModelPrivate(ctxt)), parent)
675 QDeclarative1VisualDataModel::~QDeclarative1VisualDataModel()
677 Q_D(QDeclarative1VisualDataModel);
678 if (d->m_listAccessor)
679 delete d->m_listAccessor;
680 if (d->m_delegateDataType)
681 d->m_delegateDataType->release();
685 \qmlproperty model QtQuick1::VisualDataModel::model
686 This property holds the model providing data for the VisualDataModel.
688 The model provides a set of data that is used to create the items
689 for a view. For large or dynamic datasets the model is usually
690 provided by a C++ model object. The C++ model object must be a \l
691 {QAbstractItemModel} subclass or a simple list.
693 Models can also be created directly in QML, using a \l{ListModel} or
696 \sa {qmlmodels}{Data Models}
698 QVariant QDeclarative1VisualDataModel::model() const
700 Q_D(const QDeclarative1VisualDataModel);
701 return d->m_modelVariant;
704 void QDeclarative1VisualDataModel::setModel(const QVariant &model)
706 Q_D(QDeclarative1VisualDataModel);
707 delete d->m_listAccessor;
708 d->m_listAccessor = 0;
709 d->m_modelVariant = model;
710 if (d->m_listModelInterface) {
711 // Assume caller has released all items.
712 QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsChanged(int,int,QList<int>)),
713 this, SLOT(_q_itemsChanged(int,int,QList<int>)));
714 QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsInserted(int,int)),
715 this, SLOT(_q_itemsInserted(int,int)));
716 QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsRemoved(int,int)),
717 this, SLOT(_q_itemsRemoved(int,int)));
718 QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsMoved(int,int,int)),
719 this, SLOT(_q_itemsMoved(int,int,int)));
720 d->m_listModelInterface = 0;
721 } else if (d->m_abstractItemModel) {
722 QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
723 this, SLOT(_q_rowsInserted(QModelIndex,int,int)));
724 QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsRemoved(QModelIndex,int,int)),
725 this, SLOT(_q_rowsRemoved(QModelIndex,int,int)));
726 QObject::disconnect(d->m_abstractItemModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
727 this, SLOT(_q_dataChanged(QModelIndex,QModelIndex)));
728 QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
729 this, SLOT(_q_rowsMoved(QModelIndex,int,int,QModelIndex,int)));
730 QObject::disconnect(d->m_abstractItemModel, SIGNAL(modelReset()), this, SLOT(_q_modelReset()));
731 QObject::disconnect(d->m_abstractItemModel, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged()));
732 d->m_abstractItemModel = 0;
733 } else if (d->m_visualItemModel) {
734 QObject::disconnect(d->m_visualItemModel, SIGNAL(itemsInserted(int,int)),
735 this, SIGNAL(itemsInserted(int,int)));
736 QObject::disconnect(d->m_visualItemModel, SIGNAL(itemsRemoved(int,int)),
737 this, SIGNAL(itemsRemoved(int,int)));
738 QObject::disconnect(d->m_visualItemModel, SIGNAL(itemsMoved(int,int,int)),
739 this, SIGNAL(itemsMoved(int,int,int)));
740 QObject::disconnect(d->m_visualItemModel, SIGNAL(createdPackage(int,QDeclarative1Package*)),
741 this, SLOT(_q_createdPackage(int,QDeclarative1Package*)));
742 QObject::disconnect(d->m_visualItemModel, SIGNAL(destroyingPackage(QDeclarative1Package*)),
743 this, SLOT(_q_destroyingPackage(QDeclarative1Package*)));
744 d->m_visualItemModel = 0;
748 d->m_roleNames.clear();
749 if (d->m_delegateDataType)
750 d->m_delegateDataType->release();
751 d->m_metaDataCreated = 0;
752 d->m_metaDataCacheable = false;
753 d->m_delegateDataType = new VDMDelegateDataType(&QDeclarative1VisualDataModelData::staticMetaObject, d->m_context?d->m_context->engine():qmlEngine(this));
755 QObject *object = qvariant_cast<QObject *>(model);
756 if (object && (d->m_listModelInterface = qobject_cast<QListModelInterface *>(object))) {
757 QObject::connect(d->m_listModelInterface, SIGNAL(itemsChanged(int,int,QList<int>)),
758 this, SLOT(_q_itemsChanged(int,int,QList<int>)));
759 QObject::connect(d->m_listModelInterface, SIGNAL(itemsInserted(int,int)),
760 this, SLOT(_q_itemsInserted(int,int)));
761 QObject::connect(d->m_listModelInterface, SIGNAL(itemsRemoved(int,int)),
762 this, SLOT(_q_itemsRemoved(int,int)));
763 QObject::connect(d->m_listModelInterface, SIGNAL(itemsMoved(int,int,int)),
764 this, SLOT(_q_itemsMoved(int,int,int)));
765 d->m_metaDataCacheable = true;
766 if (d->m_delegate && d->m_listModelInterface->count())
767 emit itemsInserted(0, d->m_listModelInterface->count());
769 } else if (object && (d->m_abstractItemModel = qobject_cast<QAbstractItemModel *>(object))) {
770 QObject::connect(d->m_abstractItemModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
771 this, SLOT(_q_rowsInserted(QModelIndex,int,int)));
772 QObject::connect(d->m_abstractItemModel, SIGNAL(rowsRemoved(QModelIndex,int,int)),
773 this, SLOT(_q_rowsRemoved(QModelIndex,int,int)));
774 QObject::connect(d->m_abstractItemModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
775 this, SLOT(_q_dataChanged(QModelIndex,QModelIndex)));
776 QObject::connect(d->m_abstractItemModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
777 this, SLOT(_q_rowsMoved(QModelIndex,int,int,QModelIndex,int)));
778 QObject::connect(d->m_abstractItemModel, SIGNAL(modelReset()), this, SLOT(_q_modelReset()));
779 QObject::connect(d->m_abstractItemModel, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged()));
780 d->m_metaDataCacheable = true;
781 if (d->m_abstractItemModel->canFetchMore(d->m_root))
782 d->m_abstractItemModel->fetchMore(d->m_root);
785 if ((d->m_visualItemModel = qvariant_cast<QDeclarative1VisualDataModel *>(model))) {
786 QObject::connect(d->m_visualItemModel, SIGNAL(itemsInserted(int,int)),
787 this, SIGNAL(itemsInserted(int,int)));
788 QObject::connect(d->m_visualItemModel, SIGNAL(itemsRemoved(int,int)),
789 this, SIGNAL(itemsRemoved(int,int)));
790 QObject::connect(d->m_visualItemModel, SIGNAL(itemsMoved(int,int,int)),
791 this, SIGNAL(itemsMoved(int,int,int)));
792 QObject::connect(d->m_visualItemModel, SIGNAL(createdPackage(int,QDeclarative1Package*)),
793 this, SLOT(_q_createdPackage(int,QDeclarative1Package*)));
794 QObject::connect(d->m_visualItemModel, SIGNAL(destroyingPackage(QDeclarative1Package*)),
795 this, SLOT(_q_destroyingPackage(QDeclarative1Package*)));
798 d->m_listAccessor = new QDeclarative1ListAccessor;
799 d->m_listAccessor->setList(model, d->m_context?d->m_context->engine():qmlEngine(this));
800 if (d->m_listAccessor->type() != QDeclarative1ListAccessor::ListProperty)
801 d->m_metaDataCacheable = true;
802 if (d->m_delegate && d->modelCount()) {
803 emit itemsInserted(0, d->modelCount());
809 \qmlproperty Component QtQuick1::VisualDataModel::delegate
811 The delegate provides a template defining each item instantiated by a view.
812 The index is exposed as an accessible \c index property. Properties of the
813 model are also available depending upon the type of \l {qmlmodels}{Data Model}.
815 QDeclarativeComponent *QDeclarative1VisualDataModel::delegate() const
817 Q_D(const QDeclarative1VisualDataModel);
818 if (d->m_visualItemModel)
819 return d->m_visualItemModel->delegate();
820 return d->m_delegate;
823 void QDeclarative1VisualDataModel::setDelegate(QDeclarativeComponent *delegate)
825 Q_D(QDeclarative1VisualDataModel);
826 bool wasValid = d->m_delegate != 0;
827 d->m_delegate = delegate;
828 d->m_delegateValidated = false;
829 if (!wasValid && d->modelCount() && d->m_delegate) {
830 emit itemsInserted(0, d->modelCount());
833 if (wasValid && !d->m_delegate && d->modelCount()) {
834 emit itemsRemoved(0, d->modelCount());
840 \qmlproperty QModelIndex QtQuick1::VisualDataModel::rootIndex
842 QAbstractItemModel provides a hierarchical tree of data, whereas
843 QML only operates on list data. \c rootIndex allows the children of
844 any node in a QAbstractItemModel to be provided by this model.
846 This property only affects models of type QAbstractItemModel that
847 are hierarchical (e.g, a tree model).
849 For example, here is a simple interactive file system browser.
850 When a directory name is clicked, the view's \c rootIndex is set to the
851 QModelIndex node of the clicked directory, thus updating the view to show
852 the new directory's contents.
855 \snippet doc/src/snippets/declarative/visualdatamodel_rootindex/main.cpp 0
858 \snippet doc/src/snippets/declarative/visualdatamodel_rootindex/view.qml 0
860 If the \l model is a QAbstractItemModel subclass, the delegate can also
861 reference a \c hasModelChildren property (optionally qualified by a
862 \e model. prefix) that indicates whether the delegate's model item has
866 \sa modelIndex(), parentModelIndex()
868 QVariant QDeclarative1VisualDataModel::rootIndex() const
870 Q_D(const QDeclarative1VisualDataModel);
871 return QVariant::fromValue(d->m_root);
874 void QDeclarative1VisualDataModel::setRootIndex(const QVariant &root)
876 Q_D(QDeclarative1VisualDataModel);
877 QModelIndex modelIndex = qvariant_cast<QModelIndex>(root);
878 if (d->m_root != modelIndex) {
879 int oldCount = d->modelCount();
880 d->m_root = modelIndex;
881 if (d->m_abstractItemModel && d->m_abstractItemModel->canFetchMore(modelIndex))
882 d->m_abstractItemModel->fetchMore(modelIndex);
883 int newCount = d->modelCount();
884 if (d->m_delegate && oldCount)
885 emit itemsRemoved(0, oldCount);
886 if (d->m_delegate && newCount)
887 emit itemsInserted(0, newCount);
888 if (newCount != oldCount)
890 emit rootIndexChanged();
896 \qmlmethod QModelIndex QtQuick1::VisualDataModel::modelIndex(int index)
898 QAbstractItemModel provides a hierarchical tree of data, whereas
899 QML only operates on list data. This function assists in using
902 Returns a QModelIndex for the specified index.
903 This value can be assigned to rootIndex.
907 QVariant QDeclarative1VisualDataModel::modelIndex(int idx) const
909 Q_D(const QDeclarative1VisualDataModel);
910 if (d->m_abstractItemModel)
911 return QVariant::fromValue(d->m_abstractItemModel->index(idx, 0, d->m_root));
912 return QVariant::fromValue(QModelIndex());
916 \qmlmethod QModelIndex QtQuick1::VisualDataModel::parentModelIndex()
918 QAbstractItemModel provides a hierarchical tree of data, whereas
919 QML only operates on list data. This function assists in using
922 Returns a QModelIndex for the parent of the current rootIndex.
923 This value can be assigned to rootIndex.
927 QVariant QDeclarative1VisualDataModel::parentModelIndex() const
929 Q_D(const QDeclarative1VisualDataModel);
930 if (d->m_abstractItemModel)
931 return QVariant::fromValue(d->m_abstractItemModel->parent(d->m_root));
932 return QVariant::fromValue(QModelIndex());
935 QString QDeclarative1VisualDataModel::part() const
937 Q_D(const QDeclarative1VisualDataModel);
941 void QDeclarative1VisualDataModel::setPart(const QString &part)
943 Q_D(QDeclarative1VisualDataModel);
947 int QDeclarative1VisualDataModel::count() const
949 Q_D(const QDeclarative1VisualDataModel);
950 if (d->m_visualItemModel)
951 return d->m_visualItemModel->count();
954 return d->modelCount();
957 QDeclarativeItem *QDeclarative1VisualDataModel::item(int index, bool complete)
959 Q_D(QDeclarative1VisualDataModel);
960 if (d->m_visualItemModel)
961 return d->m_visualItemModel->item(index, d->m_part.toUtf8(), complete);
962 return item(index, QByteArray(), complete);
966 Returns ReleaseStatus flags.
968 QDeclarative1VisualDataModel::ReleaseFlags QDeclarative1VisualDataModel::release(QDeclarativeItem *item)
970 Q_D(QDeclarative1VisualDataModel);
971 if (d->m_visualItemModel)
972 return d->m_visualItemModel->release(item);
974 ReleaseFlags stat = 0;
976 bool inPackage = false;
978 QHash<QObject*,QDeclarative1Package*>::iterator it = d->m_packaged.find(item);
979 if (it != d->m_packaged.end()) {
980 QDeclarative1Package *package = *it;
981 d->m_packaged.erase(it);
982 if (d->m_packaged.contains(item))
985 obj = package; // fall through and delete
988 if (d->m_cache.releaseItem(obj)) {
989 // Remove any bindings to avoid warnings due to parent change.
990 QObjectPrivate *p = QObjectPrivate::get(obj);
991 Q_ASSERT(p->declarativeData);
992 QDeclarativeData *d = static_cast<QDeclarativeData*>(p->declarativeData);
993 if (d->ownContext && d->context)
994 d->context->clearContext();
997 emit destroyingPackage(qobject_cast<QDeclarative1Package*>(obj));
1000 item->scene()->removeItem(item);
1004 } else if (!inPackage) {
1012 \qmlproperty object QtQuick1::VisualDataModel::parts
1014 The \a parts property selects a VisualDataModel which creates
1015 delegates from the part named. This is used in conjunction with
1016 the \l Package element.
1018 For example, the code below selects a model which creates
1019 delegates named \e list from a \l Package:
1025 Item { Package.name: "list" }
1031 width: 200; height:200
1032 model: visualModel.parts.list
1038 QObject *QDeclarative1VisualDataModel::parts()
1040 Q_D(QDeclarative1VisualDataModel);
1042 d->m_parts = new QDeclarative1VisualDataModelParts(this);
1046 QDeclarativeItem *QDeclarative1VisualDataModel::item(int index, const QByteArray &viewId, bool complete)
1048 Q_D(QDeclarative1VisualDataModel);
1049 if (d->m_visualItemModel)
1050 return d->m_visualItemModel->item(index, viewId, complete);
1052 if (d->modelCount() <= 0 || !d->m_delegate)
1054 QObject *nobj = d->m_cache.getItem(index);
1055 bool needComplete = false;
1057 QDeclarativeContext *ccontext = d->m_context;
1058 if (!ccontext) ccontext = qmlContext(this);
1059 QDeclarativeContext *ctxt = new QDeclarativeContext(ccontext);
1060 QDeclarative1VisualDataModelData *data = new QDeclarative1VisualDataModelData(index, this);
1061 if ((!d->m_listModelInterface || !d->m_abstractItemModel) && d->m_listAccessor
1062 && d->m_listAccessor->type() == QDeclarative1ListAccessor::ListProperty) {
1063 ctxt->setContextObject(d->m_listAccessor->at(index).value<QObject*>());
1064 ctxt = new QDeclarativeContext(ctxt, ctxt);
1066 ctxt->setContextProperty(QLatin1String("model"), data);
1067 ctxt->setContextObject(data);
1068 d->m_completePending = false;
1069 nobj = d->m_delegate->beginCreate(ctxt);
1071 d->m_delegate->completeCreate();
1073 d->m_completePending = true;
1074 needComplete = true;
1077 QDeclarative_setParent_noEvent(ctxt, nobj);
1078 QDeclarative_setParent_noEvent(data, nobj);
1079 d->m_cache.insertItem(index, nobj);
1080 if (QDeclarative1Package *package = qobject_cast<QDeclarative1Package *>(nobj))
1081 emit createdPackage(index, package);
1085 qmlInfo(this, d->m_delegate->errors()) << "Error creating delegate";
1088 QDeclarativeItem *item = qobject_cast<QDeclarativeItem *>(nobj);
1090 QDeclarative1Package *package = qobject_cast<QDeclarative1Package *>(nobj);
1092 QObject *o = package->part(QString::fromUtf8(viewId));
1093 item = qobject_cast<QDeclarativeItem *>(o);
1095 d->m_packaged.insertMulti(item, package);
1100 d->m_delegate->completeCreate();
1101 d->m_cache.releaseItem(nobj);
1102 if (!d->m_delegateValidated) {
1103 qmlInfo(d->m_delegate) << QDeclarative1VisualDataModel::tr("Delegate component must be Item type.");
1104 d->m_delegateValidated = true;
1107 if (d->modelCount()-1 == index && d->m_abstractItemModel && d->m_abstractItemModel->canFetchMore(d->m_root))
1108 d->m_abstractItemModel->fetchMore(d->m_root);
1113 bool QDeclarative1VisualDataModel::completePending() const
1115 Q_D(const QDeclarative1VisualDataModel);
1116 if (d->m_visualItemModel)
1117 return d->m_visualItemModel->completePending();
1118 return d->m_completePending;
1121 void QDeclarative1VisualDataModel::completeItem()
1123 Q_D(QDeclarative1VisualDataModel);
1124 if (d->m_visualItemModel) {
1125 d->m_visualItemModel->completeItem();
1129 d->m_delegate->completeCreate();
1130 d->m_completePending = false;
1133 QString QDeclarative1VisualDataModel::stringValue(int index, const QString &name)
1135 Q_D(QDeclarative1VisualDataModel);
1136 if (d->m_visualItemModel)
1137 return d->m_visualItemModel->stringValue(index, name);
1139 if ((!d->m_listModelInterface || !d->m_abstractItemModel) && d->m_listAccessor) {
1140 if (QObject *object = d->m_listAccessor->at(index).value<QObject*>())
1141 return object->property(name.toUtf8()).toString();
1144 if ((!d->m_listModelInterface && !d->m_abstractItemModel) || !d->m_delegate)
1149 bool tempData = false;
1151 if (QObject *nobj = d->m_cache.item(index))
1152 data = d->data(nobj);
1154 data = new QDeclarative1VisualDataModelData(index, this);
1158 QDeclarativeData *ddata = QDeclarativeData::get(data);
1159 if (ddata && ddata->propertyCache) {
1160 QDeclarativePropertyCache::Data *prop = ddata->propertyCache->property(name);
1162 if (prop->propType == QVariant::String) {
1163 void *args[] = { &val, 0 };
1164 QMetaObject::metacall(data, QMetaObject::ReadProperty, prop->coreIndex, args);
1165 } else if (prop->propType == qMetaTypeId<QVariant>()) {
1167 void *args[] = { &v, 0 };
1168 QMetaObject::metacall(data, QMetaObject::ReadProperty, prop->coreIndex, args);
1172 val = data->property(name.toUtf8()).toString();
1175 val = data->property(name.toUtf8()).toString();
1184 int QDeclarative1VisualDataModel::indexOf(QDeclarativeItem *item, QObject *) const
1186 QVariant val = QDeclarativeEngine::contextForObject(item)->contextProperty(QLatin1String("index"));
1191 void QDeclarative1VisualDataModel::setWatchedRoles(QList<QByteArray> roles)
1193 Q_D(QDeclarative1VisualDataModel);
1194 d->watchedRoles = roles;
1195 d->watchedRoleIds.clear();
1198 void QDeclarative1VisualDataModel::_q_itemsChanged(int index, int count,
1199 const QList<int> &roles)
1201 Q_D(QDeclarative1VisualDataModel);
1202 bool changed = false;
1203 if (!d->watchedRoles.isEmpty() && d->watchedRoleIds.isEmpty()) {
1204 foreach (QByteArray r, d->watchedRoles) {
1205 if (d->m_roleNames.contains(r))
1206 d->watchedRoleIds << d->m_roleNames.value(r);
1210 for (QHash<int,QDeclarative1VisualDataModelPrivate::ObjectRef>::ConstIterator iter = d->m_cache.begin();
1211 iter != d->m_cache.end(); ++iter) {
1212 const int idx = iter.key();
1214 if (idx >= index && idx < index+count) {
1215 QDeclarative1VisualDataModelPrivate::ObjectRef objRef = *iter;
1216 QDeclarative1VisualDataModelData *data = d->data(objRef.obj);
1217 for (int roleIdx = 0; roleIdx < roles.count(); ++roleIdx) {
1218 int role = roles.at(roleIdx);
1219 if (!changed && !d->watchedRoleIds.isEmpty() && d->watchedRoleIds.contains(role))
1221 int propId = data->propForRole(role);
1223 if (data->hasValue(propId)) {
1224 if (d->m_listModelInterface) {
1225 data->setValue(propId, d->m_listModelInterface->data(idx, role));
1226 } else if (d->m_abstractItemModel) {
1227 QModelIndex index = d->m_abstractItemModel->index(idx, 0, d->m_root);
1228 data->setValue(propId, d->m_abstractItemModel->data(index, role));
1233 if (d->m_listModelInterface)
1234 roleName = d->m_listModelInterface->toString(role);
1235 else if (d->m_abstractItemModel)
1236 roleName = QString::fromUtf8(d->m_abstractItemModel->roleNames().value(role));
1237 qmlInfo(this) << "Changing role not present in item: " << roleName;
1240 if (d->m_roles.count() == 1) {
1241 // Handle the modelData role we add if there is just one role.
1242 int propId = data->modelDataPropertyId();
1243 if (data->hasValue(propId)) {
1244 int role = d->m_roles.at(0);
1245 if (d->m_listModelInterface) {
1246 data->setValue(propId, d->m_listModelInterface->data(idx, role));
1247 } else if (d->m_abstractItemModel) {
1248 QModelIndex index = d->m_abstractItemModel->index(idx, 0, d->m_root);
1249 data->setValue(propId, d->m_abstractItemModel->data(index, role));
1256 emit itemsChanged(index, count);
1259 void QDeclarative1VisualDataModel::_q_itemsInserted(int index, int count)
1261 Q_D(QDeclarative1VisualDataModel);
1264 // XXX - highly inefficient
1265 QHash<int,QDeclarative1VisualDataModelPrivate::ObjectRef> items;
1266 for (QHash<int,QDeclarative1VisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
1267 iter != d->m_cache.end(); ) {
1269 if (iter.key() >= index) {
1270 QDeclarative1VisualDataModelPrivate::ObjectRef objRef = *iter;
1271 int index = iter.key() + count;
1272 iter = d->m_cache.erase(iter);
1274 items.insert(index, objRef);
1276 QDeclarative1VisualDataModelData *data = d->data(objRef.obj);
1277 data->setIndex(index);
1282 d->m_cache.unite(items);
1284 emit itemsInserted(index, count);
1285 emit countChanged();
1288 void QDeclarative1VisualDataModel::_q_itemsRemoved(int index, int count)
1290 Q_D(QDeclarative1VisualDataModel);
1293 // XXX - highly inefficient
1294 QHash<int, QDeclarative1VisualDataModelPrivate::ObjectRef> items;
1295 for (QHash<int, QDeclarative1VisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
1296 iter != d->m_cache.end(); ) {
1297 if (iter.key() >= index && iter.key() < index + count) {
1298 QDeclarative1VisualDataModelPrivate::ObjectRef objRef = *iter;
1299 iter = d->m_cache.erase(iter);
1300 items.insertMulti(-1, objRef); //XXX perhaps better to maintain separately
1301 QDeclarative1VisualDataModelData *data = d->data(objRef.obj);
1303 } else if (iter.key() >= index + count) {
1304 QDeclarative1VisualDataModelPrivate::ObjectRef objRef = *iter;
1305 int index = iter.key() - count;
1306 iter = d->m_cache.erase(iter);
1307 items.insert(index, objRef);
1308 QDeclarative1VisualDataModelData *data = d->data(objRef.obj);
1309 data->setIndex(index);
1315 d->m_cache.unite(items);
1316 emit itemsRemoved(index, count);
1317 emit countChanged();
1320 void QDeclarative1VisualDataModel::_q_itemsMoved(int from, int to, int count)
1322 Q_D(QDeclarative1VisualDataModel);
1323 // XXX - highly inefficient
1324 QHash<int,QDeclarative1VisualDataModelPrivate::ObjectRef> items;
1325 for (QHash<int,QDeclarative1VisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
1326 iter != d->m_cache.end(); ) {
1328 if (iter.key() >= from && iter.key() < from + count) {
1329 QDeclarative1VisualDataModelPrivate::ObjectRef objRef = *iter;
1330 int index = iter.key() - from + to;
1331 iter = d->m_cache.erase(iter);
1333 items.insert(index, objRef);
1335 QDeclarative1VisualDataModelData *data = d->data(objRef.obj);
1336 data->setIndex(index);
1341 for (QHash<int,QDeclarative1VisualDataModelPrivate::ObjectRef>::Iterator iter = d->m_cache.begin();
1342 iter != d->m_cache.end(); ) {
1344 int diff = from > to ? count : -count;
1345 if (iter.key() >= qMin(from,to) && iter.key() < qMax(from+count,to+count)) {
1346 QDeclarative1VisualDataModelPrivate::ObjectRef objRef = *iter;
1347 int index = iter.key() + diff;
1348 iter = d->m_cache.erase(iter);
1350 items.insert(index, objRef);
1352 QDeclarative1VisualDataModelData *data = d->data(objRef.obj);
1353 data->setIndex(index);
1358 d->m_cache.unite(items);
1360 emit itemsMoved(from, to, count);
1363 void QDeclarative1VisualDataModel::_q_rowsInserted(const QModelIndex &parent, int begin, int end)
1365 Q_D(QDeclarative1VisualDataModel);
1366 if (parent == d->m_root)
1367 _q_itemsInserted(begin, end - begin + 1);
1370 void QDeclarative1VisualDataModel::_q_rowsRemoved(const QModelIndex &parent, int begin, int end)
1372 Q_D(QDeclarative1VisualDataModel);
1373 if (parent == d->m_root)
1374 _q_itemsRemoved(begin, end - begin + 1);
1377 void QDeclarative1VisualDataModel::_q_rowsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)
1379 Q_D(QDeclarative1VisualDataModel);
1380 const int count = sourceEnd - sourceStart + 1;
1381 if (destinationParent == d->m_root && sourceParent == d->m_root) {
1382 _q_itemsMoved(sourceStart, sourceStart > destinationRow ? destinationRow : destinationRow-1, count);
1383 } else if (sourceParent == d->m_root) {
1384 _q_itemsRemoved(sourceStart, count);
1385 } else if (destinationParent == d->m_root) {
1386 _q_itemsInserted(destinationRow, count);
1390 void QDeclarative1VisualDataModel::_q_dataChanged(const QModelIndex &begin, const QModelIndex &end)
1392 Q_D(QDeclarative1VisualDataModel);
1393 if (begin.parent() == d->m_root)
1394 _q_itemsChanged(begin.row(), end.row() - begin.row() + 1, d->m_roles);
1397 void QDeclarative1VisualDataModel::_q_layoutChanged()
1399 Q_D(QDeclarative1VisualDataModel);
1400 _q_itemsChanged(0, count(), d->m_roles);
1403 void QDeclarative1VisualDataModel::_q_modelReset()
1405 Q_D(QDeclarative1VisualDataModel);
1406 d->m_root = QModelIndex();
1408 emit rootIndexChanged();
1409 if (d->m_abstractItemModel && d->m_abstractItemModel->canFetchMore(d->m_root))
1410 d->m_abstractItemModel->fetchMore(d->m_root);
1413 void QDeclarative1VisualDataModel::_q_createdPackage(int index, QDeclarative1Package *package)
1415 Q_D(QDeclarative1VisualDataModel);
1416 emit createdItem(index, qobject_cast<QDeclarativeItem*>(package->part(d->m_part)));
1419 void QDeclarative1VisualDataModel::_q_destroyingPackage(QDeclarative1Package *package)
1421 Q_D(QDeclarative1VisualDataModel);
1422 emit destroyingItem(qobject_cast<QDeclarativeItem*>(package->part(d->m_part)));
1429 QML_DECLARE_TYPE(QListModelInterface)
1431 #include <qdeclarativevisualitemmodel.moc>