1 /*
2 SPDX-FileCopyrightText: 2019 Mariusz Glebocki <mglb@arccos-1.net>
3
4 Based on KConfigDialog from KConfigWidgets
5
6 SPDX-FileCopyrightText: 2003 Benjamin C Meyer (ben+kdelibs at meyerhome dot net)
7 SPDX-FileCopyrightText: 2003 Waldo Bastian <bastian@kde.org>
8
9 SPDX-License-Identifier: GPL-2.0-or-later
10 */
11
12 // Own
13 #include "ConfigurationDialog.h"
14
15 // Konsole
16 #include "ConfigDialogButtonGroupManager.h"
17
18 // Qt
19 #include <QDialogButtonBox>
20 #include <QPushButton>
21
22 // KDE
23 #include <KConfigDialogManager>
24 #include <KLocalizedString>
25
26 using namespace Konsole;
27
ConfigurationDialog(QWidget * parent,KCoreConfigSkeleton * config)28 ConfigurationDialog::ConfigurationDialog(QWidget *parent, KCoreConfigSkeleton *config)
29 : KPageDialog(parent)
30 {
31 setWindowTitle(i18nc("@title:window", "Configure"));
32 // Setting this after modifying buttonBox results in initial focus set to buttonBox.
33 setFaceType(KPageDialog::List);
34
35 buttonBox()->setStandardButtons(QDialogButtonBox::RestoreDefaults | QDialogButtonBox::Ok | QDialogButtonBox::Apply | QDialogButtonBox::Cancel);
36 connect(buttonBox()->button(QDialogButtonBox::Apply), &QAbstractButton::clicked, this, &ConfigurationDialog::updateButtons);
37 connect(buttonBox()->button(QDialogButtonBox::RestoreDefaults), &QAbstractButton::clicked, this, &ConfigurationDialog::updateButtons);
38
39 _manager = new KConfigDialogManager(this, config);
40
41 connect(_manager, QOverload<>::of(&KConfigDialogManager::settingsChanged), this, &ConfigurationDialog::settingsChangedSlot);
42
43 connect(_manager, &KConfigDialogManager::widgetModified, this, &ConfigurationDialog::updateButtons);
44
45 connect(buttonBox()->button(QDialogButtonBox::Ok), &QAbstractButton::clicked, _manager, &KConfigDialogManager::updateSettings);
46 connect(buttonBox()->button(QDialogButtonBox::Apply), &QAbstractButton::clicked, _manager, &KConfigDialogManager::updateSettings);
47 connect(buttonBox()->button(QDialogButtonBox::Cancel), &QAbstractButton::clicked, _manager, &KConfigDialogManager::updateWidgets);
48 connect(buttonBox()->button(QDialogButtonBox::RestoreDefaults), &QAbstractButton::clicked, _manager, &KConfigDialogManager::updateWidgetsDefault);
49
50 _groupManager = new ConfigDialogButtonGroupManager(this, config);
51 connect(_groupManager, &ConfigDialogButtonGroupManager::settingsChanged, this, &ConfigurationDialog::settingsChangedSlot);
52 connect(_groupManager, &ConfigDialogButtonGroupManager::widgetModified, this, &ConfigurationDialog::updateButtons);
53
54 connect(buttonBox()->button(QDialogButtonBox::Ok), &QAbstractButton::clicked, _groupManager, &ConfigDialogButtonGroupManager::updateSettings);
55 connect(buttonBox()->button(QDialogButtonBox::Apply), &QAbstractButton::clicked, _groupManager, &ConfigDialogButtonGroupManager::updateSettings);
56 connect(buttonBox()->button(QDialogButtonBox::Cancel), &QAbstractButton::clicked, _groupManager, &ConfigDialogButtonGroupManager::updateWidgets);
57 connect(buttonBox()->button(QDialogButtonBox::RestoreDefaults),
58 &QAbstractButton::clicked,
59 _groupManager,
60 &ConfigDialogButtonGroupManager::updateWidgetsDefault);
61
62 setApplyButtonEnabled(false);
63 }
64
addPage(KPageWidgetItem * item,bool manage)65 void ConfigurationDialog::addPage(KPageWidgetItem *item, bool manage)
66 {
67 Q_ASSERT(item);
68 Q_ASSERT(item->widget());
69
70 KPageDialog::addPage(item);
71
72 item->setParent(this);
73
74 if (manage) {
75 _manager->addWidget(item->widget());
76 _groupManager->addChildren(item->widget());
77 }
78
79 if (_shown && manage) {
80 QPushButton *defaultButton = buttonBox()->button(QDialogButtonBox::RestoreDefaults);
81 if (defaultButton != nullptr) {
82 bool isDefault = defaultButton->isEnabled() && _manager->isDefault();
83 defaultButton->setEnabled(!isDefault);
84 }
85 }
86 }
87
updateButtons()88 void ConfigurationDialog::updateButtons()
89 {
90 static bool onlyOnce = false;
91 if (onlyOnce) {
92 return;
93 }
94 onlyOnce = true;
95
96 bool has_changed = _manager->hasChanged() || _groupManager->hasChanged();
97 setApplyButtonEnabled(has_changed);
98
99 bool is_default = _manager->isDefault() && _groupManager->isDefault();
100 setRestoreDefaultsButtonEnabled(!is_default);
101
102 Q_EMIT widgetModified();
103 onlyOnce = false;
104 }
105
settingsChangedSlot()106 void ConfigurationDialog::settingsChangedSlot()
107 {
108 updateButtons();
109 Q_EMIT settingsChanged();
110 }
111
setApplyButtonEnabled(bool enabled)112 void ConfigurationDialog::setApplyButtonEnabled(bool enabled)
113 {
114 QPushButton *applyButton = buttonBox()->button(QDialogButtonBox::Apply);
115 if (applyButton != nullptr) {
116 applyButton->setEnabled(enabled);
117 }
118 }
119
setRestoreDefaultsButtonEnabled(bool enabled)120 void ConfigurationDialog::setRestoreDefaultsButtonEnabled(bool enabled)
121 {
122 QPushButton *restoreDefaultsButton = buttonBox()->button(QDialogButtonBox::RestoreDefaults);
123 if (restoreDefaultsButton != nullptr) {
124 restoreDefaultsButton->setEnabled(enabled);
125 }
126 }
127
showEvent(QShowEvent * event)128 void Konsole::ConfigurationDialog::showEvent(QShowEvent *event)
129 {
130 if (!_shown) {
131 _manager->updateWidgets();
132 _groupManager->updateWidgets();
133
134 bool hasChanged = _manager->hasChanged() || _groupManager->hasChanged();
135 setApplyButtonEnabled(hasChanged);
136
137 bool isDefault = _manager->isDefault() || _groupManager->isDefault();
138 setRestoreDefaultsButtonEnabled(!isDefault);
139
140 _shown = true;
141 }
142 KPageDialog::showEvent(event);
143 }
144