From 1d600101ee81305d2d085920988a1cbd33f5b00e Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 22 Jun 2021 13:54:16 +0200 Subject: [PATCH] CMake: Apply build directory change on editingFinished Otherwise every time a character is typed, a dialog pops up, and that dialog is closed without triggering a cmake run, the value is reset. Add that behavior optionally to StringAspect. Change-Id: I6831d1622f08acae6df43d4ceb2bf7367c96a747 Reviewed-by: Cristian Adam --- src/libs/utils/aspects.cpp | 40 +++++++++++++++++-- src/libs/utils/aspects.h | 1 + .../cmakebuildconfiguration.cpp | 3 +- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index f03539d1cd7..23b57a8e0e5 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -658,6 +658,10 @@ public: bool m_showToolTipOnLabel = false; bool m_fileDialogOnly = false; bool m_useResetButton = false; + bool m_autoApplyOnEditingFinished = false; + // Used to block recursive editingFinished signals for example when return is pressed, and + // the validation changes focus by opening a dialog + bool m_blockAutoApply = false; template void updateWidgetFromCheckStatus(StringAspect *aspect, Widget *w) { @@ -1015,6 +1019,11 @@ void StringAspect::setOpenTerminalHandler(const std::function &openTerm d->m_pathChooserDisplay->setOpenTerminalHandler(openTerminal); } +void StringAspect::setAutoApplyOnEditingFinished(bool applyOnEditingFinished) +{ + d->m_autoApplyOnEditingFinished = applyOnEditingFinished; +} + void StringAspect::validateInput() { if (d->m_pathChooserDisplay) @@ -1059,8 +1068,19 @@ void StringAspect::addToLayout(LayoutBuilder &builder) addLabeledItem(builder, d->m_pathChooserDisplay); useMacroExpander(d->m_pathChooserDisplay->lineEdit()); if (isAutoApply()) { - connect(d->m_pathChooserDisplay, &PathChooser::pathChanged, this, [this] { - setValue(d->m_pathChooserDisplay->path()); }); + if (d->m_autoApplyOnEditingFinished) { + connect(d->m_pathChooserDisplay, &PathChooser::editingFinished, this, [this] { + if (d->m_blockAutoApply) + return; + d->m_blockAutoApply = true; + setValue(d->m_pathChooserDisplay->path()); + d->m_blockAutoApply = false; + }); + } else { + connect(d->m_pathChooserDisplay, &PathChooser::pathChanged, this, [this] { + setValue(d->m_pathChooserDisplay->path()); + }); + } } break; case LineEditDisplay: @@ -1075,8 +1095,20 @@ void StringAspect::addToLayout(LayoutBuilder &builder) addLabeledItem(builder, d->m_lineEditDisplay); useMacroExpander(d->m_lineEditDisplay); if (isAutoApply()) { - connect(d->m_lineEditDisplay, &FancyLineEdit::textEdited, - this, &StringAspect::setValue); + if (d->m_autoApplyOnEditingFinished) { + connect(d->m_lineEditDisplay, &FancyLineEdit::editingFinished, this, [this] { + if (d->m_blockAutoApply) + return; + d->m_blockAutoApply = true; + setValue(d->m_lineEditDisplay->text()); + d->m_blockAutoApply = false; + }); + } else { + connect(d->m_lineEditDisplay, + &FancyLineEdit::textEdited, + this, + &StringAspect::setValue); + } } if (d->m_useResetButton) { auto resetButton = createSubWidget(tr("Reset")); diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h index ef2f44d80a3..ee4219292a4 100644 --- a/src/libs/utils/aspects.h +++ b/src/libs/utils/aspects.h @@ -307,6 +307,7 @@ public: void setUseResetButton(); void setValidationFunction(const Utils::FancyLineEdit::ValidationFunction &validator); void setOpenTerminalHandler(const std::function &openTerminal); + void setAutoApplyOnEditingFinished(bool applyOnEditingFinished); void validateInput(); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 7d4a40618a6..94759a860d6 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -182,6 +182,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) container->setWidget(details); auto buildDirAspect = bc->buildDirectoryAspect(); + buildDirAspect->setAutoApplyOnEditingFinished(true); connect(buildDirAspect, &BaseAspect::changed, this, [this]() { m_configModel->flush(); // clear out config cache...; }); @@ -851,7 +852,7 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Id id) return newDir; if (QDir(oldDir).exists("CMakeCache.txt") && !QDir(newDir).exists("CMakeCache.txt")) { - if (QMessageBox::information(nullptr, + if (QMessageBox::information(Core::ICore::dialogParent(), tr("Changing Build Directory"), tr("Change the build directory and start with a " "basic CMake configuration?"),