aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/projectexplorer/projectconfigurationaspects.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/projectexplorer/projectconfigurationaspects.cpp')
-rw-r--r--src/plugins/projectexplorer/projectconfigurationaspects.cpp47
1 files changed, 43 insertions, 4 deletions
diff --git a/src/plugins/projectexplorer/projectconfigurationaspects.cpp b/src/plugins/projectexplorer/projectconfigurationaspects.cpp
index 588318de59..2a39634ad9 100644
--- a/src/plugins/projectexplorer/projectconfigurationaspects.cpp
+++ b/src/plugins/projectexplorer/projectconfigurationaspects.cpp
@@ -107,8 +107,10 @@ 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;
template<class Widget> void updateWidgetFromCheckStatus(Widget *w)
{
@@ -146,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;
@@ -154,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<QString> 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)
@@ -257,6 +276,13 @@ void BaseStringAspect::setExpectedKind(const PathChooser::Kind expectedKind)
d->m_pathChooserDisplay->setExpectedKind(expectedKind);
}
+void BaseStringAspect::setFileDialogOnly(bool requireFileDialog)
+{
+ d->m_fileDialogOnly = requireFileDialog;
+ if (d->m_pathChooserDisplay)
+ d->m_pathChooserDisplay->setFileDialogOnly(requireFileDialog);
+}
+
void BaseStringAspect::setEnvironment(const Environment &env)
{
d->m_environment = env;
@@ -287,6 +313,14 @@ void BaseStringAspect::setMacroExpanderProvider(const MacroExpanderProvider &exp
d->m_expanderProvider = expanderProvider;
}
+void BaseStringAspect::validateInput()
+{
+ if (d->m_pathChooserDisplay)
+ d->m_pathChooserDisplay->triggerChanged();
+ if (d->m_lineEditDisplay)
+ d->m_lineEditDisplay->validate();
+}
+
void BaseStringAspect::setUncheckedSemantics(BaseStringAspect::UncheckedSemantics semantics)
{
d->m_uncheckedSemantics = semantics;
@@ -329,6 +363,7 @@ void BaseStringAspect::addToLayout(LayoutBuilder &builder)
connect(d->m_pathChooserDisplay, &PathChooser::pathChanged,
this, &BaseStringAspect::setValue);
builder.addItem(d->m_pathChooserDisplay.data());
+ d->m_pathChooserDisplay->setFileDialogOnly(d->m_fileDialogOnly);
break;
case LineEditDisplay:
d->m_lineEditDisplay = new FancyLineEdit;
@@ -362,6 +397,8 @@ void BaseStringAspect::addToLayout(LayoutBuilder &builder)
break;
}
+ validateInput();
+
if (d->m_checker && d->m_checkBoxPlacement == CheckBoxPlacement::Right)
d->m_checker->addToLayout(builder);
@@ -374,7 +411,7 @@ void BaseStringAspect::update()
: d->m_value;
if (d->m_pathChooserDisplay) {
- d->m_pathChooserDisplay->setFileName(FilePath::fromString(displayedString));
+ d->m_pathChooserDisplay->setFilePath(FilePath::fromString(displayedString));
d->updateWidgetFromCheckStatus(d->m_pathChooserDisplay.data());
}
@@ -398,6 +435,8 @@ void BaseStringAspect::update()
if (!d->m_labelPixmap.isNull())
d->m_label->setPixmap(d->m_labelPixmap);
}
+
+ validateInput();
}
void BaseStringAspect::makeCheckable(CheckBoxPlacement checkBoxPlacement,