diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 5a09917339c..04869aab3b3 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -2381,59 +2381,6 @@ QList > ProjectExplorerPluginPrivate::recentProjects() c }); } -static QString pathOrDirectoryFor(const Node *node, bool dir) -{ - Utils::FilePath path = node->filePath(); - QString location; - const FolderNode *folder = node->asFolderNode(); - if (node->isVirtualFolderType() && folder) { - // Virtual Folder case - // If there are files directly below or no subfolders, take the folder path - if (!folder->fileNodes().isEmpty() || folder->folderNodes().isEmpty()) { - location = path.toString(); - } else { - // Otherwise we figure out a commonPath from the subfolders - QStringList list; - foreach (FolderNode *f, folder->folderNodes()) - list << f->filePath().toString() + QLatin1Char('/'); - location = Utils::commonPath(list); - } - - QFileInfo fi(location); - while ((!fi.exists() || !fi.isDir()) && !fi.isRoot()) - fi.setFile(fi.absolutePath()); - location = fi.absoluteFilePath(); - } else if (!path.isEmpty()) { - QFileInfo fi = path.toFileInfo(); - // remove any /suffixes, which e.g. ResourceNode uses - // Note this should be removed again by making node->path() a true path again - // That requires changes in both the VirtualFolderNode and ResourceNode - while (!fi.exists() && !fi.isRoot()) - fi.setFile(fi.absolutePath()); - - if (dir) - location = fi.isDir() ? fi.absoluteFilePath() : fi.absolutePath(); - else - location = fi.absoluteFilePath(); - } - return location; -} - -static QString pathFor(const Node *node) -{ - return pathOrDirectoryFor(node, false); -} - -static QString directoryFor(const Node *node) -{ - return pathOrDirectoryFor(node, true); -} - -QString ProjectExplorerPlugin::directoryFor(Node *node) -{ - return ProjectExplorer::directoryFor(node); -} - void ProjectExplorerPluginPrivate::updateActions() { const Project *const project = SessionManager::startupProject(); @@ -3402,7 +3349,7 @@ void ProjectExplorerPluginPrivate::addNewFile() { Node *currentNode = ProjectTree::currentNode(); QTC_ASSERT(currentNode, return); - QString location = directoryFor(currentNode); + QString location = currentNode->directory(); QVariantMap map; // store void pointer to avoid QVariant to use qobject_cast, which might core-dump when trying @@ -3428,7 +3375,7 @@ void ProjectExplorerPluginPrivate::addNewSubproject() { Node* currentNode = ProjectTree::currentNode(); QTC_ASSERT(currentNode, return); - QString location = directoryFor(currentNode); + QString location = currentNode->directory(); if (currentNode->isProjectNodeType() && currentNode->supportsAction(AddSubProject, currentNode)) { @@ -3463,7 +3410,7 @@ void ProjectExplorerPluginPrivate::addExistingProjects() if (!projectNode && currentNode->asContainerNode()) projectNode = currentNode->asContainerNode()->rootProjectNode(); QTC_ASSERT(projectNode, return); - const QString dir = directoryFor(currentNode); + const QString dir = currentNode->directory(); QStringList subProjectFilePaths = QFileDialog::getOpenFileNames( ICore::mainWindow(), tr("Choose Project File"), dir, projectNode->subProjectFileNamePatterns().join(";;")); @@ -3503,7 +3450,7 @@ void ProjectExplorerPluginPrivate::handleAddExistingFiles() QTC_ASSERT(folderNode, return); QStringList fileNames = QFileDialog::getOpenFileNames(ICore::mainWindow(), - tr("Add Existing Files"), directoryFor(node)); + tr("Add Existing Files"), node->directory()); if (fileNames.isEmpty()) return; @@ -3517,7 +3464,7 @@ void ProjectExplorerPluginPrivate::addExistingDirectory() QTC_ASSERT(folderNode, return); - SelectableFilesDialogAddDirectory dialog(Utils::FilePath::fromString(directoryFor(node)), + SelectableFilesDialogAddDirectory dialog(Utils::FilePath::fromString(node->directory()), Utils::FilePathList(), ICore::mainWindow()); dialog.setAddFileFilter({}); @@ -3531,7 +3478,7 @@ void ProjectExplorerPlugin::addExistingFiles(FolderNode *folderNode, const QStri if (!folderNode || !ProjectTree::hasNode(folderNode)) return; - const QString dir = directoryFor(folderNode); + const QString dir = folderNode->directory(); QStringList fileNames = filePaths; QStringList notAdded; folderNode->addFiles(fileNames, ¬Added); @@ -3575,14 +3522,14 @@ void ProjectExplorerPluginPrivate::searchOnFileSystem() { const Node *currentNode = ProjectTree::currentNode(); QTC_ASSERT(currentNode, return); - TextEditor::FindInFiles::findOnFileSystem(pathFor(currentNode)); + TextEditor::FindInFiles::findOnFileSystem(currentNode->path()); } void ProjectExplorerPluginPrivate::showInGraphicalShell() { Node *currentNode = ProjectTree::currentNode(); QTC_ASSERT(currentNode, return); - FileUtils::showInGraphicalShell(ICore::mainWindow(), pathFor(currentNode)); + FileUtils::showInGraphicalShell(ICore::mainWindow(), currentNode->path()); } void ProjectExplorerPluginPrivate::openTerminalHere(const EnvironmentGetter &env) @@ -3594,7 +3541,7 @@ void ProjectExplorerPluginPrivate::openTerminalHere(const EnvironmentGetter &env if (!environment) return; - FileUtils::openTerminal(directoryFor(currentNode), environment.value()); + FileUtils::openTerminal(currentNode->directory(), environment.value()); } void ProjectExplorerPluginPrivate::openTerminalHereWithRunEnv() @@ -3615,7 +3562,7 @@ void ProjectExplorerPluginPrivate::openTerminalHereWithRunEnv() device = DeviceKitAspect::device(target->kit()); QTC_ASSERT(device && device->canOpenTerminal(), return); const QString workingDir = device->type() == Constants::DESKTOP_DEVICE_TYPE - ? directoryFor(currentNode) : runnable.workingDirectory; + ? currentNode->directory() : runnable.workingDirectory; device->openTerminal(runnable.environment, workingDir); } diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index 24534627a71..342f25a9526 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -159,7 +159,6 @@ public: static QString displayNameForStepId(Core::Id stepId); - static QString directoryFor(Node *node); static QStringList projectFileGlobs(); static QThreadPool *sharedThreadPool(); diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index ff5ea876a8d..1e5a35a23ef 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -312,6 +313,43 @@ FileType Node::fileTypeForFileName(const Utils::FilePath &file) Utils::MimeMatchMode::MatchExtension)); } +QString Node::pathOrDirectory(bool dir) const +{ + QString location; + const FolderNode *folder = asFolderNode(); + if (isVirtualFolderType() && folder) { + // Virtual Folder case + // If there are files directly below or no subfolders, take the folder path + if (!folder->fileNodes().isEmpty() || folder->folderNodes().isEmpty()) { + location = m_filePath.toString(); + } else { + // Otherwise we figure out a commonPath from the subfolders + QStringList list; + foreach (FolderNode *f, folder->folderNodes()) + list << f->filePath().toString() + QLatin1Char('/'); + location = Utils::commonPath(list); + } + + QFileInfo fi(location); + while ((!fi.exists() || !fi.isDir()) && !fi.isRoot()) + fi.setFile(fi.absolutePath()); + location = fi.absoluteFilePath(); + } else if (!m_filePath.isEmpty()) { + QFileInfo fi = m_filePath.toFileInfo(); + // remove any /suffixes, which e.g. ResourceNode uses + // Note this could be removed again by making path() a true path again + // That requires changes in both the VirtualFolderNode and ResourceNode + while (!fi.exists() && !fi.isRoot()) + fi.setFile(fi.absolutePath()); + + if (dir) + location = fi.isDir() ? fi.absoluteFilePath() : fi.absolutePath(); + else + location = fi.absoluteFilePath(); + } + return location; +} + /*! \class ProjectExplorer::FileNode diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index a11f8f1710e..97319de6c4a 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -159,6 +159,9 @@ public: static FileType fileTypeForMimeType(const Utils::MimeType &mt); static FileType fileTypeForFileName(const Utils::FilePath &file); + QString path() const { return pathOrDirectory(false); } + QString directory() const { return pathOrDirectory(true); } + protected: Node(); Node(const Node &other) = delete; @@ -167,6 +170,8 @@ protected: void setFilePath(const Utils::FilePath &filePath); private: + QString pathOrDirectory(bool dir) const; + FolderNode *m_parentFolderNode = nullptr; Utils::FilePath m_filePath; int m_line = -1; diff --git a/src/plugins/projectexplorer/projectwizardpage.cpp b/src/plugins/projectexplorer/projectwizardpage.cpp index 9eaf136d8bb..692c40d78d8 100644 --- a/src/plugins/projectexplorer/projectwizardpage.cpp +++ b/src/plugins/projectexplorer/projectwizardpage.cpp @@ -27,7 +27,6 @@ #include "ui_projectwizardpage.h" #include "project.h" -#include "projectexplorer.h" #include "session.h" #include @@ -95,7 +94,7 @@ AddNewTree::AddNewTree(FolderNode *node, QList children, const QSt m_canAdd(false) { if (node) - m_toolTip = ProjectExplorerPlugin::directoryFor(node); + m_toolTip = node->directory(); foreach (AddNewTree *child, children) appendChild(child); } @@ -107,7 +106,7 @@ AddNewTree::AddNewTree(FolderNode *node, QList children, m_priority(info.priority) { if (node) - m_toolTip = ProjectExplorerPlugin::directoryFor(node); + m_toolTip = node->directory(); foreach (AddNewTree *child, children) appendChild(child); } @@ -180,7 +179,7 @@ void BestNodeSelector::inspect(AddNewTree *tree, bool isContextNode) if (m_deploys) return; - const QString projectDirectory = ProjectExplorerPlugin::directoryFor(node); + const QString projectDirectory = node->directory(); const int projectDirectorySize = projectDirectory.size(); if (m_commonDirectory != projectDirectory && !m_commonDirectory.startsWith(projectDirectory + QLatin1Char('/'))