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"