Add editable favorite role to StationListModel
authorLuciano Montanaro <mikelima@cirulla.net>
Fri, 27 Dec 2013 02:23:12 +0000 (03:23 +0100)
committerLuciano Montanaro <mikelima@cirulla.net>
Fri, 27 Dec 2013 02:23:12 +0000 (03:23 +0100)
application/stationlistmodel.cpp
application/stationlistmodel.h
application/stationlistproxymodel.cpp
application/stationlistproxymodel.h

index d7b6561..abd9613 100644 (file)
@@ -136,7 +136,7 @@ QVariant StationListModel::data(const QModelIndex &index, int role) const
     }
 }
 
-bool StationListModel::setData(const QModelIndex &index, QVariant &value, int role)
+bool StationListModel::setData(const QModelIndex &index, const QVariant &value, int role)
 {
     if (!index.isValid())
         return false;
@@ -153,9 +153,6 @@ bool StationListModel::setData(const QModelIndex &index, QVariant &value, int ro
             }
             Settings *settings = Settings::instance();
             settings->setFavoriteStations(QStringList::fromSet(m_favorites));
-            QVector<int> changedRoles;
-            changedRoles << FavoriteIndicatorRole;
-            //emit dataChanged(index, index, changedRoles);
             emit dataChanged(index, index);
         }
         return true;
index 2f68d41..aaca57f 100644 (file)
@@ -57,7 +57,7 @@ public:
     Q_INVOKABLE Qt::ItemFlags flags(const QModelIndex &index) const;
     Q_INVOKABLE int rowCount(const QModelIndex &parent = QModelIndex()) const;
     Q_INVOKABLE QVariant data(const QModelIndex &index, int role) const;
-    Q_INVOKABLE bool setData(const QModelIndex &index, QVariant &value, int role = Qt::EditRole);
+    Q_INVOKABLE bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
 
 signals:
 
index 07fa3fc..146d3a7 100644 (file)
@@ -27,6 +27,7 @@ Boston, MA 02110-1301, USA.
 #include <QtGlobal>
 #include <QDebug>
 #include <QGeoCoordinate>
+#include <QGeoPositionInfo>
 
 #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
 QTM_USE_NAMESPACE
@@ -45,6 +46,7 @@ StationListProxyModel::StationListProxyModel(QObject *parent) :
     setFilterCaseSensitivity(Qt::CaseInsensitive);
     setSortCaseSensitivity(Qt::CaseInsensitive);
     setDynamicSortFilter(true);
+    qRegisterMetaType<QGeoCoordinate>();
     if (positionInfoSource) {
         qDebug() << "position info source available";
         connect(positionInfoSource, SIGNAL(positionUpdated(QGeoPositionInfo)),
@@ -53,11 +55,24 @@ StationListProxyModel::StationListProxyModel(QObject *parent) :
     } else {
         qDebug() << "No position info source available";
     }
+    connect(settings, SIGNAL(favoriteStationsChanged()),
+            this, SLOT(updateFavoriteStations()));
+    updateFavoriteStations();
     connect(settings, SIGNAL(recentStationsChanged()),
             this, SLOT(updateRecentStations()));
     updateRecentStations();
 }
 
+Qt::ItemFlags StationListProxyModel::flags(const QModelIndex &index) const
+{
+    return QSortFilterProxyModel::flags(index);
+}
+
+bool StationListProxyModel::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+    return QSortFilterProxyModel::setData(index, value, role);
+}
+
 bool StationListProxyModel::lessThan(const QModelIndex &left,
                                      const QModelIndex &right) const
 {
@@ -106,6 +121,20 @@ void StationListProxyModel::updateRecentStations(void)
     setRecentStations(settings->recentStations());
 }
 
+void StationListProxyModel::setFavoriteStations(const QStringList &stations)
+{
+    qDebug() << "Favorite stations are now" << stations;
+    if (sortingMode() == StationListProxyModel::AlphaSorting) {
+        invalidate();
+    }
+}
+
+void StationListProxyModel::updateFavoriteStations(void)
+{
+    Settings *settings = Settings::instance();
+    setFavoriteStations(settings->favoriteStations());
+}
+
 bool StationListProxyModel::filterAcceptsRow(int sourceRow,
                                              const QModelIndex &sourceParent) const
 {
index 5ab5260..f07bf13 100644 (file)
@@ -49,6 +49,9 @@ public:
 
     explicit StationListProxyModel(QObject *parent = 0);
 
+    Q_INVOKABLE Qt::ItemFlags flags(const QModelIndex &index) const;
+    Q_INVOKABLE bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
+
     QString searchPattern() const;
     void setSearchPattern(const QString &pattern);
 
@@ -58,6 +61,7 @@ public:
     Q_INVOKABLE void setUserPosition(const QGeoCoordinate &pos);
     Q_INVOKABLE void setRecentStations(const QStringList &stations);
     Q_INVOKABLE void setRecentOnlyFilter(bool);
+    Q_INVOKABLE void setFavoriteStations(const QStringList &stations);
 
 signals:
     void sortingModeChanged(SortingMode mode);
@@ -73,6 +77,7 @@ private:
 private slots:
     void updatePosition(const QGeoPositionInfo &update);
     void updateRecentStations(void);
+    void updateFavoriteStations(void);
 private:
     QString m_searchPattern;
     QGeoPositionInfoSource *positionInfoSource;