modsettingsstorage.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /*
  2. * modsettignsstorage.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "modsettingsstorage.h"
  12. #include "../../lib/VCMIDirs.h"
  13. #include "../vcmiqt/jsonutils.h"
  14. static QVariant writeValue(QString path, QVariantMap input, QVariant value)
  15. {
  16. if(path.size() > 1)
  17. {
  18. QString entryName = path.section('/', 0, 1);
  19. QString remainder = "/" + path.section('/', 2, -1);
  20. entryName.remove(0, 1);
  21. input.insert(entryName, writeValue(remainder, input.value(entryName).toMap(), value));
  22. return input;
  23. }
  24. else
  25. {
  26. return value;
  27. }
  28. }
  29. void ModSettingsStorage::createInitialPreset()
  30. {
  31. // TODO: scan mods directory for all its content?
  32. QStringList modList;
  33. QVariantMap preset;
  34. QVariantMap presetList;
  35. modList.push_back("vcmi");
  36. preset.insert("mods", modList);
  37. presetList.insert("default", preset);
  38. config.insert("presets", presetList);
  39. }
  40. void ModSettingsStorage::importInitialPreset()
  41. {
  42. QStringList modList;
  43. QMap<QString, QVariantMap> modSettings;
  44. QVariantMap activeMods = config["activeMods"].toMap();
  45. for (QVariantMap::const_iterator modEntry = activeMods.begin(); modEntry != activeMods.end(); ++modEntry)
  46. {
  47. if (modEntry.value().toMap()["active"].toBool())
  48. modList.push_back(modEntry.key());
  49. QVariantMap submods = modEntry.value().toMap()["mods"].toMap();
  50. for (QVariantMap::const_iterator submodEntry = submods.begin(); submodEntry != submods.end(); ++submodEntry)
  51. modSettings[modEntry.key()].insert(submodEntry.key(), submodEntry.value().toMap()["active"]);
  52. }
  53. QVariantMap importedPreset;
  54. QVariantMap modSettingsVariant;
  55. QVariantMap presetList;
  56. for (QMap<QString, QVariantMap>::const_iterator modEntry = modSettings.begin(); modEntry != modSettings.end(); ++modEntry)
  57. modSettingsVariant.insert(modEntry.key(), modEntry.value());
  58. importedPreset.insert("mods", modList);
  59. importedPreset.insert("settings", modSettingsVariant);
  60. presetList.insert("default", importedPreset);
  61. config.insert("presets", presetList);
  62. }
  63. ModSettingsStorage::ModSettingsStorage()
  64. {
  65. config = JsonUtils::JsonFromFile(settingsPath()).toMap();
  66. if (!config.contains("presets"))
  67. {
  68. config.insert("activePreset", QVariant("default"));
  69. if (config.contains("activeMods"))
  70. importInitialPreset(); // 1.5 format import
  71. else
  72. createInitialPreset(); // new install
  73. JsonUtils::JsonToFile(settingsPath(), config);
  74. }
  75. }
  76. QString ModSettingsStorage::settingsPath() const
  77. {
  78. return pathToQString(VCMIDirs::get().userConfigPath() / "modSettings.json");
  79. }
  80. void ModSettingsStorage::setRootModActive(const QString & modName, bool on)
  81. {
  82. QString presetName = getActivePreset();
  83. QStringList activeMods = getActiveMods();
  84. assert(modName.count('.') == 0); // this method should never be used for submods
  85. if (on)
  86. activeMods.push_back(modName);
  87. else
  88. activeMods.removeAll(modName);
  89. config = writeValue("/presets/" + presetName + "/mods", config, activeMods).toMap();
  90. JsonUtils::JsonToFile(settingsPath(), config);
  91. }
  92. void ModSettingsStorage::registerNewMod(const QString & modName, bool keepDisabled)
  93. {
  94. if (!modName.contains('.'))
  95. return;
  96. QString rootModName = modName.section('.', 0, 0);
  97. QString settingName = modName.section('.', 1);
  98. QVariantMap modSettings = getModSettings(rootModName);
  99. if (modSettings.contains(settingName))
  100. return;
  101. setModSettingActive(modName, !keepDisabled);
  102. }
  103. void ModSettingsStorage::setModSettingActive(const QString & modName, bool on)
  104. {
  105. QString presetName = getActivePreset();
  106. QString rootModName = modName.section('.', 0, 0);
  107. QString settingName = modName.section('.', 1);
  108. QVariantMap modSettings = getModSettings(rootModName);
  109. assert(modName.count('.') != 0); // this method should only be used for submods
  110. modSettings.insert(settingName, QVariant(on));
  111. config = writeValue("/presets/" + presetName + "/settings/" + rootModName, config, modSettings).toMap();
  112. JsonUtils::JsonToFile(settingsPath(), config);
  113. }
  114. void ModSettingsStorage::setModActive(const QString & modName, bool on)
  115. {
  116. if (modName.contains('.'))
  117. setModSettingActive(modName, on);
  118. else
  119. setRootModActive(modName, on);
  120. }
  121. void ModSettingsStorage::setActivePreset(const QString & presetName)
  122. {
  123. config.insert("activePreset", QVariant(presetName));
  124. }
  125. QString ModSettingsStorage::getActivePreset() const
  126. {
  127. return config["activePreset"].toString();
  128. }
  129. bool ModSettingsStorage::isModActive(const QString & modName) const
  130. {
  131. if (modName.contains('.'))
  132. {
  133. QString rootModName = modName.section('.', 0, 0);
  134. QString settingName = modName.section('.', 1);
  135. return getModSettings(rootModName)[settingName].toBool();
  136. }
  137. else
  138. return getActiveMods().contains(modName);
  139. }
  140. QStringList ModSettingsStorage::getActiveMods() const
  141. {
  142. return getActivePresetData()["mods"].toStringList();
  143. }
  144. QVariantMap ModSettingsStorage::getActivePresetData() const
  145. {
  146. QString presetName = getActivePreset();
  147. return config["presets"].toMap()[presetName].toMap();
  148. }
  149. QVariantMap ModSettingsStorage::getModSettings(const QString & modName) const
  150. {
  151. QString presetName = getActivePreset();
  152. return getActivePresetData()["settings"].toMap()[modName].toMap();
  153. }