diff options
author | Andrew den Exter <andrew.den-exter@nokia.com> | 2012-03-16 15:37:14 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-21 07:51:57 +0200 |
commit | f242e50a9f60ec09b415c8ae922c4b26f4d22009 (patch) | |
tree | 0ac991d68b182a8c9575a1f05d001b90a981a8ae /src/quick/items/qquickvisualadaptormodel_p.h | |
parent | a96705e349c51215b6e451147b4c2de49ba5a107 (diff) |
Refactor QQuickVisualAdaptorModel to reduce memory consumption.
Don't inherit from QObject.
Use a single QQmlGuard for all model types, and reset the model
property if the model is deleted.
Construct v8 object template on demand.
Store model type specific data in a separate class that is allocated
on demand.
Change-Id: Id4f7b235741555b6ffba3fcf11727d85d6920e9e
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'src/quick/items/qquickvisualadaptormodel_p.h')
-rw-r--r-- | src/quick/items/qquickvisualadaptormodel_p.h | 132 |
1 files changed, 79 insertions, 53 deletions
diff --git a/src/quick/items/qquickvisualadaptormodel_p.h b/src/quick/items/qquickvisualadaptormodel_p.h index cf6dabe237..dba65e197e 100644 --- a/src/quick/items/qquickvisualadaptormodel_p.h +++ b/src/quick/items/qquickvisualadaptormodel_p.h @@ -42,75 +42,101 @@ #ifndef QQUICKVISUALADAPTORMODEL_P_H #define QQUICKVISUALADAPTORMODEL_P_H -#include <QtCore/qobject.h> #include <QtCore/qabstractitemmodel.h> +#include "private/qlistmodelinterface_p.h" +#include "private/qquicklistaccessor_p.h" + +#include <private/qqmlguard_p.h> + QT_BEGIN_HEADER QT_BEGIN_NAMESPACE class QQmlEngine; +class QQuickVisualDataModel; class QQuickVisualDataModelItem; class QQuickVisualDataModelItemMetaType; -class QQuickVisualAdaptorModelPrivate; -class QQuickVisualAdaptorModel : public QObject +class QQuickVisualAdaptorModel : public QQmlGuard<QObject> { - Q_OBJECT - Q_DECLARE_PRIVATE(QQuickVisualAdaptorModel) public: - enum Flag + class Accessors { - ProxiedObject = 0x01 + public: + inline Accessors() {} + virtual int count(const QQuickVisualAdaptorModel &) const { return 0; } + virtual void cleanup(QQuickVisualAdaptorModel &, QQuickVisualDataModel * = 0) const {} + + virtual QString stringValue(const QQuickVisualAdaptorModel &, int, const QString &) const { + return QString(); } + + virtual QQuickVisualDataModelItem *createItem( + QQuickVisualAdaptorModel &, + QQuickVisualDataModelItemMetaType *, + QQmlEngine *, + int) const { return 0; } + + virtual bool notify( + const QQuickVisualAdaptorModel &, + const QList<QQuickVisualDataModelItem *> &, + int, + int, + const QList<int> &) const { return false; } + virtual void replaceWatchedRoles( + QQuickVisualAdaptorModel &, + const QList<QByteArray> &, + const QList<QByteArray> &) const {} + virtual QVariant parentModelIndex(const QQuickVisualAdaptorModel &) const { + return QVariant(); } + virtual QVariant modelIndex(const QQuickVisualAdaptorModel &, int) const { + return QVariant(); } + virtual bool canFetchMore(const QQuickVisualAdaptorModel &) const { return false; } + virtual void fetchMore(QQuickVisualAdaptorModel &) const {} }; - Q_DECLARE_FLAGS(Flags, Flag) - - QQuickVisualAdaptorModel(QObject *parent = 0); - virtual ~QQuickVisualAdaptorModel(); - - Flags flags() const; - - QVariant model() const; - void setModel(const QVariant &, QQmlEngine *); - - QVariant rootIndex() const; - void setRootIndex(const QVariant &root); - - QVariant modelIndex(int idx) const; - QVariant parentModelIndex() const; - - int count() const; - QQuickVisualDataModelItem *createItem(QQuickVisualDataModelItemMetaType *metaType, int index); - QString stringValue(int index, const QString &role); - void replaceWatchedRoles(const QList<QByteArray> &oldRoles, const QList<QByteArray> &newRoles); - - bool canFetchMore() const; - void fetchMore(); - -Q_SIGNALS: - void rootIndexChanged(); - void modelReset(int oldCount, int newCount); - - void itemsInserted(int index, int count); - void itemsRemoved(int index, int count); - void itemsMoved(int from, int to, int count); - void itemsChanged(int index, int count); - -private Q_SLOTS: - void _q_itemsChanged(int, int, const QList<int> &); - void _q_itemsInserted(int index, int count); - void _q_itemsRemoved(int index, int count); - void _q_itemsMoved(int from, int to, int count); - void _q_rowsInserted(const QModelIndex &,int,int); - void _q_rowsRemoved(const QModelIndex &,int,int); - void _q_rowsMoved(const QModelIndex &, int, int, const QModelIndex &, int); - void _q_dataChanged(const QModelIndex&,const QModelIndex&); - void _q_layoutChanged(); - void _q_modelReset(); -private: - Q_DISABLE_COPY(QQuickVisualAdaptorModel) + const Accessors *accessors; + QModelIndex rootIndex; + QQuickListAccessor list; + + QQuickVisualAdaptorModel(); + ~QQuickVisualAdaptorModel(); + + inline QVariant model() const { return list.list(); } + void setModel(const QVariant &variant, QQuickVisualDataModel *vdm, QQmlEngine *engine); + + inline QAbstractItemModel *aim() { return static_cast<QAbstractItemModel *>(object()); } + inline const QAbstractItemModel *aim() const { return static_cast<const QAbstractItemModel *>(object()); } + + inline QListModelInterface *lmi() { return static_cast<QListModelInterface *>(object()); } + inline const QListModelInterface *lmi() const { return static_cast<const QListModelInterface *>(object()); } + + inline int count() const { return qMax(0, accessors->count(*this)); } + inline QString stringValue(int index, const QString &role) const { + return accessors->stringValue(*this, index, role); } + inline QQuickVisualDataModelItem *createItem(QQuickVisualDataModelItemMetaType *metaType, QQmlEngine *engine, int index) { + return accessors->createItem(*this, metaType, engine, index); } + inline bool hasProxyObject() const { + return list.type() == QQuickListAccessor::Instance || list.type() == QQuickListAccessor::ListProperty; } + + inline bool notify( + const QList<QQuickVisualDataModelItem *> &items, + int index, + int count, + const QList<int> &roles) const { + return accessors->notify(*this, items, index, count, roles); } + inline void replaceWatchedRoles( + const QList<QByteArray> &oldRoles, const QList<QByteArray> &newRoles) { + accessors->replaceWatchedRoles(*this, oldRoles, newRoles); } + + inline QVariant modelIndex(int index) const { return accessors->modelIndex(*this, index); } + inline QVariant parentModelIndex() const { return accessors->parentModelIndex(*this); } + inline bool canFetchMore() const { return accessors->canFetchMore(*this); } + inline void fetchMore() { return accessors->fetchMore(*this); } + +protected: + void objectDestroyed(QObject *); }; class QQuickVisualAdaptorModelProxyInterface |