From 38a737b4d86c055bc0d2e77e509c6e919039d84e Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 8 Jun 2026 03:06:33 +1000 Subject: [PATCH] fix: icon font config --- plugin/src/Caelestia/Config/configobject.cpp | 16 ++++++++++------ plugin/src/Caelestia/Config/configobject.hpp | 6 ++++++ plugin/src/Caelestia/Config/rootconfig.cpp | 4 ++-- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index 030ecabe..5491a02f 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -22,7 +22,7 @@ void ConfigObject::loadFromJson(const QJsonObject& obj) { qCDebug(lcConfig) << "Loading JSON into" << meta->className() << "with" << obj.keys().size() << "keys:" << obj.keys(); - for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + for (int i = basePropertyOffset(); i < meta->propertyCount(); ++i) { auto prop = meta->property(i); const auto key = QString::fromUtf8(prop.name()); @@ -72,7 +72,7 @@ QJsonObject ConfigObject::toJsonObject() const { QJsonObject obj; const auto* meta = metaObject(); - for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + for (int i = basePropertyOffset(); i < meta->propertyCount(); ++i) { const auto prop = meta->property(i); if (!prop.isReadable()) @@ -127,7 +127,7 @@ void ConfigObject::clearLoadedKeys() { m_loadedKeys.clear(); const auto* meta = metaObject(); - for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + for (int i = basePropertyOffset(); i < meta->propertyCount(); ++i) { auto prop = meta->property(i); if (isGlobalOnly(QString::fromUtf8(prop.name()))) continue; @@ -148,7 +148,7 @@ void ConfigObject::syncFromGlobal(ConfigObject* global) { connect(global, &ConfigObject::propertiesChanged, this, &ConfigObject::onGlobalPropertiesChanged); // Initial sync: copy all non-loaded property values from global - for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + for (int i = basePropertyOffset(); i < meta->propertyCount(); ++i) { auto prop = meta->property(i); const auto key = QString::fromUtf8(prop.name()); @@ -185,7 +185,7 @@ void ConfigObject::resyncFromGlobal() { return; const auto* meta = metaObject(); - for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + for (int i = basePropertyOffset(); i < meta->propertyCount(); ++i) { auto prop = meta->property(i); const auto key = QString::fromUtf8(prop.name()); @@ -210,6 +210,10 @@ void ConfigObject::resyncFromGlobal() { } } +int ConfigObject::basePropertyOffset() { + return ConfigObject::staticMetaObject.propertyCount(); +} + QString ConfigObject::propertyPath(const QString& name) const { QStringList parts; parts.append(name); @@ -223,7 +227,7 @@ QString ConfigObject::propertyPath(const QString& name) const { // Find which property name this child is on the parent const auto* meta = parentConfig->metaObject(); bool found = false; - for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + for (int i = basePropertyOffset(); i < meta->propertyCount(); ++i) { auto prop = meta->property(i); auto val = prop.read(parentObj); if (val.value() == obj) { diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index c4f4428b..159c07ce 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -102,6 +102,12 @@ public: [[nodiscard]] bool isPropertyLoaded(const QString& name) const; [[nodiscard]] QString propertyPath(const QString& name) const; + + // First property index past QObject's own (objectName). ConfigObject declares no + // properties, so this is where every subclass's config properties begin — including + // ones inherited from an intermediate config class (e.g. IconFontStyleConfig). Use + // this instead of metaObject()->propertyOffset(), which excludes inherited properties. + [[nodiscard]] static int basePropertyOffset(); [[nodiscard]] bool isOverlay() const; // Returns true only on overlays — global singleton always returns false. [[nodiscard]] bool isGlobalOnly(const QString& name) const; diff --git a/plugin/src/Caelestia/Config/rootconfig.cpp b/plugin/src/Caelestia/Config/rootconfig.cpp index 9e976ab2..0c959a32 100644 --- a/plugin/src/Caelestia/Config/rootconfig.cpp +++ b/plugin/src/Caelestia/Config/rootconfig.cpp @@ -29,7 +29,7 @@ QStringList RootConfig::collectUnknownKeys(const ConfigObject* obj, const QJsonO const auto* meta = obj->metaObject(); QSet known; - for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) + for (int i = ConfigObject::basePropertyOffset(); i < meta->propertyCount(); ++i) known.insert(QString::fromUtf8(meta->property(i).name())); for (auto it = json.begin(); it != json.end(); ++it) { @@ -126,7 +126,7 @@ void RootConfig::connectAutoSave(ConfigObject* obj) { // Recurse into sub-objects const auto* meta = obj->metaObject(); - for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + for (int i = ConfigObject::basePropertyOffset(); i < meta->propertyCount(); ++i) { auto prop = meta->property(i); auto value = prop.read(obj); auto* subObj = value.value();