File indexing completed on 2024-05-12 07:47:31
0001 /* 0002 SPDX-FileCopyrightText: 2019 Kevin Ottens <kevin.ottens@enioka.com> 0003 SPDX-License-Identifier: LGPL-2.0-or-later 0004 */ 0005 0006 #include "kquickmanagedconfigmodule.h" 0007 0008 #include <KCoreConfigSkeleton> 0009 #include <QPointer> 0010 #include <QTimer> 0011 0012 class KQuickManagedConfigModulePrivate 0013 { 0014 public: 0015 KQuickManagedConfigModulePrivate(KQuickManagedConfigModule *mod) 0016 { 0017 QTimer::singleShot(0, mod, [mod]() { 0018 const auto skeletons = mod->findChildren<KCoreConfigSkeleton *>(); 0019 for (auto *skeleton : skeletons) { 0020 mod->registerSettings(skeleton); 0021 } 0022 }); 0023 } 0024 0025 QList<QPointer<KCoreConfigSkeleton>> _skeletons; 0026 }; 0027 0028 KQuickManagedConfigModule::KQuickManagedConfigModule(QObject *parent, const KPluginMetaData &metaData) 0029 : KQuickConfigModule(parent, metaData) 0030 , d(new KQuickManagedConfigModulePrivate(this)) 0031 { 0032 } 0033 0034 KQuickManagedConfigModule::~KQuickManagedConfigModule() = default; 0035 0036 void KQuickManagedConfigModule::load() 0037 { 0038 for (const auto &skeleton : std::as_const(d->_skeletons)) { 0039 if (skeleton) { 0040 skeleton->load(); 0041 } 0042 } 0043 } 0044 0045 void KQuickManagedConfigModule::save() 0046 { 0047 for (const auto &skeleton : std::as_const(d->_skeletons)) { 0048 if (skeleton) { 0049 skeleton->save(); 0050 } 0051 } 0052 } 0053 0054 void KQuickManagedConfigModule::defaults() 0055 { 0056 for (const auto &skeleton : std::as_const(d->_skeletons)) { 0057 if (skeleton) { 0058 skeleton->setDefaults(); 0059 } 0060 } 0061 } 0062 0063 bool KQuickManagedConfigModule::isSaveNeeded() const 0064 { 0065 return false; 0066 } 0067 0068 bool KQuickManagedConfigModule::isDefaults() const 0069 { 0070 return true; 0071 } 0072 0073 void KQuickManagedConfigModule::settingsChanged() 0074 { 0075 bool needsSave = false; 0076 bool representsDefaults = true; 0077 for (const auto &skeleton : std::as_const(d->_skeletons)) { 0078 if (skeleton) { 0079 needsSave |= skeleton->isSaveNeeded(); 0080 representsDefaults &= skeleton->isDefaults(); 0081 } 0082 } 0083 0084 if (!needsSave) { 0085 needsSave = isSaveNeeded(); 0086 } 0087 0088 if (representsDefaults) { 0089 representsDefaults = isDefaults(); 0090 } 0091 0092 setRepresentsDefaults(representsDefaults); 0093 setNeedsSave(needsSave); 0094 } 0095 0096 void KQuickManagedConfigModule::registerSettings(KCoreConfigSkeleton *skeleton) 0097 { 0098 if (!skeleton || d->_skeletons.contains(skeleton)) { 0099 return; 0100 } 0101 0102 d->_skeletons.append(skeleton); 0103 0104 auto settingsChangedSlotIndex = metaObject()->indexOfMethod("settingsChanged()"); 0105 auto settingsChangedSlot = metaObject()->method(settingsChangedSlotIndex); 0106 0107 QObject::connect(skeleton, &KCoreConfigSkeleton::configChanged, this, &KQuickManagedConfigModule::settingsChanged); 0108 0109 const auto items = skeleton->items(); 0110 for (auto item : items) { 0111 const auto itemHasSignals = dynamic_cast<KConfigCompilerSignallingItem *>(item) || dynamic_cast<KPropertySkeletonItem *>(item); 0112 if (!itemHasSignals) { 0113 continue; 0114 } 0115 0116 auto name = item->name(); 0117 if (name.at(0).isUpper()) { 0118 name[0] = name[0].toLower(); 0119 } 0120 0121 const auto metaObject = skeleton->metaObject(); 0122 const auto propertyIndex = metaObject->indexOfProperty(name.toUtf8().constData()); 0123 const auto property = metaObject->property(propertyIndex); 0124 if (!property.hasNotifySignal()) { 0125 continue; 0126 } 0127 0128 const auto changedSignal = property.notifySignal(); 0129 QObject::connect(skeleton, changedSignal, this, settingsChangedSlot); 0130 } 0131 0132 auto toRemove = std::remove_if(d->_skeletons.begin(), d->_skeletons.end(), [](const QPointer<KCoreConfigSkeleton> &value) { 0133 return value.isNull(); 0134 }); 0135 d->_skeletons.erase(toRemove, d->_skeletons.end()); 0136 0137 QMetaObject::invokeMethod(this, "settingsChanged", Qt::QueuedConnection); 0138 } 0139 0140 #include "moc_kquickmanagedconfigmodule.cpp"