diff -r a10844a9914d -r a60f8b6b1d32 hgwidgets_pub/hgcacheproxymodel_api/inc/hgdataprovidermodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgwidgets_pub/hgcacheproxymodel_api/inc/hgdataprovidermodel.h Wed Oct 06 14:53:41 2010 +0300 @@ -0,0 +1,154 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +* Version : %version: 11 % +*/ +#ifndef HGDATAPROVIDERMODEL_H_ +#define HGDATAPROVIDERMODEL_H_ + +#include +#include +#include +#include +#include +#include +#include + +class HbIcon; +class QVariant; +class HgCacheProxyModel; + +#ifdef BUILD_CACHEPROXYMODEL +#define CACHEPROXYMODEL_EXPORT Q_DECL_EXPORT +#else +#define CACHEPROXYMODEL_EXPORT Q_DECL_IMPORT +#endif + +class HgDataProviderModelObserver +{ +public: + virtual void dataUpdated(int from, int to) = 0; + virtual bool isCached(int idx) const = 0; +}; + +class CACHEPROXYMODEL_EXPORT HgDataProviderModel : public QAbstractItemModel +{ + Q_OBJECT + +public: + HgDataProviderModel(QObject *parent = 0); + ~HgDataProviderModel(); +//to cooperate with buffer manager + void release(QList list, bool silent = true); + void request(QList list, bool silent = false); + virtual void doReleaseData(QList list, bool silent) = 0; + virtual void doRequestData(QList list, bool silent) = 0; + void registerObserver(HgDataProviderModelObserver* obs); + +public: +//from QAbstractItemModel + QModelIndex index(int row, int column, + const QModelIndex &parent = QModelIndex()) const; + virtual QModelIndex parent(const QModelIndex &child) const; + virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; + virtual int columnCount(const QModelIndex &parent = QModelIndex()) const; + virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + virtual QMap itemData(const QModelIndex &index) const; + +//cache management +protected: + QVariant data(int idx, int role) const; + void clearCache(); + int count() const; + bool update(int pos, QVariant obj, int role, bool silent = false); + bool update(int pos, QList< QPair< QVariant, int > >* list, bool silent = false); + bool updateIcon(int pos, QVariant obj, bool silent = false); + void resetIcon(int idx); + void newItem(QList< QPair< QVariant, int > >* list = NULL, bool silent = true); + void newItem(QPair< QVariant, int > item, bool silent = true); + void insertItem(int pos, QList< QPair< QVariant, int > >* list = NULL, bool silent = true); + void insertItem(int pos, QPair< QVariant, int > item, bool silent = true); + void clearItem(int pos, bool silent = false); + +private: + void doInsertItem(int pos, QList< QPair< QVariant, int > >* list, bool silent); + +protected: + void removeItem(int pos, bool silent = false); + void removeItems(int pos, int size, bool silent = false); + + virtual QVariant defaultIcon() const = 0; + inline bool containsRole(int idx, int role) const; + inline bool isIndexValid(int idx) const; + bool isCached(int idx) const; +public: + void resetModel(); + + enum HgDataProviderIconMode { + HgDataProviderIconHbIcon, + HgDataProviderIconQIcon, + HgDataProviderIconQImage, + HgDataProviderIconQPixmap + }; + + void setIconMode(HgDataProviderIconMode mode); + HgDataProviderIconMode iconMode(); + +protected: + virtual void doResetModel() {}; + virtual QVariant getData(int idx, int role) const {Q_UNUSED(idx); Q_UNUSED(role); return QVariant(); }; + +// helpers fot emits +protected: + void emitDataChanged(int start, int end, bool silent); + +//QPixmap pool +public: + void resizeQPixmapPool(int size); + +protected: + void releasePixmap(int idx); + QVariant createIcon(int index, QPixmap aPixmap); + +private: + QPixmap* getPixmap(int idx); + + +private: + QList*>* mCache; + int mCacheSize; //Number of cached Icons. Not same as mCache->count() + QList< QPixmap* > mFreePixmaps; + QMap< int, QPixmap* > mUsedPixmaps; + int mUnallocatedPixmaps; + QMutex mQPixmapsLock; + QMutex mDataLock; + HgDataProviderModelObserver *mObserver; + HgDataProviderIconMode mIconMode; +}; + +inline bool HgDataProviderModel::isIndexValid(int idx) const +{ + return ((idx >= 0) && + (idx < mCache->size()) && + (mCache->at(idx))); +} + +inline bool HgDataProviderModel::containsRole(int idx, int role) const +{ + return ( isIndexValid(idx) && + mCache->at(idx)->contains(role) ); +} + +#endif // HGDATAPROVIDERMODEL_H_