From dbb640783cd70d6df100f3505f64d1186075ac1b Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 24 Mar 2020 10:14:47 +0100 Subject: [PATCH] BaseStringAspect: Provide a way to place a hook between UI and value Change-Id: Ie6fd1c3215cba06dd67673b978af9f457f7fa9c8 Reviewed-by: Tobias Hunger Reviewed-by: hjk --- .../projectconfigurationaspects.cpp | 24 ++++++++++++++++--- .../projectconfigurationaspects.h | 3 +++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/plugins/projectexplorer/projectconfigurationaspects.cpp b/src/plugins/projectexplorer/projectconfigurationaspects.cpp index d12112a9411..2a39634ad9a 100644 --- a/src/plugins/projectexplorer/projectconfigurationaspects.cpp +++ b/src/plugins/projectexplorer/projectconfigurationaspects.cpp @@ -107,6 +107,7 @@ public: Utils::MacroExpanderProvider m_expanderProvider; QPixmap m_labelPixmap; Utils::FilePath m_baseFileName; + BaseStringAspect::ValueAcceptor m_valueAcceptor; bool m_readOnly = false; bool m_showToolTipOnLabel = false; bool m_fileDialogOnly = false; @@ -147,6 +148,11 @@ BaseStringAspect::BaseStringAspect() BaseStringAspect::~BaseStringAspect() = default; +void BaseStringAspect::setValueAcceptor(BaseStringAspect::ValueAcceptor &&acceptor) +{ + d->m_valueAcceptor = std::move(acceptor); +} + QString BaseStringAspect::value() const { return d->m_value; @@ -155,10 +161,22 @@ QString BaseStringAspect::value() const void BaseStringAspect::setValue(const QString &value) { const bool isSame = value == d->m_value; - d->m_value = value; + if (isSame) + return; + + QString processedValue = value; + if (d->m_valueAcceptor) { + const Utils::optional tmp = d->m_valueAcceptor(d->m_value, value); + if (!tmp) { + update(); // Make sure the original value is retained in the UI + return; + } + processedValue = tmp.value(); + } + + d->m_value = processedValue; update(); - if (!isSame) - emit changed(); + emit changed(); } void BaseStringAspect::fromMap(const QVariantMap &map) diff --git a/src/plugins/projectexplorer/projectconfigurationaspects.h b/src/plugins/projectexplorer/projectconfigurationaspects.h index 71567d493f1..f57b69869ab 100644 --- a/src/plugins/projectexplorer/projectconfigurationaspects.h +++ b/src/plugins/projectexplorer/projectconfigurationaspects.h @@ -115,6 +115,9 @@ public: void addToLayout(LayoutBuilder &builder) override; + // Hook between UI and BaseStringAspect: + using ValueAcceptor = std::function(const QString &, const QString &)>; + void setValueAcceptor(ValueAcceptor &&acceptor); QString value() const; void setValue(const QString &val);