File indexing completed on 2024-05-05 05:53:55
0001 /* 0002 SPDX-FileCopyrightText: 2019 Mariusz Glebocki <mglb@arccos-1.net> 0003 0004 Based on KConfigDialog from KConfigWidgets 0005 0006 SPDX-FileCopyrightText: 2003 Benjamin C Meyer (ben+kdelibs at meyerhome dot net) 0007 SPDX-FileCopyrightText: 2003 Waldo Bastian <bastian@kde.org> 0008 0009 SPDX-License-Identifier: GPL-2.0-or-later 0010 */ 0011 0012 // Own 0013 #include "ConfigurationDialog.h" 0014 0015 // Konsole 0016 #include "ConfigDialogButtonGroupManager.h" 0017 0018 // Qt 0019 #include <QDialogButtonBox> 0020 #include <QPushButton> 0021 0022 // KDE 0023 #include <KConfigDialogManager> 0024 #include <KLocalizedString> 0025 0026 using namespace Konsole; 0027 0028 ConfigurationDialog::ConfigurationDialog(QWidget *parent, KCoreConfigSkeleton *config) 0029 : KPageDialog(parent) 0030 { 0031 setWindowTitle(i18nc("@title:window", "Configure")); 0032 // Setting this after modifying buttonBox results in initial focus set to buttonBox. 0033 setFaceType(KPageDialog::List); 0034 0035 buttonBox()->setStandardButtons(QDialogButtonBox::RestoreDefaults | QDialogButtonBox::Ok | QDialogButtonBox::Apply | QDialogButtonBox::Cancel); 0036 connect(buttonBox()->button(QDialogButtonBox::Apply), &QAbstractButton::clicked, this, &ConfigurationDialog::updateButtons); 0037 connect(buttonBox()->button(QDialogButtonBox::RestoreDefaults), &QAbstractButton::clicked, this, &ConfigurationDialog::updateButtons); 0038 0039 _manager = new KConfigDialogManager(this, config); 0040 0041 connect(_manager, &KConfigDialogManager::settingsChanged, this, &ConfigurationDialog::settingsChangedSlot); 0042 0043 connect(_manager, &KConfigDialogManager::widgetModified, this, &ConfigurationDialog::updateButtons); 0044 0045 connect(buttonBox()->button(QDialogButtonBox::Ok), &QAbstractButton::clicked, _manager, &KConfigDialogManager::updateSettings); 0046 connect(buttonBox()->button(QDialogButtonBox::Apply), &QAbstractButton::clicked, _manager, &KConfigDialogManager::updateSettings); 0047 connect(buttonBox()->button(QDialogButtonBox::Cancel), &QAbstractButton::clicked, _manager, &KConfigDialogManager::updateWidgets); 0048 connect(buttonBox()->button(QDialogButtonBox::RestoreDefaults), &QAbstractButton::clicked, _manager, &KConfigDialogManager::updateWidgetsDefault); 0049 0050 _groupManager = new ConfigDialogButtonGroupManager(this, config); 0051 connect(_groupManager, &ConfigDialogButtonGroupManager::settingsChanged, this, &ConfigurationDialog::settingsChangedSlot); 0052 connect(_groupManager, &ConfigDialogButtonGroupManager::widgetModified, this, &ConfigurationDialog::updateButtons); 0053 0054 connect(buttonBox()->button(QDialogButtonBox::Ok), &QAbstractButton::clicked, _groupManager, &ConfigDialogButtonGroupManager::updateSettings); 0055 connect(buttonBox()->button(QDialogButtonBox::Apply), &QAbstractButton::clicked, _groupManager, &ConfigDialogButtonGroupManager::updateSettings); 0056 connect(buttonBox()->button(QDialogButtonBox::Cancel), &QAbstractButton::clicked, _groupManager, &ConfigDialogButtonGroupManager::updateWidgets); 0057 connect(buttonBox()->button(QDialogButtonBox::RestoreDefaults), 0058 &QAbstractButton::clicked, 0059 _groupManager, 0060 &ConfigDialogButtonGroupManager::updateWidgetsDefault); 0061 0062 setApplyButtonEnabled(false); 0063 } 0064 0065 void ConfigurationDialog::addPage(KPageWidgetItem *item, bool manage) 0066 { 0067 Q_ASSERT(item); 0068 Q_ASSERT(item->widget()); 0069 0070 KPageDialog::addPage(item); 0071 0072 item->setParent(this); 0073 0074 if (manage) { 0075 _manager->addWidget(item->widget()); 0076 _groupManager->addChildren(item->widget()); 0077 } 0078 0079 if (_shown && manage) { 0080 QPushButton *defaultButton = buttonBox()->button(QDialogButtonBox::RestoreDefaults); 0081 if (defaultButton != nullptr) { 0082 bool isDefault = defaultButton->isEnabled() && _manager->isDefault(); 0083 defaultButton->setEnabled(!isDefault); 0084 } 0085 } 0086 } 0087 0088 void ConfigurationDialog::updateButtons() 0089 { 0090 static bool onlyOnce = false; 0091 if (onlyOnce) { 0092 return; 0093 } 0094 onlyOnce = true; 0095 0096 bool has_changed = _manager->hasChanged() || _groupManager->hasChanged(); 0097 setApplyButtonEnabled(has_changed); 0098 0099 bool is_default = _manager->isDefault() && _groupManager->isDefault(); 0100 setRestoreDefaultsButtonEnabled(!is_default); 0101 0102 Q_EMIT widgetModified(); 0103 onlyOnce = false; 0104 } 0105 0106 void ConfigurationDialog::settingsChangedSlot() 0107 { 0108 updateButtons(); 0109 Q_EMIT settingsChanged(); 0110 } 0111 0112 void ConfigurationDialog::setApplyButtonEnabled(bool enabled) 0113 { 0114 QPushButton *applyButton = buttonBox()->button(QDialogButtonBox::Apply); 0115 if (applyButton != nullptr) { 0116 applyButton->setEnabled(enabled); 0117 } 0118 } 0119 0120 void ConfigurationDialog::setRestoreDefaultsButtonEnabled(bool enabled) 0121 { 0122 QPushButton *restoreDefaultsButton = buttonBox()->button(QDialogButtonBox::RestoreDefaults); 0123 if (restoreDefaultsButton != nullptr) { 0124 restoreDefaultsButton->setEnabled(enabled); 0125 } 0126 } 0127 0128 void Konsole::ConfigurationDialog::showEvent(QShowEvent *event) 0129 { 0130 if (!_shown) { 0131 _manager->updateWidgets(); 0132 _groupManager->updateWidgets(); 0133 0134 bool hasChanged = _manager->hasChanged() || _groupManager->hasChanged(); 0135 setApplyButtonEnabled(hasChanged); 0136 0137 bool isDefault = _manager->isDefault() || _groupManager->isDefault(); 0138 setRestoreDefaultsButtonEnabled(!isDefault); 0139 0140 _shown = true; 0141 } 0142 KPageDialog::showEvent(event); 0143 } 0144 0145 #include "moc_ConfigurationDialog.cpp"