--- a/QTfrontend/util/DataManager.cpp Sun Oct 28 15:18:26 2012 +0100
+++ b/QTfrontend/util/DataManager.cpp Fri Dec 06 22:20:53 2019 +0100
@@ -1,6 +1,6 @@
/*
* Hedgewars, a free turn based strategy game
- * Copyright (c) 2004-2012 Andrey Korotaev <unC0Rr@gmail.com>
+ * Copyright (c) 2004-2015 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
@@ -13,7 +13,7 @@
*
* 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
@@ -25,10 +25,16 @@
#include <QStringList>
#include <QStandardItemModel>
#include <QFileInfo>
+#include <QSettings>
+#include <QColor>
+
+#include <SDL.h>
#include "hwconsts.h"
#include "HWApplication.h"
#include "sdlkeys.h"
+#include "KeyMap.h"
+#include "physfs.h"
#include "DataManager.h"
@@ -39,17 +45,13 @@
DataManager::DataManager()
{
- m_userData = new QDir(cfgdir->absolutePath());
- if (!m_userData->cd("Data"))
- m_userData = NULL;
-
- m_defaultData = new QDir(datadir->absolutePath());
-
m_hatModel = NULL;
- m_mapModel = NULL;
+ m_staticMapModel = NULL;
+ m_missionMapModel = NULL;
m_themeModel = NULL;
m_colorsModel = NULL;
m_bindsModel = NULL;
+ m_gameStyleModel = NULL;
}
@@ -63,69 +65,28 @@
QStringList DataManager::entryList(
const QString & subDirectory,
QDir::Filters filters,
- const QStringList & nameFilters
+ const QStringList & nameFilters,
+ bool withDLC
) const
{
- QStringList result;
-
- if (m_userData != NULL)
- {
- QDir tmpDir(*m_userData);
- if (tmpDir.cd(subDirectory))
- result.append(tmpDir.entryList(nameFilters, filters));
- }
-
- QDir tmpDir(*m_defaultData);
- if (tmpDir.cd(subDirectory))
- result.append(tmpDir.entryList(nameFilters, filters));
-
- result.removeDuplicates();
+ QDir tmpDir(QString("physfs://%1").arg(subDirectory));
+ QStringList result = tmpDir.entryList(nameFilters, filters);
// sort case-insensitive
QMap<QString, QString> sortedFileNames;
+ QString absolutePath = datadir->absolutePath().toLocal8Bit().data();
foreach ( QString fn, result)
{
- sortedFileNames.insert(fn.toLower(), fn);
+ // Filter out DLC entries if desired
+ QString realDir = PHYSFS_getRealDir(QString(subDirectory + "/" + fn).toLocal8Bit().data());
+ if(withDLC || realDir == absolutePath)
+ sortedFileNames.insert(fn.toLower(), fn);
}
result = sortedFileNames.values();
return result;
}
-
-QString DataManager::findFileForRead(
- const QString & relativeDataFilePath) const
-{
- QString path;
-
- if (m_userData != NULL)
- path = m_userData->absolutePath()+"/"+relativeDataFilePath;
-
- if ((!path.isEmpty()) && (!QFile::exists(path)))
- path = m_defaultData->absolutePath()+"/"+relativeDataFilePath;
-
- return path;
-}
-
-
-QString DataManager::findFileForWrite(
- const QString & relativeDataFilePath) const
-{
- if (m_userData != NULL)
- {
- QString path = m_userData->absolutePath()+"/"+relativeDataFilePath;
-
- // create folders if needed
- QDir tmp;
- tmp.mkpath(QFileInfo(path).absolutePath());
-
- return path;
- }
-
-
- return "";
-}
-
GameStyleModel * DataManager::gameStyleModel()
{
if (m_gameStyleModel == NULL) {
@@ -144,20 +105,26 @@
return m_hatModel;
}
-MapModel * DataManager::mapModel()
+MapModel * DataManager::staticMapModel()
{
- if (m_mapModel == NULL) {
- m_mapModel = new MapModel();
- m_mapModel->loadMaps();
+ if (m_staticMapModel == NULL) {
+ m_staticMapModel = new MapModel(MapModel::StaticMap, this);
}
- return m_mapModel;
+ return m_staticMapModel;
+}
+
+MapModel * DataManager::missionMapModel()
+{
+ if (m_missionMapModel == NULL) {
+ m_missionMapModel = new MapModel(MapModel::MissionMap, this);
+ }
+ return m_missionMapModel;
}
ThemeModel * DataManager::themeModel()
{
if (m_themeModel == NULL) {
m_themeModel = new ThemeModel();
- m_themeModel->loadThemes();
}
return m_themeModel;
}
@@ -183,14 +150,46 @@
QStandardItemModel * DataManager::bindsModel()
{
+ KeyMap km = KeyMap::instance();
if(m_bindsModel == NULL)
{
m_bindsModel = new QStandardItemModel();
+ QStandardItem * firstItem = new QStandardItem();
+ firstItem->setData(tr("Use Default"), Qt::DisplayRole);
+ firstItem->setData("default", Qt::UserRole + 1);
+ m_bindsModel->appendRow(firstItem);
+
for(int j = 0; sdlkeys[j][1][0] != '\0'; j++)
{
QStandardItem * item = new QStandardItem();
- item->setData(HWApplication::translate("binds (keys)", sdlkeys[j][1]).contains(": ") ? HWApplication::translate("binds (keys)", sdlkeys[j][1]) : HWApplication::translate("binds (keys)", "Keyboard") + QString(": ") + HWApplication::translate("binds (keys)", sdlkeys[j][1]), Qt::DisplayRole);
+ QString keyId = QString(sdlkeys[j][0]);
+ QString keyDisplay;
+ bool isKeyboard = sdlkeys_iskeyboard[j] == true;
+ if (keyId == "none" || (!isKeyboard))
+ keyDisplay = HWApplication::translate("binds (keys)", sdlkeys[j][1]);
+ else
+ // Get key name with respect to keyboard layout
+ keyDisplay = QString(SDL_GetKeyName(SDL_GetKeyFromScancode(km.getScancodeFromKeyname(sdlkeys[j][0]))));
+
+ bool kbFallback = keyDisplay.trimmed().isEmpty();
+ if (kbFallback)
+ {
+ keyDisplay = QString(sdlkeys[j][1]);
+ if ((QString(sdlkeys[j][0]) != "f13") && (QString(sdlkeys[j][0]) != "f14") && (QString(sdlkeys[j][0]) != "f15"))
+ {
+ // If SDL doesn't know a name, show fallback name and a warning
+ //: Name of QWERTY US keyboard layout
+ keyDisplay = keyDisplay + QString(" ") + HWApplication::translate("binds (keys)", "(QWERTY)");
+ }
+ }
+ if (isKeyboard)
+ {
+ if (!kbFallback)
+ keyDisplay = HWApplication::translate("binds (keys)", keyDisplay.toUtf8().constData());
+ keyDisplay = HWApplication::translate("binds (keys)", "Keyboard") + QString(": ") + keyDisplay;
+ }
+ item->setData(keyDisplay, Qt::DisplayRole);
item->setData(sdlkeys[j][0], Qt::UserRole + 1);
m_bindsModel->appendRow(item);
}
@@ -199,6 +198,50 @@
return m_bindsModel;
}
+QString DataManager::settingsFileName()
+{
+ if(m_settingsFileName.isEmpty())
+ {
+ QFile settingsFile(cfgdir->absoluteFilePath("settings.ini"));
+
+ if(!settingsFile.exists())
+ {
+ QFile oldSettingsFile(cfgdir->absoluteFilePath("hedgewars.ini"));
+
+ settingsFile.open(QFile::WriteOnly);
+ settingsFile.close();
+
+ if(oldSettingsFile.exists())
+ {
+ QSettings sOld(oldSettingsFile.fileName(), QSettings::IniFormat);
+ QSettings sNew(settingsFile.fileName(), QSettings::IniFormat);
+ sNew.setIniCodec("UTF-8");
+
+ foreach(const QString & key, sOld.allKeys())
+ {
+ if(key.startsWith("colors/color"))
+ sNew.setValue(key, sOld.value(key).value<QColor>().name());
+ else
+ sNew.setValue(key, sOld.value(key));
+ }
+ }
+ }
+
+ m_settingsFileName = settingsFile.fileName();
+ }
+
+ return m_settingsFileName;
+}
+
+QString DataManager::safeFileName(QString fileName)
+{
+ fileName.replace('\\', '_');
+ fileName.replace('/', '_');
+ fileName.replace(':', '_');
+
+ return fileName;
+}
+
void DataManager::reload()
{
// removed for now (also code was a bit unclean, could lead to segfault if
@@ -213,3 +256,12 @@
m_colorsModel->item(i)->setData(QColor(colors[i]));
}
}
+
+bool DataManager::ensureFileExists(const QString &fileName)
+{
+ QFile tmpfile(fileName);
+ if (!tmpfile.exists())
+ return tmpfile.open(QFile::WriteOnly);
+ else
+ return true;
+}