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
wilder
Kevin Ottens 6 years ago
parent 44cfa0631d
commit d63955cfe5
  1. 63
      src/core/kcoreconfigskeleton.cpp
  2. 50
      src/core/kcoreconfigskeleton.h
  3. 22
      src/core/kcoreconfigskeleton_p.h

@ -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,

@ -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>
*/

@ -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

Loading…
Cancel
Save