CMake: Get rid of <Source Directory> in server-mode

Change-Id: Ifa4f813d577ab64351d25eb4be1dc7981687da23
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Tobias Hunger
2017-08-02 15:10:42 +02:00
parent ded65d888b
commit 68768d8e61
5 changed files with 56 additions and 38 deletions

View File

@@ -37,18 +37,16 @@ using namespace CMakeProjectManager;
using namespace CMakeProjectManager::Internal; using namespace CMakeProjectManager::Internal;
CMakeInputsNode::CMakeInputsNode(const Utils::FileName &cmakeLists) : CMakeInputsNode::CMakeInputsNode(const Utils::FileName &cmakeLists) :
ProjectExplorer::ProjectNode(CMakeInputsNode::inputsPathFromCMakeListsPath(cmakeLists)) ProjectExplorer::ProjectNode(cmakeLists, generateId(cmakeLists))
{ {
setPriority(Node::DefaultPriority - 10); // Bottom most! setPriority(Node::DefaultPriority - 10); // Bottom most!
setDisplayName(QCoreApplication::translate("CMakeFilesProjectNode", "CMake Modules")); setDisplayName(QCoreApplication::translate("CMakeFilesProjectNode", "CMake Modules"));
setIcon(QIcon(":/projectexplorer/images/session.png")); // TODO: Use a better icon! setIcon(QIcon(":/projectexplorer/images/session.png")); // TODO: Use a better icon!
} }
Utils::FileName CMakeInputsNode::inputsPathFromCMakeListsPath(const Utils::FileName &cmakeLists) QByteArray CMakeInputsNode::generateId(const Utils::FileName &inputFile)
{ {
Utils::FileName result = cmakeLists; return inputFile.toString().toUtf8() + "/cmakeInputs";
result.appendPath("cmakeInputs"); // cmakeLists is a file, so this can not exist on disk
return result;
} }
bool CMakeInputsNode::showInSimpleTree() const bool CMakeInputsNode::showInSimpleTree() const
@@ -91,13 +89,18 @@ QString CMakeProjectNode::tooltip() const
return QString(); return QString();
} }
CMakeTargetNode::CMakeTargetNode(const Utils::FileName &directory) : CMakeTargetNode::CMakeTargetNode(const Utils::FileName &directory, const QString &target) :
ProjectExplorer::ProjectNode(directory) ProjectExplorer::ProjectNode(directory, generateId(directory, target))
{ {
setPriority(Node::DefaultProjectPriority + 900); setPriority(Node::DefaultProjectPriority + 900);
setIcon(QIcon(":/projectexplorer/images/build.png")); // TODO: Use proper icon! setIcon(QIcon(":/projectexplorer/images/build.png")); // TODO: Use proper icon!
} }
QByteArray CMakeTargetNode::generateId(const Utils::FileName &directory, const QString &target)
{
return directory.toString().toUtf8() + "///::///" + target.toUtf8();
}
bool CMakeTargetNode::showInSimpleTree() const bool CMakeTargetNode::showInSimpleTree() const
{ {
return true; return true;

View File

@@ -35,7 +35,7 @@ class CMakeInputsNode : public ProjectExplorer::ProjectNode
public: public:
CMakeInputsNode(const Utils::FileName &cmakeLists); CMakeInputsNode(const Utils::FileName &cmakeLists);
static Utils::FileName inputsPathFromCMakeListsPath(const Utils::FileName &cmakeLists); static QByteArray generateId(const Utils::FileName &inputFile);
bool showInSimpleTree() const final; bool showInSimpleTree() const final;
}; };
@@ -60,7 +60,9 @@ public:
class CMakeTargetNode : public ProjectExplorer::ProjectNode class CMakeTargetNode : public ProjectExplorer::ProjectNode
{ {
public: public:
CMakeTargetNode(const Utils::FileName &directory); CMakeTargetNode(const Utils::FileName &directory, const QString &target);
static QByteArray generateId(const Utils::FileName &directory, const QString &target);
void setTargetInformation(const QList<Utils::FileName> &artifacts, const QString &type); void setTargetInformation(const QList<Utils::FileName> &artifacts, const QString &type);

View File

@@ -247,9 +247,12 @@ static void addCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, i
{ {
if (files.isEmpty()) if (files.isEmpty())
return; return;
auto folder = new VirtualFolderNode(basePath, priority); FolderNode *folder = base;
folder->setDisplayName(displayName); if (!displayName.isEmpty()) {
base->addNode(folder); folder = new VirtualFolderNode(basePath, priority);
folder->setDisplayName(displayName);
base->addNode(folder);
}
folder->addNestedNodes(files); folder->addNestedNodes(files);
for (FolderNode *fn : folder->folderNodes()) for (FolderNode *fn : folder->folderNodes())
fn->compress(); fn->compress();
@@ -265,9 +268,7 @@ static void addCMakeInputs(FolderNode *root,
ProjectNode *cmakeVFolder = new CMakeInputsNode(root->filePath()); ProjectNode *cmakeVFolder = new CMakeInputsNode(root->filePath());
root->addNode(cmakeVFolder); root->addNode(cmakeVFolder);
addCMakeVFolder(cmakeVFolder, sourceDir, 1000, addCMakeVFolder(cmakeVFolder, sourceDir, 1000, QString(), sourceInputs);
QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", "<Source Directory>"),
sourceInputs);
addCMakeVFolder(cmakeVFolder, buildDir, 100, addCMakeVFolder(cmakeVFolder, buildDir, 100,
QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", "<Build Directory>"), QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", "<Build Directory>"),
buildInputs); buildInputs);
@@ -686,12 +687,13 @@ static CMakeTargetNode *createTargetNode(const QHash<Utils::FileName, ProjectNod
ProjectNode *cmln = cmakeListsNodes.value(dir); ProjectNode *cmln = cmakeListsNodes.value(dir);
QTC_ASSERT(cmln, return nullptr); QTC_ASSERT(cmln, return nullptr);
Utils::FileName targetName = dir; QByteArray targetId = CMakeTargetNode::generateId(dir, displayName);
targetName.appendPath(".target::" + displayName);
CMakeTargetNode *tn = static_cast<CMakeTargetNode *>(cmln->projectNode(targetName)); CMakeTargetNode *tn = static_cast<CMakeTargetNode *>(cmln->findNode([&targetId](const Node *n) {
return n->id() == targetId;
}));
if (!tn) { if (!tn) {
tn = new CMakeTargetNode(targetName); tn = new CMakeTargetNode(dir, displayName);
cmln->addNode(tn); cmln->addNode(tn);
} }
tn->setDisplayName(displayName); tn->setDisplayName(displayName);
@@ -748,7 +750,7 @@ void ServerModeReader::addFileGroups(ProjectNode *targetRoot,
otherFileNodes.append(fn); otherFileNodes.append(fn);
} }
addCMakeVFolder(targetRoot, sourceDirectory, 1000, tr("<Source Directory>"), sourceFileNodes); addCMakeVFolder(targetRoot, sourceDirectory, 1000, QString(), sourceFileNodes);
addCMakeVFolder(targetRoot, buildDirectory, 100, tr("<Build Directory>"), buildFileNodes); addCMakeVFolder(targetRoot, buildDirectory, 100, tr("<Build Directory>"), buildFileNodes);
addCMakeVFolder(targetRoot, Utils::FileName(), 10, tr("<Other Locations>"), otherFileNodes); addCMakeVFolder(targetRoot, Utils::FileName(), 10, tr("<Other Locations>"), otherFileNodes);
} }

View File

@@ -119,8 +119,8 @@ static FolderNode *recursiveFindOrCreateFolderNode(FolderNode *folder,
\sa ProjectExplorer::NodesWatcher \sa ProjectExplorer::NodesWatcher
*/ */
Node::Node(NodeType nodeType, const Utils::FileName &filePath, int line) : Node::Node(NodeType nodeType, const Utils::FileName &filePath, int line, const QByteArray &id) :
m_filePath(filePath), m_line(line), m_nodeType(nodeType) m_filePath(filePath), m_nodeId(id), m_line(line), m_nodeType(nodeType)
{ } { }
void Node::setPriority(int p) void Node::setPriority(int p)
@@ -222,6 +222,11 @@ int Node::line() const
return m_line; return m_line;
} }
QByteArray Node::id() const
{
return m_nodeId;
}
QString Node::displayName() const QString Node::displayName() const
{ {
return filePath().fileName(); return filePath().fileName();
@@ -309,9 +314,9 @@ FileType Node::fileTypeForFileName(const Utils::FileName &file)
\sa ProjectExplorer::FolderNode, ProjectExplorer::ProjectNode \sa ProjectExplorer::FolderNode, ProjectExplorer::ProjectNode
*/ */
FileNode::FileNode(const Utils::FileName &filePath, FileNode::FileNode(const Utils::FileName &filePath, const FileType fileType, bool generated,
const FileType fileType, int line, const QByteArray &id) :
bool generated, int line) : Node(NodeType::File, filePath, line), Node(NodeType::File, filePath, line, id),
m_fileType(fileType) m_fileType(fileType)
{ {
setListInProject(true); setListInProject(true);
@@ -324,7 +329,7 @@ FileNode::FileNode(const Utils::FileName &filePath,
FileNode *FileNode::clone() const FileNode *FileNode::clone() const
{ {
auto fn = new FileNode(filePath(), fileType(), isGenerated(), line()); auto fn = new FileNode(filePath(), fileType(), isGenerated(), line(), id());
fn->setEnabled(isEnabled()); fn->setEnabled(isEnabled());
fn->setPriority(priority()); fn->setPriority(priority());
fn->setListInProject(listInProject()); fn->setListInProject(listInProject());
@@ -418,8 +423,9 @@ bool FileNode::supportsAction(ProjectAction action, Node *node) const
\sa ProjectExplorer::FileNode, ProjectExplorer::ProjectNode \sa ProjectExplorer::FileNode, ProjectExplorer::ProjectNode
*/ */
FolderNode::FolderNode(const Utils::FileName &folderPath, NodeType nodeType, const QString &displayName) : FolderNode::FolderNode(const Utils::FileName &folderPath, NodeType nodeType,
Node(nodeType, folderPath, -1), const QString &displayName, const QByteArray &id) :
Node(nodeType, folderPath, -1, id),
m_displayName(displayName) m_displayName(displayName)
{ {
setPriority(DefaultFolderPriority); setPriority(DefaultFolderPriority);
@@ -735,8 +741,9 @@ bool FolderNode::showInSimpleTree() const
\sa ProjectExplorer::FileNode, ProjectExplorer::ProjectNode \sa ProjectExplorer::FileNode, ProjectExplorer::ProjectNode
*/ */
VirtualFolderNode::VirtualFolderNode(const Utils::FileName &folderPath, int priority) : VirtualFolderNode::VirtualFolderNode(const Utils::FileName &folderPath, int priority,
FolderNode(folderPath, NodeType::VirtualFolder, QString()) const QByteArray &id) :
FolderNode(folderPath, NodeType::VirtualFolder, QString(), id)
{ {
setPriority(priority); setPriority(priority);
} }
@@ -761,12 +768,11 @@ QString VirtualFolderNode::addFileFilter() const
/*! /*!
Creates an uninitialized project node object. Creates an uninitialized project node object.
*/ */
ProjectNode::ProjectNode(const Utils::FileName &projectFilePath) : ProjectNode::ProjectNode(const Utils::FileName &projectFilePath, const QByteArray &id) :
FolderNode(projectFilePath, NodeType::Project) FolderNode(projectFilePath, NodeType::Project, projectFilePath.fileName(), id)
{ {
setPriority(DefaultProjectPriority); setPriority(DefaultProjectPriority);
setListInProject(true); setListInProject(true);
setDisplayName(projectFilePath.fileName());
} }
bool ProjectNode::canAddSubProject(const QString &proFilePath) const bool ProjectNode::canAddSubProject(const QString &proFilePath) const

View File

@@ -127,6 +127,7 @@ public:
const Utils::FileName &filePath() const; // file system path const Utils::FileName &filePath() const; // file system path
int line() const; int line() const;
QByteArray id() const;
virtual QString displayName() const; virtual QString displayName() const;
virtual QString tooltip() const; virtual QString tooltip() const;
bool isEnabled() const; bool isEnabled() const;
@@ -156,7 +157,8 @@ public:
static FileType fileTypeForFileName(const Utils::FileName &file); static FileType fileTypeForFileName(const Utils::FileName &file);
protected: protected:
Node(NodeType nodeType, const Utils::FileName &filePath, int line = -1); Node(NodeType nodeType, const Utils::FileName &filePath, int line = -1,
const QByteArray &id = {});
void setPriority(int priority); void setPriority(int priority);
void setIsGenerated(bool g); void setIsGenerated(bool g);
@@ -164,6 +166,7 @@ protected:
private: private:
FolderNode *m_parentFolderNode = nullptr; FolderNode *m_parentFolderNode = nullptr;
Utils::FileName m_filePath; Utils::FileName m_filePath;
QByteArray m_nodeId;
int m_line = -1; int m_line = -1;
int m_priority = DefaultPriority; int m_priority = DefaultPriority;
const NodeType m_nodeType; const NodeType m_nodeType;
@@ -180,7 +183,8 @@ private:
class PROJECTEXPLORER_EXPORT FileNode : public Node class PROJECTEXPLORER_EXPORT FileNode : public Node
{ {
public: public:
FileNode(const Utils::FileName &filePath, const FileType fileType, bool generated, int line = -1); FileNode(const Utils::FileName &filePath, const FileType fileType, bool generated, int line = -1,
const QByteArray &id = {});
FileNode *clone() const; FileNode *clone() const;
@@ -210,7 +214,7 @@ class PROJECTEXPLORER_EXPORT FolderNode : public Node
{ {
public: public:
explicit FolderNode(const Utils::FileName &folderPath, NodeType nodeType = NodeType::Folder, explicit FolderNode(const Utils::FileName &folderPath, NodeType nodeType = NodeType::Folder,
const QString &displayName = QString()); const QString &displayName = QString(), const QByteArray &id = {});
~FolderNode() override; ~FolderNode() override;
QString displayName() const override; QString displayName() const override;
@@ -288,7 +292,8 @@ private:
class PROJECTEXPLORER_EXPORT VirtualFolderNode : public FolderNode class PROJECTEXPLORER_EXPORT VirtualFolderNode : public FolderNode
{ {
public: public:
explicit VirtualFolderNode(const Utils::FileName &folderPath, int priority); explicit VirtualFolderNode(const Utils::FileName &folderPath, int priority,
const QByteArray &id = {});
void setAddFileFilter(const QString &filter) { m_addFileFilter = filter; } void setAddFileFilter(const QString &filter) { m_addFileFilter = filter; }
QString addFileFilter() const override; QString addFileFilter() const override;
@@ -323,7 +328,7 @@ public:
const ProjectNode *asProjectNode() const final { return this; } const ProjectNode *asProjectNode() const final { return this; }
protected: protected:
explicit ProjectNode(const Utils::FileName &projectFilePath); explicit ProjectNode(const Utils::FileName &projectFilePath, const QByteArray &id = {});
}; };
class PROJECTEXPLORER_EXPORT ContainerNode : public FolderNode class PROJECTEXPLORER_EXPORT ContainerNode : public FolderNode