Moved StationListModel to AbstractListModel base
[quandoparte] / application / stationlistmodel.cpp
index f739b02..d7b6561 100644 (file)
@@ -20,6 +20,7 @@ Boston, MA 02110-1301, USA.
 */
 
 #include "stationlistmodel.h"
+#include "settings.h"
 
 #include <QFile>
 #include <QFileInfo>
@@ -33,12 +34,14 @@ Q_DECLARE_METATYPE(QGeoCoordinate)
 #endif
 
 StationListModel::StationListModel(QObject *parent) :
-    QStandardItemModel(parent)
+    QAbstractListModel(parent)
 {
-    setRowCount(0);
 #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))
     setRoleNames(roleNames());
 #endif
+    Settings *settings = Settings::instance();
+    m_favorites = settings->favoriteStations().toSet();
+    qDebug() << "favorites:" << m_favorites;
 }
 
 bool StationListModel::load(const QString &filename)
@@ -95,10 +98,76 @@ QHash<int, QByteArray> StationListModel::roleNames() const
     return roles;
 }
 
-int StationListModel::rowCount(const QModelIndex &parent) const
+int StationListModel::rowCount(const QModelIndex &) const
 {
-    return QStandardItemModel::rowCount(parent);
+    return m_stations.count();
+}
+
+QVariant StationListModel::data(const QModelIndex &index, int role) const
+{
+    if (!index.isValid()) return QVariant();
+    if (index.row() < 0 || index.row() >= m_stations.count()) {
+        return QVariant();
+    }
+    StationItem item = m_stations[index.row()];
+    Settings *settings = Settings::instance();
+    switch (role) {
+    case Qt::DisplayRole:
+        return QVariant::fromValue(item.name());
+    case PositionRole:
+        return QVariant::fromValue(item.position());
+    case RecentIndicatorRole:
+        return QVariant(settings->recentStations().contains(item.name()));
+    case FavoriteIndicatorRole:
+        return QVariant(m_favorites.contains(item.name()));
+    case StationCodeRole:
+        return QVariant::fromValue(item.code());
+    case LatitudeRole:
+        return QVariant::fromValue(item.position().latitude());
+    case LongitudeRole:
+        return QVariant::fromValue(item.position().longitude());
+    case SectionRole:
+        if (m_favorites.contains(item.name()))
+            return QVariant::fromValue(tr("Favorites"));
+        else
+            return QVariant(item.name()[0]);
+    default:
+        return QVariant::fromValue(QString("Unknown role requested"));
+    }
+}
 
+bool StationListModel::setData(const QModelIndex &index, QVariant &value, int role)
+{
+    if (!index.isValid())
+        return false;
+    if (role == FavoriteIndicatorRole) {
+        bool favorite = value.toBool();
+        if (data(index, FavoriteIndicatorRole) != favorite) {
+            QString name =  m_stations[index.row()].name();
+            if (favorite) {
+                qDebug() << "adding" << name << "to favorites";
+                m_favorites.insert(name);
+            } else {
+                qDebug() << "removing" << name << "from favorites";
+                m_favorites.remove(name);
+            }
+            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;
+    }
+   return false;
+}
+
+Qt::ItemFlags StationListModel::flags(const QModelIndex &index) const
+{
+    if (!index.isValid())
+        return 0;
+    return Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled;
 }
 
 void StationListModel::readStationsElement()
@@ -122,11 +191,11 @@ void StationListModel::readStationsElement()
 
 void StationListModel::readStationElement()
 {
-    QStandardItem *item = new QStandardItem;
+    StationItem item;
     m_reader.readNext();
     while (!m_reader.atEnd()) {
         if (m_reader.isEndElement()) {
-            this->appendRow(item);
+            m_stations.append(item);
             m_reader.readNext();
             break;
         } else if (m_reader.isStartElement()) {
@@ -139,40 +208,37 @@ void StationListModel::readStationElement()
             } else {
                 skipUnknownElement(m_reader.name().toString());
             }
-            item->setData(QVariant::fromValue(false), FavoriteIndicatorRole);
         } else {
             m_reader.readNext();
         }
     }
 }
 
-void StationListModel::readPosElement(QStandardItem *item)
+void StationListModel::readPosElement(StationItem &item)
 {
     QStringList coordinates = m_reader.readElementText().split(",");
     QGeoCoordinate pos = QGeoCoordinate(coordinates[0].toDouble(), coordinates[1].toDouble());
-    item->setData(QVariant::fromValue(pos), PositionRole);
-    item->setData(QVariant::fromValue(pos.longitude()), LongitudeRole);
-    item->setData(QVariant::fromValue(pos.latitude()), LatitudeRole);
+    item.setPosition(pos);
     m_reader.readElementText();
     if (m_reader.isEndElement()) {
         m_reader.readNext();
     }
 }
 
-void StationListModel::readNameElement(QStandardItem *item)
+void StationListModel::readNameElement(StationItem &item)
 {
-    item->setText(m_reader.readElementText());
+    item.setName(m_reader.readElementText());
     if (m_reader.isEndElement()) {
         m_reader.readNext();
     }
 }
 
-void StationListModel::readCodeElement(QStandardItem *item)
+void StationListModel::readCodeElement(StationItem &item)
 {
     const QString code = m_reader.readElementText();
     qDebug() << "reading code element" << code;
 
-    item->setData(QVariant::fromValue(code), StationCodeRole);
+    item.setCode(code);
     if (m_reader.isEndElement()) {
         m_reader.readNext();
     }