diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp index f94bba6cdb3..90994797484 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.cpp +++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp @@ -336,6 +336,7 @@ static QList supportedNodeActions(ProjectExplore if (node->nodeType() == ProjectExplorer::FileNodeType && !project->qbsProject().buildSystemFiles().contains(node->path())) { actions << ProjectExplorer::RemoveFile; + actions << ProjectExplorer::Rename; } return actions; } @@ -417,6 +418,19 @@ bool QbsGroupNode::removeFiles(const QStringList &filePaths, QStringList *notRem m_qbsGroupData, notRemoved); } +bool QbsGroupNode::renameFile(const QString &filePath, const QString &newFilePath) +{ + QbsProjectNode * const prjNode = parentQbsProjectNode(this); + if (!prjNode || !prjNode->qbsProject().isValid()) + return false; + QbsProductNode * const prdNode = parentQbsProductNode(this); + if (!prdNode || !prdNode->qbsProductData().isValid()) + return false; + + return prjNode->project()->renameFileInProduct(this, filePath, newFilePath, + prdNode->qbsProductData(), m_qbsGroupData); +} + void QbsGroupNode::updateQbsGroupData(const qbs::GroupData &grp, const QString &productPath, bool productWasEnabled, bool productIsEnabled) { @@ -623,6 +637,17 @@ bool QbsProductNode::removeFiles(const QStringList &filePaths, QStringList *notR QTC_ASSERT(false, return false); } +bool QbsProductNode::renameFile(const QString &filePath, const QString &newFilePath) +{ + QbsProjectNode * const prjNode = parentQbsProjectNode(this); + if (!prjNode || !prjNode->qbsProject().isValid()) + return false; + const qbs::GroupData grp = findMainQbsGroup(m_qbsProductData); + QTC_ASSERT(grp.isValid(), return false); + return prjNode->project()->renameFileInProduct(this, filePath, newFilePath, m_qbsProductData, + grp); +} + void QbsProductNode::setQbsProductData(const qbs::Project &project, const qbs::ProductData prd) { if (m_qbsProductData == prd) diff --git a/src/plugins/qbsprojectmanager/qbsnodes.h b/src/plugins/qbsprojectmanager/qbsnodes.h index 44a1fb03211..0c87d040f89 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.h +++ b/src/plugins/qbsprojectmanager/qbsnodes.h @@ -105,6 +105,7 @@ public: QList supportedActions(Node *node) const; bool addFiles(const QStringList &filePaths, QStringList *notAdded = 0); bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = 0); + bool renameFile(const QString &filePath, const QString &newFilePath); void updateQbsGroupData(const qbs::GroupData &grp, const QString &productPath, bool productWasEnabled, bool productIsEnabled); @@ -140,6 +141,7 @@ public: QList supportedActions(Node *node) const; bool addFiles(const QStringList &filePaths, QStringList *notAdded = 0); bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = 0); + bool renameFile(const QString &filePath, const QString &newFilePath); void setQbsProductData(const qbs::Project &project, const qbs::ProductData prd); const qbs::ProductData qbsProductData() const { return m_qbsProductData; } diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 683a3f933d0..4399fa29c4b 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -307,6 +307,37 @@ bool QbsProject::removeFilesFromProduct(QbsBaseProjectNode *node, const QStringL return notRemoved->isEmpty(); } +bool QbsProject::renameFileInProduct(QbsBaseProjectNode *node, const QString &oldPath, + const QString &newPath, const qbs::ProductData &productData, + const qbs::GroupData &groupData) +{ + if (newPath.isEmpty()) + return false; + QStringList dummy; + if (!removeFilesFromProduct(node, QStringList() << oldPath, productData, groupData, &dummy)) + return false; + qbs::ProductData newProductData; + foreach (const qbs::ProductData &p, m_projectData.allProducts()) { + if (uniqueProductName(p) == uniqueProductName(productData)) { + newProductData = p; + break; + } + } + if (!newProductData.isValid()) + return false; + qbs::GroupData newGroupData; + foreach (const qbs::GroupData &g, newProductData.groups()) { + if (g.name() == groupData.name()) { + newGroupData = g; + break; + } + } + if (!newGroupData.isValid()) + return false; + + return addFilesToProduct(node, QStringList() << newPath, newProductData, newGroupData, &dummy); +} + void QbsProject::invalidate() { prepareForParsing(); diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index 7ac81c7c42b..902f80c9417 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -78,6 +78,9 @@ public: bool removeFilesFromProduct(QbsBaseProjectNode *node, const QStringList &filePaths, const qbs::ProductData &productData, const qbs::GroupData &groupData, QStringList *notRemoved); + bool renameFileInProduct(QbsBaseProjectNode *node, const QString &oldPath, + const QString &newPath, const qbs::ProductData &productData, + const qbs::GroupData &groupData); qbs::BuildJob *build(const qbs::BuildOptions &opts, QStringList products = QStringList()); qbs::CleanJob *clean(const qbs::CleanOptions &opts);