diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index 7a0a2c41cb181c0d0a4d6626767bddc8d66bd40f..24c876167080b4e902cf8d5139bd2f8aa6c27276 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -168,19 +168,16 @@ static QStringList readLines(const QString &absoluteFileName) return lines; } -bool GenericProject::addFiles(const QStringList &filePaths) +bool GenericProject::setFiles(const QStringList &filePaths) { // Make sure we can open the file for writing QFile file(filesFileName()); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return false; - QStringList newFileList = m_files; - newFileList.append(filePaths); - QTextStream stream(&file); QDir baseDir(QFileInfo(m_fileName).dir()); - foreach (const QString &filePath, newFileList) + foreach (const QString &filePath, filePaths) stream << baseDir.relativeFilePath(filePath) << QLatin1Char('\n'); file.close(); @@ -188,6 +185,24 @@ bool GenericProject::addFiles(const QStringList &filePaths) return true; } +bool GenericProject::addFiles(const QStringList &filePaths) +{ + QStringList newFileList = m_files; + newFileList.append(filePaths); + + return setFiles(newFileList); +} + +bool GenericProject::removeFiles(const QStringList &filePaths) +{ + // Removing using set allows O(n.log(n)) behavior + QSet<QString> newFileSet = m_files.toSet(); + newFileSet.subtract(filePaths.toSet()); + QStringList newFileList = newFileSet.toList(); + + return setFiles(newFileList); +} + void GenericProject::parseProject(RefreshOptions options) { if (options & Files) diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h index a22f2abda0ad1419a73f9e6c3a2d96d4f6c2fc36..cf9565644ac9d61bd7ccb177d0765067c8c62f6b 100644 --- a/src/plugins/genericprojectmanager/genericproject.h +++ b/src/plugins/genericprojectmanager/genericproject.h @@ -94,7 +94,9 @@ public: QString buildParser(const QString &buildConfiguration) const; ProjectExplorer::ToolChain *toolChain() const; + bool setFiles(const QStringList &filePaths); bool addFiles(const QStringList &filePaths); + bool removeFiles(const QStringList &filePaths); enum RefreshOptions { Files = 0x01, diff --git a/src/plugins/genericprojectmanager/genericprojectnodes.cpp b/src/plugins/genericprojectmanager/genericprojectnodes.cpp index 26e1eb812564f7ed0467da18dd18d05ad686ead4..e8668a0d7c1d362fc93c127799c72de6d37609e0 100644 --- a/src/plugins/genericprojectmanager/genericprojectnodes.cpp +++ b/src/plugins/genericprojectmanager/genericprojectnodes.cpp @@ -167,7 +167,8 @@ bool GenericProjectNode::hasTargets() const QList<ProjectExplorer::ProjectNode::ProjectAction> GenericProjectNode::supportedActions() const { return QList<ProjectAction>() - << AddFile; + << AddFile + << RemoveFile; } bool GenericProjectNode::addSubProjects(const QStringList &proFilePaths) @@ -195,9 +196,9 @@ bool GenericProjectNode::removeFiles(const ProjectExplorer::FileType fileType, const QStringList &filePaths, QStringList *notRemoved) { Q_UNUSED(fileType); - Q_UNUSED(filePaths); Q_UNUSED(notRemoved); - return false; + + return m_project->removeFiles(filePaths); } bool GenericProjectNode::renameFile(const ProjectExplorer::FileType fileType,