mirror of
https://github.com/OpenMW/openmw.git
synced 2026-05-06 07:56:40 -04:00
427da3cb90
Avoid shoving every single directory in the config file Avoid duplicates caused by mismatches between the canonical path with forward slash separator and the absolute path with native separators Give up on the broken attempt to move the path to the end of the list and clean up the essentially dead code
133 lines
4.1 KiB
C++
133 lines
4.1 KiB
C++
#ifndef GAMESETTINGS_HPP
|
|
#define GAMESETTINGS_HPP
|
|
|
|
#include <QFile>
|
|
#include <QMultiMap>
|
|
#include <QString>
|
|
#include <QStringList>
|
|
#include <QTextStream>
|
|
|
|
#include <filesystem>
|
|
|
|
namespace Files
|
|
{
|
|
typedef std::vector<std::filesystem::path> PathContainer;
|
|
struct ConfigurationManager;
|
|
}
|
|
|
|
namespace Config
|
|
{
|
|
struct SettingValue
|
|
{
|
|
QString value = "";
|
|
// value as found in openmw.cfg, e.g. relative path with ?slug?
|
|
QString originalRepresentation = value;
|
|
// path of openmw.cfg, e.g. to resolve relative paths
|
|
QString context = "";
|
|
|
|
friend std::strong_ordering operator<=>(const SettingValue&, const SettingValue&) = default;
|
|
};
|
|
|
|
class GameSettings
|
|
{
|
|
public:
|
|
explicit GameSettings(const Files::ConfigurationManager& cfg);
|
|
|
|
inline SettingValue value(const QString& key, const SettingValue& defaultValue = {})
|
|
{
|
|
return mSettings.contains(key) ? mSettings.value(key) : defaultValue;
|
|
}
|
|
|
|
inline void setValue(const QString& key, const SettingValue& value)
|
|
{
|
|
remove(key);
|
|
mSettings.insert(key, value);
|
|
if (isUserSetting(value))
|
|
mUserSettings.insert(key, value);
|
|
}
|
|
|
|
inline void setMultiValue(const QString& key, const SettingValue& value)
|
|
{
|
|
QList<SettingValue> values = mSettings.values(key);
|
|
if (!values.contains(value))
|
|
mSettings.insert(key, value);
|
|
|
|
if (isUserSetting(value))
|
|
{
|
|
values = mUserSettings.values(key);
|
|
if (!values.contains(value))
|
|
mUserSettings.insert(key, value);
|
|
}
|
|
}
|
|
|
|
inline void remove(const QString& key)
|
|
{
|
|
// simplify to removeIf when Qt5 goes
|
|
for (auto itr = mSettings.lowerBound(key); itr != mSettings.upperBound(key);)
|
|
{
|
|
if (isUserSetting(*itr))
|
|
itr = mSettings.erase(itr);
|
|
else
|
|
++itr;
|
|
}
|
|
mUserSettings.remove(key);
|
|
}
|
|
|
|
QList<SettingValue> getDataDirs() const;
|
|
|
|
QString getResourcesVfs() const;
|
|
|
|
inline QString getDataLocal() const { return mDataLocal; }
|
|
|
|
bool hasMaster();
|
|
|
|
QList<SettingValue> values(const QString& key, const QList<SettingValue>& defaultValues = {}) const;
|
|
bool containsValue(const QString& key, const QString& value) const;
|
|
|
|
bool readFile(QTextStream& stream, const QString& context, bool ignoreContent = false);
|
|
bool readFile(QTextStream& stream, QMultiMap<QString, SettingValue>& settings, const QString& context,
|
|
bool ignoreContent = false);
|
|
bool readUserFile(QTextStream& stream, const QString& context, bool ignoreContent = false);
|
|
|
|
bool writeFile(QTextStream& stream);
|
|
bool writeFileWithComments(QFile& file);
|
|
|
|
QList<SettingValue> getArchiveList() const;
|
|
void setContentList(
|
|
const QList<SettingValue>& dirNames, const QList<SettingValue>& archiveNames, const QStringList& fileNames);
|
|
QList<SettingValue> getContentList() const;
|
|
|
|
const QString& getUserContext() const { return mContexts.back(); }
|
|
bool isUserSetting(const SettingValue& settingValue) const;
|
|
|
|
SettingValue processPathSettingValue(const SettingValue& value);
|
|
|
|
void clear();
|
|
|
|
private:
|
|
const Files::ConfigurationManager& mCfgMgr;
|
|
|
|
void validatePaths();
|
|
QMultiMap<QString, SettingValue> mSettings;
|
|
QMultiMap<QString, SettingValue> mUserSettings;
|
|
|
|
QStringList mContexts;
|
|
|
|
QList<SettingValue> mDataDirs;
|
|
QString mDataLocal;
|
|
|
|
static const char sArchiveKey[];
|
|
static const char sContentKey[];
|
|
static const char sDirectoryKey[];
|
|
|
|
static bool isOrderedLine(const QString& line);
|
|
};
|
|
|
|
QDataStream& operator<<(QDataStream& out, const SettingValue& settingValue);
|
|
QDataStream& operator>>(QDataStream& in, SettingValue& settingValue);
|
|
}
|
|
|
|
Q_DECLARE_METATYPE(Config::SettingValue)
|
|
|
|
#endif // GAMESETTINGS_HPP
|