diff options
author | Tobias Hunger <tobias.hunger@digia.com> | 2013-08-13 10:52:57 +0200 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@digia.com> | 2013-09-27 14:34:43 +0200 |
commit | 921f86dfa748468a8d7e6bb7787aed8fb8b53da9 (patch) | |
tree | 717cc0cd5052ff7a75f27f11e5abb9143fd35447 /src/plugins/qt4projectmanager | |
parent | 95828d4691a993e552843738114507a5a30efe2a (diff) | |
download | qt-creator-921f86dfa748468a8d7e6bb7787aed8fb8b53da9.tar.gz |
TargetSetupPage: Generalize the page
Generalize the target setup page and move it into projectexplorer
Move the qmake specific code into a projectimporter class with
a specialization for qmake projects in the qt4projectmanager.
This change depends heavily on the BuildConfigurationFactory cleanups
done earlier and completes that change in such a way that generic
build configuration factories are now in theory possible. The
remaining problem is how to select the best factory of several that
claim to be able to handle a kit and that is left for the next patch.
Change-Id: I47134cb1938c52adebcdc1ddfe8dbf26abbbbeee
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
Diffstat (limited to 'src/plugins/qt4projectmanager')
25 files changed, 403 insertions, 2013 deletions
diff --git a/src/plugins/qt4projectmanager/buildconfigurationinfo.h b/src/plugins/qt4projectmanager/buildconfigurationinfo.h deleted file mode 100644 index a784416e0a..0000000000 --- a/src/plugins/qt4projectmanager/buildconfigurationinfo.h +++ /dev/null @@ -1,74 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef BUILDCONFIGURATIONINFO_H -#define BUILDCONFIGURATIONINFO_H - -#include "qt4projectmanager_global.h" - -#include <qtsupport/baseqtversion.h> - -namespace Qt4ProjectManager { - -class QT4PROJECTMANAGER_EXPORT BuildConfigurationInfo -{ -public: - explicit BuildConfigurationInfo() - : buildConfig(QtSupport::BaseQtVersion::QmakeBuildConfig(0)), importing(false) - { } - - explicit BuildConfigurationInfo(QtSupport::BaseQtVersion::QmakeBuildConfigs bc, - const QString &aa, const QString &d, - bool importing_ = false, - const QString &makefile_ = QString()) - : buildConfig(bc), - additionalArguments(aa), directory(d), - importing(importing_), - makefile(makefile_) - { } - - bool operator ==(const BuildConfigurationInfo &other) const - { - return buildConfig == other.buildConfig - && additionalArguments == other.additionalArguments - && directory == other.directory - && importing == other.importing - && makefile == other.makefile; - } - - QtSupport::BaseQtVersion::QmakeBuildConfigs buildConfig; - QString additionalArguments; - QString directory; - bool importing; - QString makefile; -}; - -} // namespace Qt4ProjectManager - -#endif // BUILDCONFIGURATIONINFO_H diff --git a/src/plugins/qt4projectmanager/qmakebuildinfo.h b/src/plugins/qt4projectmanager/qmakebuildinfo.h index 8ceb78f7d4..2e5795d945 100644 --- a/src/plugins/qt4projectmanager/qmakebuildinfo.h +++ b/src/plugins/qt4projectmanager/qmakebuildinfo.h @@ -33,7 +33,9 @@ #include "qt4buildconfiguration.h" #include <projectexplorer/buildinfo.h> +#include <projectexplorer/kitmanager.h> #include <qtsupport/baseqtversion.h> +#include <qtsupport/qtkitinformation.h> namespace Qt4ProjectManager { @@ -45,6 +47,15 @@ public: ProjectExplorer::BuildConfiguration::BuildType type; QString additionalArguments; QString makefile; + + QList<ProjectExplorer::Task> reportIssues(const QString &projectPath, + const QString &buildDir) const + { + ProjectExplorer::Kit *k = ProjectExplorer::KitManager::find(kitId); + QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(k); + return version ? version->reportIssues(projectPath, buildDir) + : QList<ProjectExplorer::Task>(); + } }; } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qmakeprojectimporter.cpp b/src/plugins/qt4projectmanager/qmakeprojectimporter.cpp new file mode 100644 index 0000000000..953e2daed0 --- /dev/null +++ b/src/plugins/qt4projectmanager/qmakeprojectimporter.cpp @@ -0,0 +1,254 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "qmakeprojectimporter.h" + +#include "qmakebuildinfo.h" +#include "qmakekitinformation.h" +#include "qt4buildconfiguration.h" +#include "qt4project.h" + +#include <coreplugin/icore.h> +#include <coreplugin/idocument.h> +#include <projectexplorer/kitmanager.h> +#include <projectexplorer/target.h> +#include <qtsupport/qtkitinformation.h> +#include <qtsupport/qtsupportconstants.h> +#include <qtsupport/qtversionfactory.h> +#include <qtsupport/qtversionmanager.h> +#include <utils/qtcprocess.h> + +#include <QDir> +#include <QFileInfo> +#include <QStringList> + +#include <QMessageBox> + +static const Core::Id QT_IS_TEMPORARY("Qmake.TempQt"); + +namespace Qt4ProjectManager { +namespace Internal { + +QmakeProjectImporter::QmakeProjectImporter(const QString &path) : + ProjectExplorer::ProjectImporter(path) +{ } + +QList<ProjectExplorer::BuildInfo *> QmakeProjectImporter::import(const Utils::FileName &importPath, + bool silent) +{ + QList<ProjectExplorer::BuildInfo *> result; + QFileInfo fi = importPath.toFileInfo(); + if (!fi.exists() && !fi.isDir()) + return result; + + QStringList makefiles = QDir(importPath.toString()).entryList(QStringList(QLatin1String("Makefile*"))); + + QtSupport::BaseQtVersion *version = 0; + bool temporaryVersion = false; + + foreach (const QString &file, makefiles) { + // find interesting makefiles + QString makefile = importPath.toString() + QLatin1Char('/') + file; + Utils::FileName qmakeBinary = QtSupport::QtVersionManager::findQMakeBinaryFromMakefile(makefile); + QFileInfo qmakeFi = qmakeBinary.toFileInfo(); + Utils::FileName canonicalQmakeBinary = Utils::FileName::fromString(qmakeFi.canonicalFilePath()); + if (canonicalQmakeBinary.isEmpty()) + continue; + if (QtSupport::QtVersionManager::makefileIsFor(makefile, projectFilePath()) != QtSupport::QtVersionManager::SameProject) + continue; + + // Find version: + foreach (QtSupport::BaseQtVersion *v, QtSupport::QtVersionManager::versions()) { + QFileInfo vfi = v->qmakeCommand().toFileInfo(); + Utils::FileName current = Utils::FileName::fromString(vfi.canonicalFilePath()); + if (current == canonicalQmakeBinary) { + version = v; + break; + } + } + + // Create a new version if not found: + if (!version) { + // Do not use the canonical path here... + version = QtSupport::QtVersionFactory::createQtVersionFromQMakePath(qmakeBinary); + if (!version) + continue; + + setIsUpdating(true); + QtSupport::QtVersionManager::addVersion(version); + setIsUpdating(false); + temporaryVersion = true; + } + + // find qmake arguments and mkspec + QPair<QtSupport::BaseQtVersion::QmakeBuildConfigs, QString> makefileBuildConfig = + QtSupport::QtVersionManager::scanMakeFile(makefile, version->defaultBuildConfig()); + + QString additionalArguments = makefileBuildConfig.second; + Utils::FileName parsedSpec = + Qt4BuildConfiguration::extractSpecFromArguments(&additionalArguments, importPath.toString(), version); + Utils::FileName versionSpec = version->mkspec(); + if (parsedSpec.isEmpty() || parsedSpec == Utils::FileName::fromString(QLatin1String("default"))) + parsedSpec = versionSpec; + + QString specArgument; + // Compare mkspecs and add to additional arguments + if (parsedSpec != versionSpec) + specArgument = QLatin1String("-spec ") + Utils::QtcProcess::quoteArg(parsedSpec.toUserOutput()); + Utils::QtcProcess::addArgs(&specArgument, additionalArguments); + + // Find kits (can be more than one, e.g. (Linux-)Desktop and embedded linux): + QList<ProjectExplorer::Kit *> kitList; + foreach (ProjectExplorer::Kit *k, ProjectExplorer::KitManager::kits()) { + QtSupport::BaseQtVersion *kitVersion = QtSupport::QtKitInformation::qtVersion(k); + Utils::FileName kitSpec = QmakeKitInformation::mkspec(k); + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(k); + if (kitSpec.isEmpty() && kitVersion) + kitSpec = kitVersion->mkspecFor(tc); + + if (kitVersion == version + && kitSpec == parsedSpec) + kitList.append(k); + } + if (kitList.isEmpty()) + kitList.append(createTemporaryKit(version, temporaryVersion, parsedSpec)); + + foreach (ProjectExplorer::Kit *k, kitList) { + addProject(k); + + Qt4BuildConfigurationFactory *factory + = qobject_cast<Qt4BuildConfigurationFactory *>( + ProjectExplorer::IBuildConfigurationFactory::find(k, projectFilePath())); + + if (!factory) + continue; + + // create info: + QmakeBuildInfo *info = new QmakeBuildInfo(factory); + if (makefileBuildConfig.first | QtSupport::BaseQtVersion::DebugBuild) { + info->type = ProjectExplorer::BuildConfiguration::Debug; + info->displayName = QCoreApplication::translate("Qt4ProjectManager::Internal::QmakeProjectImporter", "Debug"); + } else { + info->type = ProjectExplorer::BuildConfiguration::Release; + info->displayName = QCoreApplication::translate("Qt4ProjectManager::Internal::QmakeProjectImporter", "Release"); + } + info->kitId = k->id(); + info->buildDirectory = Utils::FileName::fromString(fi.absoluteFilePath()); + info->additionalArguments = additionalArguments; + info->makefile = makefile; + + result << info; + } + } + + if (result.isEmpty() && !silent) + QMessageBox::critical(Core::ICore::mainWindow(), + QCoreApplication::translate("Qt4ProjectManager::Internal::QmakeProjectImporter", "No Build Found"), + QCoreApplication::translate("Qt4ProjectManager::Internal::QmakeProjectImporter", "No build found in %1 matching project %2.") + .arg(importPath.toUserOutput()).arg(projectFilePath())); + + return result; +} + +QStringList QmakeProjectImporter::importCandidates(const Utils::FileName &projectPath) +{ + QStringList candidates; + + QFileInfo pfi = projectPath.toFileInfo(); + const QString prefix = pfi.baseName(); + candidates << pfi.absolutePath(); + + QList<ProjectExplorer::Kit *> kitList = ProjectExplorer::KitManager::kits(); + foreach (ProjectExplorer::Kit *k, kitList) { + QFileInfo fi(Qt4Project::shadowBuildDirectory(projectPath.toString(), k, QString())); + const QString baseDir = fi.absolutePath(); + + foreach (const QString &dir, QDir(baseDir).entryList()) { + const QString path = baseDir + QLatin1Char('/') + dir; + if (dir.startsWith(prefix) && !candidates.contains(path)) + candidates << path; + } + } + return candidates; +} + +ProjectExplorer::Target *QmakeProjectImporter::preferredTarget(const QList<ProjectExplorer::Target *> &possibleTargets) +{ + // Select active target + // a) The default target + // b) Simulator target + // c) Desktop target + // d) the first target + ProjectExplorer::Target *activeTarget = possibleTargets.isEmpty() ? 0 : possibleTargets.at(0); + int activeTargetPriority = 0; + foreach (ProjectExplorer::Target *t, possibleTargets) { + QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(t->kit()); + if (t->kit() == ProjectExplorer::KitManager::defaultKit()) { + activeTarget = t; + activeTargetPriority = 3; + } else if (activeTargetPriority < 2 && version && version->type() == QLatin1String(QtSupport::Constants::SIMULATORQT)) { + activeTarget = t; + activeTargetPriority = 2; + } else if (activeTargetPriority < 1 && version && version->type() == QLatin1String(QtSupport::Constants::DESKTOPQT)) { + activeTarget = t; + activeTargetPriority = 1; + } + } + return activeTarget; +} + +void QmakeProjectImporter::cleanupKit(ProjectExplorer::Kit *k) +{ + QtSupport::BaseQtVersion *version = QtSupport::QtVersionManager::version(k->value(QT_IS_TEMPORARY, -1).toInt()); + if (version) + QtSupport::QtVersionManager::removeVersion(version); +} + +ProjectExplorer::Kit *QmakeProjectImporter::createTemporaryKit(QtSupport::BaseQtVersion *version, + bool temporaryVersion, + const Utils::FileName &parsedSpec) +{ + ProjectExplorer::Kit *k = new ProjectExplorer::Kit; + QtSupport::QtKitInformation::setQtVersion(k, version); + ProjectExplorer::ToolChainKitInformation::setToolChain(k, version->preferredToolChain(parsedSpec)); + QmakeKitInformation::setMkspec(k, parsedSpec); + + markTemporary(k); + if (temporaryVersion) + k->setValue(QT_IS_TEMPORARY, version->uniqueId()); + + k->setDisplayName(version->displayName()); + setIsUpdating(true); + ProjectExplorer::KitManager::registerKit(k); + setIsUpdating(false); + return k; +} + +} // namespace Internal +} // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/wizards/importwidget.h b/src/plugins/qt4projectmanager/qmakeprojectimporter.h index 9cb1d728ca..4ab5be811d 100644 --- a/src/plugins/qt4projectmanager/wizards/importwidget.h +++ b/src/plugins/qt4projectmanager/qmakeprojectimporter.h @@ -27,40 +27,38 @@ ** ****************************************************************************/ -#ifndef IMPORTWIDGET_H -#define IMPORTWIDGET_H +#ifndef QMAKEPROJECTIMPORTER_H +#define QMAKEPROJECTIMPORTER_H -#include <QWidget> +#include <projectexplorer/projectimporter.h> -namespace Utils { -class PathChooser; -class FileName; -} // namespace Utils +namespace QtSupport { class BaseQtVersion; } namespace Qt4ProjectManager { + +class Qt4Project; + namespace Internal { -class ImportWidget : public QWidget +// Documentation inside. +class QmakeProjectImporter : public ProjectExplorer::ProjectImporter { - Q_OBJECT - public: - explicit ImportWidget(QWidget *parent = 0); - ~ImportWidget(); - - void setCurrentDirectory(const Utils::FileName &dir); + QmakeProjectImporter(const QString &path); -signals: - void importFrom(const Utils::FileName &dir); + QList<ProjectExplorer::BuildInfo *> import(const Utils::FileName &importPath, bool silent = false); + QStringList importCandidates(const Utils::FileName &projectFilePath); + ProjectExplorer::Target *preferredTarget(const QList<ProjectExplorer::Target *> &possibleTargets); -private slots: - void handleImportRequest(); + void cleanupKit(ProjectExplorer::Kit *k); private: - Utils::PathChooser *m_pathChooser; + ProjectExplorer::Kit *createTemporaryKit(QtSupport::BaseQtVersion *version, + bool temporaryVersion, + const Utils::FileName &parsedSpec); }; } // namespace Internal } // namespace Qt4ProjectManager -#endif // IMPORTWIDGET_H +#endif // QMAKEPROJECTIMPORTER_H diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp index 99bff9e930..c3a1b9959f 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp @@ -29,7 +29,6 @@ #include "qt4buildconfiguration.h" -#include "buildconfigurationinfo.h" #include "qmakebuildinfo.h" #include "qt4project.h" #include "qt4projectconfigwidget.h" @@ -58,6 +57,20 @@ namespace Qt4ProjectManager { +// -------------------------------------------------------------------- +// Helpers: +// -------------------------------------------------------------------- + +static Utils::FileName defaultBuildDirectory(bool supportsShadowBuild, + const QString &projectPath, + const ProjectExplorer::Kit *k, + const QString &suffix) +{ + if (supportsShadowBuild) + return Utils::FileName::fromString(Qt4Project::shadowBuildDirectory(projectPath, k, suffix)); + return Utils::FileName::fromString(ProjectExplorer::Project::projectDirectory(projectPath)); +} + using namespace Internal; using namespace ProjectExplorer; using namespace QtSupport; @@ -550,10 +563,8 @@ QmakeBuildInfo *Qt4BuildConfigurationFactory::createBuildInfo(const Kit *k, // Leave info->buildDirectory unset; info->kitId = k->id(); info->supportsShadowBuild = (version && version->supportsShadowBuilds()); - if (info->supportsShadowBuild) - info->buildDirectory = Utils::FileName::fromString(Qt4Project::shadowBuildDirectory(projectPath, k, info->displayName)); - else - info->buildDirectory = Utils::FileName::fromString(ProjectExplorer::Project::projectDirectory(projectPath)); + info->buildDirectory + = defaultBuildDirectory(info->supportsShadowBuild, projectPath, k, info->displayName); info->type = type; return info; } @@ -571,11 +582,30 @@ QList<BuildInfo *> Qt4BuildConfigurationFactory::availableBuilds(const Target *p QmakeBuildInfo *info = createBuildInfo(parent->kit(), parent->project()->projectFilePath(), BuildConfiguration::Debug); info->displayName.clear(); // ask for a name + info->buildDirectory.clear(); // This depends on the displayName result << info; return result; } +bool Qt4BuildConfigurationFactory::canSetup(const Kit *k, const QString &projectPath) const +{ + return k && QtSupport::QtKitInformation::qtVersion(k) + && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) + .matchesType(QLatin1String(Constants::PROFILE_MIMETYPE)); +} + +QList<BuildInfo *> Qt4BuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const +{ + QList<ProjectExplorer::BuildInfo *> result; + QTC_ASSERT(canSetup(k, projectPath), return result); + + result << createBuildInfo(k, projectPath, ProjectExplorer::BuildConfiguration::Debug); + result << createBuildInfo(k, projectPath, ProjectExplorer::BuildConfiguration::Release); + + return result; +} + BuildConfiguration *Qt4BuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const { QTC_ASSERT(canCreate(parent), return 0); @@ -594,11 +624,44 @@ BuildConfiguration *Qt4BuildConfigurationFactory::create(Target *parent, const B else config |= QtSupport::BaseQtVersion::DebugBuild; - BuildConfiguration *bc - = Qt4BuildConfiguration::setup(parent, info->displayName, info->displayName, - config, qmakeInfo->additionalArguments, - info->buildDirectory.toString(), false); + Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(parent); + bc->setDefaultDisplayName(info->displayName); + bc->setDisplayName(info->displayName); + + BuildStepList *buildSteps = bc->stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD)); + BuildStepList *cleanSteps = bc->stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)); + Q_ASSERT(buildSteps); + Q_ASSERT(cleanSteps); + + QMakeStep *qmakeStep = new QMakeStep(buildSteps); + buildSteps->insertStep(0, qmakeStep); + + MakeStep *makeStep = new MakeStep(buildSteps); + buildSteps->insertStep(1, makeStep); + + MakeStep *cleanStep = new MakeStep(cleanSteps); + cleanStep->setClean(true); + cleanStep->setUserArguments(QLatin1String("clean")); + cleanSteps->insertStep(0, cleanStep); + + QString additionalArguments = qmakeInfo->additionalArguments; + + bool enableQmlDebugger + = Qt4BuildConfiguration::removeQMLInspectorFromArguments(&additionalArguments); + if (!additionalArguments.isEmpty()) + qmakeStep->setUserArguments(additionalArguments); + qmakeStep->setLinkQmlDebuggingLibrary(enableQmlDebugger); + + bc->setQMakeBuildConfiguration(config); + + Utils::FileName directory = qmakeInfo->buildDirectory; + if (directory.isEmpty()) { + directory = defaultBuildDirectory(qmakeInfo->supportsShadowBuild, + parent->project()->projectFilePath(), + parent->kit(), info->displayName); + } + bc->setBuildDirectory(directory); return bc; } @@ -633,35 +696,6 @@ BuildConfiguration *Qt4BuildConfigurationFactory::restore(Target *parent, const return 0; } -QList<BuildConfigurationInfo> Qt4BuildConfigurationFactory::availableBuildConfigurations(const Kit *k, - const QString &proFilePath) -{ - QList<BuildConfigurationInfo> infoList; - - BaseQtVersion *version = QtKitInformation::qtVersion(k); - if (!version || !version->isValid()) - return infoList; - BaseQtVersion::QmakeBuildConfigs config = version->defaultBuildConfig() | QtSupport::BaseQtVersion::DebugBuild; - BuildConfigurationInfo info = BuildConfigurationInfo(config, QString(), QString(), false); - info.directory = Qt4Project::shadowBuildDirectory(proFilePath, k, buildConfigurationDisplayName(info)); - infoList.append(info); - - info.buildConfig = config ^ BaseQtVersion::DebugBuild; - info.directory = Qt4Project::shadowBuildDirectory(proFilePath, k, buildConfigurationDisplayName(info)); - infoList.append(info); - return infoList; -} - -// Return name of a build configuration. -QString Qt4BuildConfigurationFactory::buildConfigurationDisplayName(const BuildConfigurationInfo &info) -{ - return (info.buildConfig & BaseQtVersion::DebugBuild) ? - //: Name of a debug build configuration to created by a project wizard. We recommend not translating it. - tr("Debug") : - //: Name of a release build configuration to be created by a project wizard. We recommend not translating it. - tr("Release"); -} - BuildConfiguration::BuildType Qt4BuildConfiguration::buildType() const { if (qmakeBuildConfiguration() & BaseQtVersion::DebugBuild) @@ -670,52 +704,6 @@ BuildConfiguration::BuildType Qt4BuildConfiguration::buildType() const return Release; } -Qt4BuildConfiguration *Qt4BuildConfiguration::setup(Target *t, QString defaultDisplayName, - QString displayName, - BaseQtVersion::QmakeBuildConfigs qmakeBuildConfiguration, - QString additionalArguments, QString directory, - bool importing) -{ - Q_UNUSED(importing); - - // Add the build configuration. - Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(t); - bc->setDefaultDisplayName(defaultDisplayName); - bc->setDisplayName(displayName); - - BuildStepList *buildSteps = bc->stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD)); - BuildStepList *cleanSteps = bc->stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)); - Q_ASSERT(buildSteps); - Q_ASSERT(cleanSteps); - - QMakeStep *qmakeStep = new QMakeStep(buildSteps); - buildSteps->insertStep(0, qmakeStep); - - MakeStep *makeStep = new MakeStep(buildSteps); - buildSteps->insertStep(1, makeStep); - - MakeStep *cleanStep = new MakeStep(cleanSteps); - cleanStep->setClean(true); - cleanStep->setUserArguments(QLatin1String("clean")); - cleanSteps->insertStep(0, cleanStep); - - bool enableQmlDebugger - = Qt4BuildConfiguration::removeQMLInspectorFromArguments(&additionalArguments); - - if (!additionalArguments.isEmpty()) - qmakeStep->setUserArguments(additionalArguments); - qmakeStep->setLinkQmlDebuggingLibrary(enableQmlDebugger); - - bc->setQMakeBuildConfiguration(qmakeBuildConfiguration); - - if (directory.isEmpty()) - bc->setBuildDirectory(Utils::FileName::fromString(t->project()->projectDirectory())); - else - bc->setBuildDirectory(Utils::FileName::fromString(directory)); - - return bc; -} - Qt4BuildConfiguration::LastKitState::LastKitState() { @@ -743,6 +731,4 @@ bool Qt4BuildConfiguration::LastKitState::operator !=(const LastKitState &other) return !operator ==(other); } - - } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h index 18c76391d2..52ebb9df9a 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h @@ -44,7 +44,6 @@ class QMakeStep; class MakeStep; class Qt4BuildConfigurationFactory; class Qt4ProFileNode; -class BuildConfigurationInfo; namespace Internal { class Qt4ProjectConfigWidget; } @@ -103,13 +102,6 @@ public: BuildType buildType() const; - static Qt4BuildConfiguration *setup(ProjectExplorer::Target *t, - QString defaultDisplayName, - QString displayName, - QtSupport::BaseQtVersion::QmakeBuildConfigs qmakeBuildConfiguration, - QString additionalArguments, - QString directory, - bool importing); /// returns whether the Qt version in the profile supports shadow building (also true for no Qt version) bool supportsShadowBuilds(); @@ -161,6 +153,7 @@ private: ProjectExplorer::FileNode *m_fileNodeBuild; friend class Internal::Qt4ProjectConfigWidget; + friend class Qt4BuildConfigurationFactory; }; class QT4PROJECTMANAGER_EXPORT Qt4BuildConfigurationFactory : public ProjectExplorer::IBuildConfigurationFactory @@ -173,6 +166,9 @@ public: bool canCreate(const ProjectExplorer::Target *parent) const; QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const; + bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const; + QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, + const QString &projectPath) const; ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, const ProjectExplorer::BuildInfo *info) const; @@ -181,9 +177,6 @@ public: bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const; ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); - static QList<BuildConfigurationInfo> availableBuildConfigurations(const ProjectExplorer::Kit *k, const QString &proFilePath); - static QString buildConfigurationDisplayName(const BuildConfigurationInfo &info); - private slots: void update(); diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index 08086eca6f..2e48fcc904 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -30,12 +30,13 @@ #include "qt4project.h" #include "qt4projectmanager.h" +#include "qmakeprojectimporter.h" +#include "qmakebuildinfo.h" #include "qmakestep.h" #include "qt4nodes.h" #include "qt4projectmanagerconstants.h" #include "qt4buildconfiguration.h" #include "findqt4profiles.h" -#include "buildconfigurationinfo.h" #include "qt4projectmanager/wizards/abstractmobileapp.h" #include "qt4projectmanager/wizards/qtquickapp.h" #include "qt4projectmanager/wizards/html5app.h" @@ -380,32 +381,6 @@ void Qt4Project::updateFileList() } } -bool Qt4Project::setupTarget(ProjectExplorer::Target *t) -{ - QList<BuildConfigurationInfo> infoList - = Qt4BuildConfigurationFactory::availableBuildConfigurations(t->kit(), m_fileInfo->filePath()); - setupTarget(t, infoList); - return true; -} - -void Qt4Project::setupTarget(ProjectExplorer::Target *t, const QList<BuildConfigurationInfo> &infoList) -{ - // Build Configurations: - foreach (const BuildConfigurationInfo &info, infoList) { - QString name = info.buildConfig & QtSupport::BaseQtVersion::DebugBuild - ? tr("Debug") : tr("Release"); - Qt4BuildConfiguration *bc - = Qt4BuildConfiguration::setup(t, name, name, - info.buildConfig, info.additionalArguments, - info.directory, info.importing); - t->addBuildConfiguration(bc); - } - - // Deploy Configurations: - t->updateDefaultDeployConfigurations(); - // Do not create Run Configurations: Those will be generated later anyway. -} - bool Qt4Project::fromMap(const QVariantMap &map) { if (!Project::fromMap(map)) @@ -1389,6 +1364,7 @@ bool Qt4Project::needsConfiguration() const void Qt4Project::configureAsExampleProject(const QStringList &platforms) { + QList<const BuildInfo *> infoList; QList<Kit *> kits = ProjectExplorer::KitManager::kits(); foreach (Kit *k, kits) { QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(k); @@ -1397,12 +1373,14 @@ void Qt4Project::configureAsExampleProject(const QStringList &platforms) if (!platforms.isEmpty() && !platforms.contains(version->platformName())) continue; - QList<BuildConfigurationInfo> infoList - = Qt4BuildConfigurationFactory::availableBuildConfigurations(k, projectFilePath()); - if (infoList.isEmpty()) + IBuildConfigurationFactory *factory = IBuildConfigurationFactory::find(k, projectFilePath()); + if (!factory) continue; - addTarget(createTarget(k, infoList)); + foreach (BuildInfo *info, factory->availableSetups(k, projectFilePath())) + infoList << info; } + setup(infoList); + qDeleteAll(infoList); ProjectExplorer::ProjectExplorerPlugin::instance()->requestProjectModeUpdate(this); } @@ -1456,16 +1434,6 @@ QString Qt4Project::buildNameFor(const Kit *k) return k->fileSystemFriendlyName(); } -Target *Qt4Project::createTarget(Kit *k, const QList<BuildConfigurationInfo> &infoList) -{ - if (target(k)) - return 0; - - Target *t = new Target(this, k); - setupTarget(t, infoList); - return t; -} - void Qt4Project::updateBuildSystemData() { Target * const target = activeTarget(); @@ -1653,6 +1621,12 @@ void Qt4Project::emitBuildDirectoryInitialized() { emit buildDirectoryInitialized(); } + +ProjectImporter *Qt4Project::createProjectImporter() const +{ + return new QmakeProjectImporter(projectFilePath()); +} + } // namespace Qt4ProjectManager #include "qt4project.moc" diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h index 474fe49e38..751a22c01c 100644 --- a/src/plugins/qt4projectmanager/qt4project.h +++ b/src/plugins/qt4projectmanager/qt4project.h @@ -49,7 +49,6 @@ namespace ProjectExplorer { class DeploymentData; } namespace QtSupport { class ProFileReader; } namespace Qt4ProjectManager { -class BuildConfigurationInfo; class MakeStep; class QMakeStep; class Qt4BuildConfiguration; @@ -139,10 +138,10 @@ public: /// used by the default implementation of shadowBuildDirectory static QString buildNameFor(const ProjectExplorer::Kit *k); - ProjectExplorer::Target *createTarget(ProjectExplorer::Kit *k, const QList<BuildConfigurationInfo> &infoList); - void emitBuildDirectoryInitialized(); + ProjectExplorer::ProjectImporter *createProjectImporter() const; + signals: void proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *node, bool, bool); void buildDirectoryInitialized(); @@ -155,8 +154,6 @@ public slots: protected: bool fromMap(const QVariantMap &map); - bool setupTarget(ProjectExplorer::Target *t); - void setupTarget(ProjectExplorer::Target *t, const QList<BuildConfigurationInfo> &infoList); private slots: void asyncUpdate(); diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro index 9a0bb33d45..a336ae54a0 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.pro +++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro @@ -8,6 +8,7 @@ HEADERS += \ qmakebuildinfo.h \ qmakekitinformation.h \ qmakekitconfigwidget.h \ + qmakeprojectimporter.h \ qmakerunconfigurationfactory.h \ qt4projectmanagerplugin.h \ qt4projectmanager.h \ @@ -38,8 +39,6 @@ HEADERS += \ wizards/modulespage.h \ wizards/filespage.h \ wizards/qtwizard.h \ - wizards/targetsetuppage.h \ - wizards/importwidget.h \ wizards/qtquickapp.h \ wizards/qtquickappwizard.h \ wizards/qtquickappwizardpages.h \ @@ -62,16 +61,14 @@ HEADERS += \ librarydetailscontroller.h \ findqt4profiles.h \ qt4projectmanager_global.h \ - qt4targetsetupwidget.h \ - buildconfigurationinfo.h \ winceqtversionfactory.h \ winceqtversion.h \ - profilecompletionassist.h \ - unconfiguredprojectpanel.h + profilecompletionassist.h SOURCES += \ qmakekitconfigwidget.cpp \ qmakekitinformation.cpp \ + qmakeprojectimporter.cpp \ qmakerunconfigurationfactory.cpp \ qt4projectmanagerplugin.cpp \ qt4projectmanager.cpp \ @@ -102,8 +99,6 @@ SOURCES += \ wizards/modulespage.cpp \ wizards/filespage.cpp \ wizards/qtwizard.cpp \ - wizards/targetsetuppage.cpp \ - wizards/importwidget.cpp \ wizards/qtquickapp.cpp \ wizards/qtquickappwizard.cpp \ wizards/qtquickappwizardpages.cpp \ @@ -124,11 +119,9 @@ SOURCES += \ addlibrarywizard.cpp \ librarydetailscontroller.cpp \ findqt4profiles.cpp \ - qt4targetsetupwidget.cpp \ winceqtversionfactory.cpp \ winceqtversion.cpp \ - profilecompletionassist.cpp \ - unconfiguredprojectpanel.cpp + profilecompletionassist.cpp FORMS += makestep.ui \ qmakestep.ui \ diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.qbs b/src/plugins/qt4projectmanager/qt4projectmanager.qbs index 7ab0110307..90ee461949 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.qbs +++ b/src/plugins/qt4projectmanager/qt4projectmanager.qbs @@ -54,7 +54,6 @@ QtcPlugin { "qt4projectmanagerplugin.cpp", "qt4projectmanagerplugin.h", "qt4targetsetupwidget.cpp", "qt4targetsetupwidget.h", "qtmodulesinfo.cpp", "qtmodulesinfo.h", - "unconfiguredprojectpanel.cpp", "unconfiguredprojectpanel.h", "winceqtversion.cpp", "winceqtversion.h", "winceqtversionfactory.cpp", "winceqtversionfactory.h" ] @@ -117,7 +116,6 @@ QtcPlugin { "html5appwizard.cpp", "html5appwizard.h", "html5appwizardpages.cpp", "html5appwizardpages.h", "html5appwizardsourcespage.ui", - "importwidget.cpp", "importwidget.h", "libraryparameters.cpp", "libraryparameters.h", "librarywizard.cpp", "librarywizard.h", "librarywizarddialog.cpp", "librarywizarddialog.h", @@ -137,7 +135,6 @@ QtcPlugin { "qtwizard.cpp", "qtwizard.h", "subdirsprojectwizard.cpp", "subdirsprojectwizard.h", "subdirsprojectwizarddialog.cpp", "subdirsprojectwizarddialog.h", - "targetsetuppage.cpp", "targetsetuppage.h", "testwizard.cpp", "testwizard.h", "testwizarddialog.cpp", "testwizarddialog.h", "testwizardpage.cpp", "testwizardpage.h", diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h index 68ccdb3d32..2845852eb8 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h +++ b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h @@ -90,9 +90,6 @@ const char QMAKEVAR_QMLJSDEBUGGER_PATH[] = "QMLJSDEBUGGER_PATH"; const char QMAKEVAR_QUICK1_DEBUG[] = "CONFIG+=declarative_debug"; const char QMAKEVAR_QUICK2_DEBUG[] = "CONFIG+=qml_debug"; -// Unconfigured Panel -const char UNCONFIGURED_PANEL_PAGE_ID[] = "UnconfiguredPanel"; - } // namespace Constants } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp index 69453439f1..d23d8045a6 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp @@ -53,7 +53,6 @@ #include "qt-desktop/desktopqtversionfactory.h" #include "qt-desktop/simulatorqtversionfactory.h" #include "winceqtversionfactory.h" -#include "unconfiguredprojectpanel.h" #include "qmakekitinformation.h" #include "profilehighlighterfactory.h" @@ -156,7 +155,6 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString * addAutoReleasedObject(new ProFileCompletionAssistProvider); addAutoReleasedObject(new ProFileHoverHandler(this)); - addAutoReleasedObject(new UnconfiguredProjectPanel); addAutoReleasedObject(new ProFileHighlighterFactory); //menus diff --git a/src/plugins/qt4projectmanager/qt4targetsetupwidget.cpp b/src/plugins/qt4projectmanager/qt4targetsetupwidget.cpp deleted file mode 100644 index b254fac4d5..0000000000 --- a/src/plugins/qt4projectmanager/qt4targetsetupwidget.cpp +++ /dev/null @@ -1,366 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "qt4targetsetupwidget.h" - -#include "buildconfigurationinfo.h" -#include "qt4buildconfiguration.h" - -#include <coreplugin/icore.h> -#include <extensionsystem/pluginmanager.h> -#include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/kitoptionspage.h> -#include <qtsupport/qtkitinformation.h> - -#include <utils/detailsbutton.h> -#include <utils/detailswidget.h> -#include <utils/hostosinfo.h> -#include <utils/pathchooser.h> - -#include <QCheckBox> -#include <QHBoxLayout> -#include <QGridLayout> -#include <QLabel> -#include <QPushButton> - -namespace Qt4ProjectManager { - -// ------------------------------------------------------------------------- -// Qt4TargetSetupWidget -// ------------------------------------------------------------------------- - -Qt4TargetSetupWidget::Qt4TargetSetupWidget(ProjectExplorer::Kit *k, - const QString &proFilePath, - const QList<BuildConfigurationInfo> &infoList) : - m_kit(k), - m_haveImported(false), - m_ignoreChange(false), - m_selected(0) -{ - Q_ASSERT(m_kit); - - setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - QVBoxLayout *vboxLayout = new QVBoxLayout(); - setLayout(vboxLayout); - vboxLayout->setContentsMargins(0, 0, 0, 0); - m_detailsWidget = new Utils::DetailsWidget(this); - m_detailsWidget->setUseCheckBox(true); - m_detailsWidget->setChecked(false); - m_detailsWidget->setSummaryFontBold(true); - m_detailsWidget->setToolTip(m_kit->toHtml()); - vboxLayout->addWidget(m_detailsWidget); - - Utils::FadingWidget *panel = new Utils::FadingWidget(m_detailsWidget); - QHBoxLayout *panelLayout = new QHBoxLayout(panel); - m_manageButton = new QPushButton(tr("Manage...")); - panelLayout->addWidget(m_manageButton); - m_detailsWidget->setToolWidget(panel); - - handleKitUpdate(m_kit); - - QWidget *widget = new QWidget; - QVBoxLayout *layout = new QVBoxLayout; - widget->setLayout(layout); - layout->setContentsMargins(0, 0, 0, 0); - - QWidget *w = new QWidget; - m_newBuildsLayout = new QGridLayout; - m_newBuildsLayout->setMargin(0); - if (Utils::HostOsInfo::isMacHost()) - m_newBuildsLayout->setSpacing(0); - w->setLayout(m_newBuildsLayout); - layout->addWidget(w); - - widget->setEnabled(false); - m_detailsWidget->setWidget(widget); - - foreach (const BuildConfigurationInfo &info, infoList) - addBuildConfigurationInfo(info); - - setProFilePath(proFilePath); - - connect(m_detailsWidget, SIGNAL(checked(bool)), - this, SLOT(targetCheckBoxToggled(bool))); - - connect(ProjectExplorer::KitManager::instance(), SIGNAL(kitUpdated(ProjectExplorer::Kit*)), - this, SLOT(handleKitUpdate(ProjectExplorer::Kit*))); - - connect(m_manageButton, SIGNAL(clicked()), this, SLOT(manageKit())); -} - -Qt4TargetSetupWidget::~Qt4TargetSetupWidget() -{ } - -ProjectExplorer::Kit *Qt4TargetSetupWidget::kit() -{ - return m_kit; -} - -void Qt4TargetSetupWidget::clearKit() -{ - m_kit = 0; -} - -bool Qt4TargetSetupWidget::isKitSelected() const -{ - if (!m_detailsWidget->isChecked()) - return false; - - return !selectedBuildConfigurationInfoList().isEmpty(); -} - -void Qt4TargetSetupWidget::setKitSelected(bool b) -{ - // Only check target if there are build configurations possible - b &= !selectedBuildConfigurationInfoList().isEmpty(); - m_ignoreChange = true; - m_detailsWidget->setChecked(b); - m_detailsWidget->widget()->setEnabled(b); - m_ignoreChange = false; - - m_detailsWidget->setState(b ? Utils::DetailsWidget::Expanded : Utils::DetailsWidget::Collapsed); -} - -void Qt4TargetSetupWidget::addBuildConfigurationInfo(const BuildConfigurationInfo &info, bool importing) -{ - if (importing) { - if (!m_haveImported) { - // disable everything on first import - for (int i = 0; i < m_enabled.count(); ++i) { - m_enabled[i] = false; - m_checkboxes[i]->setChecked(false); - } - m_selected = 0; - } - - m_haveImported = true; - } - int pos = m_pathChoosers.count(); - m_enabled.append(true); - ++m_selected; - - m_infoList.append(info); - - QCheckBox *checkbox = new QCheckBox; - checkbox->setText(Qt4BuildConfigurationFactory::buildConfigurationDisplayName(info)); - checkbox->setChecked(m_enabled.at(pos)); - checkbox->setAttribute(Qt::WA_LayoutUsesWidgetRect); - m_newBuildsLayout->addWidget(checkbox, pos * 2, 0); - - Utils::PathChooser *pathChooser = new Utils::PathChooser(); - pathChooser->setExpectedKind(Utils::PathChooser::Directory); - pathChooser->setPath(info.directory); - QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(m_kit); - if (!version) - return; - pathChooser->setReadOnly(!version->supportsShadowBuilds() || importing); - m_newBuildsLayout->addWidget(pathChooser, pos * 2, 1); - - QLabel *reportIssuesLabel = new QLabel; - reportIssuesLabel->setIndent(32); - m_newBuildsLayout->addWidget(reportIssuesLabel, pos * 2 + 1, 0, 1, 2); - reportIssuesLabel->setVisible(false); - - connect(checkbox, SIGNAL(toggled(bool)), - this, SLOT(checkBoxToggled(bool))); - - connect(pathChooser, SIGNAL(changed(QString)), - this, SLOT(pathChanged())); - - m_checkboxes.append(checkbox); - m_pathChoosers.append(pathChooser); - m_reportIssuesLabels.append(reportIssuesLabel); - - m_issues.append(false); - reportIssues(pos); - - emit selectedToggled(); -} - -void Qt4TargetSetupWidget::targetCheckBoxToggled(bool b) -{ - if (m_ignoreChange) - return; - m_detailsWidget->widget()->setEnabled(b); - if (b) { - foreach (bool error, m_issues) { - if (error) { - m_detailsWidget->setState(Utils::DetailsWidget::Expanded); - break; - } - } - } - emit selectedToggled(); -} - -void Qt4TargetSetupWidget::manageKit() -{ - ProjectExplorer::KitOptionsPage *page = - ExtensionSystem::PluginManager::getObject<ProjectExplorer::KitOptionsPage>(); - if (!page || !m_kit) - return; - - page->showKit(m_kit); - Core::ICore::showOptionsDialog(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY, - ProjectExplorer::Constants::KITS_SETTINGS_PAGE_ID); -} - -void Qt4TargetSetupWidget::setProFilePath(const QString &proFilePath) -{ - if (!m_kit) - return; - - m_proFilePath = proFilePath; - clear(); - - QList<BuildConfigurationInfo> infoList - = Qt4BuildConfigurationFactory::availableBuildConfigurations(m_kit, proFilePath); - foreach (const BuildConfigurationInfo &info, infoList) - addBuildConfigurationInfo(info); -} - -void Qt4TargetSetupWidget::handleKitUpdate(ProjectExplorer::Kit *k) -{ - if (k != m_kit) - return; - - m_detailsWidget->setIcon(k->icon()); - m_detailsWidget->setSummaryText(k->displayName()); -} - -QList<BuildConfigurationInfo> Qt4TargetSetupWidget::selectedBuildConfigurationInfoList() const -{ - QList<BuildConfigurationInfo> result; - for (int i = 0; i < m_infoList.count(); ++i) { - if (m_enabled.at(i)) - result.append(m_infoList.at(i)); - } - return result; -} - -QList<BuildConfigurationInfo> Qt4TargetSetupWidget::allBuildConfigurationInfoList() const -{ - return m_infoList; -} - -void Qt4TargetSetupWidget::clear() -{ - qDeleteAll(m_checkboxes); - m_checkboxes.clear(); - qDeleteAll(m_pathChoosers); - m_pathChoosers.clear(); - qDeleteAll(m_reportIssuesLabels); - m_reportIssuesLabels.clear(); - - m_infoList.clear(); - m_issues.clear(); - m_enabled.clear(); - m_selected = 0; - m_haveImported = false; - - emit selectedToggled(); -} - -void Qt4TargetSetupWidget::checkBoxToggled(bool b) -{ - QCheckBox *box = qobject_cast<QCheckBox *>(sender()); - if (!box) - return; - int index = m_checkboxes.indexOf(box); - if (index == -1) - return; - if (m_enabled[index] == b) - return; - m_selected += b ? 1 : -1; - m_enabled[index] = b; - if ((m_selected == 0 && !b) || (m_selected == 1 && b)) { - emit selectedToggled(); - m_detailsWidget->setChecked(b); - } -} - -void Qt4TargetSetupWidget::pathChanged() -{ - if (m_ignoreChange) - return; - Utils::PathChooser *pathChooser = qobject_cast<Utils::PathChooser *>(sender()); - if (!pathChooser) - return; - int index = m_pathChoosers.indexOf(pathChooser); - if (index == -1) - return; - m_infoList[index].directory = pathChooser->path(); - reportIssues(index); -} - -void Qt4TargetSetupWidget::reportIssues(int index) -{ - QPair<ProjectExplorer::Task::TaskType, QString> issues = findIssues(m_infoList.at(index)); - QLabel *reportIssuesLabel = m_reportIssuesLabels.at(index); - reportIssuesLabel->setText(issues.second); - bool error = issues.first != ProjectExplorer::Task::Unknown; - reportIssuesLabel->setVisible(error); - m_issues[index] = error; -} - -QPair<ProjectExplorer::Task::TaskType, QString> Qt4TargetSetupWidget::findIssues(const BuildConfigurationInfo &info) -{ - if (m_proFilePath.isEmpty()) - return qMakePair(ProjectExplorer::Task::Unknown, QString()); - - QString buildDir = info.directory; - QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(m_kit); - if (!version) - return qMakePair(ProjectExplorer::Task::Unknown, QString()); - - QList<ProjectExplorer::Task> issues = version->reportIssues(m_proFilePath, buildDir); - - QString text; - ProjectExplorer::Task::TaskType highestType = ProjectExplorer::Task::Unknown; - foreach (const ProjectExplorer::Task &t, issues) { - if (!text.isEmpty()) - text.append(QLatin1String("<br>")); - // set severity: - QString severity; - if (t.type == ProjectExplorer::Task::Error) { - highestType = ProjectExplorer::Task::Error; - severity = tr("<b>Error:</b> ", "Severity is Task::Error"); - } else if (t.type == ProjectExplorer::Task::Warning) { - if (highestType == ProjectExplorer::Task::Unknown) - highestType = ProjectExplorer::Task::Warning; - severity = tr("<b>Warning:</b> ", "Severity is Task::Warning"); - } - text.append(severity + t.description); - } - if (!text.isEmpty()) - text = QLatin1String("<nobr>") + text; - return qMakePair(highestType, text); -} - -} // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt4targetsetupwidget.h b/src/plugins/qt4projectmanager/qt4targetsetupwidget.h deleted file mode 100644 index a17fe6a51a..0000000000 --- a/src/plugins/qt4projectmanager/qt4targetsetupwidget.h +++ /dev/null @@ -1,115 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef QT4TARGETSETUPWIDGET_H -#define QT4TARGETSETUPWIDGET_H - -#include "qt4projectmanager_global.h" - -#include <projectexplorer/task.h> - -#include <QWidget> - -QT_BEGIN_NAMESPACE -class QCheckBox; -class QHBoxLayout; -class QGridLayout; -class QLabel; -class QPushButton; -class QSpacerItem; -QT_END_NAMESPACE - -namespace ProjectExplorer { class Kit; } -namespace QtSupport { -class BaseQtVersion; -} // namespace QtSupport -namespace Utils { -class DetailsWidget; -class PathChooser; -} // namespace Utils - -namespace Qt4ProjectManager { -class BuildConfigurationInfo; - -class QT4PROJECTMANAGER_EXPORT Qt4TargetSetupWidget : public QWidget -{ - Q_OBJECT -public: - Qt4TargetSetupWidget(ProjectExplorer::Kit *k, - const QString &proFilePath, - const QList<BuildConfigurationInfo> &infoList); - ~Qt4TargetSetupWidget(); - - ProjectExplorer::Kit *kit(); - void clearKit(); - - bool isKitSelected() const; - void setKitSelected(bool b); - - void addBuildConfigurationInfo(const BuildConfigurationInfo &info, bool importing = false); - - QList<BuildConfigurationInfo> selectedBuildConfigurationInfoList() const; - QList<BuildConfigurationInfo> allBuildConfigurationInfoList() const; - void setProFilePath(const QString &proFilePath); - -signals: - void selectedToggled() const; - -private slots: - void handleKitUpdate(ProjectExplorer::Kit *k); - - void checkBoxToggled(bool b); - void pathChanged(); - void targetCheckBoxToggled(bool b); - void manageKit(); - -private: - void reportIssues(int index); - QPair<ProjectExplorer::Task::TaskType, QString> findIssues(const BuildConfigurationInfo &info); - void clear(); - - ProjectExplorer::Kit *m_kit; - QString m_proFilePath; - bool m_haveImported; - Utils::DetailsWidget *m_detailsWidget; - QPushButton *m_manageButton; - QGridLayout *m_newBuildsLayout; - QList<QCheckBox *> m_checkboxes; - QList<Utils::PathChooser *> m_pathChoosers; - QList<BuildConfigurationInfo> m_infoList; - QList<bool> m_enabled; - QList<QLabel *> m_reportIssuesLabels; - QList<bool> m_issues; - bool m_ignoreChange; - int m_selected; // Number of selected buildconfiguartions -}; - -} // namespace Qt4ProjectManager - -#endif // QT4TARGETSETUPWIDGET_H diff --git a/src/plugins/qt4projectmanager/unconfiguredprojectpanel.cpp b/src/plugins/qt4projectmanager/unconfiguredprojectpanel.cpp deleted file mode 100644 index b5cf55dc82..0000000000 --- a/src/plugins/qt4projectmanager/unconfiguredprojectpanel.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "unconfiguredprojectpanel.h" -#include "wizards/targetsetuppage.h" -#include "qt4projectmanagerconstants.h" - -#include "qt4project.h" - -#include <coreplugin/icore.h> -#include <coreplugin/modemanager.h> -#include <coreplugin/coreconstants.h> -#include <qtsupport/qtkitinformation.h> - -#include <projectexplorer/projectexplorer.h> -#include <projectexplorer/session.h> - -#include <QVBoxLayout> -#include <QPushButton> -#include <QDialogButtonBox> - -using namespace ProjectExplorer; -using namespace Qt4ProjectManager; -using namespace Qt4ProjectManager::Internal; - - -UnconfiguredProjectPanel::UnconfiguredProjectPanel() -{ -} - -QString Qt4ProjectManager::Internal::UnconfiguredProjectPanel::id() const -{ - return QLatin1String(Constants::UNCONFIGURED_PANEL_PAGE_ID); -} - -QString Qt4ProjectManager::Internal::UnconfiguredProjectPanel::displayName() const -{ - return tr("Configure Project"); -} - -int UnconfiguredProjectPanel::priority() const -{ - return -10; -} - -bool Qt4ProjectManager::Internal::UnconfiguredProjectPanel::supports(ProjectExplorer::Project *project) -{ - if (qobject_cast<Qt4Project *>(project) && project->targets().isEmpty()) - return true; - return false; -} - -ProjectExplorer::PropertiesPanel *Qt4ProjectManager::Internal::UnconfiguredProjectPanel::createPanel(ProjectExplorer::Project *project) -{ - ProjectExplorer::PropertiesPanel *panel = new ProjectExplorer::PropertiesPanel; - panel->setDisplayName(displayName()); - panel->setIcon(QIcon(QLatin1String(":/projectexplorer/images/unconfigured.png"))); - - TargetSetupPageWrapper *w = new TargetSetupPageWrapper(project); - panel->setWidget(w); - return panel; -} - -///////// -/// TargetSetupPageWrapper -//////// - -TargetSetupPageWrapper::TargetSetupPageWrapper(ProjectExplorer::Project *project) - : QWidget(), m_project(qobject_cast<Qt4Project *>(project)) -{ - QVBoxLayout *layout = new QVBoxLayout(); - layout->setMargin(0); - setLayout(layout); - - m_targetSetupPage = new TargetSetupPage(this); - m_targetSetupPage->setRequiredKitMatcher(new QtSupport::QtVersionKitMatcher); - m_targetSetupPage->setUseScrollArea(false); - m_targetSetupPage->setImportSearch(true); - m_targetSetupPage->setProFilePath(project->projectFilePath()); - m_targetSetupPage->initializePage(); - m_targetSetupPage->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - updateNoteText(); - - layout->addWidget(m_targetSetupPage); - - // Apply row - QHBoxLayout *hbox = new QHBoxLayout(); - layout->addLayout(hbox); - layout->setMargin(0); - hbox->addStretch(); - - QDialogButtonBox *box = new QDialogButtonBox(this); - - m_configureButton = new QPushButton(this); - m_configureButton->setText(tr("Configure Project")); - box->addButton(m_configureButton, QDialogButtonBox::AcceptRole); - - m_cancelButton = new QPushButton(this); - m_cancelButton->setText(tr("Cancel")); - box->addButton(m_cancelButton, QDialogButtonBox::RejectRole); - - hbox->addWidget(box); - - layout->addStretch(10); - - completeChanged(); - - connect(m_configureButton, SIGNAL(clicked()), - this, SLOT(done())); - connect(m_cancelButton, SIGNAL(clicked()), - this, SLOT(cancel())); - connect(m_targetSetupPage, SIGNAL(completeChanged()), - this, SLOT(completeChanged())); - connect(ProjectExplorer::KitManager::instance(), SIGNAL(defaultkitChanged()), - this, SLOT(updateNoteText())); - connect(ProjectExplorer::KitManager::instance(), SIGNAL(kitUpdated(ProjectExplorer::Kit*)), - this, SLOT(kitUpdated(ProjectExplorer::Kit*))); -} - -void TargetSetupPageWrapper::kitUpdated(ProjectExplorer::Kit *k) -{ - if (k == ProjectExplorer::KitManager::defaultKit()) - updateNoteText(); -} - -void TargetSetupPageWrapper::updateNoteText() -{ - ProjectExplorer::Kit *k = ProjectExplorer::KitManager::defaultKit(); - - QString text; - bool showHint = false; - if (!k) { - text = tr("The project <b>%1</b> is not yet configured.<br/>" - "Qt Creator cannot parse the project, because no kit " - "has been set up.") - .arg(m_project->displayName()); - showHint = true; - } else if (k->isValid()) { - text = tr("The project <b>%1</b> is not yet configured.<br/>" - "Qt Creator uses the kit <b>%2</b> to parse the project.") - .arg(m_project->displayName()) - .arg(k->displayName()); - showHint = false; - } else { - text = tr("The project <b>%1</b> is not yet configured.<br/>" - "Qt Creator uses the <b>invalid</b> kit <b>%2</b> to parse the project.") - .arg(m_project->displayName()) - .arg(k->displayName()); - showHint = true; - } - - m_targetSetupPage->setNoteText(text); - m_targetSetupPage->showOptionsHint(showHint); -} - -void TargetSetupPageWrapper::keyPressEvent(QKeyEvent *event) -{ - if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) { - event->accept(); - done(); - } -} - -void TargetSetupPageWrapper::keyReleaseEvent(QKeyEvent *event) -{ - if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) - event->accept(); -} - -void TargetSetupPageWrapper::cancel() -{ - ProjectExplorerPlugin::instance()->unloadProject(m_project); - if (!SessionManager::hasProjects()) - Core::ModeManager::activateMode(Core::Constants::MODE_WELCOME); -} - -void TargetSetupPageWrapper::done() -{ - m_targetSetupPage->setupProject(m_project); - ProjectExplorerPlugin::instance()->requestProjectModeUpdate(m_project); - Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); -} - -void TargetSetupPageWrapper::completeChanged() -{ - m_configureButton->setEnabled(m_targetSetupPage->isComplete()); -} diff --git a/src/plugins/qt4projectmanager/unconfiguredprojectpanel.h b/src/plugins/qt4projectmanager/unconfiguredprojectpanel.h deleted file mode 100644 index e71e7d2ef1..0000000000 --- a/src/plugins/qt4projectmanager/unconfiguredprojectpanel.h +++ /dev/null @@ -1,84 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef UNCONFIGUREDPROJECTPANEL_H -#define UNCONFIGUREDPROJECTPANEL_H - -#include <projectexplorer/iprojectproperties.h> - -#include <QString> - -QT_FORWARD_DECLARE_CLASS(QPushButton) - -namespace ProjectExplorer { class Kit; } - -namespace Qt4ProjectManager { -class TargetSetupPage; -class Qt4Project; - -namespace Internal { - -class UnconfiguredProjectPanel : public ProjectExplorer::IProjectPanelFactory -{ - Q_OBJECT -public: - UnconfiguredProjectPanel(); - virtual QString id() const; - virtual QString displayName() const; - int priority() const; - virtual bool supports(ProjectExplorer::Project *project); - virtual ProjectExplorer::PropertiesPanel *createPanel(ProjectExplorer::Project *project); -}; - -class TargetSetupPageWrapper : public QWidget -{ - Q_OBJECT -public: - TargetSetupPageWrapper(ProjectExplorer::Project *project); -protected: - void keyReleaseEvent(QKeyEvent *event); - void keyPressEvent(QKeyEvent *event); -private slots: - void done(); - void cancel(); - void kitUpdated(ProjectExplorer::Kit *k); - void updateNoteText(); - void completeChanged(); - -private: - Qt4Project *m_project; - TargetSetupPage *m_targetSetupPage; - QPushButton *m_configureButton; - QPushButton *m_cancelButton; -}; - -} -} - -#endif // UNCONFIGUREDPROJECTPANEL_H diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp index 9be35ad170..8b94e4cdf6 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp @@ -30,7 +30,7 @@ #include "abstractmobileappwizard.h" #include "mobileappwizardpages.h" -#include "targetsetuppage.h" +#include "../qmakeprojectimporter.h" #include <extensionsystem/pluginmanager.h> #include <qt4projectmanager/qt4project.h> @@ -38,6 +38,7 @@ #include <qtsupport/qtsupportconstants.h> #include <qtsupport/qtkitinformation.h> #include <projectexplorer/projectexplorer.h> +#include <projectexplorer/targetsetuppage.h> #include <projectexplorer/customwizard/customwizard.h> #include <coreplugin/editormanager/editormanager.h> @@ -64,7 +65,8 @@ AbstractMobileAppWizardDialog::AbstractMobileAppWizardDialog(QWidget *parent, .value<QList<Core::Id> >()) { if (!parameters.extraValues().contains(QLatin1String(ProjectExplorer::Constants::PROJECT_KIT_IDS))) { - m_targetsPage = new TargetSetupPage; + m_targetsPage = new ProjectExplorer::TargetSetupPage; + m_targetsPage->setProjectImporter(new Internal::QmakeProjectImporter(path())); QString platform = selectedPlatform(); if (platform.isEmpty()) { m_targetsPage->setPreferredKitMatcher( @@ -120,7 +122,7 @@ void AbstractMobileAppWizardDialog::addMobilePages() m_targetItem->setNextShownItem(0); } -TargetSetupPage *AbstractMobileAppWizardDialog::targetsPage() const +ProjectExplorer::TargetSetupPage *AbstractMobileAppWizardDialog::targetsPage() const { return m_targetsPage; } @@ -295,7 +297,7 @@ void AbstractMobileAppWizard::useProjectPath(const QString &projectName, app()->setProjectName(projectName); app()->setProjectPath(projectPath); if (wizardDialog()->m_targetsPage) - wizardDialog()->m_targetsPage->setProFilePath(app()->path(AbstractMobileApp::AppPro)); + wizardDialog()->m_targetsPage->setProjectPath(app()->path(AbstractMobileApp::AppPro)); projectPathChanged(app()->path(AbstractMobileApp::AppPro)); } diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h index 4062f17cdb..cfb2a997f8 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h @@ -33,6 +33,8 @@ #include <qt4projectmanager/qt4projectmanager_global.h> #include <projectexplorer/baseprojectwizarddialog.h> +namespace ProjectExplorer { class TargetSetupPage; } + namespace QtSupport { class QtVersionNumber; class QtVersionManager; @@ -41,7 +43,6 @@ class QtVersionManager; namespace Qt4ProjectManager { class AbstractMobileApp; -class TargetSetupPage; namespace Internal { class MobileAppWizardGenericOptionsPage; @@ -61,7 +62,7 @@ protected: void addMobilePages(); public: - TargetSetupPage *targetsPage() const; + ProjectExplorer::TargetSetupPage *targetsPage() const; protected: int addPageWithTitle(QWizardPage *page, const QString &title); @@ -80,7 +81,7 @@ private: Internal::MobileAppWizardGenericOptionsPage *m_genericOptionsPage; Internal::MobileAppWizardMaemoOptionsPage *m_maemoOptionsPage; Internal::MobileAppWizardHarmattanOptionsPage *m_harmattanOptionsPage; - TargetSetupPage *m_targetsPage; + ProjectExplorer::TargetSetupPage *m_targetsPage; int m_genericOptionsPageId; int m_maemoOptionsPageId; diff --git a/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp b/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp index 754c16859a..854377dd17 100644 --- a/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp @@ -31,11 +31,11 @@ #include "html5app.h" #include "html5appwizardpages.h" -#include "targetsetuppage.h" #include <qt4projectmanager/qt4projectmanagerconstants.h> #include <qtsupport/baseqtversion.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/targetsetuppage.h> #include <qtsupport/qtsupportconstants.h> #include <limits> @@ -115,7 +115,7 @@ AbstractMobileAppWizardDialog *Html5AppWizard::createWizardDialogInternal(QWidge void Html5AppWizard::projectPathChanged(const QString &path) const { if (d->wizardDialog->targetsPage()) - d->wizardDialog->targetsPage()->setProFilePath(path); + d->wizardDialog->targetsPage()->setProjectPath(path); } void Html5AppWizard::prepareGenerateFiles(const QWizard *w, diff --git a/src/plugins/qt4projectmanager/wizards/importwidget.cpp b/src/plugins/qt4projectmanager/wizards/importwidget.cpp deleted file mode 100644 index d3e5d99395..0000000000 --- a/src/plugins/qt4projectmanager/wizards/importwidget.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "importwidget.h" - -#include <utils/detailswidget.h> -#include <utils/pathchooser.h> - -#include <QPushButton> -#include <QVBoxLayout> - -namespace Qt4ProjectManager { -namespace Internal { - -ImportWidget::ImportWidget(QWidget *parent) : - QWidget(parent), - m_pathChooser(new Utils::PathChooser) -{ - setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - QVBoxLayout *vboxLayout = new QVBoxLayout(); - setLayout(vboxLayout); - vboxLayout->setContentsMargins(0, 0, 0, 0); - Utils::DetailsWidget *detailsWidget = new Utils::DetailsWidget(this); - detailsWidget->setUseCheckBox(false); - detailsWidget->setSummaryText(tr("Import Build from...")); - detailsWidget->setSummaryFontBold(true); - // m_detailsWidget->setIcon(); // FIXME: Set icon! - vboxLayout->addWidget(detailsWidget); - - QWidget *widget = new QWidget; - QVBoxLayout *layout = new QVBoxLayout(widget); - layout->setContentsMargins(0, 0, 0, 0); - layout->addWidget(m_pathChooser); - - m_pathChooser->setExpectedKind(Utils::PathChooser::ExistingDirectory); - QPushButton *importButton = new QPushButton(tr("Import"), widget); - layout->addWidget(importButton); - - connect(importButton, SIGNAL(clicked()), this, SLOT(handleImportRequest())); - - detailsWidget->setWidget(widget); -} - -ImportWidget::~ImportWidget() -{ } - -void ImportWidget::setCurrentDirectory(const Utils::FileName &dir) -{ - m_pathChooser->setBaseFileName(dir); - m_pathChooser->setFileName(dir); -} - -void ImportWidget::handleImportRequest() -{ - Utils::FileName dir = m_pathChooser->fileName(); - emit importFrom(dir); - - m_pathChooser->setFileName(m_pathChooser->baseFileName()); -} - -} // namespace Internal -} // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp b/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp index 04afef13f2..660fcba083 100644 --- a/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp @@ -31,12 +31,12 @@ #include "qtquickapp.h" #include "qtquickappwizardpages.h" -#include "targetsetuppage.h" -#include <qt4projectmanager/qt4projectmanagerconstants.h> +#include "qt4projectmanagerconstants.h" #include <qtsupport/qtsupportconstants.h> #include <qtsupport/baseqtversion.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/targetsetuppage.h> #include <QIcon> #include <QDebug> @@ -226,7 +226,7 @@ AbstractMobileAppWizardDialog *QtQuickAppWizard::createWizardDialogInternal(QWid void QtQuickAppWizard::projectPathChanged(const QString &path) const { if (d->wizardDialog->targetsPage()) - d->wizardDialog->targetsPage()->setProFilePath(path); + d->wizardDialog->targetsPage()->setProjectPath(path); } void QtQuickAppWizard::prepareGenerateFiles(const QWizard *w, diff --git a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp index d1629e5f5c..78d4a6a3cb 100644 --- a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp @@ -30,7 +30,6 @@ #include "qtwizard.h" #include "modulespage.h" -#include "targetsetuppage.h" #include <qt4projectmanager/qt4project.h> #include <qt4projectmanager/qt4projectmanager.h> @@ -41,6 +40,7 @@ #include <cpptools/cpptoolsconstants.h> #include <projectexplorer/projectexplorer.h> +#include <projectexplorer/targetsetuppage.h> #include <qtsupport/qtkitinformation.h> #include <qtsupport/qtsupportconstants.h> @@ -212,7 +212,7 @@ int BaseQt4ProjectWizardDialog::addModulesPage(int id) int BaseQt4ProjectWizardDialog::addTargetSetupPage(bool mobile, int id) { - m_targetSetupPage = new TargetSetupPage; + m_targetSetupPage = new ProjectExplorer::TargetSetupPage; const QString platform = selectedPlatform(); Core::FeatureSet features = mobile ? Core::FeatureSet(QtSupport::Constants::FEATURE_MOBILE) : Core::FeatureSet(QtSupport::Constants::FEATURE_DESKTOP); @@ -323,5 +323,5 @@ void BaseQt4ProjectWizardDialog::generateProfileName(const QString &name, const QDir::cleanPath(path + QLatin1Char('/') + name + QLatin1Char('/') + name + QLatin1String(".pro")); - m_targetSetupPage->setProFilePath(proFile); + m_targetSetupPage->setProjectPath(proFile); } diff --git a/src/plugins/qt4projectmanager/wizards/qtwizard.h b/src/plugins/qt4projectmanager/wizards/qtwizard.h index 459dc61629..bb78c12d6c 100644 --- a/src/plugins/qt4projectmanager/wizards/qtwizard.h +++ b/src/plugins/qt4projectmanager/wizards/qtwizard.h @@ -34,12 +34,14 @@ #include <projectexplorer/baseprojectwizarddialog.h> #include <projectexplorer/customwizard/customwizard.h> -namespace ProjectExplorer { class Kit; } +namespace ProjectExplorer { +class Kit; +class TargetSetupPage; +} // namespace ProjectExplorer namespace Qt4ProjectManager { class Qt4Project; -class TargetSetupPage; namespace Internal { @@ -142,7 +144,7 @@ private: inline void init(bool showModulesPage); ModulesPage *m_modulesPage; - TargetSetupPage *m_targetSetupPage; + ProjectExplorer::TargetSetupPage *m_targetSetupPage; QStringList m_selectedModules; QStringList m_deselectedModules; QList<Core::Id> m_profileIds; diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp deleted file mode 100644 index 350bd821bb..0000000000 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp +++ /dev/null @@ -1,731 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "targetsetuppage.h" -#include "importwidget.h" -#include "../qt4targetsetupwidget.h" - -#include <qt4projectmanager/buildconfigurationinfo.h> -#include <qt4projectmanager/qt4buildconfiguration.h> -#include <qt4projectmanager/qt4project.h> -#include <qt4projectmanager/qmakekitinformation.h> - -#include <coreplugin/icore.h> -#include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/target.h> -#include <qtsupport/qtkitinformation.h> -#include <qtsupport/qtsupportconstants.h> -#include <qtsupport/qtversionfactory.h> -#include <qtsupport/qtversionmanager.h> -#include <utils/qtcprocess.h> - -#include <QLabel> -#include <QMessageBox> -#include <QScrollArea> -#include <QVBoxLayout> - -using namespace ProjectExplorer; -using namespace QtSupport; - -namespace Qt4ProjectManager { -namespace Internal { - -static const Core::Id QT_IS_TEMPORARY("Qt4PM.TempQt"); -static const Core::Id KIT_IS_TEMPORARY("Qt4PM.TempKit"); -static const Core::Id KIT_TEMPORARY_NAME("Qt4PM.TempName"); -static const Core::Id KIT_FINAL_NAME("Qt4PM.FinalName"); -static const Core::Id TEMPORARY_OF_PROJECTS("Qt4PM.TempProject"); - -class TargetSetupPageUi -{ -public: - QWidget *centralWidget; - QWidget *scrollAreaWidget; - QScrollArea *scrollArea; - QLabel *headerLabel; - QLabel *descriptionLabel; - QLabel *noValidKitLabel; - QLabel *optionHintLabel; - - void setupUi(QWidget *q) - { - QWidget *setupTargetPage = new QWidget(q); - descriptionLabel = new QLabel(setupTargetPage); - descriptionLabel->setWordWrap(true); - descriptionLabel->setVisible(false); - - headerLabel = new QLabel(setupTargetPage); - headerLabel->setWordWrap(true); - headerLabel->setVisible(false); - - noValidKitLabel = new QLabel(setupTargetPage); - noValidKitLabel->setWordWrap(true); - noValidKitLabel->setText(TargetSetupPage::tr("<span style=\" font-weight:600;\">No valid kits found.</span>")); - - - optionHintLabel = new QLabel(setupTargetPage); - optionHintLabel->setWordWrap(true); - optionHintLabel->setText(TargetSetupPage::tr( - "Please add a kit in the <a href=\"buildandrun\">options</a> " - "or via the maintenance tool of the SDK.")); - optionHintLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); - optionHintLabel->setVisible(false); - - centralWidget = new QWidget(setupTargetPage); - QSizePolicy policy(QSizePolicy::Preferred, QSizePolicy::Fixed); - policy.setHorizontalStretch(0); - policy.setVerticalStretch(0); - policy.setHeightForWidth(centralWidget->sizePolicy().hasHeightForWidth()); - centralWidget->setSizePolicy(policy); - - scrollAreaWidget = new QWidget(setupTargetPage); - scrollArea = new QScrollArea(scrollAreaWidget); - scrollArea->setWidgetResizable(true); - - QWidget *scrollAreaWidgetContents; - scrollAreaWidgetContents = new QWidget(); - scrollAreaWidgetContents->setGeometry(QRect(0, 0, 230, 81)); - scrollArea->setWidget(scrollAreaWidgetContents); - - QVBoxLayout *verticalLayout = new QVBoxLayout(scrollAreaWidget); - verticalLayout->setSpacing(0); - verticalLayout->setContentsMargins(0, 0, 0, 0); - verticalLayout->addWidget(scrollArea); - - QVBoxLayout *verticalLayout_2 = new QVBoxLayout(setupTargetPage); - verticalLayout_2->addWidget(headerLabel); - verticalLayout_2->addWidget(noValidKitLabel); - verticalLayout_2->addWidget(descriptionLabel); - verticalLayout_2->addWidget(optionHintLabel); - verticalLayout_2->addWidget(centralWidget); - verticalLayout_2->addWidget(scrollAreaWidget); - - QVBoxLayout *verticalLayout_3 = new QVBoxLayout(q); - verticalLayout_3->setContentsMargins(0, 0, 0, -1); - verticalLayout_3->addWidget(setupTargetPage); - - QObject::connect(optionHintLabel, SIGNAL(linkActivated(QString)), - q, SLOT(openOptions())); - } -}; - -} // namespace Internal - -using namespace Internal; - -TargetSetupPage::TargetSetupPage(QWidget *parent) : - QWizardPage(parent), - m_requiredMatcher(0), - m_preferredMatcher(0), - m_baseLayout(0), - m_importSearch(false), - m_ignoreUpdates(false), - m_firstWidget(0), - m_ui(new TargetSetupPageUi), - m_importWidget(new Internal::ImportWidget(this)), - m_spacer(new QSpacerItem(0,0, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding)), - m_forceOptionHint(false) -{ - setObjectName(QLatin1String("TargetSetupPage")); - setWindowTitle(tr("Select Kits for Your Project")); - m_ui->setupUi(this); - - QSizePolicy policy(QSizePolicy::Preferred, QSizePolicy::Preferred); - policy.setHorizontalStretch(0); - policy.setVerticalStretch(0); - policy.setHeightForWidth(sizePolicy().hasHeightForWidth()); - setSizePolicy(policy); - - QWidget *centralWidget = new QWidget(this); - m_ui->scrollArea->setWidget(centralWidget); - centralWidget->setLayout(new QVBoxLayout); - m_ui->centralWidget->setLayout(new QVBoxLayout); - m_ui->centralWidget->layout()->setMargin(0); - - setUseScrollArea(true); - setImportSearch(false); - - setTitle(tr("Kit Selection")); - - QObject *km = KitManager::instance(); - connect(km, SIGNAL(kitAdded(ProjectExplorer::Kit*)), - this, SLOT(handleKitAddition(ProjectExplorer::Kit*))); - connect(km, SIGNAL(kitRemoved(ProjectExplorer::Kit*)), - this, SLOT(handleKitRemoval(ProjectExplorer::Kit*))); - connect(km, SIGNAL(kitUpdated(ProjectExplorer::Kit*)), - this, SLOT(handleKitUpdate(ProjectExplorer::Kit*))); - connect(m_importWidget, SIGNAL(importFrom(Utils::FileName)), - this, SLOT(import(Utils::FileName))); -} - -void TargetSetupPage::initializePage() -{ - reset(); - - setupWidgets(); - setupImports(); - selectAtLeastOneKit(); -} - -void TargetSetupPage::setRequiredKitMatcher(ProjectExplorer::KitMatcher *matcher) -{ - m_requiredMatcher = matcher; -} - -QList<Core::Id> TargetSetupPage::selectedKits() const -{ - QList<Core::Id> result; - QMap<Core::Id, Qt4TargetSetupWidget *>::const_iterator it, end; - it = m_widgets.constBegin(); - end = m_widgets.constEnd(); - - for ( ; it != end; ++it) { - if (isKitSelected(it.key())) - result << it.key(); - } - return result; -} - -void TargetSetupPage::setPreferredKitMatcher(ProjectExplorer::KitMatcher *matcher) -{ - m_preferredMatcher = matcher; -} - -TargetSetupPage::~TargetSetupPage() -{ - reset(); - delete m_ui; - delete m_preferredMatcher; - delete m_requiredMatcher; -} - -bool TargetSetupPage::isKitSelected(Core::Id id) const -{ - Qt4TargetSetupWidget *widget = m_widgets.value(id); - return widget && widget->isKitSelected(); -} - -void TargetSetupPage::setKitSelected(Core::Id id, bool selected) -{ - Qt4TargetSetupWidget *widget = m_widgets.value(id); - if (widget) - widget->setKitSelected(selected); -} - -bool TargetSetupPage::isComplete() const -{ - foreach (Qt4TargetSetupWidget *widget, m_widgets.values()) - if (widget->isKitSelected()) - return true; - return false; -} - -void TargetSetupPage::setImportSearch(bool b) -{ - m_importSearch = b; - m_importWidget->setVisible(b); -} - -void TargetSetupPage::setupWidgets() -{ - // Known profiles: - QList<Kit *> kits = m_requiredMatcher - ? KitManager::matchingKits(*m_requiredMatcher) : KitManager::kits(); - foreach (Kit *k, kits) - addWidget(k); - - // Setup import widget: - m_baseLayout->addWidget(m_importWidget); - Utils::FileName path = Utils::FileName::fromString(m_proFilePath); - path = path.parentDir(); // base dir - path = path.parentDir(); // parent dir - m_importWidget->setCurrentDirectory(path); - - updateVisibility(); -} - -void TargetSetupPage::reset() -{ - foreach (Qt4TargetSetupWidget *widget, m_widgets.values()) { - ProjectExplorer::Kit *k = widget->kit(); - if (!k) - continue; - removeProject(k, m_proFilePath); - delete widget; - } - - m_widgets.clear(); - m_firstWidget = 0; -} - -ProjectExplorer::Kit *TargetSetupPage::createTemporaryKit(BaseQtVersion *version, - bool temporaryVersion, - const Utils::FileName &parsedSpec) -{ - ProjectExplorer::Kit *k = new ProjectExplorer::Kit; - QtKitInformation::setQtVersion(k, version); - ProjectExplorer::ToolChainKitInformation::setToolChain(k, version->preferredToolChain(parsedSpec)); - QmakeKitInformation::setMkspec(k, parsedSpec); - - k->setDisplayName(tr("%1 - temporary").arg(version->displayName())); - k->setValue(KIT_TEMPORARY_NAME, k->displayName()); - k->setValue(KIT_FINAL_NAME, version->displayName()); - k->setValue(KIT_IS_TEMPORARY, true); - if (temporaryVersion) - k->setValue(QT_IS_TEMPORARY, version->uniqueId()); - - m_ignoreUpdates = true; - ProjectExplorer::KitManager::registerKit(k); - m_ignoreUpdates = false; - - return k; -} - -void TargetSetupPage::cleanKit(ProjectExplorer::Kit *k) -{ - m_ignoreUpdates = true; - k->removeKey(KIT_IS_TEMPORARY); - k->removeKey(QT_IS_TEMPORARY); - k->removeKey(TEMPORARY_OF_PROJECTS); - const QString tempName = k->value(KIT_TEMPORARY_NAME).toString(); - if (!tempName.isNull() && k->displayName() == tempName) - k->setDisplayName(k->value(KIT_FINAL_NAME).toString()); - k->removeKey(KIT_TEMPORARY_NAME); - k->removeKey(KIT_FINAL_NAME); - m_ignoreUpdates = false; -} - -void TargetSetupPage::makeQtPersistent(ProjectExplorer::Kit *k) -{ - m_ignoreUpdates = true; - k->removeKey(QT_IS_TEMPORARY); - m_ignoreUpdates = false; -} - -void TargetSetupPage::addProject(ProjectExplorer::Kit *k, const QString &path) -{ - if (!k->hasValue(KIT_IS_TEMPORARY)) - return; - - QStringList projects = k->value(TEMPORARY_OF_PROJECTS, QStringList()).toStringList(); - if (!projects.contains(path)) { - projects.append(path); - m_ignoreUpdates = true; - k->setValue(TEMPORARY_OF_PROJECTS, projects); - m_ignoreUpdates = false; - } -} - -void TargetSetupPage::removeProject(ProjectExplorer::Kit *k, const QString &path) -{ - if (!k->hasValue(KIT_IS_TEMPORARY) || path.isEmpty()) - return; - - QStringList projects = k->value(TEMPORARY_OF_PROJECTS, QStringList()).toStringList(); - if (projects.contains(path)) { - projects.removeOne(path); - m_ignoreUpdates = true; - if (projects.isEmpty()) - ProjectExplorer::KitManager::deregisterKit(k); - else - k->setValue(TEMPORARY_OF_PROJECTS, projects); - m_ignoreUpdates = false; - } -} - -void TargetSetupPage::setProFilePath(const QString &path) -{ - m_proFilePath = path; - if (!m_proFilePath.isEmpty()) - m_ui->headerLabel->setText(tr("Qt Creator can use the following kits for project <b>%1</b>:", - "%1: Project name").arg(QFileInfo(m_proFilePath).baseName())); - m_ui->headerLabel->setVisible(!m_proFilePath.isEmpty()); - - if (m_widgets.isEmpty()) - return; - - reset(); - setupWidgets(); -} - -void TargetSetupPage::setNoteText(const QString &text) -{ - m_ui->descriptionLabel->setText(text); - m_ui->descriptionLabel->setVisible(!text.isEmpty()); -} - -void TargetSetupPage::showOptionsHint(bool show) -{ - m_forceOptionHint = show; - updateVisibility(); -} - -void TargetSetupPage::import(const Utils::FileName &path) -{ - import(path, false); -} - -void TargetSetupPage::import(const Utils::FileName &path, const bool silent) -{ - QFileInfo fi = path.toFileInfo(); - if (!fi.exists() && !fi.isDir()) - return; - - QStringList makefiles = QDir(path.toString()).entryList(QStringList(QLatin1String("Makefile*"))); - - BaseQtVersion *version = 0; - bool temporaryVersion = false; - bool found = false; - - foreach (const QString &file, makefiles) { - // find interesting makefiles - QString makefile = path.toString() + QLatin1Char('/') + file; - Utils::FileName qmakeBinary = QtVersionManager::findQMakeBinaryFromMakefile(makefile); - QFileInfo fi = qmakeBinary.toFileInfo(); - Utils::FileName canonicalQmakeBinary = Utils::FileName::fromString(fi.canonicalFilePath()); - if (canonicalQmakeBinary.isEmpty()) - continue; - if (QtVersionManager::makefileIsFor(makefile, m_proFilePath) != QtVersionManager::SameProject) - continue; - - // Find version: - foreach (BaseQtVersion *v, QtVersionManager::versions()) { - QFileInfo vfi = v->qmakeCommand().toFileInfo(); - Utils::FileName current = Utils::FileName::fromString(vfi.canonicalFilePath()); - if (current == canonicalQmakeBinary) { - version = v; - break; - } - } - - // Create a new version if not found: - if (!version) { - // Do not use the canonical path here... - version = QtVersionFactory::createQtVersionFromQMakePath(qmakeBinary); - if (!version) - continue; - - QtVersionManager::addVersion(version); - temporaryVersion = true; - } - - // find qmake arguments and mkspec - QPair<BaseQtVersion::QmakeBuildConfigs, QString> makefileBuildConfig = - QtVersionManager::scanMakeFile(makefile, version->defaultBuildConfig()); - - QString additionalArguments = makefileBuildConfig.second; - Utils::FileName parsedSpec = - Qt4BuildConfiguration::extractSpecFromArguments(&additionalArguments, path.toString(), version); - Utils::FileName versionSpec = version->mkspec(); - if (parsedSpec.isEmpty() || parsedSpec == Utils::FileName::fromString(QLatin1String("default"))) - parsedSpec = versionSpec; - - QString specArgument; - // Compare mkspecs and add to additional arguments - if (parsedSpec != versionSpec) - specArgument = QLatin1String("-spec ") + Utils::QtcProcess::quoteArg(parsedSpec.toUserOutput()); - Utils::QtcProcess::addArgs(&specArgument, additionalArguments); - - // Find profiles (can be more than one, e.g. (Linux-)Desktop and embedded linux): - QList<ProjectExplorer::Kit *> kitList; - foreach (ProjectExplorer::Kit *k, ProjectExplorer::KitManager::kits()) { - BaseQtVersion *profileVersion = QtKitInformation::qtVersion(k); - Utils::FileName profileSpec = QmakeKitInformation::mkspec(k); - ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(k); - if (profileSpec.isEmpty() && profileVersion) - profileSpec = profileVersion->mkspecFor(tc); - - if (profileVersion == version - && profileSpec == parsedSpec) - kitList.append(k); - } - if (kitList.isEmpty()) - kitList.append(createTemporaryKit(version, temporaryVersion, parsedSpec)); - - foreach (ProjectExplorer::Kit *k, kitList) { - addProject(k, m_proFilePath); - - // Create widget: - Qt4TargetSetupWidget *widget = m_widgets.value(k->id(), 0); - if (!widget) - addWidget(k); - widget = m_widgets.value(k->id(), 0); - if (!widget) - continue; - - // create info: - BuildConfigurationInfo info = BuildConfigurationInfo(makefileBuildConfig.first, - specArgument, - path.toString(), - true, - file); - - widget->addBuildConfigurationInfo(info, true); - widget->setKitSelected(true); - found = true; - } - } - - updateVisibility(); - - if (!found && !silent) - QMessageBox::critical(this, - tr("No Build Found"), - tr("No build found in %1 matching project %2.").arg(path.toUserOutput()).arg(m_proFilePath)); -} - -void TargetSetupPage::handleQtUpdate(const QList<int> &add, const QList<int> &rm, const QList<int> &mod) -{ - Q_UNUSED(add); - // Update kit to no longer claim a Qt version is temporary once it is modified/removed. - foreach (ProjectExplorer::Kit *k, ProjectExplorer::KitManager::kits()) { - if (!k->hasValue(QT_IS_TEMPORARY)) - continue; - int qtVersion = k->value(QT_IS_TEMPORARY, -1).toInt(); - if (rm.contains(qtVersion) || mod.contains(qtVersion)) - makeQtPersistent(k); - } -} - -void TargetSetupPage::setupImports() -{ - if (!m_importSearch || m_proFilePath.isEmpty()) - return; - - QFileInfo pfi(m_proFilePath); - const QString prefix = pfi.baseName(); - QStringList toImport; - toImport << pfi.absolutePath(); - - QList<ProjectExplorer::Kit *> kitList = ProjectExplorer::KitManager::kits(); - foreach (ProjectExplorer::Kit *k, kitList) { - QFileInfo fi(Qt4Project::shadowBuildDirectory(m_proFilePath, k, QString())); - const QString baseDir = fi.absolutePath(); - - foreach (const QString &dir, QDir(baseDir).entryList()) { - const QString path = baseDir + QLatin1Char('/') + dir; - if (dir.startsWith(prefix) && !toImport.contains(path)) - toImport << path; - - } - } - foreach (const QString &path, toImport) - import(Utils::FileName::fromString(path), true); -} - -void TargetSetupPage::handleKitAddition(ProjectExplorer::Kit *k) -{ - if (m_ignoreUpdates) - return; - - Q_ASSERT(!m_widgets.contains(k->id())); - addWidget(k); - updateVisibility(); -} - -void TargetSetupPage::handleKitRemoval(ProjectExplorer::Kit *k) -{ - BaseQtVersion *version = QtVersionManager::version(k->value(QT_IS_TEMPORARY, -1).toInt()); - if (version) - QtVersionManager::removeVersion(version); - - if (m_ignoreUpdates) - return; - - removeWidget(k); - updateVisibility(); -} - -void TargetSetupPage::handleKitUpdate(ProjectExplorer::Kit *k) -{ - if (m_ignoreUpdates) - return; - - cleanKit(k); - Qt4TargetSetupWidget *widget = m_widgets.value(k->id()); - - bool acceptable = true; - if (m_requiredMatcher && !m_requiredMatcher->matches(k)) - acceptable = false; - - if (widget && !acceptable) - removeWidget(k); - else if (!widget && acceptable) - addWidget(k); - - updateVisibility(); -} - -void TargetSetupPage::selectAtLeastOneKit() -{ - bool atLeastOneKitSelected = false; - foreach (Qt4TargetSetupWidget *w, m_widgets.values()) { - if (w->isKitSelected()) { - atLeastOneKitSelected = true; - break; - } - } - - if (!atLeastOneKitSelected) { - Qt4TargetSetupWidget *widget = m_firstWidget; - ProjectExplorer::Kit *defaultKit = ProjectExplorer::KitManager::defaultKit(); - if (defaultKit) - widget = m_widgets.value(defaultKit->id(), m_firstWidget); - if (widget) - widget->setKitSelected(true); - m_firstWidget = 0; - } - emit completeChanged(); // Is this necessary? -} - -void TargetSetupPage::updateVisibility() -{ - // Always show the widgets, the import widget always makes sense to show. - m_ui->scrollAreaWidget->setVisible(m_baseLayout == m_ui->scrollArea->widget()->layout()); - m_ui->centralWidget->setVisible(m_baseLayout == m_ui->centralWidget->layout()); - - bool hasKits = !m_widgets.isEmpty(); - m_ui->noValidKitLabel->setVisible(!hasKits); - m_ui->optionHintLabel->setVisible(m_forceOptionHint || !hasKits); - - emit completeChanged(); -} - -void TargetSetupPage::openOptions() -{ - Core::ICore::showOptionsDialog(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY, - ProjectExplorer::Constants::KITS_SETTINGS_PAGE_ID, - this); -} - -void TargetSetupPage::removeWidget(ProjectExplorer::Kit *k) -{ - Qt4TargetSetupWidget *widget = m_widgets.value(k->id()); - if (!widget) - return; - if (widget == m_firstWidget) - m_firstWidget = 0; - widget->deleteLater(); - m_widgets.remove(k->id()); -} - -Qt4TargetSetupWidget *TargetSetupPage::addWidget(ProjectExplorer::Kit *k) -{ - if (m_requiredMatcher && !m_requiredMatcher->matches(k)) - return 0; - - QList<BuildConfigurationInfo> infoList = Qt4BuildConfigurationFactory::availableBuildConfigurations(k, m_proFilePath); - Qt4TargetSetupWidget *widget = infoList.isEmpty() ? 0 : new Qt4TargetSetupWidget(k, m_proFilePath, infoList); - if (!widget) - return 0; - - m_baseLayout->removeWidget(m_importWidget); - m_baseLayout->removeItem(m_spacer); - - widget->setKitSelected(m_preferredMatcher && m_preferredMatcher->matches(k)); - m_widgets.insert(k->id(), widget); - m_baseLayout->addWidget(widget); - - m_baseLayout->addWidget(m_importWidget); - m_baseLayout->addItem(m_spacer); - - connect(widget, SIGNAL(selectedToggled()), - this, SIGNAL(completeChanged())); - - if (!m_firstWidget) - m_firstWidget = widget; - - return widget; -} - -class KitBuildInfo -{ -public: - KitBuildInfo(ProjectExplorer::Kit *k, const QList<BuildConfigurationInfo> &il) : - kit(k), infoList(il) - { } - - ProjectExplorer::Kit *kit; - QList<BuildConfigurationInfo> infoList; -}; - -bool TargetSetupPage::setupProject(Qt4ProjectManager::Qt4Project *project) -{ - QList<KitBuildInfo> toRegister; - foreach (Qt4TargetSetupWidget *widget, m_widgets.values()) { - if (!widget->isKitSelected()) - continue; - - ProjectExplorer::Kit *k = widget->kit(); - cleanKit(k); - toRegister.append(KitBuildInfo(k, widget->selectedBuildConfigurationInfoList())); - widget->clearKit(); - } - reset(); - - // only register kits after we are done cleaning up - foreach (const KitBuildInfo &data, toRegister) - project->addTarget(project->createTarget(data.kit, data.infoList)); - - // Select active target - // a) Simulator target - // b) Desktop target - // c) the first target - ProjectExplorer::Target *activeTarget = 0; - QList<ProjectExplorer::Target *> targets = project->targets(); - int activeTargetPriority = 0; - foreach (ProjectExplorer::Target *t, targets) { - BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(t->kit()); - if (t->kit() == ProjectExplorer::KitManager::defaultKit()) { - activeTarget = t; - activeTargetPriority = 3; - } else if (activeTargetPriority < 2 && version && version->type() == QLatin1String(QtSupport::Constants::SIMULATORQT)) { - activeTarget = t; - activeTargetPriority = 2; - } else if (activeTargetPriority < 1 && version && version->type() == QLatin1String(QtSupport::Constants::DESKTOPQT)) { - activeTarget = t; - activeTargetPriority = 1; - } - } - if (!activeTarget && !targets.isEmpty()) - activeTarget = targets.first(); - if (activeTarget) - project->setActiveTarget(activeTarget); - - return true; -} - -void TargetSetupPage::setUseScrollArea(bool b) -{ - m_baseLayout = b ? m_ui->scrollArea->widget()->layout() : m_ui->centralWidget->layout(); - m_ui->scrollAreaWidget->setVisible(b); - m_ui->centralWidget->setVisible(!b); -} - -} // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h deleted file mode 100644 index 73dd8a601c..0000000000 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h +++ /dev/null @@ -1,142 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef TARGETSETUPPAGE_H -#define TARGETSETUPPAGE_H - -#include "../qt4projectmanager_global.h" - -#include <QString> -#include <QWizardPage> -#include <QMap> - -QT_FORWARD_DECLARE_CLASS(QSpacerItem) - -namespace Utils { class FileName; } - -namespace Core { -class Id; -} // namespace Core - -namespace ProjectExplorer { -class Kit; -class KitMatcher; -} // namespace ProjectExplorer - -namespace QtSupport { class BaseQtVersion; } - -namespace Qt4ProjectManager { -class Qt4Project; -class Qt4TargetSetupWidget; - -namespace Internal { -class ImportWidget; -class TargetSetupPageUi; -} // namespace Internal - -/// \internal -class QT4PROJECTMANAGER_EXPORT TargetSetupPage : public QWizardPage -{ - Q_OBJECT - -public: - explicit TargetSetupPage(QWidget* parent = 0); - ~TargetSetupPage(); - - /// Initializes the TargetSetupPage - /// \note The import information is gathered in initializePage(), make sure that the right proFilePath is set before - void initializePage(); - - // Call these before initializePage! - void setRequiredKitMatcher(ProjectExplorer::KitMatcher *matcher); - void setPreferredKitMatcher(ProjectExplorer::KitMatcher *matcher); - void setImportSearch(bool b); - - /// Sets whether the targetsetupage uses a scrollarea - /// to host the widgets from the factories - /// call this before \sa initializePage() - void setUseScrollArea(bool b); - - bool isComplete() const; - bool setupProject(Qt4ProjectManager::Qt4Project *project); - bool isKitSelected(Core::Id id) const; - void setKitSelected(Core::Id id, bool selected); - QList<Core::Id> selectedKits() const; - void setProFilePath(const QString &dir); - - /// Overrides the summary text of the targetsetuppage - void setNoteText(const QString &text); - void showOptionsHint(bool show); - -private slots: - void import(const Utils::FileName &path); - void handleQtUpdate(const QList<int> &add, const QList<int> &rm, const QList<int> &mod); - void handleKitAddition(ProjectExplorer::Kit *k); - void handleKitRemoval(ProjectExplorer::Kit *k); - void handleKitUpdate(ProjectExplorer::Kit *k); - void updateVisibility(); - void openOptions(); - -private: - void selectAtLeastOneKit(); - void import(const Utils::FileName &path, const bool silent); - void removeWidget(ProjectExplorer::Kit *k); - Qt4TargetSetupWidget *addWidget(ProjectExplorer::Kit *k); - - void setupImports(); - - void setupWidgets(); - void reset(); - ProjectExplorer::Kit *createTemporaryKit(QtSupport::BaseQtVersion *version, bool temporaryVersion, const Utils::FileName &parsedSpec); - void cleanKit(ProjectExplorer::Kit *k); - void makeQtPersistent(ProjectExplorer::Kit *k); - void addProject(ProjectExplorer::Kit *k, const QString &path); - void removeProject(ProjectExplorer::Kit *k, const QString &path); - - ProjectExplorer::KitMatcher *m_requiredMatcher; - ProjectExplorer::KitMatcher *m_preferredMatcher; - QLayout *m_baseLayout; - bool m_importSearch; - bool m_ignoreUpdates; - QString m_proFilePath; - QString m_defaultShadowBuildLocation; - QMap<Core::Id, Qt4TargetSetupWidget *> m_widgets; - Qt4TargetSetupWidget *m_firstWidget; - - Internal::TargetSetupPageUi *m_ui; - - Internal::ImportWidget *m_importWidget; - QSpacerItem *m_spacer; - - bool m_forceOptionHint; -}; - -} // namespace Qt4ProjectManager - -#endif // TARGETSETUPPAGE_H |