QTfrontend/model/MapModel.cpp
changeset 6939 970389573788
parent 6938 217ed62e872c
child 6943 1fe601a2761b
--- a/QTfrontend/model/MapModel.cpp	Fri Apr 27 11:47:37 2012 +0200
+++ b/QTfrontend/model/MapModel.cpp	Fri Apr 27 22:22:04 2012 +0200
@@ -1,67 +1,29 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2007-2012 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+/**
+ * @file
+ * @brief MapModel class implementation
+ */
 
 #include "MapModel.h"
 
-MapModel::MapInfo MapModel::mapInfoFromData(const QVariant data)
-{
-    MapInfo mapInfo;
-
-    mapInfo.type = Invalid;
-    mapInfo.name = "";
-    mapInfo.theme = "";
-    mapInfo.limit = 0;
-    mapInfo.scheme = "";
-    mapInfo.weapons = "";
-
-    if (data.isValid())
-    {
-        QList<QVariant> list = data.toList();
-        if (list.size() < 1) {
-            mapInfo.type = Invalid;
-            return mapInfo;
-        }
-        mapInfo.type = (MapType)list[0].toInt();
-        switch (mapInfo.type)
-        {
-            case GeneratedMap:
-            case GeneratedMaze:
-            case HandDrawnMap:
-                return mapInfo;
-
-            default:
-                mapInfo.name = list[1].toString();
-                mapInfo.theme = list[2].toString();
-                mapInfo.limit = list[3].toInt();
-                mapInfo.scheme = list[4].toString();
-                mapInfo.weapons = list[5].toString();
-        }
-    }
-
-    return mapInfo;
-}
-
-MapModel::MapModel(QObject *parent) :
-    QAbstractListModel(parent)
-{
-    m_data = QList<QMap<int, QVariant> >();
-}
-
-int MapModel::rowCount(const QModelIndex &parent) const
-{
-    if(parent.isValid())
-        return 0;
-    else
-        return m_data.size();
-}
-
-
-QVariant MapModel::data(const QModelIndex &index, int role) const
-{
-    if(index.column() > 0 || index.row() >= m_data.size())
-        return QVariant();
-    else
-        return m_data.at(index.row()).value(role, QVariant());
-}
-
 
 void MapModel::loadMaps()
 {
@@ -73,34 +35,22 @@
     QStringList maps =
         datamgr.entryList("Maps", QDir::AllDirs | QDir::NoDotAndDotDot);
 
-    m_data.clear();
+    QStandardItemModel::clear();
 
-#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
-    m_data.reserve(maps.size());
-#endif
-
-    QMap<int, QVariant> tmp;
-    QList<QVariant> mapInfo;
+    QList<QStandardItem *> genMaps;
+    QList<QStandardItem *> missionMaps;
+    QList<QStandardItem *> staticMaps;
 
     // TODO: icons for these
-    tmp.insert(Qt::DisplayRole, QComboBox::tr("generated map..."));
-    mapInfo.append(GeneratedMap);
-    tmp.insert(Qt::UserRole, mapInfo);
-    m_data.append(tmp);
-    tmp.insert(Qt::DisplayRole, QComboBox::tr("generated maze..."));
-    mapInfo.replace(0, GeneratedMaze);
-    tmp.insert(Qt::UserRole, mapInfo);
-    m_data.append(tmp);
-    tmp.insert(Qt::DisplayRole, QComboBox::tr("hand drawn map..."));
-    mapInfo.replace(0, HandDrawnMap);
-    tmp.insert(Qt::UserRole, mapInfo);
-    m_data.append(tmp);
 
-    m_nGenerators = 3;
+    genMaps.append(
+        infoToItem(QIcon(), QComboBox::tr("generated map..."), GeneratedMap, "+rnd+"));
+    genMaps.append(
+        infoToItem(QIcon(), QComboBox::tr("generated maze..."), GeneratedMaze, "+maze+"));
+    genMaps.append(
+        infoToItem(QIcon(), QComboBox::tr("hand drawn map..."), HandDrawnMap, "+drawn+"));
 
 
-    m_nMissions = 0;
-
     QFile mapLuaFile;
     QFile mapCfgFile;
 
@@ -111,80 +61,113 @@
         mapLuaFile.setFileName(
             datamgr.findFileForRead(QString("Maps/%1/map.lua").arg(map)));
 
-        QMap<int, QVariant> dataset;
-
 
         if (mapCfgFile.open(QFile::ReadOnly))
         {
+            QString caption;
             QString theme;
             quint32 limit = 0;
             QString scheme;
             QString weapons;
-            QList<QVariant> mapInfo;
             bool isMission = mapLuaFile.exists();
-            int type = isMission?MissionMap:StaticMap;
+            MapType type = isMission?MissionMap:StaticMap;
 
             QTextStream input(&mapCfgFile);
             input >> theme;
             input >> limit;
             input >> scheme;
             input >> weapons;
-            mapInfo.push_back(type);
-            mapInfo.push_back(map);
-            mapInfo.push_back(theme);
-            if (limit)
-                mapInfo.push_back(limit);
-            else
-                mapInfo.push_back(18);
+            mapCfgFile.close();
+
+            if (limit == 0)
+                limit = 18;
 
 
             if (scheme.isEmpty())
                 scheme = "locked";
-            scheme.replace("_", " ");
+            else
+                scheme.replace("_", " ");
 
             if (weapons.isEmpty())
                 weapons = "locked";
-            weapons.replace("_", " ");
+            else
+                weapons.replace("_", " ");
 
-            mapInfo.push_back(scheme);
-            mapInfo.push_back(weapons);
-
-            if(isMission)
+            if (isMission)
             {
                 // TODO: icon
-                map = QComboBox::tr("Mission") + ": " + map;
+                caption = QComboBox::tr("Mission") + ": " + map;
                 m_nMissions++;
             }
-
-            mapCfgFile.close();
-
-            // set name
-            dataset.insert(Qt::DisplayRole, map);
+            else
+                caption = map;
 
-            // TODO
-            // dataset.insert(Qt::DecorationRole, icon);
+            QStandardItem * item = infoToItem(
+                QIcon(), caption, type, map, theme, limit, scheme, weapons);
 
-            // set mapinfo
-            dataset.insert(Qt::UserRole, mapInfo);
-
-            if (isMission) // insert missions before regular maps
-                m_data.insert(m_nGenerators + m_nMissions, dataset);
+            if (isMission)
+                missionMaps.append(item);
             else
-                m_data.append(dataset);
+                staticMaps.append(item);
         
         }
 
     }
 
+    m_nMissions = missionMaps.size();
+
+    QStandardItem separator("---");
+    separator.setData(QLatin1String("separator"), Qt::AccessibleDescriptionRole);
+    separator.setFlags(separator.flags() & ~( Qt::ItemIsEnabled | Qt::ItemIsSelectable ) );
+
+    QList<QStandardItem * > items;
+    items.append(genMaps);
+    items.append(separator.clone());
+    items.append(separator.clone());
+    items.append(missionMaps);
+    items.append(separator.clone());
+    items.append(staticMaps);
+
+    QStandardItemModel::appendColumn(items);
+
     endResetModel();
 }
 
-int MapModel::generatorCount() const
-{
-    return m_nGenerators;
-}
 
 int MapModel::missionCount() const
 {
     return m_nMissions;
 }
+
+
+QStandardItem * MapModel::infoToItem(
+    const QIcon & icon,
+    const QString caption,
+    MapType type,
+    QString name,
+    QString theme,
+    quint32 limit,
+    QString scheme,
+    QString weapons)
+const
+{
+    QStandardItem * item = new QStandardItem(icon, caption);
+    MapInfo mapInfo;
+    QVariant qvar(QVariant::UserType);
+
+    mapInfo.type = type;
+    mapInfo.name = name;
+    mapInfo.theme = theme;
+    mapInfo.limit = limit;
+    mapInfo.scheme = scheme;
+    mapInfo.weapons = weapons;
+
+
+    qvar.setValue(mapInfo);
+    item->setData(qvar, Qt::UserRole + 1);
+
+    if (mapInfo.type == Invalid)
+            Q_ASSERT(false);
+
+    return item;
+}