diff options
Diffstat (limited to 'src/plugins/projectexplorer/environmentwidget.cpp')
-rw-r--r-- | src/plugins/projectexplorer/environmentwidget.cpp | 107 |
1 files changed, 99 insertions, 8 deletions
diff --git a/src/plugins/projectexplorer/environmentwidget.cpp b/src/plugins/projectexplorer/environmentwidget.cpp index d89adccb45..b734fe95dc 100644 --- a/src/plugins/projectexplorer/environmentwidget.cpp +++ b/src/plugins/projectexplorer/environmentwidget.cpp @@ -36,22 +36,104 @@ #include <utils/hostosinfo.h> #include <utils/itemviews.h> #include <utils/namevaluevalidator.h> +#include <utils/qtcassert.h> +#include <utils/stringutils.h> #include <utils/tooltip/tooltip.h> +#include <QDialogButtonBox> #include <QDir> #include <QFileDialog> #include <QFileInfo> -#include <QString> +#include <QHBoxLayout> +#include <QKeyEvent> +#include <QLineEdit> #include <QPushButton> +#include <QString> +#include <QStyledItemDelegate> #include <QTreeView> +#include <QTreeWidget> +#include <QTreeWidgetItem> #include <QVBoxLayout> -#include <QKeyEvent> -#include <QStyledItemDelegate> -#include <QLineEdit> -#include <QDebug> namespace ProjectExplorer { +class PathListDialog : public QDialog +{ + Q_DECLARE_TR_FUNCTIONS(EnvironmentWidget) +public: + PathListDialog(const QString &varName, const QString &paths, QWidget *parent) : QDialog(parent) + { + const auto mainLayout = new QVBoxLayout(this); + const auto viewLayout = new QHBoxLayout; + const auto buttonsLayout = new QVBoxLayout; + const auto addButton = new QPushButton(tr("Add ...")); + const auto removeButton = new QPushButton(tr("Remove")); + const auto editButton = new QPushButton(tr("Edit...")); + buttonsLayout->addWidget(addButton); + buttonsLayout->addWidget(removeButton); + buttonsLayout->addWidget(editButton); + buttonsLayout->addStretch(1); + const auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok + | QDialogButtonBox::Cancel); + viewLayout->addWidget(&m_view); + viewLayout->addLayout(buttonsLayout); + mainLayout->addLayout(viewLayout); + mainLayout->addWidget(buttonBox); + + m_view.setHeaderLabel(varName); + m_view.setDragDropMode(QAbstractItemView::InternalMove); + const QStringList pathList = paths.split(Utils::HostOsInfo::pathListSeparator(), + Utils::SkipEmptyParts); + for (const QString &path : pathList) + addPath(path); + + connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); + connect(addButton, &QPushButton::clicked, this, [this] { + const QString dir = QDir::toNativeSeparators( + QFileDialog::getExistingDirectory(this, tr("Choose Directory"))); + if (!dir.isEmpty()) + addPath(dir); + }); + connect(removeButton, &QPushButton::clicked, this, [this] { + const QList<QTreeWidgetItem *> selected = m_view.selectedItems(); + QTC_ASSERT(selected.count() == 1, return); + delete selected.first(); + }); + connect(editButton, &QPushButton::clicked, this, [this] { + const QList<QTreeWidgetItem *> selected = m_view.selectedItems(); + QTC_ASSERT(selected.count() == 1, return); + m_view.editItem(selected.first(), 0); + }); + const auto updateButtonStates = [this, removeButton, editButton] { + const bool hasSelection = !m_view.selectedItems().isEmpty(); + removeButton->setEnabled(hasSelection); + editButton->setEnabled(hasSelection); + }; + connect(m_view.selectionModel(), &QItemSelectionModel::selectionChanged, + this, updateButtonStates); + updateButtonStates(); + } + + QString paths() const + { + QStringList pathList; + for (int i = 0; i < m_view.topLevelItemCount(); ++i) + pathList << m_view.topLevelItem(i)->text(0); + return pathList.join(Utils::HostOsInfo::pathListSeparator()); + } + +private: + void addPath(const QString &path) + { + const auto item = new QTreeWidgetItem(&m_view, {path}); + item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable + | Qt::ItemIsDragEnabled); + } + + QTreeWidget m_view; +}; + class EnvironmentDelegate : public QStyledItemDelegate { public: @@ -85,7 +167,7 @@ class EnvironmentWidgetPrivate { public: Utils::EnvironmentModel *m_model; - + EnvironmentWidget::Type m_type = EnvironmentWidget::TypeLocal; QString m_baseEnvironmentText; EnvironmentWidget::OpenTerminalFunc m_openTerminalFunc; Utils::DetailsWidget *m_detailsContainer; @@ -105,6 +187,7 @@ EnvironmentWidget::EnvironmentWidget(QWidget *parent, Type type, QWidget *additi : QWidget(parent), d(std::make_unique<EnvironmentWidgetPrivate>()) { d->m_model = new Utils::EnvironmentModel(); + d->m_type = type; connect(d->m_model, &Utils::EnvironmentModel::userChangesChanged, this, &EnvironmentWidget::userChangesChanged); connect(d->m_model, &QAbstractItemModel::modelReset, @@ -360,7 +443,7 @@ bool EnvironmentWidget::currentEntryIsPathList(const QModelIndex ¤t) const if (valueIndex.column() == 0) valueIndex = valueIndex.siblingAtColumn(1); const QStringList entries = d->m_model->data(valueIndex).toString() - .split(Utils::HostOsInfo::pathListSeparator(), QString::SkipEmptyParts); + .split(Utils::HostOsInfo::pathListSeparator(), Utils::SkipEmptyParts); if (entries.length() < 2) return false; for (const QString &potentialDir : entries) { @@ -377,7 +460,15 @@ void EnvironmentWidget::updateButtons() void EnvironmentWidget::editEnvironmentButtonClicked() { - d->m_environmentView->edit(d->m_environmentView->currentIndex()); + const QModelIndex current = d->m_environmentView->currentIndex(); + if (current.column() == 1 && d->m_type == TypeLocal && currentEntryIsPathList(current)) { + PathListDialog dlg(d->m_model->indexToVariable(current), + d->m_model->data(current).toString(), this); + if (dlg.exec() == QDialog::Accepted) + d->m_model->setData(current, dlg.paths()); + } else { + d->m_environmentView->edit(current); + } } void EnvironmentWidget::addEnvironmentButtonClicked() |