messing with the theme model a bit (gets now auto-updated after DLC download too)
authorsheepluva
Thu, 26 Apr 2012 16:15:37 +0200
changeset 6937 7f77fa908a4e
parent 6936 8af2bf10ee62
child 6938 217ed62e872c
messing with the theme model a bit (gets now auto-updated after DLC download too)
QTfrontend/game.cpp
QTfrontend/hwconsts.cpp.in
QTfrontend/hwconsts.h
QTfrontend/main.cpp
QTfrontend/model/ThemeModel.cpp
QTfrontend/model/ThemeModel.h
QTfrontend/model/themesmodel.cpp
QTfrontend/model/themesmodel.h
QTfrontend/ui/widget/mapContainer.cpp
QTfrontend/ui/widget/mapContainer.h
QTfrontend/util/DataManager.cpp
QTfrontend/util/DataManager.h
project_files/hedgewars.pro
--- a/QTfrontend/game.cpp	Fri Apr 27 16:57:54 2012 -0400
+++ b/QTfrontend/game.cpp	Thu Apr 26 16:15:37 2012 +0200
@@ -115,10 +115,11 @@
 void HWGame::SendQuickConfig()
 {
     QByteArray teamscfg;
+    ThemeModel * themeModel = DataManager::instance().themeModel();
 
     HWProto::addStringToBuffer(teamscfg, "TL");
     HWProto::addStringToBuffer(teamscfg, QString("etheme %1")
-                               .arg((themesModel->rowCount() > 0) ? themesModel->index(rand() % themesModel->rowCount()).data().toString() : "steel"));
+                               .arg((themeModel->rowCount() > 0) ? themeModel->index(rand() % themeModel->rowCount()).data().toString() : "steel"));
     HWProto::addStringToBuffer(teamscfg, "eseed " + QUuid::createUuid().toString());
 
     HWTeam team1;
--- a/QTfrontend/hwconsts.cpp.in	Fri Apr 27 16:57:54 2012 -0400
+++ b/QTfrontend/hwconsts.cpp.in	Thu Apr 26 16:15:37 2012 +0200
@@ -27,7 +27,6 @@
 QDir * cfgdir = new QDir();
 QDir * datadir = new QDir();
 
-ThemesModel * themesModel;
 QStringList * scriptList;
 
 bool custom_config = false;
--- a/QTfrontend/hwconsts.h	Fri Apr 27 16:57:54 2012 -0400
+++ b/QTfrontend/hwconsts.h	Thu Apr 26 16:15:37 2012 +0200
@@ -22,7 +22,6 @@
 #include <QStringList>
 #include <QPair>
 
-#include "themesmodel.h"
 
 extern QString * cProtoVer;
 extern QString * cVersionString;
@@ -41,7 +40,6 @@
 
 class QStringListModel;
 
-extern ThemesModel * themesModel;
 extern QStringList * scriptList;
 
 extern QString * cDefaultAmmoStore;
--- a/QTfrontend/main.cpp	Fri Apr 27 16:57:54 2012 -0400
+++ b/QTfrontend/main.cpp	Thu Apr 26 16:15:37 2012 +0200
@@ -211,53 +211,6 @@
 
     DataManager & dataMgr = DataManager::instance();
 
-    {
-        QStringList themes;
-
-        themes.append(dataMgr.entryList(
-                          "Themes",
-                          QDir::AllDirs | QDir::NoDotAndDotDot)
-                     );
-
-        QList<QPair<QIcon, QIcon> > icons;
-
-        themes.sort();
-        for(int i = themes.size() - 1; i >= 0; --i)
-        {
-            QString file = dataMgr.findFileForRead(
-                               QString("Themes/%1/icon.png").arg(themes.at(i))
-                           );
-
-            if(QFile::exists(file))
-            {
-                // load icon
-                QPair<QIcon, QIcon> ic;
-                ic.first = QIcon(file);
-
-                // load preview icon
-                ic.second = QIcon(
-                                dataMgr.findFileForRead(
-                                    QString("Themes/%1/icon@2x.png").arg(themes.at(i))
-                                )
-                            );
-
-                icons.prepend(ic);
-            }
-            else
-            {
-                themes.removeAt(i);
-            }
-        }
-
-        themesModel = new ThemesModel(themes);
-        Q_ASSERT(themes.size() == icons.size());
-        for(int i = 0; i < icons.size(); ++i)
-        {
-            themesModel->setData(themesModel->index(i), icons[i].first, Qt::DecorationRole);
-            themesModel->setData(themesModel->index(i), icons[i].second, Qt::UserRole);
-        }
-    }
-
     scriptList = new QStringList(dataMgr.entryList(
                                      QString("Scripts/Multiplayer"),
                                      QDir::Files,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/model/ThemeModel.cpp	Thu Apr 26 16:15:37 2012 +0200
@@ -0,0 +1,75 @@
+
+#include "ThemeModel.h"
+
+ThemeModel::ThemeModel(QObject *parent) :
+    QAbstractListModel(parent)
+{
+    m_data = QList<QMap<int, QVariant> >();
+}
+
+int ThemeModel::rowCount(const QModelIndex &parent) const
+{
+    if(parent.isValid())
+        return 0;
+    else
+        return m_data.size();
+}
+
+
+QVariant ThemeModel::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);
+}
+
+
+void ThemeModel::loadThemes()
+{
+    beginResetModel();
+
+
+    DataManager & datamgr = DataManager::instance();
+
+    QStringList themes =
+        datamgr.entryList("Themes", QDir::AllDirs | QDir::NoDotAndDotDot);
+
+    m_data.clear();
+
+#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
+    m_data.reserve(themes.size());
+#endif
+
+    foreach (QString theme, themes)
+    {
+        // themes without icon are supposed to be hidden
+        QString iconpath =
+            datamgr.findFileForRead(QString("Themes/%1/icon.png").arg(theme));
+
+        if (!QFile::exists(iconpath))
+            continue;
+
+        QMap<int, QVariant> dataset;
+
+        // set name
+        dataset.insert(Qt::DisplayRole, theme);
+
+        // load and set icon
+        QIcon icon(iconpath);
+        dataset.insert(Qt::DecorationRole, icon);
+
+        // load and set preview icon
+        QIcon preview(datamgr.findFileForRead(QString("Themes/%1/icon@2x.png").arg(theme)));
+        dataset.insert(Qt::UserRole, preview);
+
+        m_data.append(dataset);
+    }
+
+
+    endResetModel();
+}
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/model/ThemeModel.h	Thu Apr 26 16:15:37 2012 +0200
@@ -0,0 +1,58 @@
+/*
+ * 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 ThemeModel class definition
+ */
+
+#ifndef HEDGEWARS_THEMEMODEL_H
+#define HEDGEWARS_THEMEMODEL_H
+
+#include <QAbstractListModel>
+#include <QStringList>
+#include <QMap>
+#include <QIcon>
+
+#include "DataManager.h"
+
+/**
+ * @brief A model listing available themes
+ */
+class ThemeModel : public QAbstractListModel
+{
+        Q_OBJECT
+
+    public:
+        explicit ThemeModel(QObject *parent = 0);
+
+        int rowCount(const QModelIndex &parent = QModelIndex()) const;
+        QVariant data(const QModelIndex &index, int role) const;
+
+
+    public slots:
+        /// reloads the themes from the DataManager
+        void loadThemes();
+
+
+    private:
+        QList<QMap<int, QVariant> > m_data;
+};
+
+#endif // HEDGEWARS_THEMEMODEL_H
--- a/QTfrontend/model/themesmodel.cpp	Fri Apr 27 16:57:54 2012 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-
-#include "themesmodel.h"
-
-ThemesModel::ThemesModel(QStringList themes, QObject *parent) :
-    QAbstractListModel(parent)
-{
-#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
-    m_data.reserve(themes.size());
-#endif
-
-    foreach(QString theme, themes)
-    {
-        m_data.append(QHash<int, QVariant>());
-        m_data.last().insert(Qt::DisplayRole, theme);
-    }
-}
-
-int ThemesModel::rowCount(const QModelIndex &parent) const
-{
-    if(parent.isValid())
-        return 0;
-    else
-        return m_data.size();
-}
-
-QVariant ThemesModel::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);
-}
-
-bool ThemesModel::setData(const QModelIndex &index, const QVariant &value, int role)
-{
-    if(index.column() > 0 || index.row() >= m_data.size())
-        return false;
-    else
-    {
-        m_data[index.row()].insert(role, value);
-
-        return true;
-    }
-
-}
-
-
-
-
--- a/QTfrontend/model/themesmodel.h	Fri Apr 27 16:57:54 2012 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-#ifndef THEMESMODEL_H
-#define THEMESMODEL_H
-
-#include <QAbstractListModel>
-#include <QStringList>
-#include <QHash>
-
-class ThemesModel : public QAbstractListModel
-{
-        Q_OBJECT
-    public:
-        explicit ThemesModel(QStringList themes, QObject *parent = 0);
-
-        int rowCount(const QModelIndex &parent = QModelIndex()) const;
-        QVariant data(const QModelIndex &index, int role) const;
-        bool setData(const QModelIndex &index, const QVariant &value,
-                     int role = Qt::EditRole);
-
-    signals:
-
-    public slots:
-
-    private:
-
-        QList<QHash<int, QVariant> > m_data;
-};
-
-#endif // THEMESMODEL_H
--- a/QTfrontend/ui/widget/mapContainer.cpp	Fri Apr 27 16:57:54 2012 -0400
+++ b/QTfrontend/ui/widget/mapContainer.cpp	Thu Apr 26 16:15:37 2012 +0200
@@ -122,7 +122,8 @@
     lvThemes = new QListView(mapWidget);
     lvThemes->setMinimumHeight(30);
     lvThemes->setFixedWidth(140);
-    lvThemes->setModel(themesModel);
+    m_themeModel = DataManager::instance().themeModel();
+    lvThemes->setModel(m_themeModel);
     lvThemes->setIconSize(QSize(16, 16));
     lvThemes->setEditTriggers(QListView::NoEditTriggers);
 
@@ -400,7 +401,7 @@
 
 void HWMapContainer::setTheme(const QString & theme)
 {
-    QModelIndexList mdl = themesModel->match(themesModel->index(0), Qt::DisplayRole, theme);
+    QModelIndexList mdl = m_themeModel->match(m_themeModel->index(0), Qt::DisplayRole, theme);
 
     if(mdl.size())
         lvThemes->setCurrentIndex(mdl.at(0));
@@ -452,9 +453,9 @@
 
 void HWMapContainer::setRandomTheme()
 {
-    if(!themesModel->rowCount()) return;
-    quint32 themeNum = rand() % themesModel->rowCount();
-    lvThemes->setCurrentIndex(themesModel->index(themeNum));
+    if(!m_themeModel->rowCount()) return;
+    quint32 themeNum = rand() % m_themeModel->rowCount();
+    lvThemes->setCurrentIndex(m_themeModel->index(themeNum));
 }
 
 void HWMapContainer::intSetTemplateFilter(int filter)
--- a/QTfrontend/ui/widget/mapContainer.h	Fri Apr 27 16:57:54 2012 -0400
+++ b/QTfrontend/ui/widget/mapContainer.h	Thu Apr 26 16:15:37 2012 +0200
@@ -105,6 +105,7 @@
         QComboBox* chooseMap;
         IconedGroupBox* gbThemes;
         QListView* lvThemes;
+        ThemeModel * m_themeModel;
         HWMap* pMap;
         QString m_seed;
         QPushButton* seedSet;
--- a/QTfrontend/util/DataManager.cpp	Fri Apr 27 16:57:54 2012 -0400
+++ b/QTfrontend/util/DataManager.cpp	Thu Apr 26 16:15:37 2012 +0200
@@ -34,11 +34,13 @@
 
 DataManager::DataManager()
 {
-    userData = new QDir(cfgdir->absolutePath());
-    if (!userData->cd("Data"))
-        userData = NULL;
+    m_userData = new QDir(cfgdir->absolutePath());
+    if (!m_userData->cd("Data"))
+        m_userData = NULL;
 
-    defaultData = new QDir(datadir->absolutePath());
+    m_defaultData = new QDir(datadir->absolutePath());
+
+    m_themeModel = NULL;
 }
 
 
@@ -57,14 +59,14 @@
 {
     QStringList result;
 
-    if (userData != NULL)
+    if (m_userData != NULL)
     {
-        QDir tmpDir(*userData);
+        QDir tmpDir(*m_userData);
         if (tmpDir.cd(subDirectory))
             result.append(tmpDir.entryList(nameFilters, filters));
     }
 
-    QDir tmpDir(*defaultData);
+    QDir tmpDir(*m_defaultData);
     if (tmpDir.cd(subDirectory))
         result.append(tmpDir.entryList(nameFilters, filters));
 
@@ -87,11 +89,11 @@
 {
     QString path;
 
-    if (userData != NULL)
-        path = userData->absolutePath()+"/"+relativeDataFilePath;
+    if (m_userData != NULL)
+        path = m_userData->absolutePath()+"/"+relativeDataFilePath;
 
     if ((!path.isEmpty()) && (!QFile::exists(path)))
-        path = defaultData->absolutePath()+"/"+relativeDataFilePath;
+        path = m_defaultData->absolutePath()+"/"+relativeDataFilePath;
 
     return path;
 }
@@ -100,9 +102,9 @@
 QString DataManager::findFileForWrite(
     const QString & relativeDataFilePath) const
 {
-    if (userData != NULL)
+    if (m_userData != NULL)
     {
-        QString path = userData->absolutePath()+"/"+relativeDataFilePath;
+        QString path = m_userData->absolutePath()+"/"+relativeDataFilePath;
 
         // create folders if needed
         QDir tmp;
@@ -115,7 +117,17 @@
     return "";
 }
 
+ThemeModel * DataManager::themeModel()
+{
+    if (m_themeModel == NULL) {
+        m_themeModel = new ThemeModel();
+        m_themeModel->loadThemes();
+    }
+    return m_themeModel;
+}
+
 void DataManager::reload()
 {
+    m_themeModel->loadThemes();
     emit updated();
 }
--- a/QTfrontend/util/DataManager.h	Fri Apr 27 16:57:54 2012 -0400
+++ b/QTfrontend/util/DataManager.h	Thu Apr 26 16:15:37 2012 +0200
@@ -30,9 +30,12 @@
 
 #include <QStringList>
 
+#include "ThemeModel.h"
+
 class QDir;
 class QFile;
 class QStringList;
+class ThemeModel;
 
 /**
  * @brief Offers access to the data files of hedgewars.
@@ -90,6 +93,14 @@
          */
         QString findFileForWrite(const QString & relativeDataFilePath) const;
 
+        /**
+         * @brief Returns pointer to a model for the available themes.
+         *
+         * The model is kept up to date automatically.
+         *
+         * @return theme model pointer
+         */
+        ThemeModel * themeModel();
 
     public slots:
         /**
@@ -116,8 +127,10 @@
          */
         DataManager();
 
-        QDir * defaultData; ///< directory of the installed data
-        QDir * userData;    ///< directory of custom data in the user's directory
+        QDir * m_defaultData; ///< directory of the installed data
+        QDir * m_userData;    ///< directory of custom data in the user's directory
+
+        ThemeModel * m_themeModel; ///< themes model instance
 };
 
 #endif // HEDGEWARS_DATAMANAGER_H
--- a/project_files/hedgewars.pro	Fri Apr 27 16:57:54 2012 -0400
+++ b/project_files/hedgewars.pro	Thu Apr 26 16:15:37 2012 +0200
@@ -22,7 +22,7 @@
 QT += network
 QT += webkit
 
-HEADERS += ../QTfrontend/model/themesmodel.h \
+HEADERS += ../QTfrontend/model/ThemeModel.h \
     ../QTfrontend/model/ammoSchemeModel.h \
     ../QTfrontend/model/netserverslist.h \
     ../QTfrontend/model/hats.h \
@@ -104,7 +104,7 @@
     ../QTfrontend/ui/dialog/input_password.h
 
 SOURCES += ../QTfrontend/model/ammoSchemeModel.cpp \
-    ../QTfrontend/model/themesmodel.cpp \
+    ../QTfrontend/model/ThemeModel.cpp \
     ../QTfrontend/model/hats.cpp \
     ../QTfrontend/model/netserverslist.cpp \
     ../QTfrontend/ui/qaspectratiolayout.cpp \