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>
This commit is contained in:
Tobias Hunger
2014-02-11 13:21:06 +01:00
parent ea80ee0150
commit dca2051210
2 changed files with 55 additions and 1 deletions

View File

@@ -29,9 +29,11 @@
#include "targetsettingspanel.h" #include "targetsettingspanel.h"
#include "buildinfo.h"
#include "buildsettingspropertiespage.h" #include "buildsettingspropertiespage.h"
#include "kitoptionspage.h" #include "kitoptionspage.h"
#include "project.h" #include "project.h"
#include "projectimporter.h"
#include "projectwindow.h" #include "projectwindow.h"
#include "runsettingspropertiespage.h" #include "runsettingspropertiespage.h"
#include "target.h" #include "target.h"
@@ -48,6 +50,7 @@
#include <projectexplorer/runconfiguration.h> #include <projectexplorer/runconfiguration.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QFileDialog>
#include <QLabel> #include <QLabel>
#include <QMenu> #include <QMenu>
#include <QMessageBox> #include <QMessageBox>
@@ -69,11 +72,13 @@ namespace Internal {
TargetSettingsPanelWidget::TargetSettingsPanelWidget(Project *project) : TargetSettingsPanelWidget::TargetSettingsPanelWidget(Project *project) :
m_currentTarget(0), m_currentTarget(0),
m_project(project), m_project(project),
m_importer(project->createProjectImporter()),
m_selector(0), m_selector(0),
m_centralWidget(0), m_centralWidget(0),
m_changeMenu(0), m_changeMenu(0),
m_duplicateMenu(0), m_duplicateMenu(0),
m_lastAction(0) m_lastAction(0),
m_importAction(0)
{ {
Q_ASSERT(m_project); Q_ASSERT(m_project);
@@ -83,6 +88,11 @@ TargetSettingsPanelWidget::TargetSettingsPanelWidget(Project *project) :
m_addMenu = new QMenu(this); m_addMenu = new QMenu(this);
m_targetMenu = 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); setFocusPolicy(Qt::NoFocus);
setupUi(); setupUi();
@@ -101,6 +111,7 @@ TargetSettingsPanelWidget::TargetSettingsPanelWidget(Project *project) :
TargetSettingsPanelWidget::~TargetSettingsPanelWidget() TargetSettingsPanelWidget::~TargetSettingsPanelWidget()
{ {
delete m_importer;
} }
bool TargetSettingsPanelWidget::event(QEvent *event) bool TargetSettingsPanelWidget::event(QEvent *event)
@@ -551,6 +562,11 @@ void TargetSettingsPanelWidget::updateTargetButtons()
m_addMenu->clear(); m_addMenu->clear();
m_targetMenu->clear(); m_targetMenu->clear();
if (m_importAction) {
m_addMenu->addAction(m_importAction);
m_addMenu->addSeparator();
}
m_changeMenu = m_targetMenu->addMenu(tr("Change Kit")); m_changeMenu = m_targetMenu->addMenu(tr("Change Kit"));
m_duplicateMenu = m_targetMenu->addMenu(tr("Copy to Kit")); m_duplicateMenu = m_targetMenu->addMenu(tr("Copy to Kit"));
QAction *removeAction = m_targetMenu->addAction(tr("Remove Kit")); QAction *removeAction = m_targetMenu->addAction(tr("Remove Kit"));
@@ -605,6 +621,37 @@ void TargetSettingsPanelWidget::openTargetPreferences()
Constants::KITS_SETTINGS_PAGE_ID); 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 int TargetSettingsPanelWidget::currentSubIndex() const
{ {
return m_selector->currentSubIndex(); return m_selector->currentSubIndex();

View File

@@ -38,10 +38,13 @@ class QMenu;
class QStackedWidget; class QStackedWidget;
QT_END_NAMESPACE QT_END_NAMESPACE
namespace Utils { class FileName; }
namespace ProjectExplorer { namespace ProjectExplorer {
class Target; class Target;
class Project; class Project;
class ProjectImporter;
class Kit; class Kit;
class PanelsWidget; class PanelsWidget;
@@ -72,6 +75,7 @@ private slots:
void updateTargetButtons(); void updateTargetButtons();
void renameTarget(); void renameTarget();
void openTargetPreferences(); void openTargetPreferences();
void importTarget();
void removeTarget(); void removeTarget();
void menuShown(int targetIndex); void menuShown(int targetIndex);
@@ -81,10 +85,12 @@ private slots:
private: private:
Target *cloneTarget(Target *sourceTarget, Kit *k); Target *cloneTarget(Target *sourceTarget, Kit *k);
void removeTarget(Target *t); void removeTarget(Target *t);
void importTarget(const Utils::FileName &path);
void createAction(Kit *k, QMenu *menu); void createAction(Kit *k, QMenu *menu);
Target *m_currentTarget; Target *m_currentTarget;
Project *m_project; Project *m_project;
ProjectImporter *m_importer;
TargetSettingsWidget *m_selector; TargetSettingsWidget *m_selector;
QStackedWidget *m_centralWidget; QStackedWidget *m_centralWidget;
QWidget *m_noTargetLabel; QWidget *m_noTargetLabel;
@@ -95,6 +101,7 @@ private:
QMenu *m_duplicateMenu; QMenu *m_duplicateMenu;
QMenu *m_addMenu; QMenu *m_addMenu;
QAction *m_lastAction; QAction *m_lastAction;
QAction *m_importAction;
int m_menuTargetIndex; int m_menuTargetIndex;
}; };