diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 162350cc012..1fafbc7d930 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -121,6 +121,14 @@ Internal::PresetsData CMakeProject::combinePresets(Internal::PresetsData &cmakeP result.include = cmakeUserPresetsData.include; } + result.vendor = cmakePresetsData.vendor; + if (result.vendor) { + if (cmakeUserPresetsData.vendor) + result.vendor->insert(cmakeUserPresetsData.vendor.value()); + } else { + result.vendor = cmakeUserPresetsData.vendor; + } + auto combinePresetsInternal = [](auto &presetsHash, auto &presets, auto &userPresets, diff --git a/src/plugins/cmakeprojectmanager/cmakespecificsettings.cpp b/src/plugins/cmakeprojectmanager/cmakespecificsettings.cpp index 45da6ab361d..eeab46f946d 100644 --- a/src/plugins/cmakeprojectmanager/cmakespecificsettings.cpp +++ b/src/plugins/cmakeprojectmanager/cmakespecificsettings.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -122,7 +123,13 @@ CMakeSpecificSettings::CMakeSpecificSettings(Project *p, bool autoApply) if (project) { // Re-read the settings. Reading in constructor is too early - connect(project, &Project::settingsLoaded, this, [this] { + connect(project, &Project::settingsLoaded, this, [this] { readSettings(); }); + + connect(project->projectImporter(), &ProjectImporter::cmakePresetsUpdated, this, [this] { + // clear settings first + Store data; + project->setNamedSettings(Constants::Settings::GENERAL_ID, variantFromStore(data)); + readSettings(); }); } @@ -133,9 +140,24 @@ void CMakeSpecificSettings::readSettings() if (!project) { AspectContainer::readSettings(); } else { - const Store data = storeFromVariant(project->namedSettings(Constants::Settings::GENERAL_ID)); - useGlobalSettings = data.value(Constants::Settings::USE_GLOBAL_SETTINGS, true).toBool(); - fromMap(data); + Store data = storeFromVariant(project->namedSettings(Constants::Settings::GENERAL_ID)); + if (data.isEmpty()) { + CMakeProject *cmakeProject = static_cast(project); + if (cmakeProject->presetsData().havePresets && cmakeProject->presetsData().vendor) { + useGlobalSettings = false; + data = storeFromMap(cmakeProject->presetsData().vendor.value()); + fromMap(data); + + // Write the new loaded CMakePresets settings into .user file + writeSettings(); + } else { + useGlobalSettings = true; + AspectContainer::readSettings(); + } + } else { + useGlobalSettings = data.value(Constants::Settings::USE_GLOBAL_SETTINGS, true).toBool(); + fromMap(data); + } } } diff --git a/src/plugins/cmakeprojectmanager/presetsparser.cpp b/src/plugins/cmakeprojectmanager/presetsparser.cpp index 3befe4d99d8..c83eb6e5d3f 100644 --- a/src/plugins/cmakeprojectmanager/presetsparser.cpp +++ b/src/plugins/cmakeprojectmanager/presetsparser.cpp @@ -435,6 +435,30 @@ bool parseBuildPresets(const QJsonValue &jsonValue, return true; } +bool parseVendor(const QJsonValue &jsonValue, std::optional &vendorSettings) +{ + // The whole section is optional + if (jsonValue.isUndefined()) + return true; + if (!jsonValue.isObject()) + return false; + + const QJsonObject object = jsonValue.toObject(); + const QJsonValue qtIo = object.value("qt.io/QtCreator/1.0"); + if (qtIo.isUndefined()) + return true; + if (!qtIo.isObject()) + return false; + + const QJsonObject qtIoObject = qtIo.toObject(); + vendorSettings = QVariantMap(); + for (const QString &settingKey : qtIoObject.keys()) { + const QJsonValue settingValue = qtIoObject.value(settingKey); + vendorSettings->insert(settingKey, settingValue.toVariant()); + } + return true; +} + const PresetsData &PresetsParser::presetsData() const { return m_presetsData; @@ -502,6 +526,12 @@ bool PresetsParser::parse(const Utils::FilePath &jsonFile, QString &errorMessage return false; } + // optional + if (!parseVendor(root.value("vendor"), m_presetsData.vendor)) { + errorMessage = ::CMakeProjectManager::Tr::tr("Invalid \"vendor\" section in %1 file") + .arg(jsonFile.fileName()); + } + return true; } diff --git a/src/plugins/cmakeprojectmanager/presetsparser.h b/src/plugins/cmakeprojectmanager/presetsparser.h index 6df09014af3..b4852656881 100644 --- a/src/plugins/cmakeprojectmanager/presetsparser.h +++ b/src/plugins/cmakeprojectmanager/presetsparser.h @@ -142,7 +142,7 @@ public: int version = 0; bool havePresets = false; QVersionNumber cmakeMinimimRequired; - QHash vendor; + std::optional vendor; std::optional include; Utils::FilePath fileDir; QList configurePresets;