diff --git a/src/quickaddons/managedconfigmodule.h b/src/quickaddons/managedconfigmodule.h --- a/src/quickaddons/managedconfigmodule.h +++ b/src/quickaddons/managedconfigmodule.h @@ -25,6 +25,8 @@ #include +class KCoreConfigSkeleton; + namespace KQuickAddons { class ManagedConfigModulePrivate; @@ -195,6 +197,15 @@ */ void settingsChanged(); + /** + * Allow to register manually settings class generated from a kcfg file. + * Used by derived class when automatic discovery is not possible. + * After skeleton is registered it will automatically call settingsChanged(). + * + * @since 5.67 + */ + void registerSettings(KCoreConfigSkeleton *skeleton); + private: /** * Allows to indicate if the module requires saving. diff --git a/src/quickaddons/managedconfigmodule.cpp b/src/quickaddons/managedconfigmodule.cpp --- a/src/quickaddons/managedconfigmodule.cpp +++ b/src/quickaddons/managedconfigmodule.cpp @@ -22,6 +22,8 @@ #include "managedconfigmodule.h" +#include + #include namespace KQuickAddons { @@ -38,7 +40,7 @@ void _k_registerSettings(); ManagedConfigModule *_q; - QList _skeletons; + QList> _skeletons; }; ManagedConfigModule::ManagedConfigModule(const KAboutData *aboutData, QObject *parent, const QVariantList &args) @@ -66,22 +68,28 @@ void ManagedConfigModule::load() { - for (const auto skeleton : qAsConst(d->_skeletons)) { - skeleton->load(); + for (const auto &skeleton : qAsConst(d->_skeletons)) { + if (skeleton) { + skeleton->load(); + } } } void ManagedConfigModule::save() { - for (const auto skeleton : qAsConst(d->_skeletons)) { - skeleton->save(); + for (const auto &skeleton : qAsConst(d->_skeletons)) { + if (skeleton) { + skeleton->save(); + } } } void ManagedConfigModule::defaults() { - for (const auto skeleton : qAsConst(d->_skeletons)) { - skeleton->setDefaults(); + for (const auto &skeleton : qAsConst(d->_skeletons)) { + if (skeleton) { + skeleton->setDefaults(); + } } } @@ -97,46 +105,21 @@ void ManagedConfigModulePrivate::_k_registerSettings() { - auto settingsChangedSlotIndex = _q->metaObject()->indexOfMethod("settingsChanged()"); - auto settingsChangedSlot = _q->metaObject()->method(settingsChangedSlotIndex); - - _skeletons = _q->findChildren(); - for (auto skeleton : qAsConst(_skeletons)) { - QObject::connect(skeleton, &KCoreConfigSkeleton::configChanged, _q, &ManagedConfigModule::settingsChanged); - - const auto items = skeleton->items(); - for (auto item : items) { - auto signallingItem = dynamic_cast(item); - if (!signallingItem) { - continue; - } - - QString name = signallingItem->name(); - if (name.at(0).isUpper()) - name[0] = name[0].toLower(); - - const auto metaObject = skeleton->metaObject(); - const auto propertyIndex = metaObject->indexOfProperty(name.toUtf8().constData()); - const auto property = metaObject->property(propertyIndex); - if (!property.hasNotifySignal()) { - continue; - } - - const auto changedSignal = property.notifySignal(); - QObject::connect(skeleton, changedSignal, _q, settingsChangedSlot); - } + const auto skeletons = _q->findChildren(); + for (auto *skeleton : skeletons) { + _q->registerSettings(skeleton); } - - _q->settingsChanged(); } void ManagedConfigModule::settingsChanged() { bool needsSave = false; bool representsDefaults = true; - for (const auto skeleton : qAsConst(d->_skeletons)) { - needsSave |= skeleton->isSaveNeeded(); - representsDefaults &= skeleton->isDefaults(); + for (const auto &skeleton : qAsConst(d->_skeletons)) { + if (skeleton) { + needsSave |= skeleton->isSaveNeeded(); + representsDefaults &= skeleton->isDefaults(); + } } if (!needsSave) { @@ -151,6 +134,51 @@ setNeedsSave(needsSave); } +void ManagedConfigModule::registerSettings(KCoreConfigSkeleton *skeleton) +{ + if (!skeleton || d->_skeletons.contains(skeleton)) { + return; + } + + d->_skeletons.append(skeleton); + + auto settingsChangedSlotIndex = metaObject()->indexOfMethod("settingsChanged()"); + auto settingsChangedSlot = metaObject()->method(settingsChangedSlotIndex); + + QObject::connect(skeleton, &KCoreConfigSkeleton::configChanged, this, &ManagedConfigModule::settingsChanged); + + const auto items = skeleton->items(); + for (auto item : items) { + auto signallingItem = dynamic_cast(item); + if (!signallingItem) { + continue; + } + + QString name = signallingItem->name(); + if (name.at(0).isUpper()) { + name[0] = name[0].toLower(); + } + + const auto metaObject = skeleton->metaObject(); + const auto propertyIndex = metaObject->indexOfProperty(name.toUtf8().constData()); + const auto property = metaObject->property(propertyIndex); + if (!property.hasNotifySignal()) { + continue; + } + + const auto changedSignal = property.notifySignal(); + QObject::connect(skeleton, changedSignal, this, settingsChangedSlot); + } + + for (auto it = d->_skeletons.begin(); it != d->_skeletons.end(); ++it) { + if (it->isNull()) { + d->_skeletons.erase(it); + } + } + + QMetaObject::invokeMethod(this, "settingsChanged", Qt::QueuedConnection); +} + } #include "moc_managedconfigmodule.cpp"