aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Ottens <kevin.ottens@enioka.com>2019-11-12 11:41:01 +0100
committerKevin Ottens <kevin.ottens@enioka.com>2019-11-12 13:33:19 +0100
commitd63955cfe547b00aaf5e4c8bf669f50f45f484a9 (patch)
tree31fd51f152cac8c3e7e25ed8f2d992e575e4cac9
parent44cfa0631d25a1b558640e6122fa6b755bb8c7ad (diff)
downloadkconfig-d63955cfe547b00aaf5e4c8bf669f50f45f484a9.tar.gz
kconfig-d63955cfe547b00aaf5e4c8bf669f50f45f484a9.tar.bz2
Add KPropertySkeletonItem
Summary: This new item allows to use a QObject property as a source for a setting. This is especially convenient for using with KCMs present in systemsettings which tend to store information outside of KConfig (for interfacing deeper with the system). Reviewers: #frameworks, dfaure, davidedmundson, bport, crossi Subscribers: kde-frameworks-devel Tags: #frameworks Differential Revision: https://phabricator.kde.org/D25211
-rw-r--r--src/core/kcoreconfigskeleton.cpp63
-rw-r--r--src/core/kcoreconfigskeleton.h50
-rw-r--r--src/core/kcoreconfigskeleton_p.h22
3 files changed, 135 insertions, 0 deletions
diff --git a/src/core/kcoreconfigskeleton.cpp b/src/core/kcoreconfigskeleton.cpp
index df52f587..a2b44fde 100644
--- a/src/core/kcoreconfigskeleton.cpp
+++ b/src/core/kcoreconfigskeleton.cpp
@@ -183,6 +183,69 @@ void KConfigSkeletonItem::setIsSaveNeededImpl(const std::function<bool ()> &impl
d->mIsSaveNeededImpl = impl;
}
+KPropertySkeletonItem::KPropertySkeletonItem(QObject *object, const QByteArray &propertyName, const QVariant &defaultValue)
+ : KConfigSkeletonItem(*new KPropertySkeletonItemPrivate(object, propertyName, defaultValue), {}, {})
+{
+ setIsDefaultImpl([this] {
+ Q_D(const KPropertySkeletonItem);
+ return d->mReference == d->mDefaultValue;
+ });
+ setIsSaveNeededImpl([this] {
+ Q_D(const KPropertySkeletonItem);
+ return d->mReference != d->mLoadedValue;
+ });
+}
+
+QVariant KPropertySkeletonItem::property() const
+{
+ Q_D(const KPropertySkeletonItem);
+ return d->mReference;
+}
+
+void KPropertySkeletonItem::setProperty(const QVariant &p)
+{
+ Q_D(KPropertySkeletonItem);
+ d->mReference = p;
+}
+
+bool KPropertySkeletonItem::isEqual(const QVariant &p) const
+{
+ Q_D(const KPropertySkeletonItem);
+ return d->mReference == p;
+}
+
+void KPropertySkeletonItem::readConfig(KConfig *)
+{
+ Q_D(KPropertySkeletonItem);
+ d->mReference = d->mObject->property(d->mPropertyName.constData());
+ d->mLoadedValue = d->mReference;
+}
+
+void KPropertySkeletonItem::writeConfig(KConfig *)
+{
+ Q_D(KPropertySkeletonItem);
+ d->mObject->setProperty(d->mPropertyName.constData(), d->mReference);
+ d->mLoadedValue = d->mReference;
+}
+
+void KPropertySkeletonItem::readDefault(KConfig *)
+{
+ Q_D(KPropertySkeletonItem);
+ d->mReference = d->mConstDefaultValue;
+}
+
+void KPropertySkeletonItem::setDefault()
+{
+ Q_D(KPropertySkeletonItem);
+ d->mReference = d->mDefaultValue;
+}
+
+void KPropertySkeletonItem::swapDefault()
+{
+ Q_D(KPropertySkeletonItem);
+ std::swap(d->mReference, d->mDefaultValue);
+}
+
KCoreConfigSkeleton::ItemString::ItemString(const QString &_group, const QString &_key,
QString &reference,
const QString &defaultValue,
diff --git a/src/core/kcoreconfigskeleton.h b/src/core/kcoreconfigskeleton.h
index ffb6d6a5..c6e49c63 100644
--- a/src/core/kcoreconfigskeleton.h
+++ b/src/core/kcoreconfigskeleton.h
@@ -247,6 +247,56 @@ protected:
KConfigSkeletonItemPrivate *const d_ptr;
};
+class KPropertySkeletonItemPrivate;
+
+/**
+ * \class KPropertySkeletonItem kcoreconfigskeleton.h <KCoreConfigSkeleton>
+ *
+ * @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 QByteArray &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 <KConfigSkeletonGenericItem>
*/
diff --git a/src/core/kcoreconfigskeleton_p.h b/src/core/kcoreconfigskeleton_p.h
index cc997621..19f6f4bb 100644
--- a/src/core/kcoreconfigskeleton_p.h
+++ b/src/core/kcoreconfigskeleton_p.h
@@ -67,4 +67,26 @@ public:
std::function<bool()> mIsSaveNeededImpl;
};
+class KPropertySkeletonItemPrivate : public KConfigSkeletonItemPrivate
+{
+public:
+ KPropertySkeletonItemPrivate(QObject *object, const QByteArray &propertyName, const QVariant &defaultValue)
+ : KConfigSkeletonItemPrivate()
+ , mObject(object)
+ , mPropertyName(propertyName)
+ , mDefaultValue(defaultValue)
+ , mConstDefaultValue(defaultValue)
+ {
+ mIsImmutable = false;
+ }
+
+ QObject *mObject;
+ const QByteArray mPropertyName;
+ QVariant mDefaultValue;
+ const QVariant mConstDefaultValue;
+ QVariant mReference;
+ QVariant mLoadedValue;
+};
+
+
#endif