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"