From dca2051210c001b771d530b3e3024e1476aca508 Mon Sep 17 00:00:00 2001 From: Tobias Hunger <tobias.hunger@digia.com> Date: Tue, 11 Feb 2014 13:21:06 +0100 Subject: [PATCH] ProjectExplorer: Add option to import existing builds Add option to import existing builds back into Projects mode. Click an "Add Kit" to get the entry (for projects that actually support importing builds). Task-number: QTCREATORBUG-7836 Change-Id: I43cf0f0ba5f80c88b6ffce1381f34f5591213e05 Reviewed-by: Daniel Teske <daniel.teske@digia.com> --- .../projectexplorer/targetsettingspanel.cpp | 49 ++++++++++++++++++- .../projectexplorer/targetsettingspanel.h | 7 +++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index 8a4128f1ef7..d3835b69fbf 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -29,9 +29,11 @@ #include "targetsettingspanel.h" +#include "buildinfo.h" #include "buildsettingspropertiespage.h" #include "kitoptionspage.h" #include "project.h" +#include "projectimporter.h" #include "projectwindow.h" #include "runsettingspropertiespage.h" #include "target.h" @@ -48,6 +50,7 @@ #include <projectexplorer/runconfiguration.h> #include <utils/qtcassert.h> +#include <QFileDialog> #include <QLabel> #include <QMenu> #include <QMessageBox> @@ -69,11 +72,13 @@ namespace Internal { TargetSettingsPanelWidget::TargetSettingsPanelWidget(Project *project) : m_currentTarget(0), m_project(project), + m_importer(project->createProjectImporter()), m_selector(0), m_centralWidget(0), m_changeMenu(0), m_duplicateMenu(0), - m_lastAction(0) + m_lastAction(0), + m_importAction(0) { Q_ASSERT(m_project); @@ -83,6 +88,11 @@ TargetSettingsPanelWidget::TargetSettingsPanelWidget(Project *project) : m_addMenu = new QMenu(this); m_targetMenu = new QMenu(this); + if (m_importer) { + m_importAction = new QAction(tr("Import existing build..."), this); + connect(m_importAction, SIGNAL(triggered()), this, SLOT(importTarget())); + } + setFocusPolicy(Qt::NoFocus); setupUi(); @@ -101,6 +111,7 @@ TargetSettingsPanelWidget::TargetSettingsPanelWidget(Project *project) : TargetSettingsPanelWidget::~TargetSettingsPanelWidget() { + delete m_importer; } bool TargetSettingsPanelWidget::event(QEvent *event) @@ -551,6 +562,11 @@ void TargetSettingsPanelWidget::updateTargetButtons() m_addMenu->clear(); m_targetMenu->clear(); + if (m_importAction) { + m_addMenu->addAction(m_importAction); + m_addMenu->addSeparator(); + } + m_changeMenu = m_targetMenu->addMenu(tr("Change Kit")); m_duplicateMenu = m_targetMenu->addMenu(tr("Copy to Kit")); QAction *removeAction = m_targetMenu->addAction(tr("Remove Kit")); @@ -605,6 +621,37 @@ void TargetSettingsPanelWidget::openTargetPreferences() Constants::KITS_SETTINGS_PAGE_ID); } +void TargetSettingsPanelWidget::importTarget() +{ + QString toImport = QFileDialog::getExistingDirectory(this, tr("Import directory"), m_project->projectDirectory()); + importTarget(Utils::FileName::fromString(toImport)); +} + +void TargetSettingsPanelWidget::importTarget(const Utils::FileName &path) +{ + if (!m_importer) + return; + + Target *target = 0; + BuildConfiguration *bc = 0; + QList<BuildInfo *> toImport = m_importer->import(path, false); + foreach (BuildInfo *info, toImport) { + target = m_project->target(info->kitId); + if (!target) { + target = new Target(m_project, KitManager::find(info->kitId)); + m_project->addTarget(target); + } + bc = info->factory()->create(target, info); + QTC_ASSERT(bc, continue); + target->addBuildConfiguration(bc); + } + m_project->setActiveTarget(target); + if (target && bc) + target->setActiveBuildConfiguration(bc); + + qDeleteAll(toImport); +} + int TargetSettingsPanelWidget::currentSubIndex() const { return m_selector->currentSubIndex(); diff --git a/src/plugins/projectexplorer/targetsettingspanel.h b/src/plugins/projectexplorer/targetsettingspanel.h index da784732147..2de991f48a9 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.h +++ b/src/plugins/projectexplorer/targetsettingspanel.h @@ -38,10 +38,13 @@ class QMenu; class QStackedWidget; QT_END_NAMESPACE +namespace Utils { class FileName; } + namespace ProjectExplorer { class Target; class Project; +class ProjectImporter; class Kit; class PanelsWidget; @@ -72,6 +75,7 @@ private slots: void updateTargetButtons(); void renameTarget(); void openTargetPreferences(); + void importTarget(); void removeTarget(); void menuShown(int targetIndex); @@ -81,10 +85,12 @@ private slots: private: Target *cloneTarget(Target *sourceTarget, Kit *k); void removeTarget(Target *t); + void importTarget(const Utils::FileName &path); void createAction(Kit *k, QMenu *menu); Target *m_currentTarget; Project *m_project; + ProjectImporter *m_importer; TargetSettingsWidget *m_selector; QStackedWidget *m_centralWidget; QWidget *m_noTargetLabel; @@ -95,6 +101,7 @@ private: QMenu *m_duplicateMenu; QMenu *m_addMenu; QAction *m_lastAction; + QAction *m_importAction; int m_menuTargetIndex; }; -- GitLab