MapModel: add getters for random maps based on type, so that the mapContainer does not have to magically know how maps and separators are ordered within the model
authorsheepluva
Sat, 28 Apr 2012 11:56:09 +0200 (2012-04-28)
changeset 6947 1be3e48e1d53
parent 6946 576c453822bf
child 6948 7271ce89950f
MapModel: add getters for random maps based on type, so that the mapContainer does not have to magically know how maps and separators are ordered within the model
QTfrontend/model/MapModel.cpp
QTfrontend/model/MapModel.h
QTfrontend/ui/widget/mapContainer.cpp
QTfrontend/ui/widget/mapContainer.h
--- a/QTfrontend/model/MapModel.cpp	Sat Apr 28 09:25:30 2012 +0200
+++ b/QTfrontend/model/MapModel.cpp	Sat Apr 28 11:56:09 2012 +0200
@@ -115,7 +115,6 @@
             {
                 // TODO: icon
                 caption = QComboBox::tr("Mission") + ": " + map;
-                m_nMissions++;
             }
             else
                 caption = map;
@@ -134,8 +133,6 @@
 
     }
 
-    // update mission count member
-    m_nMissions = missionMaps.size();
 
     // define a separator item
     QStandardItem separator("---");
@@ -152,6 +149,19 @@
     items.append(separator.clone());
     items.append(staticMaps);
 
+    // store start-index and count of relevant types
+    typeLoc.insert(GeneratedMap, QPair<int,int>(0, 1));
+    typeLoc.insert(GeneratedMaze, QPair<int,int>(1, 1));
+    typeLoc.insert(HandDrawnMap, QPair<int,int>(2, 1));
+    // mission maps
+    int startIdx = genMaps.size() + 2; // start after genMaps and 2 separators
+    int count = missionMaps.size();
+    typeLoc.insert(MissionMap, QPair<int,int>(startIdx, count));
+    // static maps
+    startIdx += count + 1; // start after missions and 2 separators
+    count = staticMaps.size();
+    typeLoc.insert(StaticMap, QPair<int,int>(startIdx, count));
+
     // store list contents in the item model
     QStandardItemModel::appendColumn(items);
 
@@ -160,9 +170,26 @@
 }
 
 
-int MapModel::missionCount() const
+int MapModel::mapCount(MapType type) const
+{
+    // return the count for this type
+    // fetch it from the second int in typeLoc, return 0 if no entry
+    return typeLoc.value(type, QPair<int,int>(0,0)).second;
+}
+
+
+int MapModel::randomMap(MapType type) const
 {
-    return m_nMissions;
+    // return a random index for this type or -1 if none available
+    QPair<int,int> loc = typeLoc.value(type, QPair<int,int>(-1,0));
+
+    int startIdx = loc.first;
+    int count = loc.second;
+
+    if (count < 1)
+        return -1;
+    else
+        return startIdx + (rand() % count);
 }
 
 
--- a/QTfrontend/model/MapModel.h	Sat Apr 28 09:25:30 2012 +0200
+++ b/QTfrontend/model/MapModel.h	Sat Apr 28 11:56:09 2012 +0200
@@ -35,7 +35,7 @@
 #include "DataManager.h"
 
 /**
- * @brief A model listing available themes
+ * @brief A model that vertically lists available maps
  *
  * @author sheepluva
  * @since 0.9.18
@@ -66,10 +66,18 @@
         };
 
         /**
-         * @brief Returns the number of available mission maps.
-         * @return mission map count.
+         * @brief Returns the number of available maps of a specified type.
+         * @param type map type to get the count of.
+         * @return count of maps that have the specified type.
          */
-        int missionCount() const;
+        int mapCount(MapType type) const;
+
+        /**
+         * @brief Returns the row-index of a random map with a specified type.
+         * @param type desired type of map.
+         * @return row-index of a map with the desired type, -1 if none found.
+         */
+        int randomMap(MapType type) const;
 
 
     public slots:
@@ -78,7 +86,8 @@
 
 
     private:
-        int m_nMissions; ///< used to keep track of the mission amount
+        ///< start-index and map count for each map-type
+        QMap<MapType, QPair<int,int> > typeLoc;
 
         /**
          * @brief Creates a QStandardItem, that holds the map info and item appearance.
--- a/QTfrontend/ui/widget/mapContainer.cpp	Sat Apr 28 09:25:30 2012 +0200
+++ b/QTfrontend/ui/widget/mapContainer.cpp	Sat Apr 28 11:56:09 2012 +0200
@@ -378,11 +378,12 @@
     int id = 0;
     for(int i = 0; i < chooseMap->count(); i++)
     {
-        // skip separators
-        if (chooseMap->itemData(i, Qt::AccessibleDescriptionRole) == QLatin1String("separator"))
+        QVariant data = chooseMap->itemData(i, Qt::UserRole + 1);
+        // skip separators etc
+        if (!data.isValid())
             continue;
-        Q_ASSERT(chooseMap->itemData(i, Qt::UserRole + 1).canConvert<MapModel::MapInfo>());
-        MapModel::MapInfo mapInfo = chooseMap->itemData(i, Qt::UserRole + 1).value<MapModel::MapInfo>();
+        Q_ASSERT(data.canConvert<MapModel::MapInfo>());
+        MapModel::MapInfo mapInfo = data.value<MapModel::MapInfo>();
 
         if (mapInfo.name == map)
         {
@@ -419,6 +420,8 @@
 
 void HWMapContainer::setRandomMap()
 {
+    int idx;
+
     setRandomSeed();
     switch(m_mapInfo.type)
     {
@@ -430,29 +433,17 @@
             emit drawMapRequested();
             break;
         case MapModel::MissionMap:
-            setRandomMission();
-            break;
         case MapModel::StaticMap:
-            setRandomStatic();
+            // get random map of same type
+            idx = m_mapModel->randomMap(m_mapInfo.type);
+            chooseMap->setCurrentIndex(idx);
+            mapChanged(idx);
             break;
         case MapModel::Invalid:
             Q_ASSERT(false);
     }
 }
 
-void HWMapContainer::setRandomStatic()
-{
-    int i = MAPGEN_MAP + 3 + numMissions + rand() % (chooseMap->count() - MAPGEN_MAP - 3 - numMissions);
-    chooseMap->setCurrentIndex(i);
-    mapChanged(i);
-}
-
-void HWMapContainer::setRandomMission()
-{
-    int i = MAPGEN_MAP + 2 + rand() % numMissions;
-    chooseMap->setCurrentIndex(i);
-    mapChanged(i);
-}
 
 void HWMapContainer::setRandomSeed()
 {
@@ -604,8 +595,8 @@
 
 void HWMapContainer::updateModelViews()
 {
-    numMissions = m_mapModel->missionCount();
-
+    // TODO: reselect theme
+    // FIXME: issues with generated maps?
     if (!m_mapInfo.name.isEmpty())
         intSetMap(m_mapInfo.name);
 }
--- a/QTfrontend/ui/widget/mapContainer.h	Sat Apr 28 09:25:30 2012 +0200
+++ b/QTfrontend/ui/widget/mapContainer.h	Sat Apr 28 11:56:09 2012 +0200
@@ -91,8 +91,6 @@
         void setRandomSeed();
         void setRandomTheme();
         void setRandomMap();
-        void setRandomStatic();
-        void setRandomMission();
         void themeSelected(const QModelIndex & current, const QModelIndex &);
         void addInfoToPreview(QPixmap image);
         void seedEdited();
@@ -120,7 +118,6 @@
         QLabel *maze_size_label;
         QComboBox *cbMazeSize;
         MapGenerator mapgen;
-        int numMissions;
         DrawMapScene drawMapScene;
 
         void intSetSeed(const QString & seed);