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

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"