[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