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 <hjk@qt.io>
This commit is contained in:
Christian Kandeler
2024-06-17 12:25:54 +02:00
parent 561dbbf5de
commit 729c803758
7 changed files with 34 additions and 12 deletions

View File

@@ -73,21 +73,14 @@ NameValueItemsWidget::NameValueItemsWidget(QWidget *parent)
layout->addWidget(m_editor); layout->addWidget(m_editor);
layout->addWidget(new QLabel(helpText, this)); 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); const auto timer = new QTimer(this);
timer->setSingleShot(true); timer->setSingleShot(true);
timer->setInterval(1000); timer->setInterval(1000);
connect(m_editor, &QPlainTextEdit::textChanged, timer, qOverload<>(&QTimer::start)); connect(m_editor, &QPlainTextEdit::textChanged, timer, qOverload<>(&QTimer::start));
connect(timer, &QTimer::timeout, this, checkForItemChange); connect(timer, &QTimer::timeout, this, &NameValueItemsWidget::forceUpdateCheck);
connect(m_editor, &Internal::TextEditHelper::lostFocus, this, [timer, checkForItemChange] { connect(m_editor, &Internal::TextEditHelper::lostFocus, this, [this, timer] {
timer->stop(); timer->stop();
checkForItemChange(); forceUpdateCheck();
}); });
} }
@@ -159,6 +152,15 @@ bool NameValueItemsWidget::editVariable(const QString &name, Selection selection
return false; 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) NameValuesDialog::NameValuesDialog(const QString &windowTitle, QWidget *parent)
: QDialog(parent) : QDialog(parent)
{ {

View File

@@ -29,6 +29,8 @@ public:
enum class Selection { Name, Value }; enum class Selection { Name, Value };
bool editVariable(const QString &name, Selection selection); bool editVariable(const QString &name, Selection selection);
void forceUpdateCheck();
signals: signals:
void userChangedItems(const EnvironmentItems &items); void userChangedItems(const EnvironmentItems &items);

View File

@@ -69,7 +69,7 @@ void EnvironmentAspect::setUserEnvironmentChanges(const Utils::EnvironmentItems
Utils::Environment EnvironmentAspect::environment() const Utils::Environment EnvironmentAspect::environment() const
{ {
Environment env = modifiedBaseEnvironment(); Environment env = modifiedBaseEnvironment();
env.modify(m_userChanges); env.modify(userEnvironmentChanges());
return env; return env;
} }
@@ -165,4 +165,9 @@ Environment EnvironmentAspect::BaseEnvironment::unmodifiedBaseEnvironment() cons
return getter ? getter() : Environment(); return getter ? getter() : Environment();
} }
Utils::EnvironmentItems EnvironmentAspect::userEnvironmentChanges() const
{
emit userChangesUpdateRequested();
return m_userChanges;
}
} // namespace ProjectExplorer } // namespace ProjectExplorer

View File

@@ -32,7 +32,7 @@ public:
int baseEnvironmentBase() const; int baseEnvironmentBase() const;
void setBaseEnvironmentBase(int base); void setBaseEnvironmentBase(int base);
Utils::EnvironmentItems userEnvironmentChanges() const { return m_userChanges; } Utils::EnvironmentItems userEnvironmentChanges() const;
void setUserEnvironmentChanges(const Utils::EnvironmentItems &diff); void setUserEnvironmentChanges(const Utils::EnvironmentItems &diff);
int addSupportedBaseEnvironment(const QString &displayName, int addSupportedBaseEnvironment(const QString &displayName,
@@ -68,6 +68,7 @@ signals:
void baseEnvironmentChanged(); void baseEnvironmentChanged();
void userEnvironmentChangesChanged(const Utils::EnvironmentItems &diff); void userEnvironmentChangesChanged(const Utils::EnvironmentItems &diff);
void environmentChanged(); void environmentChanged();
void userChangesUpdateRequested() const;
protected: protected:
void fromMap(const Utils::Store &map) override; void fromMap(const Utils::Store &map) override;

View File

@@ -26,6 +26,10 @@ EnvironmentAspectWidget::EnvironmentAspectWidget(EnvironmentAspect *aspect)
{ {
QTC_CHECK(m_aspect); QTC_CHECK(m_aspect);
connect(m_aspect, &EnvironmentAspect::userChangesUpdateRequested, this, [this] {
m_environmentWidget->forceUpdateCheck();
});
setContentsMargins(0, 0, 0, 0); setContentsMargins(0, 0, 0, 0);
auto topLayout = new QVBoxLayout(this); auto topLayout = new QVBoxLayout(this);
topLayout->setContentsMargins(0, 0, 0, 25); topLayout->setContentsMargins(0, 0, 0, 25);

View File

@@ -332,6 +332,7 @@ void EnvironmentWidget::setBaseEnvironmentText(const QString &text)
Utils::EnvironmentItems EnvironmentWidget::userChanges() const Utils::EnvironmentItems EnvironmentWidget::userChanges() const
{ {
forceUpdateCheck();
return d->m_model->userChanges(); return d->m_model->userChanges();
} }
@@ -352,6 +353,11 @@ void EnvironmentWidget::expand()
d->m_detailsContainer->setState(Utils::DetailsWidget::Expanded); d->m_detailsContainer->setState(Utils::DetailsWidget::Expanded);
} }
void EnvironmentWidget::forceUpdateCheck() const
{
d->m_editor.forceUpdateCheck();
}
void EnvironmentWidget::updateSummaryText() void EnvironmentWidget::updateSummaryText()
{ {
// The summary is redundant with the text edit, so we hide it on expansion. // The summary is redundant with the text edit, so we hide it on expansion.

View File

@@ -38,6 +38,8 @@ public:
void expand(); void expand();
void forceUpdateCheck() const;
signals: signals:
void userChangesChanged(); void userChangesChanged();
void detailsVisibleChanged(bool visible); void detailsVisibleChanged(bool visible);