2018-12-21 15:25:28 +00:00
|
|
|
#include "config.h"
|
|
|
|
#include "log.h"
|
|
|
|
#include <QDir>
|
|
|
|
#include <QFile>
|
|
|
|
#include <QList>
|
|
|
|
#include <QTextStream>
|
|
|
|
#include <QRegularExpression>
|
|
|
|
|
2018-12-25 20:41:06 +00:00
|
|
|
KeyValueConfigBase::~KeyValueConfigBase() {
|
2018-12-21 15:25:28 +00:00
|
|
|
|
2018-12-25 20:41:06 +00:00
|
|
|
}
|
2018-12-21 15:25:28 +00:00
|
|
|
|
2018-12-25 20:41:06 +00:00
|
|
|
void KeyValueConfigBase::load() {
|
|
|
|
QFile file(this->configFilename);
|
2018-12-21 15:25:28 +00:00
|
|
|
if (!file.exists()) {
|
|
|
|
if (!file.open(QIODevice::WriteOnly)) {
|
2018-12-25 20:41:06 +00:00
|
|
|
logError(QString("Could not create config file '%1'").arg(this->configFilename));
|
2018-12-21 15:25:28 +00:00
|
|
|
} else {
|
|
|
|
file.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!file.open(QIODevice::ReadOnly)) {
|
2018-12-25 20:41:06 +00:00
|
|
|
logError(QString("Could not open config file '%1': ").arg(this->configFilename) + file.errorString());
|
2018-12-21 15:25:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
QTextStream in(&file);
|
|
|
|
QList<QString> configLines;
|
|
|
|
QRegularExpression re("^(?<key>.+)=(?<value>.+)$");
|
|
|
|
while (!in.atEnd()) {
|
|
|
|
QString line = in.readLine().trimmed();
|
|
|
|
int commentIndex = line.indexOf("#");
|
|
|
|
if (commentIndex >= 0) {
|
|
|
|
line = line.left(commentIndex).trimmed();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (line.length() == 0) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
QRegularExpressionMatch match = re.match(line);
|
|
|
|
if (!match.hasMatch()) {
|
2018-12-25 20:41:06 +00:00
|
|
|
logWarn(QString("Invalid config line in %1: '%2'").arg(this->configFilename).arg(line));
|
2018-12-21 15:25:28 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2018-12-25 20:41:06 +00:00
|
|
|
this->parseConfigKeyValue(match.captured("key").toLower(), match.captured("value"));
|
2018-12-21 15:25:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
file.close();
|
|
|
|
}
|
|
|
|
|
2018-12-25 20:41:06 +00:00
|
|
|
void KeyValueConfigBase::save() {
|
|
|
|
QString text = "";
|
|
|
|
QMap<QString, QString> map = this->getKeyValueMap();
|
|
|
|
for (QMap<QString, QString>::iterator it = map.begin(); it != map.end(); it++) {
|
|
|
|
text += QString("%1=%2\n").arg(it.key()).arg(it.value());
|
|
|
|
}
|
|
|
|
|
|
|
|
QFile file(this->configFilename);
|
|
|
|
if (file.open(QIODevice::WriteOnly)) {
|
|
|
|
file.write(text.toUtf8());
|
|
|
|
file.close();
|
|
|
|
} else {
|
|
|
|
logError(QString("Could not open config file '%1' for writing: ").arg(this->configFilename) + file.errorString());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const QMap<MapSortOrder, QString> mapSortOrderMap = {
|
|
|
|
{MapSortOrder::Group, "group"},
|
|
|
|
{MapSortOrder::Layout, "layout"},
|
|
|
|
{MapSortOrder::Area, "area"},
|
|
|
|
};
|
|
|
|
|
|
|
|
const QMap<QString, MapSortOrder> mapSortOrderReverseMap = {
|
|
|
|
{"group", MapSortOrder::Group},
|
|
|
|
{"layout", MapSortOrder::Layout},
|
|
|
|
{"area", MapSortOrder::Area},
|
|
|
|
};
|
|
|
|
|
|
|
|
PorymapConfig porymapConfig;
|
|
|
|
|
|
|
|
void PorymapConfig::parseConfigKeyValue(QString key, QString value) {
|
2018-12-21 15:25:28 +00:00
|
|
|
if (key == "recent_project") {
|
2018-12-25 20:41:06 +00:00
|
|
|
this->recentProject = value;
|
2018-12-21 15:25:28 +00:00
|
|
|
} else if (key == "recent_map") {
|
2018-12-25 20:41:06 +00:00
|
|
|
this->recentMap = value;
|
2018-12-21 15:25:28 +00:00
|
|
|
} else if (key == "pretty_cursors") {
|
|
|
|
bool ok;
|
2018-12-25 20:41:06 +00:00
|
|
|
this->prettyCursors = value.toInt(&ok);
|
2018-12-21 15:25:28 +00:00
|
|
|
if (!ok) {
|
|
|
|
logWarn(QString("Invalid config value for pretty_cursors: '%1'. Must be 0 or 1.").arg(value));
|
|
|
|
}
|
|
|
|
} else if (key == "map_sort_order") {
|
|
|
|
QString sortOrder = value.toLower();
|
|
|
|
if (mapSortOrderReverseMap.contains(sortOrder)) {
|
2018-12-25 20:41:06 +00:00
|
|
|
this->mapSortOrder = mapSortOrderReverseMap.value(sortOrder);
|
2018-12-21 15:25:28 +00:00
|
|
|
} else {
|
2018-12-25 20:41:06 +00:00
|
|
|
this->mapSortOrder = MapSortOrder::Group;
|
2018-12-21 15:25:28 +00:00
|
|
|
logWarn(QString("Invalid config value for map_sort_order: '%1'. Must be 'group', 'area', or 'layout'."));
|
|
|
|
}
|
|
|
|
} else {
|
2018-12-25 20:41:06 +00:00
|
|
|
logWarn(QString("Invalid config key found in config file %1: '%2'").arg(this->configFilename).arg(key));
|
2018-12-21 15:25:28 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-12-25 20:41:06 +00:00
|
|
|
QMap<QString, QString> PorymapConfig::getKeyValueMap() {
|
|
|
|
QMap<QString, QString> map;
|
|
|
|
map.insert("recent_project", this->recentProject);
|
|
|
|
map.insert("recent_map", this->recentMap);
|
|
|
|
map.insert("pretty_cursors", this->prettyCursors ? "1" : "0");
|
|
|
|
map.insert("map_sort_order", mapSortOrderMap.value(this->mapSortOrder));
|
|
|
|
return map;
|
2018-12-21 15:25:28 +00:00
|
|
|
}
|
|
|
|
|
2018-12-25 20:41:06 +00:00
|
|
|
void PorymapConfig::setRecentProject(QString project) {
|
|
|
|
this->recentProject = project;
|
|
|
|
this->save();
|
2018-12-21 15:25:28 +00:00
|
|
|
}
|
|
|
|
|
2018-12-25 20:41:06 +00:00
|
|
|
void PorymapConfig::setRecentMap(QString map) {
|
|
|
|
this->recentMap = map;
|
|
|
|
this->save();
|
2018-12-21 15:25:28 +00:00
|
|
|
}
|
|
|
|
|
2018-12-25 20:41:06 +00:00
|
|
|
void PorymapConfig::setMapSortOrder(MapSortOrder order) {
|
|
|
|
this->mapSortOrder = order;
|
|
|
|
this->save();
|
2018-12-21 15:25:28 +00:00
|
|
|
}
|
|
|
|
|
2018-12-25 20:41:06 +00:00
|
|
|
void PorymapConfig::setPrettyCursors(bool enabled) {
|
|
|
|
this->prettyCursors = enabled;
|
|
|
|
this->save();
|
2018-12-21 15:25:28 +00:00
|
|
|
}
|
|
|
|
|
2018-12-25 20:41:06 +00:00
|
|
|
QString PorymapConfig::getRecentProject() {
|
|
|
|
return this->recentProject;
|
2018-12-21 15:25:28 +00:00
|
|
|
}
|
|
|
|
|
2018-12-25 20:41:06 +00:00
|
|
|
QString PorymapConfig::getRecentMap() {
|
|
|
|
return this->recentMap;
|
2018-12-21 15:25:28 +00:00
|
|
|
}
|
|
|
|
|
2018-12-25 20:41:06 +00:00
|
|
|
MapSortOrder PorymapConfig::getMapSortOrder() {
|
|
|
|
return this->mapSortOrder;
|
2018-12-21 15:25:28 +00:00
|
|
|
}
|
|
|
|
|
2018-12-25 20:41:06 +00:00
|
|
|
bool PorymapConfig::getPrettyCursors() {
|
|
|
|
return this->prettyCursors;
|
2018-12-21 15:25:28 +00:00
|
|
|
}
|