diff --git a/src/core/kcoreconfigskeleton.h b/src/core/kcoreconfigskeleton.h --- a/src/core/kcoreconfigskeleton.h +++ b/src/core/kcoreconfigskeleton.h @@ -247,6 +247,56 @@ KConfigSkeletonItemPrivate *const d_ptr; }; +class KPropertySkeletonItemPrivate; + +/** + * \class KPropertySkeletonItem kcoreconfigskeleton.h + * + * @short Class for proxying a QObject property as a preferences setting + * @author Kevin Ottens + * @see KConfigSkeletonItem + * + * This class represents one preferences setting as used by @ref KCoreConfigSkeleton. + * Unlike other @ref KConfigSkeletonItem subclasses, this one won't store the preference + * in KConfig but will use a QObject property as storage. + * You will have to register instances of this class with the function KCoreConfigSkeleton::addItem(). + * + * @since 5.65 + */ +class KCONFIGCORE_EXPORT KPropertySkeletonItem : public KConfigSkeletonItem +{ + Q_DECLARE_PRIVATE(KPropertySkeletonItem) +public: + /** + * Constructor + * + * @param object The QObject instance which we'll manage the property of + * @param propertyName The name of the property in @p object which we'll manage + * @param defaultValue The default value of the property + */ + KPropertySkeletonItem(QObject *object, const char *propertyName, const QVariant &defaultValue); + + /** @copydoc KConfigSkeletonItem::property() */ + QVariant property() const override; + /** @copydoc KConfigSkeletonItem::setProperty(const QVariant &) */ + void setProperty(const QVariant &p) override; + /** @copydoc KConfigSkeletonItem::isEqual(const QVariant &) */ + bool isEqual(const QVariant &p) const override; + + /** @copydoc KConfigSkeletonItem::readConfig(KConfig *) */ + void readConfig(KConfig *) override; + /** @copydoc KConfigSkeletonItem::writeConfig(KConfig *) */ + void writeConfig(KConfig *) override; + + /** @copydoc KConfigSkeletonItem::readDefault(KConfig *) */ + void readDefault(KConfig *) override; + /** @copydoc KConfigSkeletonItem::setDefault() */ + void setDefault() override; + /** @copydoc KConfigSkeletonItem::swapDefault() */ + void swapDefault() override; +}; + + /** * \class KConfigSkeletonGenericItem kcoreconfigskeleton.h */ diff --git a/src/core/kcoreconfigskeleton.cpp b/src/core/kcoreconfigskeleton.cpp --- a/src/core/kcoreconfigskeleton.cpp +++ b/src/core/kcoreconfigskeleton.cpp @@ -181,6 +181,69 @@ d->mIsSaveNeededImpl = impl; } +KPropertySkeletonItem::KPropertySkeletonItem(QObject *object, const char *propertyName, const QVariant &defaultValue) + : KConfigSkeletonItem(*new KPropertySkeletonItemPrivate(object, propertyName, defaultValue), {}, {}) +{ + setIsDefaultImpl([this] { + Q_D(const KPropertySkeletonItem); + return d->m_reference == d->m_defaultValue; + }); + setIsSaveNeededImpl([this] { + Q_D(const KPropertySkeletonItem); + return d->m_reference != d->m_loadedValue; + }); +} + +QVariant KPropertySkeletonItem::property() const +{ + Q_D(const KPropertySkeletonItem); + return d->m_reference; +} + +void KPropertySkeletonItem::setProperty(const QVariant &p) +{ + Q_D(KPropertySkeletonItem); + d->m_reference = p; +} + +bool KPropertySkeletonItem::isEqual(const QVariant &p) const +{ + Q_D(const KPropertySkeletonItem); + return d->m_reference == p; +} + +void KPropertySkeletonItem::readConfig(KConfig *) +{ + Q_D(KPropertySkeletonItem); + d->m_reference = d->m_object->property(d->m_propertyName); + d->m_loadedValue = d->m_reference; +} + +void KPropertySkeletonItem::writeConfig(KConfig *) +{ + Q_D(KPropertySkeletonItem); + d->m_object->setProperty(d->m_propertyName, d->m_reference); + d->m_loadedValue = d->m_reference; +} + +void KPropertySkeletonItem::readDefault(KConfig *) +{ + Q_D(KPropertySkeletonItem); + d->m_reference = d->m_constDefaultValue; +} + +void KPropertySkeletonItem::setDefault() +{ + Q_D(KPropertySkeletonItem); + d->m_reference = d->m_defaultValue; +} + +void KPropertySkeletonItem::swapDefault() +{ + Q_D(KPropertySkeletonItem); + std::swap(d->m_reference, d->m_defaultValue); +} + KCoreConfigSkeleton::ItemString::ItemString(const QString &_group, const QString &_key, QString &reference, const QString &defaultValue, 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 @@ -66,4 +66,26 @@ std::function mIsSaveNeededImpl; }; +class KPropertySkeletonItemPrivate : public KConfigSkeletonItemPrivate +{ +public: + KPropertySkeletonItemPrivate(QObject *object, const char *propertyName, const QVariant &defaultValue) + : KConfigSkeletonItemPrivate() + , m_object(object) + , m_propertyName(propertyName) + , m_defaultValue(defaultValue) + , m_constDefaultValue(defaultValue) + { + mIsImmutable = false; + } + + QObject *m_object; + const char *m_propertyName; + QVariant m_defaultValue; + const QVariant m_constDefaultValue; + QVariant m_reference; + QVariant m_loadedValue; +}; + + #endif