forked from qt-creator/qt-creator
Qbs: Support subprojects
Change-Id: Ic7015b44362b89a14957f7d21540e71d441c860f Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
This commit is contained in:
@@ -574,10 +574,14 @@ QbsProjectNode::QbsProjectNode(QbsProject *project) :
|
|||||||
QbsBaseProjectNode(project->document()->fileName()),
|
QbsBaseProjectNode(project->document()->fileName()),
|
||||||
m_project(project), m_qbsProject(0), m_qbsProjectData(0)
|
m_project(project), m_qbsProject(0), m_qbsProjectData(0)
|
||||||
{
|
{
|
||||||
Q_ASSERT(project);
|
ctor();
|
||||||
setIcon(m_projectIcon);
|
}
|
||||||
addFileNodes(QList<ProjectExplorer::FileNode *>()
|
|
||||||
<< new ProjectExplorer::FileNode(path(), ProjectExplorer::ProjectFileType, false), this);
|
QbsProjectNode::QbsProjectNode(const QString &path) :
|
||||||
|
QbsBaseProjectNode(path),
|
||||||
|
m_project(0), m_qbsProject(0), m_qbsProjectData(0)
|
||||||
|
{
|
||||||
|
ctor();
|
||||||
}
|
}
|
||||||
|
|
||||||
QbsProjectNode::~QbsProjectNode()
|
QbsProjectNode::~QbsProjectNode()
|
||||||
@@ -588,30 +592,44 @@ QbsProjectNode::~QbsProjectNode()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void QbsProjectNode::update(const qbs::Project *prj)
|
void QbsProjectNode::update(const qbs::Project *prj)
|
||||||
|
{
|
||||||
|
if (prj)
|
||||||
|
update(prj->projectData());
|
||||||
|
|
||||||
|
delete m_qbsProject;
|
||||||
|
m_qbsProject = prj;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QbsProjectNode::update(const qbs::ProjectData &prjData)
|
||||||
{
|
{
|
||||||
QList<ProjectExplorer::ProjectNode *> toAdd;
|
QList<ProjectExplorer::ProjectNode *> toAdd;
|
||||||
QList<ProjectExplorer::ProjectNode *> toRemove = subProjectNodes();
|
QList<ProjectExplorer::ProjectNode *> toRemove = subProjectNodes();
|
||||||
|
|
||||||
qbs::ProjectData *newData = 0;
|
foreach (const qbs::ProjectData &subData, prjData.subProjects()) {
|
||||||
|
QbsProjectNode *qn = findProjectNode(subData.name());
|
||||||
|
if (!qn) {
|
||||||
|
QbsProjectNode *subProject = new QbsProjectNode(prjData.location().fileName());
|
||||||
|
subProject->update(subData);
|
||||||
|
toAdd << subProject;
|
||||||
|
} else {
|
||||||
|
qn->update(subData);
|
||||||
|
toRemove.removeOne(qn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (prj) {
|
foreach (const qbs::ProductData &prd, prjData.products()) {
|
||||||
newData = new qbs::ProjectData(prj->projectData());
|
QbsProductNode *qn = findProductNode(prd.name());
|
||||||
foreach (const qbs::ProductData &prd, newData->products()) {
|
if (!qn) {
|
||||||
QbsProductNode *qn = findProductNode(prd.name());
|
toAdd << new QbsProductNode(&prd);
|
||||||
if (!qn) {
|
} else {
|
||||||
toAdd << new QbsProductNode(&prd);
|
qn->setQbsProductData(&prd);
|
||||||
} else {
|
toRemove.removeOne(qn);
|
||||||
qn->setQbsProductData(&prd);
|
|
||||||
toRemove.removeOne(qn);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
delete m_qbsProjectData;
|
delete m_qbsProjectData;
|
||||||
m_qbsProjectData = newData;
|
m_qbsProjectData = new qbs::ProjectData(prjData);
|
||||||
|
setDisplayName(prjData.name());
|
||||||
delete m_qbsProject;
|
|
||||||
m_qbsProject = prj;
|
|
||||||
|
|
||||||
removeProjectNodes(toRemove);
|
removeProjectNodes(toRemove);
|
||||||
addProjectNodes(toAdd);
|
addProjectNodes(toAdd);
|
||||||
@@ -619,11 +637,16 @@ void QbsProjectNode::update(const qbs::Project *prj)
|
|||||||
|
|
||||||
QbsProject *QbsProjectNode::project() const
|
QbsProject *QbsProjectNode::project() const
|
||||||
{
|
{
|
||||||
|
if (!m_project && projectNode())
|
||||||
|
return static_cast<QbsProjectNode *>(projectNode())->project();
|
||||||
return m_project;
|
return m_project;
|
||||||
}
|
}
|
||||||
|
|
||||||
const qbs::Project *QbsProjectNode::qbsProject() const
|
const qbs::Project *QbsProjectNode::qbsProject() const
|
||||||
{
|
{
|
||||||
|
QbsProjectNode *parent = qobject_cast<QbsProjectNode *>(projectNode());
|
||||||
|
if (!m_qbsProject && parent != this)
|
||||||
|
return parent->qbsProject();
|
||||||
return m_qbsProject;
|
return m_qbsProject;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -632,11 +655,28 @@ const qbs::ProjectData *QbsProjectNode::qbsProjectData() const
|
|||||||
return m_qbsProjectData;
|
return m_qbsProjectData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QbsProjectNode::ctor()
|
||||||
|
{
|
||||||
|
setIcon(m_projectIcon);
|
||||||
|
addFileNodes(QList<ProjectExplorer::FileNode *>()
|
||||||
|
<< new ProjectExplorer::FileNode(path(), ProjectExplorer::ProjectFileType, false), this);
|
||||||
|
}
|
||||||
|
|
||||||
QbsProductNode *QbsProjectNode::findProductNode(const QString &name)
|
QbsProductNode *QbsProjectNode::findProductNode(const QString &name)
|
||||||
{
|
{
|
||||||
foreach (ProjectExplorer::ProjectNode *n, subProjectNodes()) {
|
foreach (ProjectExplorer::ProjectNode *n, subProjectNodes()) {
|
||||||
QbsProductNode *qn = static_cast<QbsProductNode *>(n);
|
QbsProductNode *qn = qobject_cast<QbsProductNode *>(n);
|
||||||
if (qn->qbsProductData()->name() == name)
|
if (qn && qn->qbsProductData()->name() == name)
|
||||||
|
return qn;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QbsProjectNode *QbsProjectNode::findProjectNode(const QString &name)
|
||||||
|
{
|
||||||
|
foreach (ProjectExplorer::ProjectNode *n, subProjectNodes()) {
|
||||||
|
QbsProjectNode *qn = qobject_cast<QbsProjectNode *>(n);
|
||||||
|
if (qn && qn->qbsProjectData()->name() == name)
|
||||||
return qn;
|
return qn;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -174,16 +174,21 @@ class QbsProjectNode : public QbsBaseProjectNode
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
explicit QbsProjectNode(QbsProject *project);
|
explicit QbsProjectNode(QbsProject *project);
|
||||||
|
explicit QbsProjectNode(const QString &path);
|
||||||
~QbsProjectNode();
|
~QbsProjectNode();
|
||||||
|
|
||||||
void update(const qbs::Project *prj);
|
void update(const qbs::Project *prj);
|
||||||
|
void update(const qbs::ProjectData &prjData);
|
||||||
|
|
||||||
QbsProject *project() const;
|
QbsProject *project() const;
|
||||||
const qbs::Project *qbsProject() const;
|
const qbs::Project *qbsProject() const;
|
||||||
const qbs::ProjectData *qbsProjectData() const;
|
const qbs::ProjectData *qbsProjectData() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void ctor();
|
||||||
|
|
||||||
QbsProductNode *findProductNode(const QString &name);
|
QbsProductNode *findProductNode(const QString &name);
|
||||||
|
QbsProjectNode *findProjectNode(const QString &name);
|
||||||
|
|
||||||
QbsProject *m_project;
|
QbsProject *m_project;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user