From 695b752b57da0d9364fc20fcd0f1252322fb59b5 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 16 Jun 2015 13:44:48 +0200 Subject: [PATCH] JsonWizard: Explicitly set required/preferred features on kits page Do not use the required/preferred features from the wizard in the kits page. The wizard's features are used to decide which wizards will be shown (together with the enabled key). The kits page has a separate set of features that are used to decide on the Kits shown. Keep these settings separate, as they are different things. If nothing is set at the Kits page, then the wizard's values will be copied. This is to stay compatible with existing JSON wizards. Change-Id: I2f8e3ccc46ce92f5be89aecaf52e5a81e4b29e83 Reviewed-by: Orgad Shaneh --- .../jsonwizard/jsonkitspage.cpp | 75 ++++++++++++++++++- .../projectexplorer/jsonwizard/jsonkitspage.h | 23 ++++++ .../jsonwizard/jsonwizardpagefactory_p.cpp | 23 +++++- 3 files changed, 116 insertions(+), 5 deletions(-) diff --git a/src/plugins/projectexplorer/jsonwizard/jsonkitspage.cpp b/src/plugins/projectexplorer/jsonwizard/jsonkitspage.cpp index 65737f5593..647384cec8 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonkitspage.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonkitspage.cpp @@ -45,8 +45,13 @@ #include #include +using namespace Core; + namespace ProjectExplorer { +const char KEY_FEATURE[] = "feature"; +const char KEY_CONDITION[] = "condition"; + JsonKitsPage::JsonKitsPage(QWidget *parent) : TargetSetupPage(parent) { } @@ -58,8 +63,10 @@ void JsonKitsPage::initializePage() connect(wiz, &JsonWizard::filesPolished, this, &JsonKitsPage::setupProjectFiles); const QString platform = wiz->stringValue(QLatin1String("Platform")); - const Core::FeatureSet preferred = Core::FeatureSet::fromStringList(wiz->value(QLatin1String("PreferredFeatures")).toStringList()); - const Core::FeatureSet required = Core::FeatureSet::fromStringList(wiz->value(QLatin1String("RequiredFeatures")).toStringList()); + const FeatureSet preferred + = evaluate(m_preferredFeatures, wiz->value(QLatin1String("PreferredFeatures")), wiz); + const FeatureSet required + = evaluate(m_requiredFeatures, wiz->value(QLatin1String("RequiredFeatures")), wiz); setRequiredKitMatcher(KitMatcher([required](const Kit *k) { return k->hasFeatures(required); })); setPreferredKitMatcher(KitMatcher([platform, preferred](const Kit *k) { return k->hasPlatform(platform) && k->hasFeatures(preferred); })); @@ -88,13 +95,23 @@ QString JsonKitsPage::unexpandedProjectPath() const return m_unexpandedProjectPath; } +void JsonKitsPage::setRequiredFeatures(const QVariant &data) +{ + m_requiredFeatures = parseFeatures(data); +} + +void JsonKitsPage::setPreferredFeatures(const QVariant &data) +{ + m_preferredFeatures = parseFeatures(data); +} + void JsonKitsPage::setupProjectFiles(const JsonWizard::GeneratorFiles &files) { Project *project = 0; QList managerList = ExtensionSystem::PluginManager::getObjects(); foreach (const JsonWizard::GeneratorFile &f, files) { - if (f.file.attributes() & Core::GeneratedFile::OpenProjectAttribute) { + if (f.file.attributes() & GeneratedFile::OpenProjectAttribute) { QString errorMessage; QString path = f.file.path(); const QFileInfo fi(path); @@ -119,4 +136,56 @@ void JsonKitsPage::setupProjectFiles(const JsonWizard::GeneratorFiles &files) } } +FeatureSet JsonKitsPage::evaluate(const QVector &list, + const QVariant &defaultSet, JsonWizard *wiz) +{ + if (list.isEmpty()) + return FeatureSet::fromStringList(defaultSet.toStringList()); + + FeatureSet features; + foreach (const ConditionalFeature &f, list) { + if (JsonWizard::boolFromVariant(f.condition, wiz->expander())) + features |= f.feature; + } + return features; +} + +QVector JsonKitsPage::parseFeatures(const QVariant &data, + QString *errorMessage) +{ + QVector result; + if (errorMessage) + errorMessage->clear(); + + if (data.isNull()) + return result; + if (data.type() != QVariant::List) { + if (errorMessage) + *errorMessage = tr("Feature list is set and not of type list."); + return result; + } + + foreach (const QVariant &element, data.toList()) { + if (element.type() == QVariant::String) { + result.append({ Id::fromString(element.toString()), QVariant(true) }); + } else if (element.type() == QVariant::Map) { + const QVariantMap obj = element.toMap(); + const QString feature = obj.value(QLatin1String(KEY_FEATURE)).toString(); + if (feature.isEmpty()) { + *errorMessage = tr("No \"%1\" key found in feature list object.") + .arg(QLatin1String(KEY_FEATURE)); + return QVector(); + } + + result.append({ Id::fromString(feature), obj.value(QLatin1String(KEY_CONDITION), true) }); + } else { + if (errorMessage) + *errorMessage = tr("Feature list element is not a string or object."); + return QVector(); + } + } + + return result; +} + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/jsonwizard/jsonkitspage.h b/src/plugins/projectexplorer/jsonwizard/jsonkitspage.h index 0bbedbd027..388da79aa1 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonkitspage.h +++ b/src/plugins/projectexplorer/jsonwizard/jsonkitspage.h @@ -34,6 +34,8 @@ #include "jsonwizard.h" #include "../targetsetuppage.h" +#include + namespace ProjectExplorer { // Documentation inside. @@ -50,11 +52,32 @@ public: void setUnexpandedProjectPath(const QString &path); QString unexpandedProjectPath() const; + void setRequiredFeatures(const QVariant &data); + void setPreferredFeatures(const QVariant &data); + + class ConditionalFeature { + public: + ConditionalFeature() : feature(-1) { } + ConditionalFeature(const Core::Feature &f, const QVariant &c) : feature(f), condition(c) + { } + + Core::Feature feature; + QVariant condition; + }; + static QVector parseFeatures(const QVariant &data, + QString *errorMessage = 0); + private slots: void setupProjectFiles(const JsonWizard::GeneratorFiles &files); private: QString m_unexpandedProjectPath; + + QVector m_requiredFeatures; + QVector m_preferredFeatures; + + Core::FeatureSet evaluate(const QVector &list, const QVariant &defaultSet, + JsonWizard *wiz); }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardpagefactory_p.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardpagefactory_p.cpp index 570addd0c6..8d3d7b8f79 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardpagefactory_p.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardpagefactory_p.cpp @@ -129,6 +129,8 @@ bool FilePageFactory::validateData(Core::Id typeId, const QVariant &data, QStrin // -------------------------------------------------------------------- static const char KEY_PROJECT_FILE[] = "projectFilePath"; +static const char KEY_REQUIRED_FEATURES[] = "requiredFeatures"; +static const char KEY_PREFERRED_FEATURES[] = "preferredFeatures"; KitsPageFactory::KitsPageFactory() { @@ -141,11 +143,27 @@ Utils::WizardPage *KitsPageFactory::create(JsonWizard *wizard, Core::Id typeId, QTC_ASSERT(canCreate(typeId), return 0); JsonKitsPage *page = new JsonKitsPage; - page->setUnexpandedProjectPath(data.toMap().value(QLatin1String(KEY_PROJECT_FILE)).toString()); + const QVariantMap dataMap = data.toMap(); + page->setUnexpandedProjectPath(dataMap.value(QLatin1String(KEY_PROJECT_FILE)).toString()); + page->setRequiredFeatures(dataMap.value(QLatin1String(KEY_REQUIRED_FEATURES))); + page->setPreferredFeatures(dataMap.value(QLatin1String(KEY_PREFERRED_FEATURES))); return page; } +static bool validateFeatureList(const QVariantMap &data, const QByteArray &key, QString *errorMessage) +{ + QString message; + JsonKitsPage::parseFeatures(data.value(QLatin1String(key)), &message); + if (!message.isEmpty()) { + *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonWizard", + "Error parsing \"%1\" in \"Kits\" page: %2") + .arg(QLatin1String(key), message); + return false; + } + return true; +} + bool KitsPageFactory::validateData(Core::Id typeId, const QVariant &data, QString *errorMessage) { QTC_ASSERT(canCreate(typeId), return false); @@ -164,7 +182,8 @@ bool KitsPageFactory::validateData(Core::Id typeId, const QVariant &data, QStrin return false; } - return true; + return validateFeatureList(tmp, KEY_REQUIRED_FEATURES, errorMessage) + && validateFeatureList(tmp, KEY_PREFERRED_FEATURES, errorMessage); } // -------------------------------------------------------------------- -- GitLab