diff --git a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp index 9f77707a72b..6dc1aa6814d 100644 --- a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp +++ b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp @@ -24,6 +24,8 @@ ****************************************************************************/ #include "defaultpropertyprovider.h" + +#include "qbskitinformation.h" #include "qbsprojectmanagerconstants.h" #include @@ -207,7 +209,7 @@ QVariantMap DefaultPropertyProvider::properties(const ProjectExplorer::Kit *k, { QTC_ASSERT(k, return defaultData); QVariantMap data = autoGeneratedProperties(k, defaultData); - const QVariantMap customProperties = k->value(Core::Id(QBS_PROPERTIES_KEY_FOR_KITS)).toMap(); + const QVariantMap customProperties = QbsKitInformation::properties(k); for (QVariantMap::ConstIterator it = customProperties.constBegin(); it != customProperties.constEnd(); ++it) { data.insert(it.key(), it.value()); diff --git a/src/plugins/qbsprojectmanager/qbskitinformation.cpp b/src/plugins/qbsprojectmanager/qbskitinformation.cpp new file mode 100644 index 00000000000..b949d9325d1 --- /dev/null +++ b/src/plugins/qbsprojectmanager/qbskitinformation.cpp @@ -0,0 +1,121 @@ +/**************************************************************************** +** +** Copyright (C) 2017 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 "qbskitinformation.h" + +#include "customqbspropertiesdialog.h" + +#include +#include + +#include + +#include +#include + +using namespace ProjectExplorer; + +namespace QbsProjectManager { +namespace Internal { + +class ConfigWidget final : public KitConfigWidget +{ + Q_OBJECT +public: + ConfigWidget(Kit *kit, const KitInformation *kitInfo) + : KitConfigWidget(kit, kitInfo), + m_contentLabel(new QLabel), + m_changeButton(new QPushButton(tr("Change..."))) + { + connect(m_changeButton, &QPushButton::clicked, this, &ConfigWidget::changeProperties); + } + +private: + QString displayName() const override { return QbsKitInformation::displayName(); } + void makeReadOnly() override { m_changeButton->setEnabled(false); } + void refresh() override { m_contentLabel->setText(QbsKitInformation::representation(kit())); } + QWidget *mainWidget() const override { return m_contentLabel; } + QWidget *buttonWidget() const override { return m_changeButton; } + + void changeProperties() + { + CustomQbsPropertiesDialog dlg(QbsKitInformation::properties(kit())); + if (dlg.exec() == QDialog::Accepted) + QbsKitInformation::setProperties(kit(), dlg.properties()); + } + + QLabel * const m_contentLabel; + QPushButton * const m_changeButton; +}; + +QString QbsKitInformation::displayName() +{ + return tr("Additional Qbs Profile Settings"); +} + +QString QbsKitInformation::representation(const Kit *kit) +{ + const QVariantMap props = properties(kit); + QString repr; + for (auto it = props.begin(); it != props.end(); ++it) { + if (!repr.isEmpty()) + repr += ' '; + repr += it.key() + ':' + qbs::settingsValueToRepresentation(it.value()); + } + return repr; +} + +QVariantMap QbsKitInformation::properties(const Kit *kit) +{ + return kit->value(id()).toMap(); +} + +void QbsKitInformation::setProperties(Kit *kit, const QVariantMap &properties) +{ + kit->setValue(id(), properties); +} + +Core::Id QbsKitInformation::id() +{ + return "Qbs.KitInformation"; +} + +QVariant QbsKitInformation::defaultValue(const Kit *) const { return QString(); } +QList QbsKitInformation::validate(const Kit *) const { return QList(); } + +KitInformation::ItemList QbsKitInformation::toUserOutput(const Kit *k) const +{ + return ItemList({qMakePair(displayName(), representation(k))}); +} + +KitConfigWidget *QbsKitInformation::createConfigWidget(Kit *k) const +{ + return new ConfigWidget(k, this); +} + +} // namespace Internal +} // namespace QbsProjectManager + +#include diff --git a/src/plugins/qbsprojectmanager/qbskitinformation.h b/src/plugins/qbsprojectmanager/qbskitinformation.h new file mode 100644 index 00000000000..1c3fde049fa --- /dev/null +++ b/src/plugins/qbsprojectmanager/qbskitinformation.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Copyright (C) 2017 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 + +namespace QbsProjectManager { +namespace Internal { + +class QbsKitInformation final : public ProjectExplorer::KitInformation +{ +public: + static QString displayName(); + static QString representation(const ProjectExplorer::Kit *kit); + static QVariantMap properties(const ProjectExplorer::Kit *kit); + static void setProperties(ProjectExplorer::Kit *kit, const QVariantMap &properties); + +private: + static Core::Id id(); + + QVariant defaultValue(const ProjectExplorer::Kit *) const override; + QList validate(const ProjectExplorer::Kit *) const override; + ItemList toUserOutput(const ProjectExplorer::Kit *) const override; + ProjectExplorer::KitConfigWidget *createConfigWidget(ProjectExplorer::Kit *) const override; + + ProjectExplorer::KitConfigWidget *m_widget = nullptr; +}; + +} // namespace Internal +} // namespace QbsProjectManager diff --git a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp index 79ced8629c3..49de784313e 100644 --- a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp +++ b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp @@ -26,7 +26,6 @@ #include "qbsprofilessettingspage.h" #include "ui_qbsprofilessettingswidget.h" -#include "customqbspropertiesdialog.h" #include "qbsprojectmanager.h" #include "qbsprojectmanagerconstants.h" #include "qbsprojectmanagersettings.h" @@ -57,16 +56,9 @@ public: private: void refreshKitsList(); void displayCurrentProfile(); - void editProfile(); - void setupCustomProperties(const ProjectExplorer::Kit *kit); - void mergeCustomPropertiesIntoModel(); Ui::QbsProfilesSettingsWidget m_ui; qbs::SettingsModel m_model; - - typedef QHash CustomProperties; - CustomProperties m_customProperties; - bool m_applyingProperties; }; QbsProfilesSettingsPage::QbsProfilesSettingsPage(QObject *parent) @@ -109,7 +101,6 @@ void QbsProfilesSettingsPage::finish() QbsProfilesSettingsWidget::QbsProfilesSettingsWidget(QWidget *parent) : QWidget(parent) , m_model(QbsProjectManagerSettings::qbsSettingsBaseDir()) - , m_applyingProperties(false) { m_model.setEditable(false); m_ui.setupUi(this); @@ -125,31 +116,17 @@ QbsProfilesSettingsWidget::QbsProfilesSettingsWidget(QWidget *parent) m_ui.propertiesView, &QTreeView::expandAll); connect(m_ui.collapseButton, &QAbstractButton::clicked, m_ui.propertiesView, &QTreeView::collapseAll); - connect(m_ui.editButton, &QAbstractButton::clicked, - this, &QbsProfilesSettingsWidget::editProfile); refreshKitsList(); } void QbsProfilesSettingsWidget::apply() { - QTC_ASSERT(!m_applyingProperties, return); - m_applyingProperties = true; // The following will cause kitsChanged() to be emitted. - for (CustomProperties::ConstIterator it = m_customProperties.constBegin(); - it != m_customProperties.constEnd(); ++it) { - ProjectExplorer::Kit * const kit = ProjectExplorer::KitManager::kit(it.key()); - QTC_ASSERT(kit, continue); - kit->setValue(Core::Id(Constants::QBS_PROPERTIES_KEY_FOR_KITS), it.value()); - } - m_applyingProperties = false; m_model.reload(); displayCurrentProfile(); } void QbsProfilesSettingsWidget::refreshKitsList() { - if (m_applyingProperties) - return; - m_ui.kitsComboBox->disconnect(this); m_ui.propertiesView->setModel(0); m_model.reload(); @@ -162,15 +139,11 @@ void QbsProfilesSettingsWidget::refreshKitsList() QList validKits = ProjectExplorer::KitManager::kits(); Utils::erase(validKits, [](const ProjectExplorer::Kit *k) { return !k->isValid(); }); const bool hasKits = !validKits.isEmpty(); - m_customProperties.clear(); foreach (const ProjectExplorer::Kit * const kit, validKits) { if (kit->id() == currentId) newCurrentIndex = m_ui.kitsComboBox->count(); m_ui.kitsComboBox->addItem(kit->displayName(), kit->id().toSetting()); - setupCustomProperties(kit); } - mergeCustomPropertiesIntoModel(); - m_ui.editButton->setEnabled(hasKits); if (newCurrentIndex != -1) m_ui.kitsComboBox->setCurrentIndex(newCurrentIndex); else if (hasKits) @@ -208,45 +181,6 @@ void QbsProfilesSettingsWidget::displayCurrentProfile() } } -void QbsProfilesSettingsWidget::editProfile() -{ - QTC_ASSERT(m_ui.kitsComboBox->currentIndex() != -1, return); - - const Core::Id kitId = Core::Id::fromSetting(m_ui.kitsComboBox->currentData()); - CustomQbsPropertiesDialog dlg(m_customProperties.value(kitId), this); - if (dlg.exec() != QDialog::Accepted) - return; - - m_customProperties.insert(kitId, dlg.properties()); - mergeCustomPropertiesIntoModel(); - displayCurrentProfile(); -} - -void QbsProfilesSettingsWidget::setupCustomProperties(const ProjectExplorer::Kit *kit) -{ - const QVariantMap &properties - = kit->value(Core::Id(Constants::QBS_PROPERTIES_KEY_FOR_KITS)).toMap(); - m_customProperties.insert(kit->id(), properties); -} - -void QbsProfilesSettingsWidget::mergeCustomPropertiesIntoModel() -{ - QVariantMap customProperties; - for (CustomProperties::ConstIterator it = m_customProperties.constBegin(); - it != m_customProperties.constEnd(); ++it) { - const Core::Id kitId = it.key(); - const ProjectExplorer::Kit * const kit = ProjectExplorer::KitManager::kit(kitId); - QTC_ASSERT(kit, continue); - const QString keyPrefix = QLatin1String("profiles.") - + QbsManager::instance()->profileForKit(kit) + QLatin1Char('.'); - for (QVariantMap::ConstIterator it2 = it.value().constBegin(); it2 != it.value().constEnd(); - ++it2) { - customProperties.insert(keyPrefix + it2.key(), it2.value()); - } - } - m_model.setAdditionalProperties(customProperties); -} - } // namespace Internal } // namespace QbsProjectManager diff --git a/src/plugins/qbsprojectmanager/qbsprofilessettingswidget.ui b/src/plugins/qbsprojectmanager/qbsprofilessettingswidget.ui index 74745774cfe..69086d71289 100644 --- a/src/plugins/qbsprojectmanager/qbsprofilessettingswidget.ui +++ b/src/plugins/qbsprojectmanager/qbsprofilessettingswidget.ui @@ -101,13 +101,6 @@ - - - - &Edit... - - - diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.pro b/src/plugins/qbsprojectmanager/qbsprojectmanager.pro index 0270bf053c4..bbe36df9b3c 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.pro +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.pro @@ -28,6 +28,7 @@ HEADERS = \ qbscleanstep.h \ qbsdeployconfigurationfactory.h \ qbsinfopage.h \ + qbskitinformation.h \ qbsinstallstep.h \ qbslogsink.h \ qbsnodes.h \ @@ -56,6 +57,7 @@ SOURCES = \ qbsdeployconfigurationfactory.cpp \ qbsinfopage.cpp \ qbsinstallstep.cpp \ + qbskitinformation.cpp \ qbslogsink.cpp \ qbsnodes.cpp \ qbsnodetreebuilder.cpp \ diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs b/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs index 1b5a27ef974..0812c8ca659 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs @@ -84,6 +84,8 @@ QtcPlugin { "qbsinstallstep.cpp", "qbsinstallstep.h", "qbsinstallstepconfigwidget.ui", + "qbskitinformation.cpp", + "qbskitinformation.h", "qbslogsink.cpp", "qbslogsink.h", "qbsnodes.cpp", diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h b/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h index e18767a2230..3195bb8d654 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h +++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h @@ -93,8 +93,6 @@ const char QBS_SETTINGS_CATEGORY[] = "YM.qbs"; const char QBS_SETTINGS_TR_CATEGORY[] = QT_TRANSLATE_NOOP("QbsProjectManager", "Qbs"); const char QBS_SETTINGS_CATEGORY_ICON[] = ":/projectexplorer/images/build.png"; -const char QBS_PROPERTIES_KEY_FOR_KITS[] = "QbsProjectManager.qbs-properties"; - const char QBS_PROFILING_ENV[] = "QTC_QBS_PROFILING"; } // namespace Constants diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp index fe7b3618e43..8ad70ee87b5 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp @@ -31,6 +31,7 @@ #include "qbsdeployconfigurationfactory.h" #include "qbsinfopage.h" #include "qbsinstallstep.h" +#include "qbskitinformation.h" #include "qbsnodes.h" #include "qbsprofilessettingspage.h" #include "qbsproject.h" @@ -93,6 +94,7 @@ bool QbsProjectManagerPlugin::initialize(const QStringList &arguments, QString * Core::FileIconProvider::registerIconOverlayForSuffix(ProjectExplorer::Constants::FILEOVERLAY_QT, "qbs"); ProjectManager::registerProjectType(QmlJSTools::Constants::QBS_MIMETYPE); + KitManager::registerKitInformation(new QbsKitInformation); //create and register objects addAutoReleasedObject(new QbsManager);