diff options
| author | Cyril Rossi <cyril.rossi@enioka.com> | 2020-01-24 17:14:51 +0100 | 
|---|---|---|
| committer | Cyril Rossi <cyril.rossi@enioka.com> | 2020-02-24 13:23:24 +0100 | 
| commit | c8bf5e96cf2f25bb85330cf2587e2e365e6f0f71 (patch) | |
| tree | 7a9866f61e7b7caf4f67f555f80d5ce852cdb775 /src | |
| parent | 55aaa712b75b1401331e29aef08123556b0257f3 (diff) | |
| download | kconfig-c8bf5e96cf2f25bb85330cf2587e2e365e6f0f71.tar.gz kconfig-c8bf5e96cf2f25bb85330cf2587e2e365e6f0f71.tar.bz2 | |
KConfigSkeletonItem : allow to set a KconfigGroup to read and write items in nested groups
Summary:
Currently KConfgiSkeleton cannot manage item entry in subgroup, like
```
[General][Colors]
MyItem=foo
```
Example of use
```
// Generated Class with KConfig compiler, inherits KConfigSkeleton
KConfigGroup generalGroup( &config, "General" );
KConfigGroup colorsGroup = config.group( "Colors" )
myItem->setGroup(cg); // Now can take a KConfigGroup
addItem(myItem, "MyItem");
```
Evolution of kconfig compiler will follow to consider this.
Reviewers: ervin, dfaure, #frameworks, mdawson
Reviewed By: ervin, dfaure
Subscribers: kde-frameworks-devel
Tags: #frameworks
Differential Revision: https://phabricator.kde.org/D27059
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/kcoreconfigskeleton.cpp | 75 | ||||
| -rw-r--r-- | src/core/kcoreconfigskeleton.h | 28 | ||||
| -rw-r--r-- | src/core/kcoreconfigskeleton_p.h | 1 | 
3 files changed, 77 insertions, 27 deletions
| diff --git a/src/core/kcoreconfigskeleton.cpp b/src/core/kcoreconfigskeleton.cpp index be2fe27c..5672a850 100644 --- a/src/core/kcoreconfigskeleton.cpp +++ b/src/core/kcoreconfigskeleton.cpp @@ -64,6 +64,21 @@ void KConfigSkeletonItem::setGroup(const QString &_group)      mGroup = _group;  } +void KConfigSkeletonItem::setGroup(const KConfigGroup &cg) +{ +    Q_D(KConfigSkeletonItem); +    d->mConfigGroup = cg; +} + +KConfigGroup KConfigSkeletonItem::configGroup(KConfig *config) const +{ +    Q_D(const KConfigSkeletonItem); +    if (d->mConfigGroup.isValid()) { +        return d->mConfigGroup; +    } +    return KConfigGroup(config, mGroup); +} +  QString KConfigSkeletonItem::group() const  {      return mGroup; @@ -276,7 +291,7 @@ KCoreConfigSkeleton::ItemString::ItemString(const QString &_group, const QString  void KCoreConfigSkeleton::ItemString::writeConfig(KConfig *config)  {      if (mReference != mLoadedValue) { // WABA: Is this test needed? -        KConfigGroup cg(config, mGroup); +        KConfigGroup cg = configGroup(config);          if ((mDefault == mReference) && !cg.hasDefault(mKey)) {              cg.revertToDefault(mKey, writeFlags());          } else if (mType == Path) { @@ -292,7 +307,7 @@ void KCoreConfigSkeleton::ItemString::writeConfig(KConfig *config)  void KCoreConfigSkeleton::ItemString::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      if (mType == Path) {          mReference = cg.readPathEntry(mKey, mDefault); @@ -347,7 +362,7 @@ KCoreConfigSkeleton::ItemUrl::ItemUrl(const QString &_group, const QString &_key  void KCoreConfigSkeleton::ItemUrl::writeConfig(KConfig *config)  {      if (mReference != mLoadedValue) { // WABA: Is this test needed? -        KConfigGroup cg(config, mGroup); +        KConfigGroup cg = configGroup(config);          if ((mDefault == mReference) && !cg.hasDefault(mKey)) {              cg.revertToDefault(mKey, writeFlags());          } else { @@ -359,7 +374,7 @@ void KCoreConfigSkeleton::ItemUrl::writeConfig(KConfig *config)  void KCoreConfigSkeleton::ItemUrl::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      mReference = QUrl(cg.readEntry<QString>(mKey, mDefault.toString()));      mLoadedValue = mReference; @@ -392,7 +407,7 @@ KCoreConfigSkeleton::ItemProperty::ItemProperty(const QString &_group,  void KCoreConfigSkeleton::ItemProperty::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      mReference = cg.readEntry(mKey, mDefault);      mLoadedValue = mReference; @@ -423,7 +438,7 @@ KCoreConfigSkeleton::ItemBool::ItemBool(const QString &_group, const QString &_k  void KCoreConfigSkeleton::ItemBool::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      mReference = cg.readEntry(mKey, mDefault);      mLoadedValue = mReference; @@ -454,7 +469,7 @@ KCoreConfigSkeleton::ItemInt::ItemInt(const QString &_group, const QString &_key  void KCoreConfigSkeleton::ItemInt::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      mReference = cg.readEntry(mKey, mDefault);      if (mHasMin) {          mReference = qMax(mReference, mMin); @@ -519,7 +534,7 @@ KCoreConfigSkeleton::ItemLongLong::ItemLongLong(const QString &_group, const QSt  void KCoreConfigSkeleton::ItemLongLong::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      mReference = cg.readEntry(mKey, mDefault);      if (mHasMin) {          mReference = qMax(mReference, mMin); @@ -585,7 +600,7 @@ KCoreConfigSkeleton::ItemEnum::ItemEnum(const QString &_group, const QString &_k  void KCoreConfigSkeleton::ItemEnum::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      if (!cg.hasKey(mKey)) {          mReference = mDefault;      } else { @@ -611,7 +626,7 @@ void KCoreConfigSkeleton::ItemEnum::readConfig(KConfig *config)  void KCoreConfigSkeleton::ItemEnum::writeConfig(KConfig *config)  {      if (mReference != mLoadedValue) { // WABA: Is this test needed? -        KConfigGroup cg(config, mGroup); +        KConfigGroup cg = configGroup(config);          if ((mDefault == mReference) && !cg.hasDefault(mKey)) {              cg.revertToDefault(mKey, writeFlags());          } else if ((mReference >= 0) && (mReference < mChoices.count())) { @@ -643,7 +658,7 @@ KCoreConfigSkeleton::ItemUInt::ItemUInt(const QString &_group, const QString &_k  void KCoreConfigSkeleton::ItemUInt::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      mReference = cg.readEntry(mKey, mDefault);      if (mHasMin) {          mReference = qMax(mReference, mMin); @@ -708,7 +723,7 @@ KCoreConfigSkeleton::ItemULongLong::ItemULongLong(const QString &_group, const Q  void KCoreConfigSkeleton::ItemULongLong::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      mReference = cg.readEntry(mKey, mDefault);      if (mHasMin) {          mReference = qMax(mReference, mMin); @@ -773,7 +788,7 @@ KCoreConfigSkeleton::ItemDouble::ItemDouble(const QString &_group, const QString  void KCoreConfigSkeleton::ItemDouble::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      mReference = cg.readEntry(mKey, mDefault);      if (mHasMin) {          mReference = qMax(mReference, mMin); @@ -838,7 +853,7 @@ KCoreConfigSkeleton::ItemRect::ItemRect(const QString &_group, const QString &_k  void KCoreConfigSkeleton::ItemRect::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      mReference = cg.readEntry(mKey, mDefault);      mLoadedValue = mReference; @@ -869,7 +884,7 @@ KCoreConfigSkeleton::ItemPoint::ItemPoint(const QString &_group, const QString &  void KCoreConfigSkeleton::ItemPoint::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      mReference = cg.readEntry(mKey, mDefault);      mLoadedValue = mReference; @@ -900,7 +915,7 @@ KCoreConfigSkeleton::ItemSize::ItemSize(const QString &_group, const QString &_k  void KCoreConfigSkeleton::ItemSize::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      mReference = cg.readEntry(mKey, mDefault);      mLoadedValue = mReference; @@ -931,7 +946,7 @@ KCoreConfigSkeleton::ItemDateTime::ItemDateTime(const QString &_group, const QSt  void KCoreConfigSkeleton::ItemDateTime::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      mReference = cg.readEntry(mKey, mDefault);      mLoadedValue = mReference; @@ -962,7 +977,7 @@ KCoreConfigSkeleton::ItemStringList::ItemStringList(const QString &_group, const  void KCoreConfigSkeleton::ItemStringList::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      if (!cg.hasKey(mKey)) {          mReference = mDefault;      } else { @@ -997,7 +1012,7 @@ KCoreConfigSkeleton::ItemPathList::ItemPathList(const QString &_group, const QSt  void KCoreConfigSkeleton::ItemPathList::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      if (!cg.hasKey(mKey)) {          mReference = mDefault;      } else { @@ -1011,7 +1026,7 @@ void KCoreConfigSkeleton::ItemPathList::readConfig(KConfig *config)  void KCoreConfigSkeleton::ItemPathList::writeConfig(KConfig *config)  {      if (mReference != mLoadedValue) { // WABA: Is this test needed? -        KConfigGroup cg(config, mGroup); +        KConfigGroup cg = configGroup(config);          if ((mDefault == mReference) && !cg.hasDefault(mKey)) {              cg.revertToDefault(mKey, writeFlags());          } else { @@ -1031,7 +1046,7 @@ KCoreConfigSkeleton::ItemUrlList::ItemUrlList(const QString &_group, const QStri  void KCoreConfigSkeleton::ItemUrlList::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      if (!cg.hasKey(mKey)) {          mReference = mDefault;      } else { @@ -1053,7 +1068,7 @@ void KCoreConfigSkeleton::ItemUrlList::readConfig(KConfig *config)  void KCoreConfigSkeleton::ItemUrlList::writeConfig(KConfig *config)  {      if (mReference != mLoadedValue) { // WABA: Is this test needed? -        KConfigGroup cg(config, mGroup); +        KConfigGroup cg = configGroup(config);          if ((mDefault == mReference) && !cg.hasDefault(mKey)) {              cg.revertToDefault(mKey, writeFlags());          } else { @@ -1091,7 +1106,7 @@ KCoreConfigSkeleton::ItemIntList::ItemIntList(const QString &_group, const QStri  void KCoreConfigSkeleton::ItemIntList::readConfig(KConfig *config)  { -    KConfigGroup cg(config, mGroup); +    KConfigGroup cg = configGroup(config);      if (!cg.hasKey(mKey)) {          mReference = mDefault;      } else { @@ -1560,7 +1575,7 @@ void KConfigCompilerSignallingItem::readConfig(KConfig* c)      QVariant oldValue = mItem->property();      mItem->readConfig(c);      //readConfig() changes mIsImmutable, update it here as well -    KConfigGroup cg(c, mGroup ); +    KConfigGroup cg = configGroup(c);      readImmutability(cg);      if (!mItem->isEqual(oldValue)) {          invokeNotifyFunction(); @@ -1571,7 +1586,7 @@ void KConfigCompilerSignallingItem::readDefault(KConfig* c)  {      mItem->readDefault(c);      //readDefault() changes mIsImmutable, update it here as well -    KConfigGroup cg(c, mGroup ); +    KConfigGroup cg = configGroup(c);      readImmutability(cg);  } @@ -1615,3 +1630,13 @@ KConfigBase::WriteConfigFlags KConfigCompilerSignallingItem::writeFlags() const  {      return mItem->writeFlags();  } + +void KConfigCompilerSignallingItem::setGroup(const KConfigGroup &cg) +{ +    mItem->setGroup(cg); +} + +KConfigGroup KConfigCompilerSignallingItem::configGroup(KConfig *config) const +{ +    return mItem->configGroup(config); +} diff --git a/src/core/kcoreconfigskeleton.h b/src/core/kcoreconfigskeleton.h index 7abc4052..02473fb4 100644 --- a/src/core/kcoreconfigskeleton.h +++ b/src/core/kcoreconfigskeleton.h @@ -34,6 +34,7 @@  #include <QStringList>  #include <QVariant>  #include <QUrl> +  class KCoreConfigSkeletonPrivate;  class KConfigSkeletonItemPrivate; @@ -82,6 +83,22 @@ public:      QString group() const;      /** +     * Set config file group but giving the KConfigGroup. +     * Allow the item to be in nested groups. +     * @since 5.68 +     */ +    void setGroup(const KConfigGroup &cg); + +    /** +     * Return a KConfigGroup, the one provided by setGroup(KConfigGroup) if it's valid, +     * or make one from @param config and item's group +     * @sa setGroup(const QString &_group) +     * @sa setGroup(KConfigGroup cg) +     * @since 5.68 +     */ +    KConfigGroup configGroup(KConfig *config) const; + +    /**       * Set config file key.       */      void setKey(const QString &_key); @@ -366,7 +383,7 @@ public:      void writeConfig(KConfig *config) override      {          if (mReference != mLoadedValue) { // Is this needed? -            KConfigGroup cg(config, mGroup); +            KConfigGroup cg = configGroup(config);              if ((mDefault == mReference) && !cg.hasDefault(mKey)) {                  cg.revertToDefault(mKey, writeFlags());              } else { @@ -436,10 +453,17 @@ public:      QVariant property() const override;      void setDefault() override;      void swapDefault() override; -    // shadow the method in KConfigSkeletonItem, which should be fine for autogenerated code      // KF6 TODO - fix this +    // Ideally we would do this in an overload of KConfigSkeletonItem, but +    // given we can't, I've shadowed the method. This isn't pretty, but given +    // the docs say it should generally only be used from auto generated code, +    // should be fine.      void setWriteFlags(KConfigBase::WriteConfigFlags flags);      KConfigBase::WriteConfigFlags writeFlags() const; +    void setGroup(const KConfigGroup &cg); +    KConfigGroup configGroup(KConfig *config) const; +    // END TODO +  private:      inline void invokeNotifyFunction()      { diff --git a/src/core/kcoreconfigskeleton_p.h b/src/core/kcoreconfigskeleton_p.h index 871122c0..8ba64db7 100644 --- a/src/core/kcoreconfigskeleton_p.h +++ b/src/core/kcoreconfigskeleton_p.h @@ -61,6 +61,7 @@ public:      QString mLabel; ///< The label for this item      QString mToolTip; ///< The ToolTip text for this item      QString mWhatsThis; ///< The What's This text for this item +    KConfigGroup mConfigGroup; ///< KConfigGroup, allow to read/write item in nested groups      // HACK: Necessary to avoid introducing new virtuals in KConfigSkeletonItem      std::function<bool()> mIsDefaultImpl; | 
