diff options
author | hjk <[email protected]> | 2019-05-06 11:09:49 +0200 |
---|---|---|
committer | Christian Stenger <[email protected]> | 2019-05-06 12:13:22 +0000 |
commit | 7bea21cff1a5fdc8a9a21de4eab7f4fb9efdedf0 (patch) | |
tree | 5942b0e9dcb1291d73ad265202b88b96cef56b02 /src/plugins/ios/iosbuildconfiguration.cpp | |
parent | b3eded3ee11189f97b78cb179666fc72b1e83bcd (diff) |
Ios: More IosBuildConfiguration aspectification
Move IosBuildSettingsWidget closer to IosBuildConfiguration,
start replacing bits by existing aspect functionality.
Change-Id: I2016f0298f5e0c40d93c4d3bb144904453a5af02
Reviewed-by: Christian Stenger <[email protected]>
Diffstat (limited to 'src/plugins/ios/iosbuildconfiguration.cpp')
-rw-r--r-- | src/plugins/ios/iosbuildconfiguration.cpp | 390 |
1 files changed, 368 insertions, 22 deletions
diff --git a/src/plugins/ios/iosbuildconfiguration.cpp b/src/plugins/ios/iosbuildconfiguration.cpp index 149c5749a09..533d29f45c9 100644 --- a/src/plugins/ios/iosbuildconfiguration.cpp +++ b/src/plugins/ios/iosbuildconfiguration.cpp @@ -27,16 +27,23 @@ #include "iosconfigurations.h" #include "iosconstants.h" -#include "iosbuildsettingswidget.h" -#include "projectexplorer/kitinformation.h" -#include "projectexplorer/namedwidget.h" -#include "projectexplorer/target.h" +#include <projectexplorer/kitinformation.h> +#include <projectexplorer/namedwidget.h> +#include <projectexplorer/target.h> -#include "qmakeprojectmanager/qmakebuildinfo.h" -#include "qmakeprojectmanager/qmakeprojectmanagerconstants.h" +#include <qmakeprojectmanager/qmakebuildinfo.h> +#include <qmakeprojectmanager/qmakeprojectmanagerconstants.h> #include <utils/algorithm.h> +#include <utils/detailswidget.h> +#include <utils/utilsicons.h> + +#include <QCheckBox> +#include <QComboBox> +#include <QHBoxLayout> +#include <QLabel> +#include <QPushButton> using namespace QmakeProjectManager; using namespace ProjectExplorer; @@ -44,11 +51,363 @@ using namespace ProjectExplorer; namespace Ios { namespace Internal { +Q_LOGGING_CATEGORY(iosSettingsLog, "qtc.ios.common", QtWarningMsg) + const char qmakeIosTeamSettings[] = "QMAKE_MAC_XCODE_SETTINGS+=qteam qteam.name=DEVELOPMENT_TEAM qteam.value="; const char qmakeProvisioningProfileSettings[] = "QMAKE_MAC_XCODE_SETTINGS+=qprofile qprofile.name=PROVISIONING_PROFILE_SPECIFIER qprofile.value="; const char signingIdentifierKey[] = "Ios.SigningIdentifier"; const char autoManagedSigningKey[] = "Ios.AutoManagedSigning"; +const int IdentifierRole = Qt::UserRole+1; + + +class IosBuildSettingsWidget : public NamedWidget +{ +public: + explicit IosBuildSettingsWidget(IosBuildConfiguration *iosBuildConfiguration); + + bool isSigningAutomaticallyManaged() const; + +private: + void announceSigningChanged(bool isAutoManaged, QString identifier); + void onSigningEntityComboIndexChanged(); + void onReset(); + + void setDefaultSigningIdentfier(const QString &identifier) const; + void configureSigningUi(bool autoManageSigning); + void populateDevelopmentTeams(); + void populateProvisioningProfiles(); + QString selectedIdentifier() const; + void updateInfoText(); + void updateWarningText(); + +private: + IosBuildConfiguration *m_bc = nullptr; + QString m_lastProfileSelection; + QString m_lastTeamSelection; + const bool m_isDevice; + + QPushButton *m_qmakeDefaults; + QComboBox *m_signEntityCombo; + QCheckBox *m_autoSignCheckbox; + QLabel *m_signEntityLabel; + QLabel *m_infoIconLabel; + QLabel *m_infoLabel; + QLabel *m_warningIconLabel; + QLabel *m_warningLabel; +}; + +IosBuildSettingsWidget::IosBuildSettingsWidget(IosBuildConfiguration *bc) + : m_bc(bc), + m_isDevice(DeviceTypeKitAspect::deviceTypeId(bc->target()->kit()) + == Constants::IOS_DEVICE_TYPE) +{ + auto detailsWidget = new Utils::DetailsWidget(this); + auto container = new QWidget(detailsWidget); + + m_qmakeDefaults = new QPushButton(container); + QSizePolicy sizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + m_qmakeDefaults->setSizePolicy(sizePolicy); + m_qmakeDefaults->setText(IosBuildConfiguration::tr("Reset")); + m_qmakeDefaults->setEnabled(m_isDevice); + + m_signEntityCombo = new QComboBox(container); + QSizePolicy sizePolicy1(QSizePolicy::Preferred, QSizePolicy::Fixed); + sizePolicy1.setHorizontalStretch(0); + sizePolicy1.setVerticalStretch(0); + m_signEntityCombo->setSizePolicy(sizePolicy1); + + m_autoSignCheckbox = new QCheckBox(container); + QSizePolicy sizePolicy2(QSizePolicy::Expanding, QSizePolicy::Fixed); + sizePolicy2.setHorizontalStretch(0); + sizePolicy2.setVerticalStretch(0); + m_autoSignCheckbox->setSizePolicy(sizePolicy2); + m_autoSignCheckbox->setChecked(true); + m_autoSignCheckbox->setText(IosBuildConfiguration::tr("Automatically manage signing")); + m_autoSignCheckbox->setChecked(bc->m_autoManagedSigning->value()); + m_autoSignCheckbox->setEnabled(m_isDevice); + + m_signEntityLabel = new QLabel(container); + + m_infoIconLabel = new QLabel(container); + QSizePolicy sizePolicy3(QSizePolicy::Maximum, QSizePolicy::Preferred); + sizePolicy3.setHorizontalStretch(0); + sizePolicy3.setVerticalStretch(0); + m_infoIconLabel->setSizePolicy(sizePolicy3); + + m_infoLabel = new QLabel(container); + QSizePolicy sizePolicy4(QSizePolicy::Preferred, QSizePolicy::Preferred); + sizePolicy4.setHorizontalStretch(0); + sizePolicy4.setVerticalStretch(0); + m_infoLabel->setSizePolicy(sizePolicy4); + m_infoLabel->setWordWrap(false); + + m_warningIconLabel = new QLabel(container); + m_warningIconLabel->setSizePolicy(sizePolicy3); + + m_warningLabel = new QLabel(container); + m_warningLabel->setSizePolicy(sizePolicy4); + m_warningLabel->setWordWrap(true); + + m_signEntityLabel->setText(IosBuildConfiguration::tr("Development team:")); + + connect(m_qmakeDefaults, &QPushButton::clicked, this, &IosBuildSettingsWidget::onReset); + + m_infoIconLabel->hide(); + m_infoIconLabel->setPixmap(Utils::Icons::INFO.pixmap()); + m_infoLabel->hide(); + + m_warningIconLabel->hide(); + m_warningIconLabel->setPixmap(Utils::Icons::WARNING.pixmap()); + m_warningLabel->hide(); + + detailsWidget->setState(Utils::DetailsWidget::NoSummary); + detailsWidget->setWidget(container); + + setDisplayName(IosBuildConfiguration::tr("iOS Settings")); + + if (m_isDevice) { + connect(IosConfigurations::instance(), &IosConfigurations::provisioningDataChanged, + this, &IosBuildSettingsWidget::populateDevelopmentTeams); + connect(m_signEntityCombo, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), + this, &IosBuildSettingsWidget::onSigningEntityComboIndexChanged); + connect(m_autoSignCheckbox, &QCheckBox::toggled, + this, &IosBuildSettingsWidget::configureSigningUi); + configureSigningUi(m_autoSignCheckbox->isChecked()); + setDefaultSigningIdentfier(bc->m_signingIdentifier->value()); + } + + m_signEntityCombo->setEnabled(m_isDevice); + m_signEntityLabel->setEnabled(m_isDevice); + adjustSize(); + + auto rootLayout = new QVBoxLayout(this); + rootLayout->setMargin(0); + rootLayout->addWidget(detailsWidget); + + auto gridLayout = new QGridLayout(); + gridLayout->addWidget(m_signEntityLabel, 0, 0, 1, 1); + gridLayout->addWidget(m_signEntityCombo, 0, 1, 1, 1); + gridLayout->addWidget(m_autoSignCheckbox, 0, 2, 1, 1); + gridLayout->addWidget(m_qmakeDefaults, 1, 1, 1, 1); + + auto horizontalLayout = new QHBoxLayout(); + horizontalLayout->addWidget(m_infoIconLabel); + horizontalLayout->addWidget(m_infoLabel); + + auto horizontalLayout_2 = new QHBoxLayout(); + horizontalLayout_2->addWidget(m_warningIconLabel); + horizontalLayout_2->addWidget(m_warningLabel); + + auto verticalLayout = new QVBoxLayout(container); + verticalLayout->addLayout(gridLayout); + verticalLayout->addLayout(horizontalLayout); + verticalLayout->addLayout(horizontalLayout_2); +} + +void IosBuildSettingsWidget::setDefaultSigningIdentfier(const QString &identifier) const +{ + if (identifier.isEmpty()) { + m_signEntityCombo->setCurrentIndex(0); + return; + } + + int defaultIndex = -1; + for (int index = 0; index < m_signEntityCombo->count(); ++index) { + QString teamID = m_signEntityCombo->itemData(index, IdentifierRole).toString(); + if (teamID == identifier) { + defaultIndex = index; + break; + } + } + if (defaultIndex > -1) { + m_signEntityCombo->setCurrentIndex(defaultIndex); + } else { + // Reset to default + m_signEntityCombo->setCurrentIndex(0); + qCDebug(iosSettingsLog) << "Cannot find default" + << (m_autoSignCheckbox->isChecked() ? "team": "provisioning profile") + << ". Identifier: " << identifier; + } +} + +bool IosBuildSettingsWidget::isSigningAutomaticallyManaged() const +{ + return m_autoSignCheckbox->isChecked() && m_signEntityCombo->currentIndex() > 0; +} + +void IosBuildSettingsWidget::onSigningEntityComboIndexChanged() +{ + QString identifier = selectedIdentifier(); + (m_autoSignCheckbox->isChecked() ? m_lastTeamSelection : m_lastProfileSelection) = identifier; + + updateInfoText(); + updateWarningText(); + announceSigningChanged(m_autoSignCheckbox->isChecked(), identifier); +} + +void IosBuildSettingsWidget::onReset() +{ + m_lastTeamSelection.clear(); + m_lastProfileSelection.clear(); + m_autoSignCheckbox->setChecked(true); + setDefaultSigningIdentfier(""); +} + +void IosBuildSettingsWidget::configureSigningUi(bool autoManageSigning) +{ + m_signEntityLabel->setText(autoManageSigning ? IosBuildConfiguration::tr("Development team:") + : IosBuildConfiguration::tr("Provisioning profile:")); + if (autoManageSigning) + populateDevelopmentTeams(); + else + populateProvisioningProfiles(); + + updateInfoText(); + announceSigningChanged(autoManageSigning, selectedIdentifier()); +} + +void IosBuildSettingsWidget::announceSigningChanged(bool autoManagedSigning, QString identifier) +{ + if (m_bc->m_signingIdentifier->value().compare(identifier) != 0 + || m_bc->m_autoManagedSigning->value() != autoManagedSigning) { + m_bc->m_autoManagedSigning->setValue(autoManagedSigning); + m_bc->m_signingIdentifier->setValue(identifier); + m_bc->updateQmakeCommand(); + } +} + +void IosBuildSettingsWidget::populateDevelopmentTeams() +{ + { + QSignalBlocker blocker(m_signEntityCombo); + // Populate Team id's + m_signEntityCombo->clear(); + m_signEntityCombo->addItem(IosBuildConfiguration::tr("Default")); + foreach (auto team, IosConfigurations::developmentTeams()) { + m_signEntityCombo->addItem(team->displayName()); + const int index = m_signEntityCombo->count() - 1; + m_signEntityCombo->setItemData(index, team->identifier(), IdentifierRole); + m_signEntityCombo->setItemData(index, team->details(), Qt::ToolTipRole); + } + } + // Maintain previous selection. + setDefaultSigningIdentfier(m_lastTeamSelection); + updateWarningText(); +} + +void IosBuildSettingsWidget::populateProvisioningProfiles() +{ + { + // Populate Team id's + QSignalBlocker blocker(m_signEntityCombo); + m_signEntityCombo->clear(); + const ProvisioningProfiles profiles = IosConfigurations::provisioningProfiles(); + if (profiles.count() > 0) { + for (auto profile : profiles) { + m_signEntityCombo->addItem(profile->displayName()); + const int index = m_signEntityCombo->count() - 1; + m_signEntityCombo->setItemData(index, profile->identifier(), IdentifierRole); + m_signEntityCombo->setItemData(index, profile->details(), Qt::ToolTipRole); + } + } else { + m_signEntityCombo->addItem(IosBuildConfiguration::tr("None")); + } + } + // Maintain previous selection. + setDefaultSigningIdentfier(m_lastProfileSelection); + updateWarningText(); +} + +QString IosBuildSettingsWidget::selectedIdentifier() const +{ + return m_signEntityCombo->currentData(IdentifierRole).toString(); +} + +void IosBuildSettingsWidget::updateInfoText() +{ + if (!m_isDevice) + return; + + QString infoMessage; + auto addMessage = [&infoMessage](const QString &msg) { + if (!infoMessage.isEmpty()) + infoMessage += "\n"; + infoMessage += msg; + }; + + QString identifier = selectedIdentifier(); + bool configuringTeams = m_autoSignCheckbox->isChecked(); + + if (identifier.isEmpty()) { + // No signing entity selection. + if (configuringTeams) + addMessage(IosBuildConfiguration::tr("Development team is not selected.")); + else + addMessage(IosBuildConfiguration::tr("Provisioning profile is not selected.")); + + addMessage(IosBuildConfiguration::tr("Using default development team and provisioning profile.")); + } else { + if (!configuringTeams) { + ProvisioningProfilePtr profile = IosConfigurations::provisioningProfile(identifier); + QTC_ASSERT(profile, return); + auto team = profile->developmentTeam(); + if (team) { + // Display corresponding team information. + addMessage(IosBuildConfiguration::tr("Development team: %1 (%2)").arg(team->displayName()) + .arg(team->identifier())); + addMessage(IosBuildConfiguration::tr("Settings defined here override the QMake environment.")); + } else { + qCDebug(iosSettingsLog) << "Development team not found for profile" << profile; + } + } else { + addMessage(IosBuildConfiguration::tr("Settings defined here override the QMake environment.")); + } + } + + m_infoIconLabel->setVisible(!infoMessage.isEmpty()); + m_infoLabel->setVisible(!infoMessage.isEmpty()); + m_infoLabel->setText(infoMessage); +} + +void IosBuildSettingsWidget::updateWarningText() +{ + if (!m_isDevice) + return; + + QString warningText; + bool configuringTeams = m_autoSignCheckbox->isChecked(); + if (m_signEntityCombo->count() < 2) { + warningText = IosBuildConfiguration::tr("%1 not configured. Use Xcode and Apple " + "developer account to configure the " + "provisioning profiles and teams.") + .arg(configuringTeams ? IosBuildConfiguration::tr("Development teams") + : IosBuildConfiguration::tr("Provisioning profiles")); + } else { + QString identifier = selectedIdentifier(); + if (configuringTeams) { + auto team = IosConfigurations::developmentTeam(identifier); + if (team && !team->hasProvisioningProfile()) + warningText = IosBuildConfiguration::tr("No provisioning profile found for the selected team."); + } else { + auto profile = IosConfigurations::provisioningProfile(identifier); + if (profile && QDateTime::currentDateTimeUtc() > profile->expirationDate()) { + warningText = IosBuildConfiguration::tr("Provisioning profile expired. Expiration date: %1") + .arg(profile->expirationDate().toLocalTime().toString(Qt::SystemLocaleLongDate)); + } + } + } + + m_warningLabel->setVisible(!warningText.isEmpty()); + m_warningIconLabel->setVisible(!warningText.isEmpty()); + m_warningLabel->setText(warningText); +} + + +// IosBuildConfiguration + IosBuildConfiguration::IosBuildConfiguration(Target *target, Core::Id id) : QmakeBuildConfiguration(target, id) { @@ -60,26 +419,13 @@ IosBuildConfiguration::IosBuildConfiguration(Target *target, Core::Id id) m_autoManagedSigning->setSettingsKey(autoManagedSigningKey); } -QList<ProjectExplorer::NamedWidget *> IosBuildConfiguration::createSubConfigWidgets() +QList<NamedWidget *> IosBuildConfiguration::createSubConfigWidgets() { auto subConfigWidgets = QmakeBuildConfiguration::createSubConfigWidgets(); - Core::Id devType = ProjectExplorer::DeviceTypeKitAspect::deviceTypeId(target()->kit()); // Ownership of this widget is with BuildSettingsWidget - auto buildSettingsWidget = new IosBuildSettingsWidget(devType, - m_signingIdentifier->value(), - m_autoManagedSigning->value()); + auto buildSettingsWidget = new IosBuildSettingsWidget(this); subConfigWidgets.prepend(buildSettingsWidget); - connect(buildSettingsWidget, &IosBuildSettingsWidget::signingSettingsChanged, - this, [this](bool autoManagedSigning, QString identifier) { - if (m_signingIdentifier->value().compare(identifier) != 0 - || m_autoManagedSigning->value() != autoManagedSigning) { - m_autoManagedSigning->setValue(autoManagedSigning); - m_signingIdentifier->setValue(identifier); - updateQmakeCommand(); - } - }); - return subConfigWidgets; } @@ -109,7 +455,7 @@ void IosBuildConfiguration::updateQmakeCommand() if (signingIdentifier.isEmpty() ) extraArgs << forceOverrideArg; - Core::Id devType = ProjectExplorer::DeviceTypeKitAspect::deviceTypeId(target()->kit()); + Core::Id devType = DeviceTypeKitAspect::deviceTypeId(target()->kit()); if (devType == Constants::IOS_DEVICE_TYPE && !signingIdentifier.isEmpty()) { if (m_autoManagedSigning->value()) { extraArgs << qmakeIosTeamSettings + signingIdentifier; |