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