aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/projectexplorer/project.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/projectexplorer/project.cpp')
-rw-r--r--src/plugins/projectexplorer/project.cpp55
1 files changed, 36 insertions, 19 deletions
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index e7e6599ed9..d808ca8d7f 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -31,6 +31,7 @@
#include "deployconfiguration.h"
#include "editorconfiguration.h"
#include "kit.h"
+#include "kitinformation.h"
#include "makestep.h"
#include "projectexplorer.h"
#include "projectmacroexpander.h"
@@ -39,6 +40,7 @@
#include "runcontrol.h"
#include "session.h"
#include "target.h"
+#include "taskhub.h"
#include "userfileaccessor.h"
#include <coreplugin/idocument.h>
@@ -57,6 +59,7 @@
#include <utils/macroexpander.h>
#include <utils/pointeralgorithm.h>
#include <utils/qtcassert.h>
+#include <utils/stringutils.h>
#include <QFileDialog>
@@ -178,7 +181,7 @@ class ProjectPrivate
public:
~ProjectPrivate();
- Core::Id m_id;
+ Utils::Id m_id;
bool m_needsInitialExpansion = false;
bool m_canBuildProducts = false;
bool m_knowsAllBuildExecutables = true;
@@ -238,7 +241,7 @@ QString Project::displayName() const
return d->m_displayName;
}
-Core::Id Project::id() const
+Utils::Id Project::id() const
{
QTC_CHECK(d->m_id.isValid());
return d->m_id;
@@ -374,7 +377,7 @@ void Project::setExtraProjectFiles(const QSet<Utils::FilePath> &projectDocumentP
}
}
-Target *Project::target(Core::Id id) const
+Target *Project::target(Utils::Id id) const
{
return Utils::findOrDefault(d->m_targets, Utils::equal(&Target::id, id));
}
@@ -468,11 +471,11 @@ bool Project::copySteps(Target *sourceTarget, Target *newTarget)
if (fatalError) {
// That could be a more granular error message
- QMessageBox::critical(Core::ICore::mainWindow(),
+ QMessageBox::critical(Core::ICore::dialogParent(),
tr("Incompatible Kit"),
tr("Kit %1 is incompatible with kit %2.")
- .arg(sourceTarget->kit()->displayName())
- .arg(newTarget->kit()->displayName()));
+ .arg(sourceTarget->kit()->displayName())
+ .arg(newTarget->kit()->displayName()));
} else if (!buildconfigurationError.isEmpty()
|| !deployconfigurationError.isEmpty()
|| ! runconfigurationError.isEmpty()) {
@@ -496,7 +499,7 @@ bool Project::copySteps(Target *sourceTarget, Target *newTarget)
+ runconfigurationError.join(QLatin1Char('\n'));
}
- QMessageBox msgBox(Core::ICore::mainWindow());
+ QMessageBox msgBox(Core::ICore::dialogParent());
msgBox.setIcon(QMessageBox::Warning);
msgBox.setWindowTitle(tr("Partially Incompatible Kit"));
msgBox.setText(tr("Some configurations could not be copied."));
@@ -526,7 +529,7 @@ void Project::setDisplayName(const QString &name)
emit displayNameChanged();
}
-void Project::setId(Core::Id id)
+void Project::setId(Utils::Id id)
{
QTC_ASSERT(!d->m_id.isValid(), return); // Id may not change ever!
d->m_id = id;
@@ -576,14 +579,14 @@ void Project::saveSettings()
if (!d->m_accessor)
d->m_accessor = std::make_unique<Internal::UserFileAccessor>(this);
if (!targets().isEmpty())
- d->m_accessor->saveSettings(toMap(), Core::ICore::mainWindow());
+ d->m_accessor->saveSettings(toMap(), Core::ICore::dialogParent());
}
Project::RestoreResult Project::restoreSettings(QString *errorMessage)
{
if (!d->m_accessor)
d->m_accessor = std::make_unique<Internal::UserFileAccessor>(this);
- QVariantMap map(d->m_accessor->restoreSettings(Core::ICore::mainWindow()));
+ QVariantMap map(d->m_accessor->restoreSettings(Core::ICore::dialogParent()));
RestoreResult result = fromMap(map, errorMessage);
if (result == RestoreResult::Ok)
emit settingsLoaded();
@@ -748,7 +751,7 @@ void Project::createTargetFromMap(const QVariantMap &map, int index)
const QVariantMap targetMap = map.value(key).toMap();
- Core::Id id = idFromMap(targetMap);
+ Utils::Id id = idFromMap(targetMap);
if (target(id)) {
qWarning("Warning: Duplicated target id found, not restoring second target with id '%s'. Continuing.",
qPrintable(id.toString()));
@@ -757,8 +760,22 @@ void Project::createTargetFromMap(const QVariantMap &map, int index)
Kit *k = KitManager::kit(id);
if (!k) {
- qWarning("Warning: No kit '%s' found. Continuing.", qPrintable(id.toString()));
- return;
+ Utils::Id deviceTypeId = Utils::Id::fromSetting(targetMap.value(Target::deviceTypeKey()));
+ if (!deviceTypeId.isValid())
+ deviceTypeId = Constants::DESKTOP_DEVICE_TYPE;
+ const QString formerKitName = targetMap.value(Target::displayNameKey()).toString();
+ k = KitManager::registerKit([deviceTypeId, &formerKitName](Kit *kit) {
+ const QString tempKitName = Utils::makeUniquelyNumbered(
+ tr("Replacement for \"%1\"").arg(formerKitName),
+ Utils::transform(KitManager::kits(), &Kit::unexpandedDisplayName));
+ kit->setUnexpandedDisplayName(tempKitName);
+ DeviceTypeKitAspect::setDeviceTypeId(kit, deviceTypeId);
+ kit->setup();
+ }, id);
+ TaskHub::addTask(BuildSystemTask(Task::Warning, tr("Project \"%1\" was configured for "
+ "kit \"%2\" with id %3, which does not exist anymore. The new kit \"%4\" was "
+ "created in its place, in an attempt not to lose custom project settings.")
+ .arg(displayName(), formerKitName, id.toString(), k->displayName())));
}
auto t = std::make_unique<Target>(this, k, Target::_constructor_tag{});
@@ -793,7 +810,7 @@ void Project::setProjectLanguages(Core::Context language)
emit projectLanguagesUpdated();
}
-void Project::addProjectLanguage(Core::Id id)
+void Project::addProjectLanguage(Utils::Id id)
{
Core::Context lang = projectLanguages();
int pos = lang.indexOf(id);
@@ -802,7 +819,7 @@ void Project::addProjectLanguage(Core::Id id)
setProjectLanguages(lang);
}
-void Project::removeProjectLanguage(Core::Id id)
+void Project::removeProjectLanguage(Utils::Id id)
{
Core::Context lang = projectLanguages();
int pos = lang.indexOf(id);
@@ -811,7 +828,7 @@ void Project::removeProjectLanguage(Core::Id id)
setProjectLanguages(lang);
}
-void Project::setProjectLanguage(Core::Id id, bool enabled)
+void Project::setProjectLanguage(Utils::Id id, bool enabled)
{
if (enabled)
addProjectLanguage(id);
@@ -841,7 +858,7 @@ void Project::setNeedsDeployConfigurations(bool value)
Task Project::createProjectTask(Task::TaskType type, const QString &description)
{
- return Task(type, description, Utils::FilePath(), -1, Core::Id());
+ return Task(type, description, Utils::FilePath(), -1, Utils::Id());
}
void Project::setBuildSystemCreator(const std::function<BuildSystem *(Target *)> &creator)
@@ -893,7 +910,7 @@ bool Project::needsBuildConfigurations() const
return d->m_needsBuildConfigurations;
}
-void Project::configureAsExampleProject()
+void Project::configureAsExampleProject(Kit * /*kit*/)
{
}
@@ -1060,7 +1077,7 @@ void ProjectExplorerPlugin::testProject_setup()
QCOMPARE(project.files(Project::AllFiles), {TEST_PROJECT_PATH});
QCOMPARE(project.files(Project::GeneratedFiles), {});
- QCOMPARE(project.id(), Core::Id(TEST_PROJECT_ID));
+ QCOMPARE(project.id(), Utils::Id(TEST_PROJECT_ID));
QVERIFY(!project.target->buildSystem()->isParsing());
QVERIFY(!project.target->buildSystem()->hasParsingData());