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"