| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- file Copyright.txt or https://cmake.org/licensing for details. */
- #include "EnvironmentDialog.h"
- #include <QDialogButtonBox>
- #include <QGridLayout>
- #include <QItemSelectionModel>
- #include <QLabel>
- #include <QLineEdit>
- #include <QMessageBox>
- #include <QStandardItem>
- EnvironmentItemModel::EnvironmentItemModel(
- const QProcessEnvironment& environment, QObject* parent)
- : QStandardItemModel(parent)
- {
- this->clear();
- for (auto const& key : environment.keys()) {
- auto value = environment.value(key);
- this->appendVariable(key, value);
- }
- }
- QProcessEnvironment EnvironmentItemModel::environment() const
- {
- QProcessEnvironment env;
- for (int i = 0; i < this->rowCount(); ++i) {
- auto name = this->data(this->index(i, 0), Qt::DisplayRole).toString();
- auto value = this->data(this->index(i, 1), Qt::DisplayRole).toString();
- env.insert(name, value);
- }
- return env;
- }
- void EnvironmentItemModel::clear()
- {
- this->QStandardItemModel::clear();
- QStringList labels;
- labels << tr("Name") << tr("Value");
- this->setHorizontalHeaderLabels(labels);
- }
- QModelIndex EnvironmentItemModel::buddy(const QModelIndex& index) const
- {
- if (index.column() == 0) {
- return this->index(index.row(), index.column() + 1, index.parent());
- }
- return index;
- }
- void EnvironmentItemModel::appendVariable(const QString& key,
- const QString& value)
- {
- this->insertVariable(this->rowCount(), key, value);
- }
- void EnvironmentItemModel::insertVariable(int row, const QString& key,
- const QString& value)
- {
- for (int i = 0; i < this->rowCount(); ++i) {
- if (this->data(this->index(i, 0), Qt::DisplayRole) == key) {
- this->setData(this->index(i, 1), value, Qt::DisplayRole);
- return;
- }
- }
- auto* keyItem = new QStandardItem(key);
- auto* valueItem = new QStandardItem(value);
- this->insertRow(row, { keyItem, valueItem });
- }
- EnvironmentSearchFilter::EnvironmentSearchFilter(QObject* parent)
- : QSortFilterProxyModel(parent)
- {
- }
- bool EnvironmentSearchFilter::filterAcceptsRow(int row,
- const QModelIndex& parent) const
- {
- auto* model = this->sourceModel();
- auto key =
- model->data(model->index(row, 0, parent), Qt::DisplayRole).toString();
- #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
- return key.contains(this->filterRegularExpression());
- #else
- return key.contains(this->filterRegExp());
- #endif
- }
- EnvironmentDialog::EnvironmentDialog(const QProcessEnvironment& environment,
- QWidget* parent)
- : QDialog(parent)
- {
- this->setupUi(this);
- this->RemoveEntry->setEnabled(false);
- this->m_model = new EnvironmentItemModel(environment, this);
- this->m_filter = new EnvironmentSearchFilter(this);
- this->m_filter->setSourceModel(this->m_model);
- this->Environment->setModel(this->m_filter);
- this->Environment->setUniformRowHeights(true);
- this->Environment->setRootIsDecorated(false);
- this->Environment->setSelectionMode(QAbstractItemView::ExtendedSelection);
- this->Environment->setSelectionBehavior(QAbstractItemView::SelectRows);
- QObject::connect(this->AddEntry, &QAbstractButton::clicked, this,
- &EnvironmentDialog::addEntry);
- QObject::connect(this->RemoveEntry, &QAbstractButton::clicked, this,
- &EnvironmentDialog::removeSelectedEntries);
- #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
- QObject::connect(this->Search, &QLineEdit::textChanged, this->m_filter,
- QOverload<const QString&>::of(
- &EnvironmentSearchFilter::setFilterRegularExpression));
- #else
- QObject::connect(this->Search, &QLineEdit::textChanged, this->m_filter,
- &EnvironmentSearchFilter::setFilterFixedString);
- #endif
- QObject::connect(this->Environment->selectionModel(),
- &QItemSelectionModel::selectionChanged, this,
- &EnvironmentDialog::selectionChanged);
- }
- QProcessEnvironment EnvironmentDialog::environment() const
- {
- return this->m_model->environment();
- }
- void EnvironmentDialog::addEntry()
- {
- // Build the dialog manually because it's simple enough
- QDialog dialog(this);
- dialog.setWindowTitle("Add Environment Variable");
- auto* layout = new QGridLayout;
- dialog.setLayout(layout);
- auto* nameLabel = new QLabel;
- nameLabel->setText("Name:");
- layout->addWidget(nameLabel, 0, 0);
- auto* nameEdit = new QLineEdit;
- nameEdit->setObjectName("name");
- layout->addWidget(nameEdit, 0, 1);
- auto* valueLabel = new QLabel;
- valueLabel->setText("Value:");
- layout->addWidget(valueLabel, 1, 0);
- auto* valueEdit = new QLineEdit;
- valueEdit->setObjectName("value");
- layout->addWidget(valueEdit, 1, 1);
- auto* buttons = new QDialogButtonBox;
- buttons->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
- QObject::connect(
- buttons, &QDialogButtonBox::accepted, &dialog,
- [this, &dialog, nameEdit]() {
- auto text = nameEdit->text();
- if (text.isEmpty()) {
- QMessageBox::critical(&dialog, "Error", "Name must be non-empty.");
- return;
- }
- auto* model = this->Environment->model();
- for (int i = 0; i < model->rowCount(); ++i) {
- if (model->data(model->index(i, 0), Qt::DisplayRole) == text) {
- QMessageBox::critical(
- &dialog, "Error",
- tr("Environment variable \"%1\" already exists.").arg(text));
- return;
- }
- }
- dialog.accept();
- });
- QObject::connect(buttons, &QDialogButtonBox::rejected, &dialog,
- &QDialog::reject);
- layout->addWidget(buttons, 2, 0, 1, 2);
- if (dialog.exec() == QDialog::Accepted) {
- this->m_model->insertVariable(0, nameEdit->text(), valueEdit->text());
- }
- }
- void EnvironmentDialog::removeSelectedEntries()
- {
- QModelIndexList idxs = this->Environment->selectionModel()->selectedRows();
- QList<QPersistentModelIndex> pidxs;
- foreach (QModelIndex const& i, idxs) {
- pidxs.append(i);
- }
- foreach (QPersistentModelIndex const& pi, pidxs) {
- this->Environment->model()->removeRow(pi.row(), pi.parent());
- }
- }
- void EnvironmentDialog::selectionChanged()
- {
- auto selected = this->Environment->selectionModel()->selectedRows();
- this->RemoveEntry->setEnabled(!selected.isEmpty());
- }
|