[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [marble/sok-2012-plasma-active] src: Expose favorite items as a QAbstractListModel
From:       Dennis_Nienhüser <earthwings () gentoo ! org>
Date:       2012-06-05 14:11:56
Message-ID: 20120605141156.64559A60CD () git ! kde ! org
[Download RAW message or body]

Git commit 861cde72e01a2213e33a9631d167fa2008dda8e9 by Dennis Nienhüser.
Committed on 05/06/2012 at 12:21.
Pushed by nienhueser into branch 'sok-2012-plasma-active'.

Expose favorite items as a QAbstractListModel

Derived models should call registerItemProperties to access properties
conveniently by name in QML.

M  +7    -0    src/lib/AbstractDataPlugin.cpp
M  +6    -0    src/lib/AbstractDataPlugin.h
M  +123  -39   src/lib/AbstractDataPluginModel.cpp
M  +9    -1    src/lib/AbstractDataPluginModel.h
M  +1    -0    src/plugins/render/weather/WeatherModel.cpp

http://commits.kde.org/marble/861cde72e01a2213e33a9631d167fa2008dda8e9

diff --git a/src/lib/AbstractDataPlugin.cpp b/src/lib/AbstractDataPlugin.cpp
index ddee5a7..2784f88 100644
--- a/src/lib/AbstractDataPlugin.cpp
+++ b/src/lib/AbstractDataPlugin.cpp
@@ -127,6 +127,8 @@ void AbstractDataPlugin::setModel( AbstractDataPluginModel* model \
)  SLOT( favoriteItemsChanged( const QStringList& ) ) );
     connect( d->m_model, SIGNAL( favoriteItemsOnlyChanged() ), this,
                          SIGNAL( favoriteItemsOnlyChanged() ) );
+
+    emit favoritesModelChanged();
 }
 
 const PluginManager* AbstractDataPlugin::pluginManager() const
@@ -184,6 +186,11 @@ bool AbstractDataPlugin::isFavoriteItemsOnly() const
     return d->m_model->isFavoriteItemsOnly();
 }
 
+QObject *AbstractDataPlugin::favoritesModel()
+{
+    return d->m_model ? d->m_model->favoritesModel() : 0;
+}
+
 void AbstractDataPlugin::handleViewportChange( GeoPainter* painter, ViewportParams* \
viewport )  {
     QList<AbstractDataPluginItem*> orphane = d->m_delegateInstances.keys();
diff --git a/src/lib/AbstractDataPlugin.h b/src/lib/AbstractDataPlugin.h
index 61679c3..3ad011f 100644
--- a/src/lib/AbstractDataPlugin.h
+++ b/src/lib/AbstractDataPlugin.h
@@ -44,6 +44,8 @@ class MARBLE_EXPORT AbstractDataPlugin : public RenderPlugin
     Q_OBJECT
 
     Q_PROPERTY( bool favoriteItemsOnly READ isFavoriteItemsOnly WRITE \
setFavoriteItemsOnly NOTIFY favoriteItemsOnlyChanged ) +    /** @todo FIXME Qt Quick \
segfaults if using the real class here instead of QObject */ +    Q_PROPERTY( \
QObject* favoritesModel READ favoritesModel NOTIFY favoritesModelChanged )  
  public:    
     AbstractDataPlugin( const MarbleModel *marbleModel );
@@ -115,6 +117,8 @@ class MARBLE_EXPORT AbstractDataPlugin : public RenderPlugin
     void setFavoriteItemsOnly( bool favoriteOnly );
 
     bool isFavoriteItemsOnly() const;
+
+    QObject* favoritesModel();
     
 public Q_SLOTS:
     void handleViewportChange(GeoPainter *painter, ViewportParams* viewport );
@@ -126,6 +130,8 @@ public Q_SLOTS:
     void changedNumberOfItems( quint32 number );
 
     void favoriteItemsOnlyChanged();
+
+    void favoritesModelChanged();
     
  private:
     AbstractDataPluginPrivate * const d;
diff --git a/src/lib/AbstractDataPluginModel.cpp \
b/src/lib/AbstractDataPluginModel.cpp index 97869d8..1f09d83 100644
--- a/src/lib/AbstractDataPluginModel.cpp
+++ b/src/lib/AbstractDataPluginModel.cpp
@@ -17,6 +17,8 @@
 #include <QtCore/QPointF>
 #include <QtCore/QtAlgorithms>
 #include <QtCore/QVariant>
+#include <QtCore/QAbstractListModel>
+#include <QtCore/QMetaProperty>
 
 // Marble
 #include "MarbleDebug.h"
@@ -48,43 +50,16 @@ const qreal boxComparisonFactor = 16.0;
 // Separator to separate the id of the item from the file type
 const char fileIdSeparator = '_';
 
+class FavoritesModel;
+
 class AbstractDataPluginModelPrivate
 {
 public:
     AbstractDataPluginModelPrivate( const QString& name,
                                     const PluginManager *pluginManager,
-                                    AbstractDataPluginModel * parent )
-        : m_parent( parent ),
-          m_name( name ),
-          m_lastBox(),
-          m_downloadedBox(),
-          m_lastNumber( 0 ),
-          m_downloadedNumber( 0 ),
-          m_lastMarbleModel( 0 ),
-          m_downloadTimer( m_parent ),
-          m_descriptionFileNumber( 0 ),
-          m_itemSettings(),
-          m_favoriteItemsOnly( false ),
-          m_storagePolicy( MarbleDirs::localPath() + "/cache/" + m_name + '/' ),
-          m_downloadManager( &m_storagePolicy, pluginManager )
-    {
-    }
+                                    AbstractDataPluginModel * parent );
     
-    ~AbstractDataPluginModelPrivate() {
-        QList<AbstractDataPluginItem*>::iterator lIt = m_itemSet.begin();
-        QList<AbstractDataPluginItem*>::iterator const lItEnd = m_itemSet.end();
-        for (; lIt != lItEnd; ++lIt ) {
-            (*lIt)->deleteLater();
-        }
-        
-        QHash<QString,AbstractDataPluginItem*>::iterator hIt = \
                m_downloadingItems.begin();
-        QHash<QString,AbstractDataPluginItem*>::iterator const hItEnd = \
                m_downloadingItems.end();
-        for (; hIt != hItEnd; ++hIt ) {
-            (*hIt)->deleteLater();
-        }
-        
-        m_storagePolicy.clearCache();
-    }
+    ~AbstractDataPluginModelPrivate();
 
     void updateFavoriteItems();
     
@@ -107,8 +82,111 @@ public:
 
     CacheStoragePolicy m_storagePolicy;
     HttpDownloadManager m_downloadManager;
+    FavoritesModel* m_favoritesModel;
+    QMetaObject m_metaObject;
 };
 
+class FavoritesModel : public QAbstractListModel
+{
+public:
+    AbstractDataPluginModelPrivate* d;
+
+    explicit FavoritesModel( AbstractDataPluginModelPrivate* d, QObject* parent = 0 \
); +
+    virtual int rowCount ( const QModelIndex & parent = QModelIndex() ) const;
+
+    QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const;
+
+    void reset();
+};
+
+AbstractDataPluginModelPrivate::AbstractDataPluginModelPrivate( const QString& name,
+                                const PluginManager *pluginManager,
+                                AbstractDataPluginModel * parent )
+    : m_parent( parent ),
+      m_name( name ),
+      m_lastBox(),
+      m_downloadedBox(),
+      m_lastNumber( 0 ),
+      m_downloadedNumber( 0 ),
+      m_lastMarbleModel( 0 ),
+      m_downloadTimer( m_parent ),
+      m_descriptionFileNumber( 0 ),
+      m_itemSettings(),
+      m_favoriteItemsOnly( false ),
+      m_storagePolicy( MarbleDirs::localPath() + "/cache/" + m_name + '/' ),
+      m_downloadManager( &m_storagePolicy, pluginManager ),
+      m_favoritesModel( 0 )
+{
+}
+
+AbstractDataPluginModelPrivate::~AbstractDataPluginModelPrivate() {
+    QList<AbstractDataPluginItem*>::iterator lIt = m_itemSet.begin();
+    QList<AbstractDataPluginItem*>::iterator const lItEnd = m_itemSet.end();
+    for (; lIt != lItEnd; ++lIt ) {
+        (*lIt)->deleteLater();
+    }
+
+    QHash<QString,AbstractDataPluginItem*>::iterator hIt = \
m_downloadingItems.begin(); +    QHash<QString,AbstractDataPluginItem*>::iterator \
const hItEnd = m_downloadingItems.end(); +    for (; hIt != hItEnd; ++hIt ) {
+        (*hIt)->deleteLater();
+    }
+
+    m_storagePolicy.clearCache();
+}
+
+void AbstractDataPluginModelPrivate::updateFavoriteItems()
+{
+    if ( m_lastMarbleModel && m_favoriteItemsOnly ) {
+        foreach( const QString &id, m_favoriteItems ) {
+            if ( !m_parent->findItem( id ) ) {
+                m_parent->getItem( id, m_lastMarbleModel );
+            }
+        }
+    }
+}
+
+FavoritesModel::FavoritesModel( AbstractDataPluginModelPrivate *_d, QObject* parent \
) : +    QAbstractListModel( parent ), d(_d)
+{
+    QHash<int,QByteArray> roles = roleNames();
+    int const size = d->m_metaObject.propertyCount();
+    for ( int i=0; i<size; ++i ) {
+        QMetaProperty property = d->m_metaObject.property( i );
+        roles[Qt::UserRole+i] = property.name();
+    }
+    roles[Qt::DisplayRole] = "display";
+    roles[Qt::DecorationRole] = "decoration";
+    setRoleNames( roles );
+}
+
+int FavoritesModel::rowCount ( const QModelIndex &parent ) const
+{
+    return parent.isValid() ? 0 : d->m_favoriteItems.size();
+}
+
+QVariant FavoritesModel::data( const QModelIndex &index, int role ) const
+{
+    int const row = index.row();
+    if ( row >= 0 && row < rowCount() ) {
+        QString const roleName = roleNames().value( role, int( Qt::DisplayRole ) );
+        QString const id = d->m_favoriteItems[row];
+        foreach( AbstractDataPluginItem* item, d->m_itemSet ) {
+            if ( item->id() == id ) {
+                return item->property( roleName.toAscii() );
+            }
+        }
+    }
+
+    return QVariant();
+}
+
+void FavoritesModel::reset()
+{
+    QAbstractListModel::reset();
+}
+
 AbstractDataPluginModel::AbstractDataPluginModel( const QString& name,
                                                   const PluginManager \
*pluginManager,  QObject *parent )
@@ -326,6 +404,9 @@ void AbstractDataPluginModel::setFavoriteItems( const \
QStringList& list )  if ( d->m_favoriteItems != list) {
         d->m_favoriteItems = list;
         d->updateFavoriteItems();
+        if ( d->m_favoritesModel ) {
+            d->m_favoritesModel->reset();
+        }
         emit favoriteItemsChanged( d->m_favoriteItems );
     }
 }
@@ -349,6 +430,15 @@ bool AbstractDataPluginModel::isFavoriteItemsOnly() const
     return d->m_favoriteItemsOnly;
 }
 
+QObject *AbstractDataPluginModel::favoritesModel()
+{
+    if ( !d->m_favoritesModel ) {
+        d->m_favoritesModel = new FavoritesModel( d, this );
+    }
+
+    return d->m_favoritesModel;
+}
+
 void AbstractDataPluginModel::favoriteItemChanged( const QString& id, bool \
isFavorite )  {
     QStringList favorites = d->m_favoriteItems;
@@ -513,15 +603,9 @@ void AbstractDataPluginModel::clear()
     emit itemsUpdated();
 }
 
-void AbstractDataPluginModelPrivate::updateFavoriteItems()
+void AbstractDataPluginModel::registerItemProperties( const QMetaObject &item )
 {
-    if ( m_lastMarbleModel && m_favoriteItemsOnly ) {
-        foreach( const QString &id, m_favoriteItems ) {
-            if ( !m_parent->findItem( id ) ) {
-                m_parent->getItem( id, m_lastMarbleModel );
-            }
-        }
-    }
+    d->m_metaObject = item;
 }
 
 } // namespace Marble
diff --git a/src/lib/AbstractDataPluginModel.h b/src/lib/AbstractDataPluginModel.h
index 6b0f242..d727259 100644
--- a/src/lib/AbstractDataPluginModel.h
+++ b/src/lib/AbstractDataPluginModel.h
@@ -20,6 +20,7 @@
 
 class QPoint;
 class QUrl;
+class QAbstractItemModel;
 
 namespace Marble
 {
@@ -44,6 +45,9 @@ class ViewportParams;
 class MARBLE_EXPORT AbstractDataPluginModel : public QObject
 {
     Q_OBJECT
+
+    /** @todo FIXME Qt Quick segfaults if using the real class here instead of \
QObject */ +    Q_PROPERTY( QObject* favoritesModel READ favoritesModel CONSTANT )
  
  public:
     explicit AbstractDataPluginModel( const QString& name,
@@ -81,6 +85,8 @@ class MARBLE_EXPORT AbstractDataPluginModel : public QObject
     void setFavoriteItemsOnly( bool favoriteOnly );
     bool isFavoriteItemsOnly() const;
 
+    QObject* favoritesModel();
+
 public Q_SLOTS:
     /**
      * Adds the @p items to the list of initialized items. It checks if items with \
the same id are @@ -165,6 +171,8 @@ public Q_SLOTS:
      * Removes all items
      */
     void clear();
+
+    void registerItemProperties( const QMetaObject& item );
     
  private Q_SLOTS:
     /**
@@ -191,7 +199,7 @@ public Q_SLOTS:
     void itemsUpdated();
     void favoriteItemsChanged( const QStringList& favoriteItems );
     void favoriteItemsOnlyChanged();
-    
+
  private:
     AbstractDataPluginModelPrivate * const d;
     friend class AbstractDataPluginModelPrivate;
diff --git a/src/plugins/render/weather/WeatherModel.cpp \
b/src/plugins/render/weather/WeatherModel.cpp index a4916bf..e6580d3 100644
--- a/src/plugins/render/weather/WeatherModel.cpp
+++ b/src/plugins/render/weather/WeatherModel.cpp
@@ -30,6 +30,7 @@ WeatherModel::WeatherModel( const PluginManager *pluginManager, \
QObject *parent  : AbstractDataPluginModel( "weather", pluginManager, parent ),
       m_initialized( false )
 {
+    registerItemProperties( WeatherItem::staticMetaObject );
     createServices();
 
     m_timer = new QTimer();


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic