diff --git a/src/core/kcoreconfigskeleton.h b/src/core/kcoreconfigskeleton.h --- a/src/core/kcoreconfigskeleton.h +++ b/src/core/kcoreconfigskeleton.h @@ -294,6 +294,11 @@ void setDefault() override; /** @copydoc KConfigSkeletonItem::swapDefault() */ void swapDefault() override; + /** + * Set a function called when property change + * @since 5.68 + */ + void setNotifyFunction(const std::function &impl); }; diff --git a/src/core/kcoreconfigskeleton.cpp b/src/core/kcoreconfigskeleton.cpp --- a/src/core/kcoreconfigskeleton.cpp +++ b/src/core/kcoreconfigskeleton.cpp @@ -205,7 +205,13 @@ void KPropertySkeletonItem::setProperty(const QVariant &p) { Q_D(KPropertySkeletonItem); + if (d->mReference == p) { + return; + } d->mReference = p; + if (d->mNotifyFunction) { + d->mNotifyFunction(); + } } bool KPropertySkeletonItem::isEqual(const QVariant &p) const @@ -217,7 +223,7 @@ void KPropertySkeletonItem::readConfig(KConfig *) { Q_D(KPropertySkeletonItem); - d->mReference = d->mObject->property(d->mPropertyName.constData()); + setProperty(d->mObject->property(d->mPropertyName.constData())); d->mLoadedValue = d->mReference; } @@ -231,19 +237,31 @@ void KPropertySkeletonItem::readDefault(KConfig *) { Q_D(KPropertySkeletonItem); - d->mReference = d->mConstDefaultValue; + setProperty(d->mConstDefaultValue); } void KPropertySkeletonItem::setDefault() { Q_D(KPropertySkeletonItem); - d->mReference = d->mDefaultValue; + setProperty(d->mDefaultValue); } void KPropertySkeletonItem::swapDefault() { Q_D(KPropertySkeletonItem); + if (d->mReference == d->mDefaultValue) { + return; + } std::swap(d->mReference, d->mDefaultValue); + if (d->mNotifyFunction) { + d->mNotifyFunction(); + } +} + +void KPropertySkeletonItem::setNotifyFunction(const std::function &impl) +{ + Q_D(KPropertySkeletonItem); + d->mNotifyFunction = impl; } KCoreConfigSkeleton::ItemString::ItemString(const QString &_group, const QString &_key, diff --git a/src/core/kcoreconfigskeleton_p.h b/src/core/kcoreconfigskeleton_p.h --- a/src/core/kcoreconfigskeleton_p.h +++ b/src/core/kcoreconfigskeleton_p.h @@ -86,6 +86,7 @@ const QVariant mConstDefaultValue; QVariant mReference; QVariant mLoadedValue; + std::function mNotifyFunction; };