diff --git a/engine/includes/editor/editorplatform.h b/engine/includes/editor/editorplatform.h index b028b5140..edf5a9fe1 100644 --- a/engine/includes/editor/editorplatform.h +++ b/engine/includes/editor/editorplatform.h @@ -67,6 +67,8 @@ class ENGINE_EXPORT EditorPlatform : public PlatformAdaptor { TString locationLocalDir() const override; + void syncConfiguration(VariantMap &map) const override; + protected: QHash m_keys; QHash m_mouseButtons; diff --git a/engine/src/editor/editorplatform.cpp b/engine/src/editor/editorplatform.cpp index 4be1ffb5b..e4e0e505b 100644 --- a/engine/src/editor/editorplatform.cpp +++ b/engine/src/editor/editorplatform.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -158,6 +159,16 @@ void EditorPlatform::setImportPath(const TString &path) { } bool EditorPlatform::init() { + File fp(locationLocalDir() + "/config.json"); + if(fp.open(File::ReadOnly | File::Text)) { + ByteArray data = fp.readAll(); + fp.close(); + + for(auto &it : Json::load(data).toMap()) { + Engine::setValue(it.first, it.second); + } + } + return true; } @@ -283,4 +294,14 @@ void EditorPlatform::mouseLockCursor(bool lock) { m_mouseLock = lock; } -TString EditorPlatform::locationLocalDir() const { return QStandardPaths::writableLocation(QStandardPaths::ConfigLocation).toStdString(); } +TString EditorPlatform::locationLocalDir() const { + return QStandardPaths::writableLocation(QStandardPaths::ConfigLocation).toStdString(); +} + +void EditorPlatform::syncConfiguration(VariantMap &map) const { + File fp(locationLocalDir() + "/config.json"); + if(fp.open(File::WriteOnly)) { + fp.write(Json::save(map)); + fp.close(); + } +} diff --git a/engine/src/editor/editorsettings.cpp b/engine/src/editor/editorsettings.cpp index 323532ec0..2d2bad4cd 100644 --- a/engine/src/editor/editorsettings.cpp +++ b/engine/src/editor/editorsettings.cpp @@ -7,7 +7,10 @@ #include #include -#define SETTINGS ".Settings" +namespace { + const char *gSettings(".Settings"); + const char *gEditorSettings("EditorSettings"); +} EditorSettings *EditorSettings::m_pInstance = nullptr; @@ -47,43 +50,55 @@ void EditorSettings::setValue(const TString &name, const Variant &value) { } void EditorSettings::loadSettings() { - QSettings settings(COMPANY_NAME, EDITOR_NAME); - QVariantMap data = settings.value(SETTINGS).toMap(); - blockSignals(true); - for(const TString &it : dynamicPropertyNames()) { - TString info = propertyTag(dynamicPropertyInfo(it.data()), "editor="); - Variant propertyValue = property(it.data()); - - int userType = propertyValue.userType(); - switch(userType) { - case MetaType::BOOLEAN: { - bool value = data[it.data()].toBool(); - setProperty(it.data(), value); - } break; - case MetaType::INTEGER: { - int value = data[it.data()].toInt(); - setProperty(it.data(), value); - } break; - case MetaType::FLOAT: { - float value = data[it.data()].toFloat(); - setProperty(it.data(), value); - } break; - case MetaType::STRING: { - TString value(data[it.data()].toString().toStdString()); - setProperty(it.data(), value); - } break; - case MetaType::VECTOR4: { - if(info == "Color") { - QString str(data[it.data()].toString()); - if(!str.isEmpty()) { - QColor color(str); - Vector4 value(color.redF(), color.greenF(), color.blueF(), color.alphaF()); - setProperty(it.data(), value); + + if(Engine::value(gEditorSettings).isValid()) { + VariantMap data = Engine::value(gEditorSettings).toMap(); + + for(const TString &name : dynamicPropertyNames()) { + auto it = data.find(name); + if(it != data.end()) { + setProperty(name.data(), it->second); + } + } + } else { /// \todo To be removed in mid 2025 + QSettings settings(COMPANY_NAME, EDITOR_NAME); + QVariantMap data = settings.value(gSettings).toMap(); + + for(const TString &it : dynamicPropertyNames()) { + TString info = propertyTag(dynamicPropertyInfo(it.data()), "editor="); + Variant propertyValue = property(it.data()); + + int userType = propertyValue.userType(); + switch(userType) { + case MetaType::BOOLEAN: { + bool value = data[it.data()].toBool(); + setProperty(it.data(), value); + } break; + case MetaType::INTEGER: { + int value = data[it.data()].toInt(); + setProperty(it.data(), value); + } break; + case MetaType::FLOAT: { + float value = data[it.data()].toFloat(); + setProperty(it.data(), value); + } break; + case MetaType::STRING: { + TString value(data[it.data()].toString().toStdString()); + setProperty(it.data(), value); + } break; + case MetaType::VECTOR4: { + if(info == "Color") { + QString str(data[it.data()].toString()); + if(!str.isEmpty()) { + QColor color(str); + Vector4 value(color.redF(), color.greenF(), color.blueF(), color.alphaF()); + setProperty(it.data(), value); + } } - } - } break; - default: break; + } break; + default: break; + } } } @@ -95,37 +110,13 @@ void EditorSettings::saveSettings() { return; } - QVariantMap data; - + VariantMap data; for(const TString &it : dynamicPropertyNames()) { - Variant propertyValue = property(it.data()); - - int userType = propertyValue.userType(); - switch(userType) { - case MetaType::BOOLEAN: { - data[it.data()] = propertyValue.toBool(); - } break; - case MetaType::INTEGER: { - data[it.data()] = propertyValue.toInt(); - } break; - case MetaType::FLOAT: { - data[it.data()] = propertyValue.toFloat(); - } break; - case MetaType::STRING: { - data[it.data()] = propertyValue.toString().data(); - } break; - case MetaType::VECTOR4: { - Vector4 v = propertyValue.toVector4(); - QString str(QColor::fromRgbF(v.x, v.y, v.z, v.w).name(QColor::HexArgb)); - - data[it.data()] = str; - } break; - default: break; - } + data[it] = property(it.data()); } - QSettings settings(COMPANY_NAME, EDITOR_NAME); - settings.setValue(SETTINGS, data); + Engine::setValue(gEditorSettings, data); + Engine::syncValues(); } void EditorSettings::setLanguage(const QLocale &locale) { diff --git a/engine/src/engine.cpp b/engine/src/engine.cpp index 58013bcb8..49592a994 100644 --- a/engine/src/engine.cpp +++ b/engine/src/engine.cpp @@ -365,7 +365,7 @@ void Engine::syncValues() { } VariantMap filtered; - for(auto it : m_values) { + for(auto &it : m_values) { if(it.first.front() != '.') { filtered[it.first] = it.second; }