hgwidgets_pub/hgcacheproxymodel_api/inc/hgdataprovidermodel.h
changeset 20 a60f8b6b1d32
--- /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 <QObject>
+#include <QList>
+#include <QPair>
+#include <QPixmap>
+#include <QMap>
+#include <QMutex>
+#include <QAbstractItemModel>
+
+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<int> list, bool silent = true);
+    void request(QList<int> list, bool silent = false);  
+    virtual void doReleaseData(QList<int> list, bool silent) = 0;
+    virtual void doRequestData(QList<int> 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<int, QVariant> 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<QMap<int, QVariant>*>* 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_