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"