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 | |
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')
-rw-r--r-- | src/plugins/ios/ios.pro | 2 | ||||
-rw-r--r-- | src/plugins/ios/ios.qbs | 2 | ||||
-rw-r--r-- | src/plugins/ios/iosbuildconfiguration.cpp | 390 | ||||
-rw-r--r-- | src/plugins/ios/iosbuildconfiguration.h | 2 | ||||
-rw-r--r-- | src/plugins/ios/iosbuildsettingswidget.cpp | 353 | ||||
-rw-r--r-- | src/plugins/ios/iosbuildsettingswidget.h | 80 |
6 files changed, 370 insertions, 459 deletions
diff --git a/src/plugins/ios/ios.pro b/src/plugins/ios/ios.pro index 28f710e4405..d8bfd14d15d 100644 --- a/src/plugins/ios/ios.pro +++ b/src/plugins/ios/ios.pro @@ -25,7 +25,6 @@ HEADERS += \ iosdeploystep.h \ simulatorcontrol.h \ iosbuildconfiguration.h \ - iosbuildsettingswidget.h \ createsimulatordialog.h \ simulatoroperationdialog.h \ simulatorinfomodel.h @@ -48,7 +47,6 @@ SOURCES += \ iosdeploystep.cpp \ simulatorcontrol.cpp \ iosbuildconfiguration.cpp \ - iosbuildsettingswidget.cpp \ createsimulatordialog.cpp \ simulatoroperationdialog.cpp \ simulatorinfomodel.cpp diff --git a/src/plugins/ios/ios.qbs b/src/plugins/ios/ios.qbs index d2d7f79a44b..e338c9241f9 100644 --- a/src/plugins/ios/ios.qbs +++ b/src/plugins/ios/ios.qbs @@ -20,8 +20,6 @@ QtcPlugin { "ios.qrc", "iosbuildconfiguration.cpp", "iosbuildconfiguration.h", - "iosbuildsettingswidget.cpp", - "iosbuildsettingswidget.h", "iosbuildstep.cpp", "iosbuildstep.h", "iosbuildstep.ui", 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; diff --git a/src/plugins/ios/iosbuildconfiguration.h b/src/plugins/ios/iosbuildconfiguration.h index d267d93450f..d575b328b00 100644 --- a/src/plugins/ios/iosbuildconfiguration.h +++ b/src/plugins/ios/iosbuildconfiguration.h @@ -39,6 +39,8 @@ public: IosBuildConfiguration(ProjectExplorer::Target *target, Core::Id id); private: + friend class IosBuildSettingsWidget; + QList<ProjectExplorer::NamedWidget *> createSubConfigWidgets() override; bool fromMap(const QVariantMap &map) override; diff --git a/src/plugins/ios/iosbuildsettingswidget.cpp b/src/plugins/ios/iosbuildsettingswidget.cpp deleted file mode 100644 index 067477ffe2b..00000000000 --- a/src/plugins/ios/iosbuildsettingswidget.cpp +++ /dev/null @@ -1,353 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "iosbuildsettingswidget.h" -#include "ui_iosbuildsettingswidget.h" -#include "iosconfigurations.h" -#include "iosconstants.h" - -#include <qmakeprojectmanager/qmakeproject.h> -#include <qmakeprojectmanager/qmakenodes.h> - -#include <projectexplorer/runconfiguration.h> - -#include <utils/algorithm.h> -#include <utils/detailswidget.h> -#include <utils/qtcassert.h> -#include <utils/utilsicons.h> - -#include <QLoggingCategory> -#include <QVBoxLayout> - -namespace Ios { -namespace Internal { - -namespace { -Q_LOGGING_CATEGORY(iosSettingsLog, "qtc.ios.common", QtWarningMsg) -} - -static const int IdentifierRole = Qt::UserRole+1; - -IosBuildSettingsWidget::IosBuildSettingsWidget(const Core::Id &deviceType, - const QString &signingIdentifier, - bool isSigningAutoManaged, QWidget *parent) : - ProjectExplorer::NamedWidget(parent), - m_deviceType(deviceType) -{ - const bool isDevice = m_deviceType == 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(tr("Reset")); - m_qmakeDefaults->setEnabled(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(tr("Automatically manage signing")); - m_autoSignCheckbox->setChecked(isSigningAutoManaged); - m_autoSignCheckbox->setEnabled(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(QApplication::translate("Ios::Internal::IosBuildSettingsWidget", "Development team:", nullptr)); - - 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(tr("iOS Settings")); - - if (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(signingIdentifier); - } - - m_signEntityCombo->setEnabled(isDevice); - m_signEntityLabel->setEnabled(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(); - emit signingSettingsChanged(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 ? tr("Development team:") - : tr("Provisioning profile:")); - if (autoManageSigning) - populateDevelopmentTeams(); - else - populateProvisioningProfiles(); - - updateInfoText(); - emit signingSettingsChanged(autoManageSigning, selectedIdentifier()); -} - -void IosBuildSettingsWidget::populateDevelopmentTeams() -{ - { - QSignalBlocker blocker(m_signEntityCombo); - // Populate Team id's - m_signEntityCombo->clear(); - m_signEntityCombo->addItem(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(tr("None")); - } - } - // Maintain previous selection. - setDefaultSigningIdentfier(m_lastProfileSelection); - updateWarningText(); -} - -QString IosBuildSettingsWidget::selectedIdentifier() const -{ - return m_signEntityCombo->currentData(IdentifierRole).toString(); -} - -void IosBuildSettingsWidget::updateInfoText() -{ - if (m_deviceType != Constants::IOS_DEVICE_TYPE) - 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(tr("Development team is not selected.")); - else - addMessage(tr("Provisioning profile is not selected.")); - - addMessage(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(tr("Development team: %1 (%2)").arg(team->displayName()) - .arg(team->identifier())); - addMessage(tr("Settings defined here override the QMake environment.")); - } else { - qCDebug(iosSettingsLog) << "Development team not found for profile" << profile; - } - } else { - addMessage(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_deviceType != Constants::IOS_DEVICE_TYPE) - return; - - QString warningText; - bool configuringTeams = m_autoSignCheckbox->isChecked(); - if (m_signEntityCombo->count() < 2) { - warningText = tr("%1 not configured. Use Xcode and Apple developer account to configure the " - "provisioning profiles and teams.") - .arg(configuringTeams ? tr("Development teams") : tr("Provisioning profiles")); - } else { - QString identifier = selectedIdentifier(); - if (configuringTeams) { - auto team = IosConfigurations::developmentTeam(identifier); - if (team && !team->hasProvisioningProfile()) - warningText = tr("No provisioning profile found for the selected team."); - } else { - auto profile = IosConfigurations::provisioningProfile(identifier); - if (profile && QDateTime::currentDateTimeUtc() > profile->expirationDate()) { - warningText = 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); -} - -} // namespace Internal -} // namespace Ios diff --git a/src/plugins/ios/iosbuildsettingswidget.h b/src/plugins/ios/iosbuildsettingswidget.h deleted file mode 100644 index 30c90a06357..00000000000 --- a/src/plugins/ios/iosbuildsettingswidget.h +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ -#pragma once - -#include <coreplugin/id.h> - -#include <projectexplorer/namedwidget.h> - -#include <QCheckBox> -#include <QComboBox> -#include <QLabel> -#include <QPushButton> - -namespace Ios { -namespace Internal { - -class IosBuildSettingsWidget : public ProjectExplorer::NamedWidget -{ - Q_OBJECT - -public: - explicit IosBuildSettingsWidget(const Core::Id &deviceType, const QString &signingIdentifier, - bool isSigningAutoManaged, QWidget *parent = nullptr); - - bool isSigningAutomaticallyManaged() const; - -signals: - void signingSettingsChanged(bool isAutoManaged, QString identifier); - -private: - 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: - QString m_lastProfileSelection; - QString m_lastTeamSelection; - const Core::Id m_deviceType; - - QPushButton *m_qmakeDefaults; - QComboBox *m_signEntityCombo; - QCheckBox *m_autoSignCheckbox; - QLabel *m_signEntityLabel; - QLabel *m_infoIconLabel; - QLabel *m_infoLabel; - QLabel *m_warningIconLabel; - QLabel *m_warningLabel; -}; - -} // namespace Internal -} // namespace Ios |