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"