File indexing completed on 2024-04-14 05:44:08

0001 /*
0002     SPDX-FileCopyrightText: 2008 Robert Knight <robertknight@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 // Own
0008 #include "CopyInputDialog.h"
0009 
0010 // Qt
0011 #include <QSortFilterProxyModel>
0012 
0013 // Konsole
0014 #include "CheckableSessionModel.h"
0015 #include "ui_CopyInputDialog.h"
0016 
0017 #include <KLocalizedString>
0018 #include <QDialogButtonBox>
0019 #include <QPushButton>
0020 #include <QVBoxLayout>
0021 
0022 using namespace Konsole;
0023 
0024 CopyInputDialog::CopyInputDialog(QWidget *parent)
0025     : QDialog(parent)
0026     , _ui(nullptr)
0027     , _model(nullptr)
0028     , _masterSession(nullptr)
0029 {
0030     setWindowTitle(i18n("Copy Input"));
0031     auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
0032     auto mainWidget = new QWidget(this);
0033     auto mainLayout = new QVBoxLayout;
0034     setLayout(mainLayout);
0035     mainLayout->addWidget(mainWidget);
0036     QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
0037     okButton->setDefault(true);
0038     connect(buttonBox, &QDialogButtonBox::accepted, this, &CopyInputDialog::accept);
0039     connect(buttonBox, &QDialogButtonBox::rejected, this, &CopyInputDialog::reject);
0040     mainLayout->addWidget(buttonBox);
0041 
0042     setWindowModality(Qt::WindowModal);
0043 
0044     _ui = new Ui::CopyInputDialog();
0045     _ui->setupUi(mainWidget);
0046 
0047     connect(_ui->selectAllButton, &QPushButton::clicked, this, &Konsole::CopyInputDialog::selectAll);
0048     connect(_ui->deselectAllButton, &QPushButton::clicked, this, &Konsole::CopyInputDialog::deselectAll);
0049 
0050     _ui->filterEdit->setClearButtonEnabled(true);
0051     _ui->filterEdit->setFocus();
0052 
0053     _model = new CheckableSessionModel(parent);
0054     _model->setCheckColumn(1);
0055     _model->setSessions(SessionManager::instance()->sessions());
0056 
0057     auto filterProxyModel = new QSortFilterProxyModel(this);
0058     filterProxyModel->setDynamicSortFilter(true);
0059     filterProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
0060     filterProxyModel->setSourceModel(_model);
0061     filterProxyModel->setFilterKeyColumn(-1);
0062 
0063     connect(_ui->filterEdit, &QLineEdit::textChanged, filterProxyModel, &QSortFilterProxyModel::setFilterFixedString);
0064 
0065     _ui->sessionList->setModel(filterProxyModel);
0066     _ui->sessionList->setColumnHidden(0, true); // Hide number column
0067     _ui->sessionList->header()->hide();
0068 }
0069 
0070 CopyInputDialog::~CopyInputDialog()
0071 {
0072     delete _ui;
0073 }
0074 
0075 void CopyInputDialog::setChosenSessions(const QSet<Session *> &sessions)
0076 {
0077     QSet<Session *> checked = sessions;
0078     if (!_masterSession.isNull()) {
0079         checked.insert(_masterSession);
0080     }
0081 
0082     _model->setCheckedSessions(checked);
0083 }
0084 
0085 QSet<Session *> CopyInputDialog::chosenSessions() const
0086 {
0087     return _model->checkedSessions();
0088 }
0089 
0090 void CopyInputDialog::setMasterSession(Session *session)
0091 {
0092     if (!_masterSession.isNull()) {
0093         _model->setCheckable(_masterSession, true);
0094     }
0095 
0096     _model->setCheckable(session, false);
0097     QSet<Session *> checked = _model->checkedSessions();
0098     checked.insert(session);
0099     _model->setCheckedSessions(checked);
0100 
0101     _masterSession = session;
0102 }
0103 
0104 void CopyInputDialog::setSelectionChecked(bool checked)
0105 {
0106     QAbstractItemModel *model = _ui->sessionList->model();
0107     int rows = model->rowCount();
0108 
0109     const QModelIndexList selected = _ui->sessionList->selectionModel()->selectedIndexes();
0110 
0111     if (selected.count() > 1) {
0112         for (const QModelIndex &index : selected) {
0113             setRowChecked(index.row(), checked);
0114         }
0115     } else {
0116         for (int i = 0; i < rows; i++) {
0117             setRowChecked(i, checked);
0118         }
0119     }
0120 }
0121 
0122 void CopyInputDialog::setRowChecked(int row, bool checked)
0123 {
0124     QAbstractItemModel *model = _ui->sessionList->model();
0125     QModelIndex index = model->index(row, _model->checkColumn());
0126     model->setData(index, static_cast<int>(checked ? Qt::Checked : Qt::Unchecked), Qt::CheckStateRole);
0127 }
0128 
0129 #include "moc_CopyInputDialog.cpp"