#include "../headers/scstwsettings.h" ScStwSettings::ScStwSettings(QObject *parent) : QObject(parent) { QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); QDir dir(path); this->settingsFile = new QFile(path + "/settings.json"); if(!this->settingsFile->exists()) if(!dir.mkpath(path)) qFatal("[FATAL] Couldn't create settings dir %s", qPrintable(path)); if(!this->settingsFile->open(QFile::ReadWrite)) qFatal("[FATAL] Couldn't open settings file %s", qPrintable(path + "/settings.json")); if(!this->loadSettingsFromFile() && this->settingsFile->size() != 0) qFatal("[FATAL] Settings file (%s) is of invalid format!", qPrintable(path + "/settings.json")); connect(this, &ScStwSettings::settingChanged, this, &ScStwSettings::writeSettingsToFile); } QVariant ScStwSettings::readSetting(BaseStationSetting key) { return this->readSetting(QMetaEnum::fromType().valueToKey(int(key)), int(key), 0); } QVariant ScStwSettings::readSetting(int key, int keyLevel) { if(keyLevel == ScStwSettings::KeyLevel) return this->readSetting(ScStwSettings::BaseStationSetting(key)); else return QVariant(); } bool ScStwSettings::writeSetting(BaseStationSetting key, QVariant value) { return this->writeSetting(QMetaEnum::fromType().valueToKey(int(key)), value, int(key), 0); } bool ScStwSettings::writeSetting(int key, QVariant value, int keyLevel) { if(keyLevel == ScStwSettings::KeyLevel) return this->writeSetting(ScStwSettings::BaseStationSetting(key), value); else return false; } void ScStwSettings::setDefaultSetting(BaseStationSetting key, QVariant defaultVariant) { this->setDefaultSetting(QMetaEnum::fromType().valueToKey(int(key)), defaultVariant, int(key), 0); } QVariant ScStwSettings::readSetting(QString key, int keyInt, int keyLevel) { Q_UNUSED(keyInt) Q_UNUSED(keyLevel) return this->settingsCache[key]; } bool ScStwSettings::writeSetting(QString key, QVariant value, int keyInt, int keyLevel) { if(!this->settingsCache.contains(key)) this->settingsCache.insert(key, value); else if (this->settingsCache[key] == value) return true; else this->settingsCache[key] = value; emit this->settingChanged(keyInt, keyLevel, value); return true; } void ScStwSettings::setDefaultSetting(QString key, QVariant defaultVariant, int keyInt, int keyLevel) { if(!this->settingsCache.contains(key)) this->writeSetting(key, defaultVariant, keyInt, keyLevel); } /* * File handling */ bool ScStwSettings::writeSettingsToFile() { QJsonDocument doc = QJsonDocument::fromVariant(this->settingsCache); // overwrite file this->settingsFile->reset(); this->settingsFile->write(doc.toJson(QJsonDocument::Indented)); this->settingsFile->flush(); return true; } bool ScStwSettings::loadSettingsFromFile() { QJsonDocument doc = QJsonDocument::fromJson(this->settingsFile->readAll()); if(doc.toVariant().type() != QVariant::Map) return false; this->settingsCache = doc.toVariant().toMap(); return true; }