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. Used by derived class + * that don't store their settings as children items + * + * After manual registration on the fly, + * it may be needed to call settingsChanged() + */ + 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) @@ -67,21 +69,27 @@ void ManagedConfigModule::load() { for (const auto skeleton : qAsConst(d->_skeletons)) { - skeleton->load(); + if (skeleton) { + skeleton->load(); + } } } void ManagedConfigModule::save() { for (const auto skeleton : qAsConst(d->_skeletons)) { - skeleton->save(); + if (skeleton) { + skeleton->save(); + } } } void ManagedConfigModule::defaults() { for (const auto skeleton : qAsConst(d->_skeletons)) { - skeleton->setDefaults(); + if (skeleton) { + skeleton->setDefaults(); + } } } @@ -97,34 +105,9 @@ 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(); @@ -135,8 +118,10 @@ bool needsSave = false; bool representsDefaults = true; for (const auto skeleton : qAsConst(d->_skeletons)) { - needsSave |= skeleton->isSaveNeeded(); - representsDefaults &= skeleton->isDefaults(); + if (skeleton) { + needsSave |= skeleton->isSaveNeeded(); + representsDefaults &= skeleton->isDefaults(); + } } if (!needsSave) { @@ -151,6 +136,43 @@ 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); + } +} + } #include "moc_managedconfigmodule.cpp"