File indexing completed on 2024-05-05 16:07:15
0001 /* 0002 This file is part of the KDE libraries 0003 SPDX-FileCopyrightText: 2019 Kevin Ottens <kevin.ottens@enioka.com> 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #include "managedconfigmodule.h" 0009 0010 #include <QPointer> 0011 0012 #include <KCoreConfigSkeleton> 0013 0014 namespace KQuickAddons 0015 { 0016 class ManagedConfigModulePrivate 0017 { 0018 public: 0019 ManagedConfigModulePrivate(ManagedConfigModule *module) 0020 : _q(module) 0021 { 0022 QMetaObject::invokeMethod(_q, "_k_registerSettings", Qt::QueuedConnection); 0023 } 0024 0025 void _k_registerSettings(); 0026 0027 ManagedConfigModule *_q; 0028 QList<QPointer<KCoreConfigSkeleton>> _skeletons; 0029 }; 0030 0031 #if QUICKADDONS_BUILD_DEPRECATED_SINCE(5, 88) 0032 ManagedConfigModule::ManagedConfigModule(const KAboutData *aboutData, QObject *parent, const QVariantList &args) 0033 : ConfigModule(aboutData, parent, args) 0034 , d(new ManagedConfigModulePrivate(this)) 0035 { 0036 } 0037 #endif 0038 0039 #if QUICKADDONS_BUILD_DEPRECATED_SINCE(5, 88) 0040 ManagedConfigModule::ManagedConfigModule(const KPluginMetaData &metaData, QObject *parent, const QVariantList &args) 0041 : ConfigModule(metaData, parent, args) 0042 , d(new ManagedConfigModulePrivate(this)) 0043 { 0044 } 0045 #endif 0046 0047 #if QUICKADDONS_BUILD_DEPRECATED_SINCE(5, 104) 0048 ManagedConfigModule::ManagedConfigModule(QObject *parent, const QVariantList &args) 0049 : ConfigModule(parent, args) 0050 , d(new ManagedConfigModulePrivate(this)) 0051 { 0052 } 0053 #endif 0054 0055 ManagedConfigModule::ManagedConfigModule(QObject *parent, const KPluginMetaData &metaData, const QVariantList &args) 0056 : ConfigModule(parent, metaData, args) 0057 , d(new ManagedConfigModulePrivate(this)) 0058 { 0059 } 0060 0061 ManagedConfigModule::~ManagedConfigModule() 0062 { 0063 delete d; 0064 } 0065 0066 void ManagedConfigModule::load() 0067 { 0068 for (const auto &skeleton : std::as_const(d->_skeletons)) { 0069 if (skeleton) { 0070 skeleton->load(); 0071 } 0072 } 0073 } 0074 0075 void ManagedConfigModule::save() 0076 { 0077 for (const auto &skeleton : std::as_const(d->_skeletons)) { 0078 if (skeleton) { 0079 skeleton->save(); 0080 } 0081 } 0082 } 0083 0084 void ManagedConfigModule::defaults() 0085 { 0086 for (const auto &skeleton : std::as_const(d->_skeletons)) { 0087 if (skeleton) { 0088 skeleton->setDefaults(); 0089 } 0090 } 0091 } 0092 0093 bool ManagedConfigModule::isSaveNeeded() const 0094 { 0095 return false; 0096 } 0097 0098 bool ManagedConfigModule::isDefaults() const 0099 { 0100 return true; 0101 } 0102 0103 void ManagedConfigModulePrivate::_k_registerSettings() 0104 { 0105 const auto skeletons = _q->findChildren<KCoreConfigSkeleton *>(); 0106 for (auto *skeleton : skeletons) { 0107 _q->registerSettings(skeleton); 0108 } 0109 } 0110 0111 void ManagedConfigModule::settingsChanged() 0112 { 0113 bool needsSave = false; 0114 bool representsDefaults = true; 0115 for (const auto &skeleton : std::as_const(d->_skeletons)) { 0116 if (skeleton) { 0117 needsSave |= skeleton->isSaveNeeded(); 0118 representsDefaults &= skeleton->isDefaults(); 0119 } 0120 } 0121 0122 if (!needsSave) { 0123 needsSave = isSaveNeeded(); 0124 } 0125 0126 if (representsDefaults) { 0127 representsDefaults = isDefaults(); 0128 } 0129 0130 setRepresentsDefaults(representsDefaults); 0131 setNeedsSave(needsSave); 0132 } 0133 0134 void ManagedConfigModule::registerSettings(KCoreConfigSkeleton *skeleton) 0135 { 0136 if (!skeleton || d->_skeletons.contains(skeleton)) { 0137 return; 0138 } 0139 0140 d->_skeletons.append(skeleton); 0141 0142 auto settingsChangedSlotIndex = metaObject()->indexOfMethod("settingsChanged()"); 0143 auto settingsChangedSlot = metaObject()->method(settingsChangedSlotIndex); 0144 0145 QObject::connect(skeleton, &KCoreConfigSkeleton::configChanged, this, &ManagedConfigModule::settingsChanged); 0146 0147 const auto items = skeleton->items(); 0148 for (auto item : items) { 0149 const auto itemHasSignals = dynamic_cast<KConfigCompilerSignallingItem *>(item) || dynamic_cast<KPropertySkeletonItem *>(item); 0150 if (!itemHasSignals) { 0151 continue; 0152 } 0153 0154 auto name = item->name(); 0155 if (name.at(0).isUpper()) { 0156 name[0] = name[0].toLower(); 0157 } 0158 0159 const auto metaObject = skeleton->metaObject(); 0160 const auto propertyIndex = metaObject->indexOfProperty(name.toUtf8().constData()); 0161 const auto property = metaObject->property(propertyIndex); 0162 if (!property.hasNotifySignal()) { 0163 continue; 0164 } 0165 0166 const auto changedSignal = property.notifySignal(); 0167 QObject::connect(skeleton, changedSignal, this, settingsChangedSlot); 0168 } 0169 0170 auto toRemove = std::remove_if(d->_skeletons.begin(), d->_skeletons.end(), [](const QPointer<KCoreConfigSkeleton> &value) { 0171 return value.isNull(); 0172 }); 0173 d->_skeletons.erase(toRemove, d->_skeletons.end()); 0174 0175 QMetaObject::invokeMethod(this, "settingsChanged", Qt::QueuedConnection); 0176 } 0177 0178 } 0179 0180 #include "moc_managedconfigmodule.cpp"