File indexing completed on 2024-05-12 03:54:26

0001 /*
0002     This file is part of KOrganizer.
0003     SPDX-FileCopyrightText: 2000, 2001 Cornelius Schumacher <schumacher@kde.org>
0004     SPDX-FileCopyrightText: 2003 Waldo Bastian <bastian@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 #include "kcoreconfigskeleton.h"
0010 #include "kcoreconfigskeleton_p.h"
0011 
0012 #include <QUrl>
0013 
0014 #include <algorithm>
0015 
0016 static QString obscuredString(const QString &str)
0017 {
0018     QString result;
0019     const QChar *unicode = str.unicode();
0020     for (int i = 0; i < str.length(); ++i) {
0021         // yes, no typo. can't encode ' ' or '!' because
0022         // they're the unicode BOM. stupid scrambling. stupid.
0023         result += (unicode[i].unicode() <= 0x21) ? unicode[i] : QChar(0x1001F - unicode[i].unicode());
0024     }
0025 
0026     return result;
0027 }
0028 
0029 KConfigSkeletonItemPrivate::~KConfigSkeletonItemPrivate() = default;
0030 
0031 KConfigSkeletonItem::KConfigSkeletonItem(const QString &_group, const QString &_key)
0032     : mGroup(_group)
0033     , mKey(_key)
0034     , d_ptr(new KConfigSkeletonItemPrivate)
0035 {
0036 }
0037 
0038 KConfigSkeletonItem::KConfigSkeletonItem(KConfigSkeletonItemPrivate &dd, const QString &_group, const QString &_key)
0039     : mGroup(_group)
0040     , mKey(_key)
0041     , d_ptr(&dd)
0042 {
0043 }
0044 
0045 KConfigSkeletonItem::~KConfigSkeletonItem()
0046 {
0047     delete d_ptr;
0048 }
0049 
0050 void KConfigSkeletonItem::setGroup(const QString &_group)
0051 {
0052     mGroup = _group;
0053 }
0054 
0055 void KConfigSkeletonItem::setGroup(const KConfigGroup &cg)
0056 {
0057     Q_D(KConfigSkeletonItem);
0058     d->mConfigGroup = cg;
0059 }
0060 
0061 KConfigGroup KConfigSkeletonItem::configGroup(KConfig *config) const
0062 {
0063     Q_D(const KConfigSkeletonItem);
0064     if (d->mConfigGroup.isValid()) {
0065         return d->mConfigGroup;
0066     }
0067     return KConfigGroup(config, mGroup);
0068 }
0069 
0070 QString KConfigSkeletonItem::group() const
0071 {
0072     return mGroup;
0073 }
0074 
0075 void KConfigSkeletonItem::setKey(const QString &_key)
0076 {
0077     mKey = _key;
0078 }
0079 
0080 QString KConfigSkeletonItem::key() const
0081 {
0082     return mKey;
0083 }
0084 
0085 void KConfigSkeletonItem::setName(const QString &_name)
0086 {
0087     mName = _name;
0088 }
0089 
0090 QString KConfigSkeletonItem::name() const
0091 {
0092     return mName;
0093 }
0094 
0095 void KConfigSkeletonItem::setLabel(const QString &l)
0096 {
0097     Q_D(KConfigSkeletonItem);
0098     d->mLabel = l;
0099 }
0100 
0101 QString KConfigSkeletonItem::label() const
0102 {
0103     Q_D(const KConfigSkeletonItem);
0104     return d->mLabel;
0105 }
0106 
0107 void KConfigSkeletonItem::setToolTip(const QString &t)
0108 {
0109     Q_D(KConfigSkeletonItem);
0110     d->mToolTip = t;
0111 }
0112 
0113 QString KConfigSkeletonItem::toolTip() const
0114 {
0115     Q_D(const KConfigSkeletonItem);
0116     return d->mToolTip;
0117 }
0118 
0119 void KConfigSkeletonItem::setWhatsThis(const QString &w)
0120 {
0121     Q_D(KConfigSkeletonItem);
0122     d->mWhatsThis = w;
0123 }
0124 
0125 QString KConfigSkeletonItem::whatsThis() const
0126 {
0127     Q_D(const KConfigSkeletonItem);
0128     return d->mWhatsThis;
0129 }
0130 
0131 void KConfigSkeletonItem::setWriteFlags(KConfigBase::WriteConfigFlags flags)
0132 {
0133     Q_D(KConfigSkeletonItem);
0134     d->mWriteFlags = flags;
0135 }
0136 
0137 KConfigBase::WriteConfigFlags KConfigSkeletonItem::writeFlags() const
0138 {
0139     Q_D(const KConfigSkeletonItem);
0140     return d->mWriteFlags;
0141 }
0142 
0143 QVariant KConfigSkeletonItem::minValue() const
0144 {
0145     return QVariant();
0146 }
0147 
0148 QVariant KConfigSkeletonItem::maxValue() const
0149 {
0150     return QVariant();
0151 }
0152 
0153 bool KConfigSkeletonItem::isImmutable() const
0154 {
0155     Q_D(const KConfigSkeletonItem);
0156     return d->mIsImmutable;
0157 }
0158 
0159 bool KConfigSkeletonItem::isDefault() const
0160 {
0161     Q_D(const KConfigSkeletonItem);
0162     return d->mIsDefaultImpl();
0163 }
0164 
0165 bool KConfigSkeletonItem::isSaveNeeded() const
0166 {
0167     Q_D(const KConfigSkeletonItem);
0168     return d->mIsSaveNeededImpl();
0169 }
0170 
0171 QVariant KConfigSkeletonItem::getDefault() const
0172 {
0173     Q_D(const KConfigSkeletonItem);
0174     return d->mGetDefaultImpl();
0175 }
0176 
0177 void KConfigSkeletonItem::readImmutability(const KConfigGroup &group)
0178 {
0179     Q_D(KConfigSkeletonItem);
0180     d->mIsImmutable = group.isEntryImmutable(mKey);
0181 }
0182 
0183 void KConfigSkeletonItem::setIsDefaultImpl(const std::function<bool()> &impl)
0184 {
0185     Q_D(KConfigSkeletonItem);
0186     d->mIsDefaultImpl = impl;
0187 }
0188 
0189 void KConfigSkeletonItem::setIsSaveNeededImpl(const std::function<bool()> &impl)
0190 {
0191     Q_D(KConfigSkeletonItem);
0192     d->mIsSaveNeededImpl = impl;
0193 }
0194 
0195 void KConfigSkeletonItem::setGetDefaultImpl(const std::function<QVariant()> &impl)
0196 {
0197     Q_D(KConfigSkeletonItem);
0198     d->mGetDefaultImpl = impl;
0199 }
0200 
0201 KPropertySkeletonItem::KPropertySkeletonItem(QObject *object, const QByteArray &propertyName, const QVariant &defaultValue)
0202     : KConfigSkeletonItem(*new KPropertySkeletonItemPrivate(object, propertyName, defaultValue), {}, {})
0203 {
0204     setIsDefaultImpl([this] {
0205         Q_D(const KPropertySkeletonItem);
0206         return d->mReference == d->mDefaultValue;
0207     });
0208     setIsSaveNeededImpl([this] {
0209         Q_D(const KPropertySkeletonItem);
0210         return d->mReference != d->mLoadedValue;
0211     });
0212     setGetDefaultImpl([this] {
0213         Q_D(const KPropertySkeletonItem);
0214         return d->mDefaultValue;
0215     });
0216 }
0217 
0218 QVariant KPropertySkeletonItem::property() const
0219 {
0220     Q_D(const KPropertySkeletonItem);
0221     return d->mReference;
0222 }
0223 
0224 void KPropertySkeletonItem::setProperty(const QVariant &p)
0225 {
0226     Q_D(KPropertySkeletonItem);
0227     if (d->mReference == p) {
0228         return;
0229     }
0230     d->mReference = p;
0231     if (d->mNotifyFunction) {
0232         d->mNotifyFunction();
0233     }
0234 }
0235 
0236 bool KPropertySkeletonItem::isEqual(const QVariant &p) const
0237 {
0238     Q_D(const KPropertySkeletonItem);
0239     return d->mReference == p;
0240 }
0241 
0242 void KPropertySkeletonItem::readConfig(KConfig *)
0243 {
0244     Q_D(KPropertySkeletonItem);
0245     setProperty(d->mObject->property(d->mPropertyName.constData()));
0246     d->mLoadedValue = d->mReference;
0247 }
0248 
0249 void KPropertySkeletonItem::writeConfig(KConfig *)
0250 {
0251     Q_D(KPropertySkeletonItem);
0252     d->mObject->setProperty(d->mPropertyName.constData(), d->mReference);
0253     d->mLoadedValue = d->mReference;
0254 }
0255 
0256 void KPropertySkeletonItem::readDefault(KConfig *)
0257 {
0258     Q_D(KPropertySkeletonItem);
0259     setProperty(d->mConstDefaultValue);
0260 }
0261 
0262 void KPropertySkeletonItem::setDefault()
0263 {
0264     Q_D(KPropertySkeletonItem);
0265     setProperty(d->mDefaultValue);
0266 }
0267 
0268 void KPropertySkeletonItem::swapDefault()
0269 {
0270     Q_D(KPropertySkeletonItem);
0271     if (d->mReference == d->mDefaultValue) {
0272         return;
0273     }
0274     std::swap(d->mReference, d->mDefaultValue);
0275     if (d->mNotifyFunction) {
0276         d->mNotifyFunction();
0277     }
0278 }
0279 
0280 void KPropertySkeletonItem::setNotifyFunction(const std::function<void()> &impl)
0281 {
0282     Q_D(KPropertySkeletonItem);
0283     d->mNotifyFunction = impl;
0284 }
0285 
0286 KCoreConfigSkeleton::ItemString::ItemString(const QString &_group, const QString &_key, QString &reference, const QString &defaultValue, Type type)
0287     : KConfigSkeletonGenericItem<QString>(_group, _key, reference, defaultValue)
0288     , mType(type)
0289 {
0290 }
0291 
0292 void KCoreConfigSkeleton::ItemString::writeConfig(KConfig *config)
0293 {
0294     if (mReference != mLoadedValue) { // WABA: Is this test needed?
0295         KConfigGroup cg = configGroup(config);
0296         if ((mDefault == mReference) && !cg.hasDefault(mKey)) {
0297             cg.revertToDefault(mKey, writeFlags());
0298         } else if (mType == Path) {
0299             cg.writePathEntry(mKey, mReference, writeFlags());
0300         } else if (mType == Password) {
0301             cg.writeEntry(mKey, obscuredString(mReference), writeFlags());
0302         } else {
0303             cg.writeEntry(mKey, mReference, writeFlags());
0304         }
0305         mLoadedValue = mReference;
0306     }
0307 }
0308 
0309 void KCoreConfigSkeleton::ItemString::readConfig(KConfig *config)
0310 {
0311     KConfigGroup cg = configGroup(config);
0312 
0313     if (mType == Path) {
0314         mReference = cg.readPathEntry(mKey, mDefault);
0315     } else if (mType == Password) {
0316         QString val = cg.readEntry(mKey, obscuredString(mDefault));
0317         mReference = obscuredString(val);
0318     } else {
0319         mReference = cg.readEntry(mKey, mDefault);
0320     }
0321 
0322     mLoadedValue = mReference;
0323 
0324     readImmutability(cg);
0325 }
0326 
0327 void KCoreConfigSkeleton::ItemString::setProperty(const QVariant &p)
0328 {
0329     mReference = p.toString();
0330 }
0331 
0332 bool KCoreConfigSkeleton::ItemString::isEqual(const QVariant &v) const
0333 {
0334     return mReference == v.toString();
0335 }
0336 
0337 QVariant KCoreConfigSkeleton::ItemString::property() const
0338 {
0339     return QVariant(mReference);
0340 }
0341 
0342 KCoreConfigSkeleton::ItemPassword::ItemPassword(const QString &_group, const QString &_key, QString &reference, const QString &defaultValue)
0343     : ItemString(_group, _key, reference, defaultValue, Password)
0344 {
0345 }
0346 
0347 KCoreConfigSkeleton::ItemPath::ItemPath(const QString &_group, const QString &_key, QString &reference, const QString &defaultValue)
0348     : ItemString(_group, _key, reference, defaultValue, Path)
0349 {
0350 }
0351 
0352 KCoreConfigSkeleton::ItemUrl::ItemUrl(const QString &_group, const QString &_key, QUrl &reference, const QUrl &defaultValue)
0353     : KConfigSkeletonGenericItem<QUrl>(_group, _key, reference, defaultValue)
0354 {
0355 }
0356 
0357 void KCoreConfigSkeleton::ItemUrl::writeConfig(KConfig *config)
0358 {
0359     if (mReference != mLoadedValue) { // WABA: Is this test needed?
0360         KConfigGroup cg = configGroup(config);
0361         if ((mDefault == mReference) && !cg.hasDefault(mKey)) {
0362             cg.revertToDefault(mKey, writeFlags());
0363         } else {
0364             cg.writeEntry<QString>(mKey, mReference.toString(), writeFlags());
0365         }
0366         mLoadedValue = mReference;
0367     }
0368 }
0369 
0370 void KCoreConfigSkeleton::ItemUrl::readConfig(KConfig *config)
0371 {
0372     KConfigGroup cg = configGroup(config);
0373 
0374     mReference = QUrl(cg.readEntry<QString>(mKey, mDefault.toString()));
0375     mLoadedValue = mReference;
0376 
0377     readImmutability(cg);
0378 }
0379 
0380 void KCoreConfigSkeleton::ItemUrl::setProperty(const QVariant &p)
0381 {
0382     mReference = qvariant_cast<QUrl>(p);
0383 }
0384 
0385 bool KCoreConfigSkeleton::ItemUrl::isEqual(const QVariant &v) const
0386 {
0387     return mReference == qvariant_cast<QUrl>(v);
0388 }
0389 
0390 QVariant KCoreConfigSkeleton::ItemUrl::property() const
0391 {
0392     return QVariant::fromValue<QUrl>(mReference);
0393 }
0394 
0395 KCoreConfigSkeleton::ItemProperty::ItemProperty(const QString &_group, const QString &_key, QVariant &reference, const QVariant &defaultValue)
0396     : KConfigSkeletonGenericItem<QVariant>(_group, _key, reference, defaultValue)
0397 {
0398 }
0399 
0400 void KCoreConfigSkeleton::ItemProperty::readConfig(KConfig *config)
0401 {
0402     KConfigGroup cg = configGroup(config);
0403     mReference = cg.readEntry(mKey, mDefault);
0404     mLoadedValue = mReference;
0405 
0406     readImmutability(cg);
0407 }
0408 
0409 void KCoreConfigSkeleton::ItemProperty::setProperty(const QVariant &p)
0410 {
0411     mReference = p;
0412 }
0413 
0414 bool KCoreConfigSkeleton::ItemProperty::isEqual(const QVariant &v) const
0415 {
0416     // this might cause problems if the QVariants are not of default types
0417     return mReference == v;
0418 }
0419 
0420 QVariant KCoreConfigSkeleton::ItemProperty::property() const
0421 {
0422     return mReference;
0423 }
0424 
0425 KCoreConfigSkeleton::ItemBool::ItemBool(const QString &_group, const QString &_key, bool &reference, bool defaultValue)
0426     : KConfigSkeletonGenericItem<bool>(_group, _key, reference, defaultValue)
0427 {
0428 }
0429 
0430 void KCoreConfigSkeleton::ItemBool::readConfig(KConfig *config)
0431 {
0432     KConfigGroup cg = configGroup(config);
0433     mReference = cg.readEntry(mKey, mDefault);
0434     mLoadedValue = mReference;
0435 
0436     readImmutability(cg);
0437 }
0438 
0439 void KCoreConfigSkeleton::ItemBool::setProperty(const QVariant &p)
0440 {
0441     mReference = p.toBool();
0442 }
0443 
0444 bool KCoreConfigSkeleton::ItemBool::isEqual(const QVariant &v) const
0445 {
0446     return mReference == v.toBool();
0447 }
0448 
0449 QVariant KCoreConfigSkeleton::ItemBool::property() const
0450 {
0451     return QVariant(mReference);
0452 }
0453 
0454 KCoreConfigSkeleton::ItemInt::ItemInt(const QString &_group, const QString &_key, qint32 &reference, qint32 defaultValue)
0455     : KConfigSkeletonGenericItem<qint32>(_group, _key, reference, defaultValue)
0456     , mHasMin(false)
0457     , mHasMax(false)
0458 {
0459 }
0460 
0461 void KCoreConfigSkeleton::ItemInt::readConfig(KConfig *config)
0462 {
0463     KConfigGroup cg = configGroup(config);
0464     mReference = cg.readEntry(mKey, mDefault);
0465     if (mHasMin) {
0466         mReference = qMax(mReference, mMin);
0467     }
0468     if (mHasMax) {
0469         mReference = qMin(mReference, mMax);
0470     }
0471     mLoadedValue = mReference;
0472 
0473     readImmutability(cg);
0474 }
0475 
0476 void KCoreConfigSkeleton::ItemInt::setProperty(const QVariant &p)
0477 {
0478     mReference = p.toInt();
0479 }
0480 
0481 bool KCoreConfigSkeleton::ItemInt::isEqual(const QVariant &v) const
0482 {
0483     return mReference == v.toInt();
0484 }
0485 
0486 QVariant KCoreConfigSkeleton::ItemInt::property() const
0487 {
0488     return QVariant(mReference);
0489 }
0490 
0491 QVariant KCoreConfigSkeleton::ItemInt::minValue() const
0492 {
0493     if (mHasMin) {
0494         return QVariant(mMin);
0495     }
0496     return QVariant();
0497 }
0498 
0499 QVariant KCoreConfigSkeleton::ItemInt::maxValue() const
0500 {
0501     if (mHasMax) {
0502         return QVariant(mMax);
0503     }
0504     return QVariant();
0505 }
0506 
0507 void KCoreConfigSkeleton::ItemInt::setMinValue(qint32 v)
0508 {
0509     mHasMin = true;
0510     mMin = v;
0511 }
0512 
0513 void KCoreConfigSkeleton::ItemInt::setMaxValue(qint32 v)
0514 {
0515     mHasMax = true;
0516     mMax = v;
0517 }
0518 
0519 KCoreConfigSkeleton::ItemLongLong::ItemLongLong(const QString &_group, const QString &_key, qint64 &reference, qint64 defaultValue)
0520     : KConfigSkeletonGenericItem<qint64>(_group, _key, reference, defaultValue)
0521     , mHasMin(false)
0522     , mHasMax(false)
0523 {
0524 }
0525 
0526 void KCoreConfigSkeleton::ItemLongLong::readConfig(KConfig *config)
0527 {
0528     KConfigGroup cg = configGroup(config);
0529     mReference = cg.readEntry(mKey, mDefault);
0530     if (mHasMin) {
0531         mReference = qMax(mReference, mMin);
0532     }
0533     if (mHasMax) {
0534         mReference = qMin(mReference, mMax);
0535     }
0536     mLoadedValue = mReference;
0537 
0538     readImmutability(cg);
0539 }
0540 
0541 void KCoreConfigSkeleton::ItemLongLong::setProperty(const QVariant &p)
0542 {
0543     mReference = p.toLongLong();
0544 }
0545 
0546 bool KCoreConfigSkeleton::ItemLongLong::isEqual(const QVariant &v) const
0547 {
0548     return mReference == v.toLongLong();
0549 }
0550 
0551 QVariant KCoreConfigSkeleton::ItemLongLong::property() const
0552 {
0553     return QVariant(mReference);
0554 }
0555 
0556 QVariant KCoreConfigSkeleton::ItemLongLong::minValue() const
0557 {
0558     if (mHasMin) {
0559         return QVariant(mMin);
0560     }
0561     return QVariant();
0562 }
0563 
0564 QVariant KCoreConfigSkeleton::ItemLongLong::maxValue() const
0565 {
0566     if (mHasMax) {
0567         return QVariant(mMax);
0568     }
0569     return QVariant();
0570 }
0571 
0572 void KCoreConfigSkeleton::ItemLongLong::setMinValue(qint64 v)
0573 {
0574     mHasMin = true;
0575     mMin = v;
0576 }
0577 
0578 void KCoreConfigSkeleton::ItemLongLong::setMaxValue(qint64 v)
0579 {
0580     mHasMax = true;
0581     mMax = v;
0582 }
0583 
0584 QString KCoreConfigSkeleton::ItemEnum::valueForChoice(const QString &name) const
0585 {
0586     for (auto it = mChoices.cbegin(); it != mChoices.cend(); ++it) {
0587         if (it->name == name) {
0588             return it->value.isEmpty() ? it->name : it->value;
0589         }
0590     }
0591     return name;
0592 }
0593 
0594 void KCoreConfigSkeleton::ItemEnum::setValueForChoice(const QString &name, const QString &value)
0595 {
0596     for (auto it = mChoices.begin(); it != mChoices.end(); ++it) {
0597         if (it->name == name) {
0598             it->value = value;
0599             return;
0600         }
0601     }
0602 }
0603 
0604 KCoreConfigSkeleton::ItemEnum::ItemEnum(const QString &_group, const QString &_key, qint32 &reference, const QList<Choice> &choices, qint32 defaultValue)
0605     : ItemInt(_group, _key, reference, defaultValue)
0606     , mChoices(choices)
0607 {
0608 }
0609 
0610 void KCoreConfigSkeleton::ItemEnum::readConfig(KConfig *config)
0611 {
0612     KConfigGroup cg = configGroup(config);
0613     if (!cg.hasKey(mKey)) {
0614         mReference = mDefault;
0615     } else {
0616         int i = 0;
0617         mReference = -1;
0618         const QString entryString = cg.readEntry(mKey, QString());
0619         for (auto it = mChoices.cbegin(); it != mChoices.cend(); ++it, ++i) {
0620             QString choiceName = (*it).name;
0621             if (valueForChoice(choiceName).compare(entryString, Qt::CaseInsensitive) == 0) {
0622                 mReference = i;
0623                 break;
0624             }
0625         }
0626         if (mReference == -1) {
0627             mReference = cg.readEntry(mKey, mDefault);
0628         }
0629     }
0630     mLoadedValue = mReference;
0631 
0632     readImmutability(cg);
0633 }
0634 
0635 void KCoreConfigSkeleton::ItemEnum::writeConfig(KConfig *config)
0636 {
0637     if (mReference != mLoadedValue) { // WABA: Is this test needed?
0638         KConfigGroup cg = configGroup(config);
0639         if ((mDefault == mReference) && !cg.hasDefault(mKey)) {
0640             cg.revertToDefault(mKey, writeFlags());
0641         } else if ((mReference >= 0) && (mReference < mChoices.count())) {
0642             cg.writeEntry(mKey, valueForChoice(mChoices.at(mReference).name), writeFlags());
0643         } else {
0644             cg.writeEntry(mKey, mReference, writeFlags());
0645         }
0646         mLoadedValue = mReference;
0647     }
0648 }
0649 
0650 QList<KCoreConfigSkeleton::ItemEnum::Choice> KCoreConfigSkeleton::ItemEnum::choices() const
0651 {
0652     return mChoices;
0653 }
0654 
0655 KCoreConfigSkeleton::ItemUInt::ItemUInt(const QString &_group, const QString &_key, quint32 &reference, quint32 defaultValue)
0656     : KConfigSkeletonGenericItem<quint32>(_group, _key, reference, defaultValue)
0657     , mHasMin(false)
0658     , mHasMax(false)
0659 {
0660 }
0661 
0662 void KCoreConfigSkeleton::ItemUInt::readConfig(KConfig *config)
0663 {
0664     KConfigGroup cg = configGroup(config);
0665     mReference = cg.readEntry(mKey, mDefault);
0666     if (mHasMin) {
0667         mReference = qMax(mReference, mMin);
0668     }
0669     if (mHasMax) {
0670         mReference = qMin(mReference, mMax);
0671     }
0672     mLoadedValue = mReference;
0673 
0674     readImmutability(cg);
0675 }
0676 
0677 void KCoreConfigSkeleton::ItemUInt::setProperty(const QVariant &p)
0678 {
0679     mReference = p.toUInt();
0680 }
0681 
0682 bool KCoreConfigSkeleton::ItemUInt::isEqual(const QVariant &v) const
0683 {
0684     return mReference == v.toUInt();
0685 }
0686 
0687 QVariant KCoreConfigSkeleton::ItemUInt::property() const
0688 {
0689     return QVariant(mReference);
0690 }
0691 
0692 QVariant KCoreConfigSkeleton::ItemUInt::minValue() const
0693 {
0694     if (mHasMin) {
0695         return QVariant(mMin);
0696     }
0697     return QVariant();
0698 }
0699 
0700 QVariant KCoreConfigSkeleton::ItemUInt::maxValue() const
0701 {
0702     if (mHasMax) {
0703         return QVariant(mMax);
0704     }
0705     return QVariant();
0706 }
0707 
0708 void KCoreConfigSkeleton::ItemUInt::setMinValue(quint32 v)
0709 {
0710     mHasMin = true;
0711     mMin = v;
0712 }
0713 
0714 void KCoreConfigSkeleton::ItemUInt::setMaxValue(quint32 v)
0715 {
0716     mHasMax = true;
0717     mMax = v;
0718 }
0719 
0720 KCoreConfigSkeleton::ItemULongLong::ItemULongLong(const QString &_group, const QString &_key, quint64 &reference, quint64 defaultValue)
0721     : KConfigSkeletonGenericItem<quint64>(_group, _key, reference, defaultValue)
0722     , mHasMin(false)
0723     , mHasMax(false)
0724 {
0725 }
0726 
0727 void KCoreConfigSkeleton::ItemULongLong::readConfig(KConfig *config)
0728 {
0729     KConfigGroup cg = configGroup(config);
0730     mReference = cg.readEntry(mKey, mDefault);
0731     if (mHasMin) {
0732         mReference = qMax(mReference, mMin);
0733     }
0734     if (mHasMax) {
0735         mReference = qMin(mReference, mMax);
0736     }
0737     mLoadedValue = mReference;
0738 
0739     readImmutability(cg);
0740 }
0741 
0742 void KCoreConfigSkeleton::ItemULongLong::setProperty(const QVariant &p)
0743 {
0744     mReference = p.toULongLong();
0745 }
0746 
0747 bool KCoreConfigSkeleton::ItemULongLong::isEqual(const QVariant &v) const
0748 {
0749     return mReference == v.toULongLong();
0750 }
0751 
0752 QVariant KCoreConfigSkeleton::ItemULongLong::property() const
0753 {
0754     return QVariant(mReference);
0755 }
0756 
0757 QVariant KCoreConfigSkeleton::ItemULongLong::minValue() const
0758 {
0759     if (mHasMin) {
0760         return QVariant(mMin);
0761     }
0762     return QVariant();
0763 }
0764 
0765 QVariant KCoreConfigSkeleton::ItemULongLong::maxValue() const
0766 {
0767     if (mHasMax) {
0768         return QVariant(mMax);
0769     }
0770     return QVariant();
0771 }
0772 
0773 void KCoreConfigSkeleton::ItemULongLong::setMinValue(quint64 v)
0774 {
0775     mHasMin = true;
0776     mMin = v;
0777 }
0778 
0779 void KCoreConfigSkeleton::ItemULongLong::setMaxValue(quint64 v)
0780 {
0781     mHasMax = true;
0782     mMax = v;
0783 }
0784 
0785 KCoreConfigSkeleton::ItemDouble::ItemDouble(const QString &_group, const QString &_key, double &reference, double defaultValue)
0786     : KConfigSkeletonGenericItem<double>(_group, _key, reference, defaultValue)
0787     , mHasMin(false)
0788     , mHasMax(false)
0789 {
0790 }
0791 
0792 void KCoreConfigSkeleton::ItemDouble::readConfig(KConfig *config)
0793 {
0794     KConfigGroup cg = configGroup(config);
0795     mReference = cg.readEntry(mKey, mDefault);
0796     if (mHasMin) {
0797         mReference = qMax(mReference, mMin);
0798     }
0799     if (mHasMax) {
0800         mReference = qMin(mReference, mMax);
0801     }
0802     mLoadedValue = mReference;
0803 
0804     readImmutability(cg);
0805 }
0806 
0807 void KCoreConfigSkeleton::ItemDouble::setProperty(const QVariant &p)
0808 {
0809     mReference = p.toDouble();
0810 }
0811 
0812 bool KCoreConfigSkeleton::ItemDouble::isEqual(const QVariant &v) const
0813 {
0814     return mReference == v.toDouble();
0815 }
0816 
0817 QVariant KCoreConfigSkeleton::ItemDouble::property() const
0818 {
0819     return QVariant(mReference);
0820 }
0821 
0822 QVariant KCoreConfigSkeleton::ItemDouble::minValue() const
0823 {
0824     if (mHasMin) {
0825         return QVariant(mMin);
0826     }
0827     return QVariant();
0828 }
0829 
0830 QVariant KCoreConfigSkeleton::ItemDouble::maxValue() const
0831 {
0832     if (mHasMax) {
0833         return QVariant(mMax);
0834     }
0835     return QVariant();
0836 }
0837 
0838 void KCoreConfigSkeleton::ItemDouble::setMinValue(double v)
0839 {
0840     mHasMin = true;
0841     mMin = v;
0842 }
0843 
0844 void KCoreConfigSkeleton::ItemDouble::setMaxValue(double v)
0845 {
0846     mHasMax = true;
0847     mMax = v;
0848 }
0849 
0850 KCoreConfigSkeleton::ItemRect::ItemRect(const QString &_group, const QString &_key, QRect &reference, const QRect &defaultValue)
0851     : KConfigSkeletonGenericItem<QRect>(_group, _key, reference, defaultValue)
0852 {
0853 }
0854 
0855 void KCoreConfigSkeleton::ItemRect::readConfig(KConfig *config)
0856 {
0857     KConfigGroup cg = configGroup(config);
0858     mReference = cg.readEntry(mKey, mDefault);
0859     mLoadedValue = mReference;
0860 
0861     readImmutability(cg);
0862 }
0863 
0864 void KCoreConfigSkeleton::ItemRect::setProperty(const QVariant &p)
0865 {
0866     mReference = p.toRect();
0867 }
0868 
0869 bool KCoreConfigSkeleton::ItemRect::isEqual(const QVariant &v) const
0870 {
0871     return mReference == v.toRect();
0872 }
0873 
0874 QVariant KCoreConfigSkeleton::ItemRect::property() const
0875 {
0876     return QVariant(mReference);
0877 }
0878 
0879 KCoreConfigSkeleton::ItemRectF::ItemRectF(const QString &_group, const QString &_key, QRectF &reference, const QRectF &defaultValue)
0880     : KConfigSkeletonGenericItem<QRectF>(_group, _key, reference, defaultValue)
0881 {
0882 }
0883 
0884 void KCoreConfigSkeleton::ItemRectF::readConfig(KConfig *config)
0885 {
0886     KConfigGroup cg = configGroup(config);
0887     mReference = cg.readEntry(mKey, mDefault);
0888     mLoadedValue = mReference;
0889 
0890     readImmutability(cg);
0891 }
0892 
0893 void KCoreConfigSkeleton::ItemRectF::setProperty(const QVariant &p)
0894 {
0895     mReference = p.toRectF();
0896 }
0897 
0898 bool KCoreConfigSkeleton::ItemRectF::isEqual(const QVariant &v) const
0899 {
0900     return mReference == v.toRectF();
0901 }
0902 
0903 QVariant KCoreConfigSkeleton::ItemRectF::property() const
0904 {
0905     return QVariant(mReference);
0906 }
0907 
0908 KCoreConfigSkeleton::ItemPoint::ItemPoint(const QString &_group, const QString &_key, QPoint &reference, const QPoint &defaultValue)
0909     : KConfigSkeletonGenericItem<QPoint>(_group, _key, reference, defaultValue)
0910 {
0911 }
0912 
0913 void KCoreConfigSkeleton::ItemPoint::readConfig(KConfig *config)
0914 {
0915     KConfigGroup cg = configGroup(config);
0916     mReference = cg.readEntry(mKey, mDefault);
0917     mLoadedValue = mReference;
0918 
0919     readImmutability(cg);
0920 }
0921 
0922 void KCoreConfigSkeleton::ItemPoint::setProperty(const QVariant &p)
0923 {
0924     mReference = p.toPoint();
0925 }
0926 
0927 bool KCoreConfigSkeleton::ItemPoint::isEqual(const QVariant &v) const
0928 {
0929     return mReference == v.toPoint();
0930 }
0931 
0932 QVariant KCoreConfigSkeleton::ItemPoint::property() const
0933 {
0934     return QVariant(mReference);
0935 }
0936 
0937 KCoreConfigSkeleton::ItemPointF::ItemPointF(const QString &_group, const QString &_key, QPointF &reference, const QPointF &defaultValue)
0938     : KConfigSkeletonGenericItem<QPointF>(_group, _key, reference, defaultValue)
0939 {
0940 }
0941 
0942 void KCoreConfigSkeleton::ItemPointF::readConfig(KConfig *config)
0943 {
0944     KConfigGroup cg = configGroup(config);
0945     mReference = cg.readEntry(mKey, mDefault);
0946     mLoadedValue = mReference;
0947 
0948     readImmutability(cg);
0949 }
0950 
0951 void KCoreConfigSkeleton::ItemPointF::setProperty(const QVariant &p)
0952 {
0953     mReference = p.toPointF();
0954 }
0955 
0956 bool KCoreConfigSkeleton::ItemPointF::isEqual(const QVariant &v) const
0957 {
0958     return mReference == v.toPointF();
0959 }
0960 
0961 QVariant KCoreConfigSkeleton::ItemPointF::property() const
0962 {
0963     return QVariant(mReference);
0964 }
0965 
0966 KCoreConfigSkeleton::ItemSize::ItemSize(const QString &_group, const QString &_key, QSize &reference, const QSize &defaultValue)
0967     : KConfigSkeletonGenericItem<QSize>(_group, _key, reference, defaultValue)
0968 {
0969 }
0970 
0971 void KCoreConfigSkeleton::ItemSize::readConfig(KConfig *config)
0972 {
0973     KConfigGroup cg = configGroup(config);
0974     mReference = cg.readEntry(mKey, mDefault);
0975     mLoadedValue = mReference;
0976 
0977     readImmutability(cg);
0978 }
0979 
0980 void KCoreConfigSkeleton::ItemSize::setProperty(const QVariant &p)
0981 {
0982     mReference = p.toSize();
0983 }
0984 
0985 bool KCoreConfigSkeleton::ItemSize::isEqual(const QVariant &v) const
0986 {
0987     return mReference == v.toSize();
0988 }
0989 
0990 QVariant KCoreConfigSkeleton::ItemSize::property() const
0991 {
0992     return QVariant(mReference);
0993 }
0994 
0995 KCoreConfigSkeleton::ItemSizeF::ItemSizeF(const QString &_group, const QString &_key, QSizeF &reference, const QSizeF &defaultValue)
0996     : KConfigSkeletonGenericItem<QSizeF>(_group, _key, reference, defaultValue)
0997 {
0998 }
0999 
1000 void KCoreConfigSkeleton::ItemSizeF::readConfig(KConfig *config)
1001 {
1002     KConfigGroup cg = configGroup(config);
1003     mReference = cg.readEntry(mKey, mDefault);
1004     mLoadedValue = mReference;
1005 
1006     readImmutability(cg);
1007 }
1008 
1009 void KCoreConfigSkeleton::ItemSizeF::setProperty(const QVariant &p)
1010 {
1011     mReference = p.toSizeF();
1012 }
1013 
1014 bool KCoreConfigSkeleton::ItemSizeF::isEqual(const QVariant &v) const
1015 {
1016     return mReference == v.toSizeF();
1017 }
1018 
1019 QVariant KCoreConfigSkeleton::ItemSizeF::property() const
1020 {
1021     return QVariant(mReference);
1022 }
1023 
1024 KCoreConfigSkeleton::ItemDateTime::ItemDateTime(const QString &_group, const QString &_key, QDateTime &reference, const QDateTime &defaultValue)
1025     : KConfigSkeletonGenericItem<QDateTime>(_group, _key, reference, defaultValue)
1026 {
1027 }
1028 
1029 void KCoreConfigSkeleton::ItemDateTime::readConfig(KConfig *config)
1030 {
1031     KConfigGroup cg = configGroup(config);
1032     mReference = cg.readEntry(mKey, mDefault);
1033     mLoadedValue = mReference;
1034 
1035     readImmutability(cg);
1036 }
1037 
1038 void KCoreConfigSkeleton::ItemDateTime::setProperty(const QVariant &p)
1039 {
1040     mReference = p.toDateTime();
1041 }
1042 
1043 bool KCoreConfigSkeleton::ItemDateTime::isEqual(const QVariant &v) const
1044 {
1045     return mReference == v.toDateTime();
1046 }
1047 
1048 QVariant KCoreConfigSkeleton::ItemDateTime::property() const
1049 {
1050     return QVariant(mReference);
1051 }
1052 
1053 KCoreConfigSkeleton::ItemStringList::ItemStringList(const QString &_group, const QString &_key, QStringList &reference, const QStringList &defaultValue)
1054     : KConfigSkeletonGenericItem<QStringList>(_group, _key, reference, defaultValue)
1055 {
1056 }
1057 
1058 void KCoreConfigSkeleton::ItemStringList::readConfig(KConfig *config)
1059 {
1060     KConfigGroup cg = configGroup(config);
1061     if (!cg.hasKey(mKey)) {
1062         mReference = mDefault;
1063     } else {
1064         mReference = cg.readEntry(mKey, mDefault);
1065     }
1066     mLoadedValue = mReference;
1067 
1068     readImmutability(cg);
1069 }
1070 
1071 void KCoreConfigSkeleton::ItemStringList::setProperty(const QVariant &p)
1072 {
1073     mReference = p.toStringList();
1074 }
1075 
1076 bool KCoreConfigSkeleton::ItemStringList::isEqual(const QVariant &v) const
1077 {
1078     return mReference == v.toStringList();
1079 }
1080 
1081 QVariant KCoreConfigSkeleton::ItemStringList::property() const
1082 {
1083     return QVariant(mReference);
1084 }
1085 
1086 KCoreConfigSkeleton::ItemPathList::ItemPathList(const QString &_group, const QString &_key, QStringList &reference, const QStringList &defaultValue)
1087     : ItemStringList(_group, _key, reference, defaultValue)
1088 {
1089 }
1090 
1091 void KCoreConfigSkeleton::ItemPathList::readConfig(KConfig *config)
1092 {
1093     KConfigGroup cg = configGroup(config);
1094     if (!cg.hasKey(mKey)) {
1095         mReference = mDefault;
1096     } else {
1097         mReference = cg.readPathEntry(mKey, QStringList());
1098     }
1099     mLoadedValue = mReference;
1100 
1101     readImmutability(cg);
1102 }
1103 
1104 void KCoreConfigSkeleton::ItemPathList::writeConfig(KConfig *config)
1105 {
1106     if (mReference != mLoadedValue) { // WABA: Is this test needed?
1107         KConfigGroup cg = configGroup(config);
1108         if ((mDefault == mReference) && !cg.hasDefault(mKey)) {
1109             cg.revertToDefault(mKey, writeFlags());
1110         } else {
1111             QStringList sl = mReference;
1112             cg.writePathEntry(mKey, sl, writeFlags());
1113         }
1114         mLoadedValue = mReference;
1115     }
1116 }
1117 
1118 KCoreConfigSkeleton::ItemUrlList::ItemUrlList(const QString &_group, const QString &_key, QList<QUrl> &reference, const QList<QUrl> &defaultValue)
1119     : KConfigSkeletonGenericItem<QList<QUrl>>(_group, _key, reference, defaultValue)
1120 {
1121 }
1122 
1123 void KCoreConfigSkeleton::ItemUrlList::readConfig(KConfig *config)
1124 {
1125     KConfigGroup cg = configGroup(config);
1126     if (!cg.hasKey(mKey)) {
1127         mReference = mDefault;
1128     } else {
1129         QStringList strList;
1130         for (const QUrl &url : std::as_const(mDefault)) {
1131             strList.append(url.toString());
1132         }
1133         mReference.clear();
1134         const QStringList readList = cg.readEntry<QStringList>(mKey, strList);
1135         for (const QString &str : readList) {
1136             mReference.append(QUrl(str));
1137         }
1138     }
1139     mLoadedValue = mReference;
1140 
1141     readImmutability(cg);
1142 }
1143 
1144 void KCoreConfigSkeleton::ItemUrlList::writeConfig(KConfig *config)
1145 {
1146     if (mReference != mLoadedValue) { // WABA: Is this test needed?
1147         KConfigGroup cg = configGroup(config);
1148         if ((mDefault == mReference) && !cg.hasDefault(mKey)) {
1149             cg.revertToDefault(mKey, writeFlags());
1150         } else {
1151             QStringList strList;
1152             for (const QUrl &url : std::as_const(mReference)) {
1153                 strList.append(url.toString());
1154             }
1155             cg.writeEntry<QStringList>(mKey, strList, writeFlags());
1156         }
1157         mLoadedValue = mReference;
1158     }
1159 }
1160 
1161 void KCoreConfigSkeleton::ItemUrlList::setProperty(const QVariant &p)
1162 {
1163     mReference = qvariant_cast<QList<QUrl>>(p);
1164 }
1165 
1166 bool KCoreConfigSkeleton::ItemUrlList::isEqual(const QVariant &v) const
1167 {
1168     return mReference == qvariant_cast<QList<QUrl>>(v);
1169 }
1170 
1171 QVariant KCoreConfigSkeleton::ItemUrlList::property() const
1172 {
1173     return QVariant::fromValue<QList<QUrl>>(mReference);
1174 }
1175 
1176 KCoreConfigSkeleton::ItemIntList::ItemIntList(const QString &_group, const QString &_key, QList<int> &reference, const QList<int> &defaultValue)
1177     : KConfigSkeletonGenericItem<QList<int>>(_group, _key, reference, defaultValue)
1178 {
1179 }
1180 
1181 void KCoreConfigSkeleton::ItemIntList::readConfig(KConfig *config)
1182 {
1183     KConfigGroup cg = configGroup(config);
1184     if (!cg.hasKey(mKey)) {
1185         mReference = mDefault;
1186     } else {
1187         mReference = cg.readEntry(mKey, mDefault);
1188     }
1189     mLoadedValue = mReference;
1190 
1191     readImmutability(cg);
1192 }
1193 
1194 void KCoreConfigSkeleton::ItemIntList::setProperty(const QVariant &p)
1195 {
1196     mReference = qvariant_cast<QList<int>>(p);
1197 }
1198 
1199 bool KCoreConfigSkeleton::ItemIntList::isEqual(const QVariant &v) const
1200 {
1201     return mReference == qvariant_cast<QList<int>>(v);
1202 }
1203 
1204 QVariant KCoreConfigSkeleton::ItemIntList::property() const
1205 {
1206     return QVariant::fromValue<QList<int>>(mReference);
1207 }
1208 
1209 // static int kCoreConfigSkeletionDebugArea() { static int s_area = KDebug::registerArea("kdecore (KConfigSkeleton)"); return s_area; }
1210 
1211 KCoreConfigSkeleton::KCoreConfigSkeleton(const QString &configname, QObject *parent)
1212     : QObject(parent)
1213     , d(new KCoreConfigSkeletonPrivate)
1214 {
1215     // qDebug() << "Creating KCoreConfigSkeleton (" << (void *)this << ")";
1216 
1217     d->mConfig = KSharedConfig::openConfig(configname, KConfig::FullConfig);
1218 }
1219 
1220 KCoreConfigSkeleton::KCoreConfigSkeleton(KSharedConfig::Ptr pConfig, QObject *parent)
1221     : QObject(parent)
1222     , d(new KCoreConfigSkeletonPrivate)
1223 {
1224     // qDebug() << "Creating KCoreConfigSkeleton (" << (void *)this << ")";
1225     d->mConfig = std::move(pConfig);
1226 }
1227 
1228 KCoreConfigSkeleton::~KCoreConfigSkeleton()
1229 {
1230     delete d;
1231 }
1232 
1233 void KCoreConfigSkeleton::setCurrentGroup(const QString &group)
1234 {
1235     d->mCurrentGroup = group;
1236 }
1237 
1238 QString KCoreConfigSkeleton::currentGroup() const
1239 {
1240     return d->mCurrentGroup;
1241 }
1242 
1243 KConfig *KCoreConfigSkeleton::config()
1244 {
1245     return d->mConfig.data();
1246 }
1247 
1248 const KConfig *KCoreConfigSkeleton::config() const
1249 {
1250     return d->mConfig.data();
1251 }
1252 
1253 KSharedConfig::Ptr KCoreConfigSkeleton::sharedConfig() const
1254 {
1255     return d->mConfig;
1256 }
1257 
1258 void KCoreConfigSkeleton::setSharedConfig(KSharedConfig::Ptr pConfig)
1259 {
1260     d->mConfig = std::move(pConfig);
1261 }
1262 
1263 KConfigSkeletonItem::List KCoreConfigSkeleton::items() const
1264 {
1265     return d->mItems;
1266 }
1267 
1268 bool KCoreConfigSkeleton::useDefaults(bool b)
1269 {
1270     if (b == d->mUseDefaults) {
1271         return d->mUseDefaults;
1272     }
1273 
1274     d->mUseDefaults = b;
1275     for (auto *skelItem : std::as_const(d->mItems)) {
1276         skelItem->swapDefault();
1277     }
1278 
1279     usrUseDefaults(b);
1280     return !d->mUseDefaults;
1281 }
1282 
1283 void KCoreConfigSkeleton::setDefaults()
1284 {
1285     for (auto *skelItem : std::as_const(d->mItems)) {
1286         skelItem->setDefault();
1287     }
1288     usrSetDefaults();
1289 }
1290 
1291 void KCoreConfigSkeleton::load()
1292 {
1293     d->mConfig->reparseConfiguration();
1294     read();
1295 }
1296 
1297 void KCoreConfigSkeleton::read()
1298 {
1299     for (auto *skelItem : std::as_const(d->mItems)) {
1300         skelItem->readConfig(d->mConfig.data());
1301     }
1302     usrRead();
1303 }
1304 
1305 bool KCoreConfigSkeleton::isDefaults() const
1306 {
1307     return std::all_of(d->mItems.cbegin(), d->mItems.cend(), [](KConfigSkeletonItem *skelItem) {
1308         return skelItem->isDefault();
1309     });
1310 }
1311 
1312 bool KCoreConfigSkeleton::isSaveNeeded() const
1313 {
1314     return std::any_of(d->mItems.cbegin(), d->mItems.cend(), [](KConfigSkeletonItem *skelItem) {
1315         return skelItem->isSaveNeeded();
1316     });
1317 }
1318 
1319 bool KCoreConfigSkeleton::save()
1320 {
1321     // qDebug();
1322     for (auto *skelItem : std::as_const(d->mItems)) {
1323         skelItem->writeConfig(d->mConfig.data());
1324     }
1325 
1326     if (!usrSave()) {
1327         return false;
1328     }
1329 
1330     if (d->mConfig->isDirty()) {
1331         if (!d->mConfig->sync()) {
1332             return false;
1333         }
1334         Q_EMIT configChanged();
1335     }
1336     return true;
1337 }
1338 
1339 bool KCoreConfigSkeleton::usrUseDefaults(bool)
1340 {
1341     return false;
1342 }
1343 
1344 void KCoreConfigSkeleton::usrSetDefaults()
1345 {
1346 }
1347 
1348 void KCoreConfigSkeleton::usrRead()
1349 {
1350 }
1351 
1352 bool KCoreConfigSkeleton::usrSave()
1353 {
1354     return true;
1355 }
1356 
1357 void KCoreConfigSkeleton::addItem(KConfigSkeletonItem *item, const QString &name)
1358 {
1359     if (d->mItems.contains(item)) {
1360         if (item->name() == name || (name.isEmpty() && item->name() == item->key())) {
1361             // nothing to do -> it is already in our collection
1362             // and the name isn't changing
1363             return;
1364         }
1365 
1366         d->mItemDict.remove(item->name());
1367     } else {
1368         d->mItems.append(item);
1369     }
1370 
1371     item->setName(name.isEmpty() ? item->key() : name);
1372     d->mItemDict.insert(item->name(), item);
1373     item->readDefault(d->mConfig.data());
1374     item->readConfig(d->mConfig.data());
1375 }
1376 
1377 void KCoreConfigSkeleton::removeItem(const QString &name)
1378 {
1379     KConfigSkeletonItem *item = d->mItemDict.value(name);
1380     if (item) {
1381         d->mItems.removeAll(item);
1382         d->mItemDict.remove(item->name());
1383         delete item;
1384     }
1385 }
1386 
1387 void KCoreConfigSkeleton::clearItems()
1388 {
1389     KConfigSkeletonItem::List items = d->mItems;
1390     d->mItems.clear();
1391     d->mItemDict.clear();
1392     qDeleteAll(items);
1393 }
1394 
1395 KCoreConfigSkeleton::ItemString *KCoreConfigSkeleton::addItemString(const QString &name, QString &reference, const QString &defaultValue, const QString &key)
1396 {
1397     KCoreConfigSkeleton::ItemString *item;
1398     item = new KCoreConfigSkeleton::ItemString(d->mCurrentGroup, key.isEmpty() ? name : key, reference, defaultValue, KCoreConfigSkeleton::ItemString::Normal);
1399     addItem(item, name);
1400     return item;
1401 }
1402 
1403 KCoreConfigSkeleton::ItemPassword *
1404 KCoreConfigSkeleton::addItemPassword(const QString &name, QString &reference, const QString &defaultValue, const QString &key)
1405 {
1406     KCoreConfigSkeleton::ItemPassword *item;
1407     item = new KCoreConfigSkeleton::ItemPassword(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1408     addItem(item, name);
1409     return item;
1410 }
1411 
1412 KCoreConfigSkeleton::ItemPath *KCoreConfigSkeleton::addItemPath(const QString &name, QString &reference, const QString &defaultValue, const QString &key)
1413 {
1414     KCoreConfigSkeleton::ItemPath *item;
1415     item = new KCoreConfigSkeleton::ItemPath(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1416     addItem(item, name);
1417     return item;
1418 }
1419 
1420 KCoreConfigSkeleton::ItemProperty *
1421 KCoreConfigSkeleton::addItemProperty(const QString &name, QVariant &reference, const QVariant &defaultValue, const QString &key)
1422 {
1423     KCoreConfigSkeleton::ItemProperty *item;
1424     item = new KCoreConfigSkeleton::ItemProperty(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1425     addItem(item, name);
1426     return item;
1427 }
1428 
1429 KCoreConfigSkeleton::ItemBool *KCoreConfigSkeleton::addItemBool(const QString &name, bool &reference, bool defaultValue, const QString &key)
1430 {
1431     KCoreConfigSkeleton::ItemBool *item;
1432     item = new KCoreConfigSkeleton::ItemBool(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1433     addItem(item, name);
1434     return item;
1435 }
1436 
1437 KCoreConfigSkeleton::ItemInt *KCoreConfigSkeleton::addItemInt(const QString &name, qint32 &reference, qint32 defaultValue, const QString &key)
1438 {
1439     KCoreConfigSkeleton::ItemInt *item;
1440     item = new KCoreConfigSkeleton::ItemInt(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1441     addItem(item, name);
1442     return item;
1443 }
1444 
1445 KCoreConfigSkeleton::ItemUInt *KCoreConfigSkeleton::addItemUInt(const QString &name, quint32 &reference, quint32 defaultValue, const QString &key)
1446 {
1447     KCoreConfigSkeleton::ItemUInt *item;
1448     item = new KCoreConfigSkeleton::ItemUInt(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1449     addItem(item, name);
1450     return item;
1451 }
1452 
1453 KCoreConfigSkeleton::ItemLongLong *KCoreConfigSkeleton::addItemLongLong(const QString &name, qint64 &reference, qint64 defaultValue, const QString &key)
1454 {
1455     KCoreConfigSkeleton::ItemLongLong *item;
1456     item = new KCoreConfigSkeleton::ItemLongLong(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1457     addItem(item, name);
1458     return item;
1459 }
1460 
1461 KCoreConfigSkeleton::ItemULongLong *KCoreConfigSkeleton::addItemULongLong(const QString &name, quint64 &reference, quint64 defaultValue, const QString &key)
1462 {
1463     KCoreConfigSkeleton::ItemULongLong *item;
1464     item = new KCoreConfigSkeleton::ItemULongLong(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1465     addItem(item, name);
1466     return item;
1467 }
1468 
1469 KCoreConfigSkeleton::ItemDouble *KCoreConfigSkeleton::addItemDouble(const QString &name, double &reference, double defaultValue, const QString &key)
1470 {
1471     KCoreConfigSkeleton::ItemDouble *item;
1472     item = new KCoreConfigSkeleton::ItemDouble(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1473     addItem(item, name);
1474     return item;
1475 }
1476 
1477 KCoreConfigSkeleton::ItemRect *KCoreConfigSkeleton::addItemRect(const QString &name, QRect &reference, const QRect &defaultValue, const QString &key)
1478 {
1479     KCoreConfigSkeleton::ItemRect *item;
1480     item = new KCoreConfigSkeleton::ItemRect(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1481     addItem(item, name);
1482     return item;
1483 }
1484 
1485 KCoreConfigSkeleton::ItemRectF *KCoreConfigSkeleton::addItemRectF(const QString &name, QRectF &reference, const QRectF &defaultValue, const QString &key)
1486 {
1487     KCoreConfigSkeleton::ItemRectF *item;
1488     item = new KCoreConfigSkeleton::ItemRectF(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1489     addItem(item, name);
1490     return item;
1491 }
1492 
1493 KCoreConfigSkeleton::ItemPoint *KCoreConfigSkeleton::addItemPoint(const QString &name, QPoint &reference, const QPoint &defaultValue, const QString &key)
1494 {
1495     KCoreConfigSkeleton::ItemPoint *item;
1496     item = new KCoreConfigSkeleton::ItemPoint(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1497     addItem(item, name);
1498     return item;
1499 }
1500 
1501 KCoreConfigSkeleton::ItemPointF *KCoreConfigSkeleton::addItemPointF(const QString &name, QPointF &reference, const QPointF &defaultValue, const QString &key)
1502 {
1503     KCoreConfigSkeleton::ItemPointF *item;
1504     item = new KCoreConfigSkeleton::ItemPointF(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1505     addItem(item, name);
1506     return item;
1507 }
1508 
1509 KCoreConfigSkeleton::ItemSize *KCoreConfigSkeleton::addItemSize(const QString &name, QSize &reference, const QSize &defaultValue, const QString &key)
1510 {
1511     KCoreConfigSkeleton::ItemSize *item;
1512     item = new KCoreConfigSkeleton::ItemSize(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1513     addItem(item, name);
1514     return item;
1515 }
1516 
1517 KCoreConfigSkeleton::ItemSizeF *KCoreConfigSkeleton::addItemSizeF(const QString &name, QSizeF &reference, const QSizeF &defaultValue, const QString &key)
1518 {
1519     KCoreConfigSkeleton::ItemSizeF *item;
1520     item = new KCoreConfigSkeleton::ItemSizeF(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1521     addItem(item, name);
1522     return item;
1523 }
1524 
1525 KCoreConfigSkeleton::ItemDateTime *
1526 KCoreConfigSkeleton::addItemDateTime(const QString &name, QDateTime &reference, const QDateTime &defaultValue, const QString &key)
1527 {
1528     KCoreConfigSkeleton::ItemDateTime *item;
1529     item = new KCoreConfigSkeleton::ItemDateTime(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1530     addItem(item, name);
1531     return item;
1532 }
1533 
1534 KCoreConfigSkeleton::ItemStringList *
1535 KCoreConfigSkeleton::addItemStringList(const QString &name, QStringList &reference, const QStringList &defaultValue, const QString &key)
1536 {
1537     KCoreConfigSkeleton::ItemStringList *item;
1538     item = new KCoreConfigSkeleton::ItemStringList(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1539     addItem(item, name);
1540     return item;
1541 }
1542 
1543 KCoreConfigSkeleton::ItemIntList *
1544 KCoreConfigSkeleton::addItemIntList(const QString &name, QList<int> &reference, const QList<int> &defaultValue, const QString &key)
1545 {
1546     KCoreConfigSkeleton::ItemIntList *item;
1547     item = new KCoreConfigSkeleton::ItemIntList(d->mCurrentGroup, key.isNull() ? name : key, reference, defaultValue);
1548     addItem(item, name);
1549     return item;
1550 }
1551 
1552 bool KCoreConfigSkeleton::isImmutable(const QString &name) const
1553 {
1554     KConfigSkeletonItem *item = findItem(name);
1555     return !item || item->isImmutable();
1556 }
1557 
1558 KConfigSkeletonItem *KCoreConfigSkeleton::findItem(const QString &name) const
1559 {
1560     return d->mItemDict.value(name);
1561 }
1562 
1563 KConfigCompilerSignallingItem::KConfigCompilerSignallingItem(KConfigSkeletonItem *item,
1564                                                              QObject *object,
1565                                                              KConfigCompilerSignallingItem::NotifyFunction targetFunction,
1566                                                              quint64 userData)
1567     : KConfigSkeletonItem(item->group(), item->key())
1568     , mItem(item)
1569     , mTargetFunction(targetFunction)
1570     , mObject(object)
1571     , mUserData(userData)
1572 {
1573     Q_ASSERT(mTargetFunction);
1574     Q_ASSERT(mItem);
1575     Q_ASSERT(mObject);
1576 
1577     setIsDefaultImpl([this] {
1578         return mItem->isDefault();
1579     });
1580     setIsSaveNeededImpl([this] {
1581         return mItem->isSaveNeeded();
1582     });
1583     setGetDefaultImpl([this] {
1584         return mItem->getDefault();
1585     });
1586 }
1587 
1588 KConfigCompilerSignallingItem::~KConfigCompilerSignallingItem()
1589 {
1590 }
1591 
1592 bool KConfigCompilerSignallingItem::isEqual(const QVariant &p) const
1593 {
1594     return mItem->isEqual(p);
1595 }
1596 
1597 QVariant KConfigCompilerSignallingItem::property() const
1598 {
1599     return mItem->property();
1600 }
1601 
1602 QVariant KConfigCompilerSignallingItem::minValue() const
1603 {
1604     return mItem->minValue();
1605 }
1606 
1607 QVariant KConfigCompilerSignallingItem::maxValue() const
1608 {
1609     return mItem->maxValue();
1610 }
1611 
1612 void KConfigCompilerSignallingItem::readConfig(KConfig *c)
1613 {
1614     QVariant oldValue = mItem->property();
1615     mItem->readConfig(c);
1616     // readConfig() changes mIsImmutable, update it here as well
1617     KConfigGroup cg = configGroup(c);
1618     readImmutability(cg);
1619     if (!mItem->isEqual(oldValue)) {
1620         invokeNotifyFunction();
1621     }
1622 }
1623 
1624 void KConfigCompilerSignallingItem::readDefault(KConfig *c)
1625 {
1626     mItem->readDefault(c);
1627     // readDefault() changes mIsImmutable, update it here as well
1628     KConfigGroup cg = configGroup(c);
1629     readImmutability(cg);
1630 }
1631 
1632 void KConfigCompilerSignallingItem::writeConfig(KConfig *c)
1633 {
1634     mItem->writeConfig(c);
1635 }
1636 
1637 void KConfigCompilerSignallingItem::setDefault()
1638 {
1639     QVariant oldValue = mItem->property();
1640     mItem->setDefault();
1641     if (!mItem->isEqual(oldValue)) {
1642         invokeNotifyFunction();
1643     }
1644 }
1645 
1646 void KConfigCompilerSignallingItem::setProperty(const QVariant &p)
1647 {
1648     if (!mItem->isEqual(p)) {
1649         mItem->setProperty(p);
1650         invokeNotifyFunction();
1651     }
1652 }
1653 
1654 void KConfigCompilerSignallingItem::swapDefault()
1655 {
1656     QVariant oldValue = mItem->property();
1657     mItem->swapDefault();
1658     if (!mItem->isEqual(oldValue)) {
1659         invokeNotifyFunction();
1660     }
1661 }
1662 
1663 void KConfigCompilerSignallingItem::setWriteFlags(KConfigBase::WriteConfigFlags flags)
1664 {
1665     mItem->setWriteFlags(flags);
1666 }
1667 
1668 KConfigBase::WriteConfigFlags KConfigCompilerSignallingItem::writeFlags() const
1669 {
1670     return mItem->writeFlags();
1671 }
1672 
1673 void KConfigCompilerSignallingItem::setGroup(const KConfigGroup &cg)
1674 {
1675     mItem->setGroup(cg);
1676 }
1677 
1678 KConfigGroup KConfigCompilerSignallingItem::configGroup(KConfig *config) const
1679 {
1680     return mItem->configGroup(config);
1681 }
1682 
1683 #include "moc_kcoreconfigskeleton.cpp"