From 729c8037581a087912a4b61acb2895fac60d6d8e Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 17 Jun 2024 12:25:54 +0200 Subject: [PATCH] ProjectExplorer: Ensure environment from aspect is always up to date Otherwise our (intential) delay when updating the environment from the text edit can lead to surprises for the user. Fixes: QTCREATORBUG-31052 Change-Id: Iaba8c496094ad95d8c099c67c0805317f32a2936 Reviewed-by: hjk --- src/libs/utils/namevaluesdialog.cpp | 22 ++++++++++--------- src/libs/utils/namevaluesdialog.h | 2 ++ .../projectexplorer/environmentaspect.cpp | 7 +++++- .../projectexplorer/environmentaspect.h | 3 ++- .../environmentaspectwidget.cpp | 4 ++++ .../projectexplorer/environmentwidget.cpp | 6 +++++ .../projectexplorer/environmentwidget.h | 2 ++ 7 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/libs/utils/namevaluesdialog.cpp b/src/libs/utils/namevaluesdialog.cpp index 5a45c54a75e..cd34a23955f 100644 --- a/src/libs/utils/namevaluesdialog.cpp +++ b/src/libs/utils/namevaluesdialog.cpp @@ -73,21 +73,14 @@ NameValueItemsWidget::NameValueItemsWidget(QWidget *parent) layout->addWidget(m_editor); layout->addWidget(new QLabel(helpText, this)); - const auto checkForItemChange = [this] { - const EnvironmentItems newItems = environmentItems(); - if (newItems != m_originalItems) { - m_originalItems = newItems; - emit userChangedItems(newItems); - } - }; const auto timer = new QTimer(this); timer->setSingleShot(true); timer->setInterval(1000); connect(m_editor, &QPlainTextEdit::textChanged, timer, qOverload<>(&QTimer::start)); - connect(timer, &QTimer::timeout, this, checkForItemChange); - connect(m_editor, &Internal::TextEditHelper::lostFocus, this, [timer, checkForItemChange] { + connect(timer, &QTimer::timeout, this, &NameValueItemsWidget::forceUpdateCheck); + connect(m_editor, &Internal::TextEditHelper::lostFocus, this, [this, timer] { timer->stop(); - checkForItemChange(); + forceUpdateCheck(); }); } @@ -159,6 +152,15 @@ bool NameValueItemsWidget::editVariable(const QString &name, Selection selection return false; } +void NameValueItemsWidget::forceUpdateCheck() +{ + const EnvironmentItems newItems = environmentItems(); + if (newItems != m_originalItems) { + m_originalItems = newItems; + emit userChangedItems(newItems); + } +} + NameValuesDialog::NameValuesDialog(const QString &windowTitle, QWidget *parent) : QDialog(parent) { diff --git a/src/libs/utils/namevaluesdialog.h b/src/libs/utils/namevaluesdialog.h index a1e884fe5b5..abf6b84b23e 100644 --- a/src/libs/utils/namevaluesdialog.h +++ b/src/libs/utils/namevaluesdialog.h @@ -29,6 +29,8 @@ public: enum class Selection { Name, Value }; bool editVariable(const QString &name, Selection selection); + void forceUpdateCheck(); + signals: void userChangedItems(const EnvironmentItems &items); diff --git a/src/plugins/projectexplorer/environmentaspect.cpp b/src/plugins/projectexplorer/environmentaspect.cpp index fb5aaa2c243..43107b6141d 100644 --- a/src/plugins/projectexplorer/environmentaspect.cpp +++ b/src/plugins/projectexplorer/environmentaspect.cpp @@ -69,7 +69,7 @@ void EnvironmentAspect::setUserEnvironmentChanges(const Utils::EnvironmentItems Utils::Environment EnvironmentAspect::environment() const { Environment env = modifiedBaseEnvironment(); - env.modify(m_userChanges); + env.modify(userEnvironmentChanges()); return env; } @@ -165,4 +165,9 @@ Environment EnvironmentAspect::BaseEnvironment::unmodifiedBaseEnvironment() cons return getter ? getter() : Environment(); } +Utils::EnvironmentItems EnvironmentAspect::userEnvironmentChanges() const +{ + emit userChangesUpdateRequested(); + return m_userChanges; +} } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/environmentaspect.h b/src/plugins/projectexplorer/environmentaspect.h index 26dd43f6a41..86d7d345008 100644 --- a/src/plugins/projectexplorer/environmentaspect.h +++ b/src/plugins/projectexplorer/environmentaspect.h @@ -32,7 +32,7 @@ public: int baseEnvironmentBase() const; void setBaseEnvironmentBase(int base); - Utils::EnvironmentItems userEnvironmentChanges() const { return m_userChanges; } + Utils::EnvironmentItems userEnvironmentChanges() const; void setUserEnvironmentChanges(const Utils::EnvironmentItems &diff); int addSupportedBaseEnvironment(const QString &displayName, @@ -68,6 +68,7 @@ signals: void baseEnvironmentChanged(); void userEnvironmentChangesChanged(const Utils::EnvironmentItems &diff); void environmentChanged(); + void userChangesUpdateRequested() const; protected: void fromMap(const Utils::Store &map) override; diff --git a/src/plugins/projectexplorer/environmentaspectwidget.cpp b/src/plugins/projectexplorer/environmentaspectwidget.cpp index d47b4e82cc3..148b4415658 100644 --- a/src/plugins/projectexplorer/environmentaspectwidget.cpp +++ b/src/plugins/projectexplorer/environmentaspectwidget.cpp @@ -26,6 +26,10 @@ EnvironmentAspectWidget::EnvironmentAspectWidget(EnvironmentAspect *aspect) { QTC_CHECK(m_aspect); + connect(m_aspect, &EnvironmentAspect::userChangesUpdateRequested, this, [this] { + m_environmentWidget->forceUpdateCheck(); + }); + setContentsMargins(0, 0, 0, 0); auto topLayout = new QVBoxLayout(this); topLayout->setContentsMargins(0, 0, 0, 25); diff --git a/src/plugins/projectexplorer/environmentwidget.cpp b/src/plugins/projectexplorer/environmentwidget.cpp index c438b7b1f2c..c62a9488594 100644 --- a/src/plugins/projectexplorer/environmentwidget.cpp +++ b/src/plugins/projectexplorer/environmentwidget.cpp @@ -332,6 +332,7 @@ void EnvironmentWidget::setBaseEnvironmentText(const QString &text) Utils::EnvironmentItems EnvironmentWidget::userChanges() const { + forceUpdateCheck(); return d->m_model->userChanges(); } @@ -352,6 +353,11 @@ void EnvironmentWidget::expand() d->m_detailsContainer->setState(Utils::DetailsWidget::Expanded); } +void EnvironmentWidget::forceUpdateCheck() const +{ + d->m_editor.forceUpdateCheck(); +} + void EnvironmentWidget::updateSummaryText() { // The summary is redundant with the text edit, so we hide it on expansion. diff --git a/src/plugins/projectexplorer/environmentwidget.h b/src/plugins/projectexplorer/environmentwidget.h index b1a26b036b3..f204ae978f0 100644 --- a/src/plugins/projectexplorer/environmentwidget.h +++ b/src/plugins/projectexplorer/environmentwidget.h @@ -38,6 +38,8 @@ public: void expand(); + void forceUpdateCheck() const; + signals: void userChangesChanged(); void detailsVisibleChanged(bool visible);