diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 2bc84d6cbbf525eae55ec4fd7422b1bf6c3c82f8..bd0074b25b070b6a98adbffed5d41d4726a8c289 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -163,6 +163,7 @@ struct ProjectExplorerPluginPrivate { QAction *m_addNewFileAction; QAction *m_addExistingFilesAction; QAction *m_removeFileAction; + QAction *m_removeProjectAction; QAction *m_deleteFileAction; QAction *m_renameFileAction; QAction *m_openFileAction; @@ -725,6 +726,12 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er globalcontext); mfilec->addAction(cmd, Constants::G_FILE_OTHER); + // remove project action + d->m_removeProjectAction = new QAction(tr("Remove Project"), this); + cmd = am->registerAction(d->m_removeProjectAction, ProjectExplorer::Constants::REMOVEPROJECT, + globalcontext); + msubProject->addAction(cmd, Constants::G_PROJECT_FILES); + // delete file action d->m_deleteFileAction = new QAction(tr("Delete File..."), this); cmd = am->registerAction(d->m_deleteFileAction, ProjectExplorer::Constants::DELETEFILE, @@ -826,6 +833,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er connect(d->m_clearSession, SIGNAL(triggered()), this, SLOT(clearSession())); connect(d->m_addNewFileAction, SIGNAL(triggered()), this, SLOT(addNewFile())); connect(d->m_addExistingFilesAction, SIGNAL(triggered()), this, SLOT(addExistingFiles())); + connect(d->m_removeProjectAction, SIGNAL(triggered()), this, SLOT(removeProject())); connect(d->m_openFileAction, SIGNAL(triggered()), this, SLOT(openFile())); connect(d->m_showInGraphicalShell, SIGNAL(triggered()), this, SLOT(showInGraphicalShell())); connect(d->m_openTerminalHere, SIGNAL(triggered()), this, SLOT(openTerminalHere())); @@ -2088,6 +2096,19 @@ void ProjectExplorerPlugin::addExistingFiles() } } +void ProjectExplorerPlugin::removeProject() +{ + ProjectNode *subProjectNode = qobject_cast<ProjectNode*>(d->m_currentNode->projectNode()); + ProjectNode *projectNode = qobject_cast<ProjectNode *>(subProjectNode->parentFolderNode()); + if (projectNode) { + Core::ICore *core = Core::ICore::instance(); + RemoveFileDialog removeFileDialog(subProjectNode->path(), core->mainWindow()); + removeFileDialog.setDeleteFileVisible(false); + if (removeFileDialog.exec() == QDialog::Accepted) + projectNode->removeSubProjects(QStringList() << subProjectNode->path()); + } +} + void ProjectExplorerPlugin::openFile() { QTC_ASSERT(d->m_currentNode, return) diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index 1770f274401bdeef52a4b75fa9aeed3f2728fc69..f9c0ebf014eb0e5ef91e91ef4bcdcf1ed8834aad 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -170,6 +170,7 @@ private slots: void addNewFile(); void addExistingFiles(); + void removeProject(); void openFile(); void showInGraphicalShell(); void removeFile(); diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h index 0f76253ce71186db0940c5a83627091bbdc969e1..69eb3e55af068c45040c4a268f43bc9bc80bf787 100644 --- a/src/plugins/projectexplorer/projectexplorerconstants.h +++ b/src/plugins/projectexplorer/projectexplorerconstants.h @@ -74,6 +74,7 @@ const char * const FINDINALLPROJECTS = "ProjectExplorer.FindInAllProjects"; const char * const SHOWPROPERTIES = "ProjectExplorer.ShowProperties"; const char * const ADDNEWFILE = "ProjectExplorer.AddNewFile"; const char * const ADDEXISTINGFILES = "ProjectExplorer.AddExistingFiles"; +const char * const REMOVEPROJECT = "ProjectExplorer.RemoveProject"; const char * const OPENFILE = "ProjectExplorer.OpenFile"; const char * const SHOWINGRAPHICALSHELL = "ProjectExplorer.ShowInGraphicalShell"; const char * const OPENTERMIANLHERE = "ProjectExplorer.OpenTerminalHere"; diff --git a/src/plugins/projectexplorer/removefiledialog.cpp b/src/plugins/projectexplorer/removefiledialog.cpp index de911ba0a1fbbfce7bdead4268803e49fc999ac2..b5acf09e46cae162817a79c54ce91ac4411e69d1 100644 --- a/src/plugins/projectexplorer/removefiledialog.cpp +++ b/src/plugins/projectexplorer/removefiledialog.cpp @@ -50,6 +50,11 @@ RemoveFileDialog::~RemoveFileDialog() delete m_ui; } +void RemoveFileDialog::setDeleteFileVisible(bool visible) +{ + m_ui->deleteFileCheckBox->setVisible(visible); +} + bool RemoveFileDialog::isDeleteFileChecked() const { return m_ui->deleteFileCheckBox->isChecked(); diff --git a/src/plugins/projectexplorer/removefiledialog.h b/src/plugins/projectexplorer/removefiledialog.h index a9b2b0484b2bddfd6f70bbe0e9c2eaa21601168d..6a3a12d34de39b528b9a773338c70e0fe5f46101 100644 --- a/src/plugins/projectexplorer/removefiledialog.h +++ b/src/plugins/projectexplorer/removefiledialog.h @@ -47,6 +47,7 @@ public: explicit RemoveFileDialog(const QString &filePath, QWidget *parent = 0); virtual ~RemoveFileDialog(); + void setDeleteFileVisible(bool visible); bool isDeleteFileChecked() const; protected: diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index f266a395b7f7b4441c494b98631f245b3f49ce21..d6d2f769650981c9168deea5eb50ec7798a64b30 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -780,6 +780,18 @@ bool Qt4PriFileNode::canAddSubProject(const QString &proFilePath) const return false; } +static QString simplifyProFilePath(const QString &proFilePath) +{ + // if proFilePath is like: _path_/projectName/projectName.pro + // we simplify it to: _path_/projectName + QFileInfo fi(proFilePath); + const QString parentPath = fi.absolutePath(); + QFileInfo parentFi(parentPath); + if (parentFi.fileName() == fi.completeBaseName()) + return parentPath; + return proFilePath; +} + bool Qt4PriFileNode::addSubProjects(const QStringList &proFilePaths) { ProjectExplorer::FindAllFilesVisitor visitor; @@ -787,18 +799,9 @@ bool Qt4PriFileNode::addSubProjects(const QStringList &proFilePaths) const QStringList &allFiles = visitor.filePaths(); QStringList uniqueProFilePaths; - foreach (const QString &proFile, proFilePaths) { - if (!allFiles.contains(proFile)) { - // if proFilePath is like: _path_/projectName/projectName.pro - // we simplify it to: _path_/projectName - QString proFilePath = proFile; - QFileInfo fi(proFile); - QFileInfo parentFi(fi.absolutePath()); - if (parentFi.fileName() == fi.baseName()) - proFilePath = parentFi.absoluteFilePath(); - uniqueProFilePaths.append(proFilePath); - } - } + foreach (const QString &proFile, proFilePaths) + if (!allFiles.contains(proFile)) + uniqueProFilePaths.append(simplifyProFilePath(proFile)); QStringList failedFiles; changeFiles(ProjectExplorer::ProjectFileType, uniqueProFilePaths, &failedFiles, AddToProFile); @@ -808,8 +811,17 @@ bool Qt4PriFileNode::addSubProjects(const QStringList &proFilePaths) bool Qt4PriFileNode::removeSubProjects(const QStringList &proFilePaths) { - Q_UNUSED(proFilePaths) - return false; //changeIncludes(m_includeFile, proFilePaths, RemoveFromProFile); + QStringList failedOriginalFiles; + changeFiles(ProjectExplorer::ProjectFileType, proFilePaths, &failedOriginalFiles, RemoveFromProFile); + + QStringList simplifiedProFiles; + foreach (const QString &proFile, failedOriginalFiles) + simplifiedProFiles.append(simplifyProFilePath(proFile)); + + QStringList failedSimplifiedFiles; + changeFiles(ProjectExplorer::ProjectFileType, simplifiedProFiles, &failedSimplifiedFiles, RemoveFromProFile); + + return failedSimplifiedFiles.isEmpty(); } bool Qt4PriFileNode::addFiles(const FileType fileType, const QStringList &filePaths,