diff --git a/src/plugins/vcsbase/vcsplugin.cpp b/src/plugins/vcsbase/vcsplugin.cpp index 13f226d43ab..1432f77b9c3 100644 --- a/src/plugins/vcsbase/vcsplugin.cpp +++ b/src/plugins/vcsbase/vcsplugin.cpp @@ -36,11 +36,13 @@ #include "nicknamedialog.h" #include "vcsoutputwindow.h" #include "corelistener.h" +#include "wizard/vcsconfigurationpage.h" #include #include #include +#include #include #include @@ -89,6 +91,8 @@ bool VcsPlugin::initialize(const QStringList &arguments, QString *errorMessage) this, SLOT(slotSettingsChanged())); slotSettingsChanged(); + JsonWizardFactory::registerPageFactory(new Internal::VcsConfigurationPageFactory); + Utils::MacroExpander *expander = Utils::globalMacroExpander(); expander->registerVariable(Constants::VAR_VCS_NAME, tr("Name of the version control system in use by the current project."), diff --git a/src/plugins/vcsbase/wizard/vcsconfigurationpage.cpp b/src/plugins/vcsbase/wizard/vcsconfigurationpage.cpp index e3c28dc4ab4..34c3ea7cd12 100644 --- a/src/plugins/vcsbase/wizard/vcsconfigurationpage.cpp +++ b/src/plugins/vcsbase/wizard/vcsconfigurationpage.cpp @@ -34,7 +34,11 @@ #include #include +#include +#include +#include +#include #include #include @@ -42,10 +46,65 @@ #include using namespace Core; +using namespace ProjectExplorer; namespace VcsBase { namespace Internal { +VcsConfigurationPageFactory::VcsConfigurationPageFactory() +{ + setTypeIdsSuffix(QLatin1String("VcsConfiguration")); +} + +Utils::WizardPage *VcsConfigurationPageFactory::create(JsonWizard *wizard, Id typeId, + const QVariant &data) +{ + Q_UNUSED(wizard); + + QTC_ASSERT(canCreate(typeId), return 0); + + QVariantMap tmp = data.toMap(); + const QString vcsId = tmp.value(QLatin1String("vcsId")).toString(); + QTC_ASSERT(!vcsId.isEmpty(), return 0); + + IVersionControl *vc = VcsManager::versionControl(Id::fromString(vcsId)); + QTC_ASSERT(vc, return 0); + + return new VcsConfigurationPage(vc); +} + +bool VcsConfigurationPageFactory::validateData(Id typeId, const QVariant &data, + QString *errorMessage) +{ + QTC_ASSERT(canCreate(typeId), return false); + + if (data.isNull() || data.type() != QVariant::Map) { + *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonWizard", + "\"data\" must be a JSON object for \"VcsConfiguration\" pages."); + return false; + } + + QVariantMap tmp = data.toMap(); + const QString vcsId = tmp.value(QLatin1String("vcsId")).toString(); + if (vcsId.isEmpty()) { + *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonWizard", + "\"VcsConfiguration\" page requires a \"vcsId\" set."); + return false; + } + + if (!VcsManager::versionControl(Id::fromString(vcsId))) { + *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonWizard", + "\"vcsId\" (\"%1\") is invalid for \"VcsConfiguration\" page. " + "Possible values are: %2.") + .arg(vcsId) + .arg(QStringList(Utils::transform(VcsManager::versionControls(), [](const IVersionControl *vc) { + return vc->id().toString(); + })).join(QLatin1String(", "))); + return false; + } + return true; +} + class VcsConfigurationPagePrivate { public: @@ -56,7 +115,7 @@ public: } // namespace Internal VcsConfigurationPage::VcsConfigurationPage(const IVersionControl *vc, QWidget *parent) : - QWizardPage(parent), + Utils::WizardPage(parent), d(new Internal::VcsConfigurationPagePrivate) { QTC_ASSERT(vc, return); diff --git a/src/plugins/vcsbase/wizard/vcsconfigurationpage.h b/src/plugins/vcsbase/wizard/vcsconfigurationpage.h index 0f743265d04..1a0b6059267 100644 --- a/src/plugins/vcsbase/wizard/vcsconfigurationpage.h +++ b/src/plugins/vcsbase/wizard/vcsconfigurationpage.h @@ -33,7 +33,9 @@ #include "../vcsbase_global.h" -#include +#include + +#include namespace Core { class IVersionControl; } @@ -41,11 +43,25 @@ namespace VcsBase { namespace Internal { class VcsConfigurationPagePrivate; } -class VCSBASE_EXPORT VcsConfigurationPage : public QWizardPage +namespace Internal { + +class VcsConfigurationPageFactory : public ProjectExplorer::JsonWizardPageFactory +{ +public: + VcsConfigurationPageFactory(); + + Utils::WizardPage *create(ProjectExplorer::JsonWizard *wizard, Core::Id typeId, const QVariant &data); + bool validateData(Core::Id typeId, const QVariant &data, QString *errorMessage); +}; + +} // namespace Internal + +class VCSBASE_EXPORT VcsConfigurationPage : public Utils::WizardPage { Q_OBJECT public: + // TODO: Make this set the VCS only in initializePage. explicit VcsConfigurationPage(const Core::IVersionControl *, QWidget *parent = 0); ~VcsConfigurationPage();