File indexing completed on 2024-05-19 07:41:53

0001 /*
0002     SPDX-FileCopyrightText: 2001 Michael Goffioul <kdeprint@swing.be>
0003     SPDX-FileCopyrightText: 2004 Frans Englich <frans.englich@telia.com>
0004     SPDX-FileCopyrightText: 2009 Dario Freddi <drf@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 #include "kcmodule.h"
0010 #include "kabstractconfigmodule.h"
0011 #include "kcmutils_debug.h"
0012 
0013 #include <QVBoxLayout>
0014 
0015 #include <KConfigDialogManager>
0016 #include <KConfigSkeleton>
0017 #include <KLocalizedString>
0018 #include <KPluginMetaData>
0019 
0020 class KCModuleProxyInternal : public QWidget
0021 {
0022     Q_OBJECT
0023 public:
0024     KCModuleProxyInternal(QWidget *parent)
0025         : QWidget(parent)
0026     {
0027     }
0028 };
0029 
0030 class KCModulePrivate
0031 {
0032 public:
0033     KCModulePrivate(QWidget *parentWidget)
0034         : _needsAuthorization(false)
0035         , _unmanagedWidgetChangeState(false)
0036         , _unmanagedWidgetDefaultState(false)
0037         , _unmanagedWidgetDefaultStateCalled(false)
0038         , parentWidget(parentWidget)
0039     {
0040     }
0041 
0042     void authStatusChanged(int status);
0043 
0044     QList<KConfigDialogManager *> managers;
0045 
0046     bool _needsAuthorization : 1;
0047 
0048     // this member is used to record the state on non-automatically
0049     // managed widgets, allowing for mixed KConfigXT-drive and manual
0050     // widgets to coexist peacefully and do the correct thing with
0051     // the changed(bool) signal
0052     bool _unmanagedWidgetChangeState : 1;
0053     bool _unmanagedWidgetDefaultState : 1;
0054     bool _unmanagedWidgetDefaultStateCalled : 1;
0055     QVBoxLayout *m_topLayout = nullptr; /* Contains QScrollView view, and root stuff */
0056     QWidget *parentWidget;
0057     KCModuleProxyInternal *m_proxyInternal = nullptr;
0058 };
0059 
0060 KCModule::KCModule(QWidget *parent, const KPluginMetaData &data)
0061     : KAbstractConfigModule(parent, data)
0062     , d(new KCModulePrivate(parent))
0063 {
0064 }
0065 
0066 KConfigDialogManager *KCModule::addConfig(KCoreConfigSkeleton *config, QWidget *widget)
0067 {
0068     KConfigDialogManager *manager = new KConfigDialogManager(widget, config);
0069     manager->setObjectName(objectName());
0070     connect(manager, &KConfigDialogManager::widgetModified, this, &KCModule::widgetChanged);
0071     connect(manager, &QObject::destroyed, this, [this, manager]() {
0072         d->managers.removeOne(manager);
0073     });
0074     d->managers.append(manager);
0075     return manager;
0076 }
0077 
0078 KCModule::~KCModule()
0079 {
0080     qDeleteAll(d->managers);
0081     d->managers.clear();
0082 }
0083 
0084 void KCModule::load()
0085 {
0086     KAbstractConfigModule::load();
0087     for (KConfigDialogManager *manager : std::as_const(d->managers)) {
0088         manager->updateWidgets();
0089     }
0090     widgetChanged();
0091 }
0092 
0093 void KCModule::save()
0094 {
0095     KAbstractConfigModule::save();
0096     for (KConfigDialogManager *manager : std::as_const(d->managers)) {
0097         manager->updateSettings();
0098     }
0099 }
0100 
0101 void KCModule::defaults()
0102 {
0103     KAbstractConfigModule::defaults();
0104     for (KConfigDialogManager *manager : std::as_const(d->managers)) {
0105         manager->updateWidgetsDefault();
0106     }
0107 }
0108 
0109 QWidget *KCModule::widget()
0110 {
0111     if (!d->m_proxyInternal) {
0112         d->m_topLayout = new QVBoxLayout(d->parentWidget);
0113         d->m_proxyInternal = new KCModuleProxyInternal(d->parentWidget);
0114         d->m_topLayout->addWidget(d->m_proxyInternal);
0115     }
0116     return d->m_proxyInternal;
0117 }
0118 
0119 void KCModule::widgetChanged()
0120 {
0121     setNeedsSave(d->_unmanagedWidgetChangeState || managedWidgetChangeState());
0122     if (d->_unmanagedWidgetDefaultStateCalled) {
0123         setRepresentsDefaults(d->_unmanagedWidgetDefaultState && managedWidgetDefaultState());
0124     } else {
0125         setRepresentsDefaults(!d->managers.isEmpty() && managedWidgetDefaultState());
0126     }
0127 }
0128 
0129 bool KCModule::managedWidgetChangeState() const
0130 {
0131     for (KConfigDialogManager *manager : std::as_const(d->managers)) {
0132         if (manager->hasChanged()) {
0133             return true;
0134         }
0135     }
0136 
0137     return false;
0138 }
0139 
0140 bool KCModule::managedWidgetDefaultState() const
0141 {
0142     for (KConfigDialogManager *manager : std::as_const(d->managers)) {
0143         if (!manager->isDefault()) {
0144             return false;
0145         }
0146     }
0147 
0148     return true;
0149 }
0150 
0151 void KCModule::unmanagedWidgetChangeState(bool changed)
0152 {
0153     d->_unmanagedWidgetChangeState = changed;
0154     widgetChanged();
0155 }
0156 
0157 void KCModule::unmanagedWidgetDefaultState(bool defaulted)
0158 {
0159     d->_unmanagedWidgetDefaultStateCalled = true;
0160     d->_unmanagedWidgetDefaultState = defaulted;
0161     widgetChanged();
0162 }
0163 
0164 QList<KConfigDialogManager *> KCModule::configs() const
0165 {
0166     return d->managers;
0167 }
0168 
0169 #include "kcmodule.moc"
0170 #include "moc_kcmodule.cpp"