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 | |
20 | class KCModuleProxyInternal : public QWidget |
21 | { |
22 | Q_OBJECT |
23 | public: |
24 | KCModuleProxyInternal(QWidget *parent) |
25 | : QWidget(parent) |
26 | { |
27 | } |
28 | }; |
29 | |
30 | class KCModulePrivate |
31 | { |
32 | public: |
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 | |
60 | KCModule::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 | |
71 | KConfigDialogManager *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 | |
84 | KCModule::~KCModule() |
85 | { |
86 | qDeleteAll(c: d->managers); |
87 | d->managers.clear(); |
88 | } |
89 | |
90 | void KCModule::load() |
91 | { |
92 | KAbstractConfigModule::load(); |
93 | for (KConfigDialogManager *manager : std::as_const(t&: d->managers)) { |
94 | manager->updateWidgets(); |
95 | } |
96 | widgetChanged(); |
97 | } |
98 | |
99 | void KCModule::save() |
100 | { |
101 | KAbstractConfigModule::save(); |
102 | for (KConfigDialogManager *manager : std::as_const(t&: d->managers)) { |
103 | manager->updateSettings(); |
104 | } |
105 | } |
106 | |
107 | void KCModule::defaults() |
108 | { |
109 | KAbstractConfigModule::defaults(); |
110 | for (KConfigDialogManager *manager : std::as_const(t&: d->managers)) { |
111 | manager->updateWidgetsDefault(); |
112 | } |
113 | } |
114 | |
115 | QWidget *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 | |
125 | void 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 | |
135 | bool 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 | |
146 | bool 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 | |
157 | void KCModule::unmanagedWidgetChangeState(bool changed) |
158 | { |
159 | d->_unmanagedWidgetChangeState = changed; |
160 | widgetChanged(); |
161 | } |
162 | |
163 | void KCModule::unmanagedWidgetDefaultState(bool defaulted) |
164 | { |
165 | d->_unmanagedWidgetDefaultStateCalled = true; |
166 | d->_unmanagedWidgetDefaultState = defaulted; |
167 | widgetChanged(); |
168 | } |
169 | |
170 | QList<KConfigDialogManager *> KCModule::configs() const |
171 | { |
172 | return d->managers; |
173 | } |
174 | |
175 | #include "kcmodule.moc" |
176 | #include "moc_kcmodule.cpp" |
177 | |