File indexing completed on 2024-05-05 04:40:56
0001 /* 0002 SPDX-FileCopyrightText: 2023 George Florea Bănuș <georgefb899@gmail.com> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "outputwidgetconfig.h" 0008 0009 #include <KConfigGroup> 0010 #include <KLocalizedString> 0011 #include <KSharedConfig> 0012 0013 #include <QCheckBox> 0014 #include <QDialog> 0015 #include <QDialogButtonBox> 0016 #include <QFormLayout> 0017 #include <QLabel> 0018 #include <QSpinBox> 0019 #include <QVBoxLayout> 0020 0021 namespace { 0022 constexpr const char* maxViewCountConfigKey = "MaxOutputViewCount"; 0023 constexpr const char* isViewLimitEnabledConfigKey = "IsViewLimitEnabled"; 0024 } 0025 0026 OutputWidgetConfig::OutputWidgetConfig(const QByteArray& configSubgroupName, const QString& toolViewTitle, 0027 QObject* parent) 0028 : QObject(parent) 0029 , m_configSubgroupName{configSubgroupName} 0030 , m_toolViewTitle{toolViewTitle} 0031 { 0032 } 0033 0034 KConfigGroup OutputWidgetConfig::configSubgroup() const 0035 { 0036 // group is mutable, because the returned subgroup becomes read-only if group is const. 0037 KConfigGroup group(KSharedConfig::openConfig(), "StandardOutputView"); 0038 return KConfigGroup(&group, m_configSubgroupName.constData()); 0039 } 0040 0041 int OutputWidgetConfig::maxViewCount(const KConfigGroup& configSubgroup) const 0042 { 0043 return configSubgroup.readEntry(maxViewCountConfigKey, 10); 0044 } 0045 0046 bool OutputWidgetConfig::isViewLimitEnabled(const KConfigGroup& configSubgroup) const 0047 { 0048 return configSubgroup.readEntry(isViewLimitEnabledConfigKey, false); 0049 } 0050 0051 std::optional<int> OutputWidgetConfig::maxViewCount() const 0052 { 0053 const auto config = configSubgroup(); 0054 if (isViewLimitEnabled(config)) 0055 return maxViewCount(config); 0056 return std::nullopt; 0057 } 0058 0059 void OutputWidgetConfig::openDialog(QWidget* dialogParent) 0060 { 0061 auto* const dialog = new QDialog(dialogParent); 0062 dialog->setAttribute(Qt::WA_DeleteOnClose); 0063 dialog->setWindowTitle( 0064 i18nc("@title:window %1: output type, e.g. Build or Run", "Configure %1 Output", m_toolViewTitle)); 0065 0066 auto* const dialogLayout = new QVBoxLayout(); 0067 dialog->setLayout(dialogLayout); 0068 0069 auto* const formLayout = new QFormLayout(); 0070 dialogLayout->addLayout(formLayout); 0071 0072 const auto config = configSubgroup(); 0073 0074 auto* const checkboxLabel = new QLabel(i18nc("@option:check", "Limit the number of output views"), dialog); 0075 checkboxLabel->setToolTip(i18nc("@info:tooltip", "Automatically close oldest output views")); 0076 auto* const checkbox = new QCheckBox(dialog); 0077 checkbox->setToolTip(checkboxLabel->toolTip()); 0078 checkbox->setChecked(isViewLimitEnabled(config)); 0079 formLayout->addRow(checkboxLabel, checkbox); 0080 0081 auto* const spinboxLabel = new QLabel(i18nc("@label:spinbox", "Maximum output view count"), dialog); 0082 spinboxLabel->setToolTip( 0083 i18nc("@info:tooltip", "The oldest output view is closed when\nthe number of views exceeds this value")); 0084 auto* const spinbox = new QSpinBox(dialog); 0085 spinbox->setToolTip(spinboxLabel->toolTip()); 0086 spinbox->setRange(1, 99); 0087 spinbox->setValue(maxViewCount(config)); 0088 0089 const auto enableSpinbox = [spinbox, spinboxLabel](bool enable) { 0090 spinbox->setEnabled(enable); 0091 spinboxLabel->setEnabled(enable); 0092 }; 0093 enableSpinbox(checkbox->isChecked()); 0094 connect(checkbox, &QCheckBox::toggled, this, enableSpinbox); 0095 0096 formLayout->addRow(spinboxLabel, spinbox); 0097 0098 auto* const buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, dialog); 0099 connect(buttonBox, &QDialogButtonBox::accepted, this, [this, dialog, checkbox, spinbox]() { 0100 auto config = configSubgroup(); 0101 config.writeEntry(isViewLimitEnabledConfigKey, checkbox->isChecked()); 0102 config.writeEntry(maxViewCountConfigKey, spinbox->value()); 0103 dialog->accept(); 0104 Q_EMIT settingsChanged(); 0105 }); 0106 connect(buttonBox, &QDialogButtonBox::rejected, dialog, &QDialog::reject); 0107 0108 dialogLayout->addStretch(); 0109 dialogLayout->addWidget(buttonBox); 0110 dialog->open(); 0111 } 0112 0113 #include "moc_outputwidgetconfig.cpp"