File indexing completed on 2024-04-28 05:50:54

0001 /*
0002     SPDX-FileCopyrightText: 2007-2008 Robert Knight <robertknight@gmail.com>
0003     SPDX-FileCopyrightText: 2012 Jekyll Wu <adaptee@gmail.com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 // Own
0009 #include "widgets/HistorySizeWidget.h"
0010 
0011 // Qt
0012 #include <QAbstractButton>
0013 #include <QButtonGroup>
0014 #include <QWhatsThis>
0015 
0016 #include <KLocalizedString>
0017 
0018 // Konsole
0019 #include "ui_HistorySizeWidget.h"
0020 
0021 using namespace Konsole;
0022 
0023 HistorySizeWidget::HistorySizeWidget(QWidget *parent)
0024     : QWidget(parent)
0025     , _ui(nullptr)
0026 {
0027     _ui = new Ui::HistorySizeWidget();
0028     _ui->setupUi(this);
0029 
0030     // focus and select the spinner automatically when appropriate
0031     _ui->fixedSizeHistoryButton->setFocusProxy(_ui->historyLineSpinner);
0032     connect(_ui->fixedSizeHistoryButton, &QRadioButton::clicked, _ui->historyLineSpinner, &KPluralHandlingSpinBox::selectAll);
0033 
0034     auto modeGroup = new QButtonGroup(this);
0035     modeGroup->addButton(_ui->noHistoryButton);
0036     modeGroup->addButton(_ui->fixedSizeHistoryButton);
0037     modeGroup->addButton(_ui->unlimitedHistoryButton);
0038     connect(modeGroup, static_cast<void (QButtonGroup::*)(QAbstractButton *)>(&QButtonGroup::buttonClicked), this, &Konsole::HistorySizeWidget::buttonClicked);
0039 
0040     _ui->historyLineSpinner->setSuffix(ki18ncp("@label:textbox Unit of scrollback", " line", " lines"));
0041     setLineCount(HistorySizeWidget::DefaultLineCount);
0042 
0043     connect(_ui->historyLineSpinner,
0044             static_cast<void (KPluralHandlingSpinBox::*)(int)>(&KPluralHandlingSpinBox::valueChanged),
0045             this,
0046             &Konsole::HistorySizeWidget::historySizeChanged);
0047 
0048     auto warningButtonSizePolicy = _ui->fixedSizeHistoryWarningButton->sizePolicy();
0049     warningButtonSizePolicy.setRetainSizeWhenHidden(true);
0050 
0051     _ui->fixedSizeHistoryWarningButton->setSizePolicy(warningButtonSizePolicy);
0052     _ui->fixedSizeHistoryWarningButton->hide();
0053     connect(_ui->fixedSizeHistoryButton, &QAbstractButton::toggled, _ui->historyLineSpinner, &QWidget::setEnabled);
0054     connect(_ui->fixedSizeHistoryButton, &QAbstractButton::toggled, _ui->fixedSizeHistoryWarningButton, &QWidget::setVisible);
0055     connect(_ui->fixedSizeHistoryWarningButton, &QToolButton::clicked, this, [this](bool) {
0056         const QString message = i18nc("@info:whatsthis",
0057                                       "When using this option, the scrollback data will be saved to RAM. If you choose a huge value, your system may run out "
0058                                       "of free RAM and cause serious issues with your system.");
0059         const QPoint pos = QPoint(_ui->fixedSizeHistoryWrapper->width() / 2, _ui->fixedSizeHistoryWrapper->height());
0060         QWhatsThis::showText(_ui->fixedSizeHistoryWrapper->mapToGlobal(pos), message, _ui->fixedSizeHistoryWrapper);
0061     });
0062 
0063     _ui->unlimitedHistoryWarningButton->setSizePolicy(warningButtonSizePolicy);
0064     _ui->unlimitedHistoryWarningButton->hide();
0065     connect(_ui->unlimitedHistoryButton, &QAbstractButton::toggled, _ui->unlimitedHistoryWarningButton, &QWidget::setVisible);
0066     connect(_ui->unlimitedHistoryWarningButton, &QToolButton::clicked, this, [this](bool) {
0067         const auto message =
0068             xi18nc("@info:tooltip",
0069                    "When using this option, the scrollback data will be written unencrypted to temporary files. Those temporary files will be "
0070                    "deleted automatically when Konsole is closed in a normal manner.<nl/>Use <emphasis>Settings → Configure Konsole → Temporary "
0071                    "Files</emphasis> to select the location of the temporary files.");
0072         const QPoint pos = QPoint(_ui->unlimitedHistoryWrapper->width() / 2, _ui->unlimitedHistoryWrapper->height());
0073         QWhatsThis::showText(_ui->unlimitedHistoryWrapper->mapToGlobal(pos), message, _ui->unlimitedHistoryWrapper);
0074     });
0075 
0076     // Make radio buttons height equal
0077     // fixedSizeHistoryWrapper contains radio + spinbox + toolbutton, so it
0078     // has height always equal to or larger than single radio button, and
0079     // radio + toolbutton
0080     const int radioButtonHeight = _ui->fixedSizeHistoryWrapper->sizeHint().height();
0081     _ui->noHistoryButton->setMinimumHeight(radioButtonHeight);
0082     _ui->unlimitedHistoryButton->setMinimumHeight(radioButtonHeight);
0083 }
0084 
0085 HistorySizeWidget::~HistorySizeWidget()
0086 {
0087     delete _ui;
0088 }
0089 
0090 void HistorySizeWidget::buttonClicked(QAbstractButton *)
0091 {
0092     Enum::HistoryModeEnum selectedMode = mode();
0093     Q_EMIT historyModeChanged(selectedMode);
0094 }
0095 
0096 void HistorySizeWidget::setMode(Enum::HistoryModeEnum aMode)
0097 {
0098     if (aMode == Enum::NoHistory) {
0099         _ui->noHistoryButton->setChecked(true);
0100     } else if (aMode == Enum::FixedSizeHistory) {
0101         _ui->fixedSizeHistoryButton->setChecked(true);
0102     } else if (aMode == Enum::UnlimitedHistory) {
0103         _ui->unlimitedHistoryButton->setChecked(true);
0104     }
0105 }
0106 
0107 Enum::HistoryModeEnum HistorySizeWidget::mode() const
0108 {
0109     if (_ui->noHistoryButton->isChecked()) {
0110         return Enum::NoHistory;
0111     } else if (_ui->fixedSizeHistoryButton->isChecked()) {
0112         return Enum::FixedSizeHistory;
0113     } else if (_ui->unlimitedHistoryButton->isChecked()) {
0114         return Enum::UnlimitedHistory;
0115     }
0116 
0117     Q_ASSERT(false);
0118     return Enum::NoHistory;
0119 }
0120 
0121 void HistorySizeWidget::setLineCount(int lines)
0122 {
0123     _ui->historyLineSpinner->setValue(lines);
0124     _ui->historyLineSpinner->setSingleStep(lines / 10);
0125 }
0126 
0127 int HistorySizeWidget::lineCount() const
0128 {
0129     return _ui->historyLineSpinner->value();
0130 }
0131 
0132 int HistorySizeWidget::preferredLabelHeight()
0133 {
0134     Q_ASSERT(_ui);
0135     Q_ASSERT(_ui->noHistoryButton);
0136 
0137     return _ui->fixedSizeHistoryWrapper->sizeHint().height();
0138 }
0139 
0140 #include "moc_HistorySizeWidget.cpp"