1/*
2 SPDX-FileCopyrightText: 2001 Michael Goffioul <kdeprint@swing.be>
3 SPDX-FileCopyrightText: 2004 Frans Englich <frans.englich@telia.com>
4 SPDX-FileCopyrightText: 2009 Dario Freddi <drf@kde.org>
5
6 SPDX-License-Identifier: LGPL-2.0-or-later
7*/
8
9#include "kcmodule.h"
10#include "kabstractconfigmodule.h"
11#include "kcmutils_debug.h"
12
13#include <QVBoxLayout>
14
15#include <KConfigDialogManager>
16#include <KConfigSkeleton>
17#include <KLocalizedString>
18#include <KPluginMetaData>
19
20class KCModuleProxyInternal : public QWidget
21{
22 Q_OBJECT
23public:
24 KCModuleProxyInternal(QWidget *parent)
25 : QWidget(parent)
26 {
27 }
28};
29
30class KCModulePrivate
31{
32public:
33 KCModulePrivate(QWidget *parentWidget)
34 : _needsAuthorization(false)
35 , _unmanagedWidgetChangeState(false)
36 , _unmanagedWidgetDefaultState(false)
37 , _unmanagedWidgetDefaultStateCalled(false)
38 , parentWidget(parentWidget)
39 {
40 }
41
42 void authStatusChanged(int status);
43
44 QList<KConfigDialogManager *> managers;
45
46 bool _needsAuthorization : 1;
47
48 // this member is used to record the state on non-automatically
49 // managed widgets, allowing for mixed KConfigXT-drive and manual
50 // widgets to coexist peacefully and do the correct thing with
51 // the changed(bool) signal
52 bool _unmanagedWidgetChangeState : 1;
53 bool _unmanagedWidgetDefaultState : 1;
54 bool _unmanagedWidgetDefaultStateCalled : 1;
55 QVBoxLayout *m_topLayout = nullptr; /* Contains QScrollView view, and root stuff */
56 QWidget *parentWidget;
57 KCModuleProxyInternal *m_proxyInternal = nullptr;
58};
59
60KCModule::KCModule(QWidget *parent, const KPluginMetaData &data)
61 : KAbstractConfigModule(parent, data)
62 , d(new KCModulePrivate(parent))
63{
64 connect(sender: this, signal: &KAbstractConfigModule::defaultsIndicatorsVisibleChanged, context: this, slot: [this] {
65 for (auto manager : std::as_const(t&: d->managers)) {
66 manager->setDefaultsIndicatorsVisible(defaultsIndicatorsVisible());
67 }
68 });
69}
70
71KConfigDialogManager *KCModule::addConfig(KCoreConfigSkeleton *config, QWidget *widget)
72{
73 KConfigDialogManager *manager = new KConfigDialogManager(widget, config);
74 manager->setDefaultsIndicatorsVisible(defaultsIndicatorsVisible());
75 manager->setObjectName(objectName());
76 connect(sender: manager, signal: &KConfigDialogManager::widgetModified, context: this, slot: &KCModule::widgetChanged);
77 connect(sender: manager, signal: &QObject::destroyed, context: this, slot: [this, manager]() {
78 d->managers.removeOne(t: manager);
79 });
80 d->managers.append(t: manager);
81 return manager;
82}
83
84KCModule::~KCModule()
85{
86 qDeleteAll(c: d->managers);
87 d->managers.clear();
88}
89
90void KCModule::load()
91{
92 KAbstractConfigModule::load();
93 for (KConfigDialogManager *manager : std::as_const(t&: d->managers)) {
94 manager->updateWidgets();
95 }
96 widgetChanged();
97}
98
99void KCModule::save()
100{
101 KAbstractConfigModule::save();
102 for (KConfigDialogManager *manager : std::as_const(t&: d->managers)) {
103 manager->updateSettings();
104 }
105}
106
107void KCModule::defaults()
108{
109 KAbstractConfigModule::defaults();
110 for (KConfigDialogManager *manager : std::as_const(t&: d->managers)) {
111 manager->updateWidgetsDefault();
112 }
113}
114
115QWidget *KCModule::widget()
116{
117 if (!d->m_proxyInternal) {
118 d->m_topLayout = new QVBoxLayout(d->parentWidget);
119 d->m_proxyInternal = new KCModuleProxyInternal(d->parentWidget);
120 d->m_topLayout->addWidget(d->m_proxyInternal);
121 }
122 return d->m_proxyInternal;
123}
124
125void KCModule::widgetChanged()
126{
127 setNeedsSave(d->_unmanagedWidgetChangeState || managedWidgetChangeState());
128 if (d->_unmanagedWidgetDefaultStateCalled) {
129 setRepresentsDefaults(d->_unmanagedWidgetDefaultState && managedWidgetDefaultState());
130 } else {
131 setRepresentsDefaults(!d->managers.isEmpty() && managedWidgetDefaultState());
132 }
133}
134
135bool KCModule::managedWidgetChangeState() const
136{
137 for (KConfigDialogManager *manager : std::as_const(t&: d->managers)) {
138 if (manager->hasChanged()) {
139 return true;
140 }
141 }
142
143 return false;
144}
145
146bool KCModule::managedWidgetDefaultState() const
147{
148 for (KConfigDialogManager *manager : std::as_const(t&: d->managers)) {
149 if (!manager->isDefault()) {
150 return false;
151 }
152 }
153
154 return true;
155}
156
157void KCModule::unmanagedWidgetChangeState(bool changed)
158{
159 d->_unmanagedWidgetChangeState = changed;
160 widgetChanged();
161}
162
163void KCModule::unmanagedWidgetDefaultState(bool defaulted)
164{
165 d->_unmanagedWidgetDefaultStateCalled = true;
166 d->_unmanagedWidgetDefaultState = defaulted;
167 widgetChanged();
168}
169
170QList<KConfigDialogManager *> KCModule::configs() const
171{
172 return d->managers;
173}
174
175#include "kcmodule.moc"
176#include "moc_kcmodule.cpp"
177

source code of kcmutils/src/kcmodule.cpp