ProjectExplorer: Create initial project tree

Create an initial project tree with a ProjectNode and a FileNode for
the project file itself.

Fix the Projects to not implement their own tree before they have
better data.

Change-Id: I147ccd5603d22d1d60880a97f30fd8c271eac88c
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Tobias Hunger
2017-03-03 17:10:00 +01:00
parent 2fde3fffa9
commit 49fef0ae24
15 changed files with 35 additions and 47 deletions
@@ -74,31 +74,26 @@ AutotoolsProject::AutotoolsProject(const Utils::FileName &fileName) :
{
setId(Constants::AUTOTOOLS_PROJECT_ID);
setDocument(new AutotoolsProjectFile(fileName));
setRootProjectNode(new AutotoolsProjectNode(projectDirectory()));
setProjectContext(Core::Context(Constants::PROJECT_CONTEXT));
setProjectLanguages(Core::Context(ProjectExplorer::Constants::CXX_LANGUAGE_ID));
const QFileInfo fileInfo = projectFilePath().toFileInfo();
m_projectName = fileInfo.absoluteDir().dirName();
rootProjectNode()->setDisplayName(m_projectName);
}
AutotoolsProject::~AutotoolsProject()
{
delete m_cppCodeModelUpdater;
setRootProjectNode(0);
setRootProjectNode(nullptr);
if (m_makefileParserThread != 0) {
if (m_makefileParserThread) {
m_makefileParserThread->wait();
delete m_makefileParserThread;
m_makefileParserThread = 0;
m_makefileParserThread = nullptr;
}
}
QString AutotoolsProject::displayName() const
{
return m_projectName;
return projectFilePath().toFileInfo().absoluteDir().dirName();
}
QString AutotoolsProject::defaultBuildDirectory(const QString &projectPath)
@@ -97,8 +97,6 @@ private:
*/
void updateCppCodeModel();
QString m_projectName;
/// Return value for AutotoolsProject::files()
QStringList m_files;
@@ -80,14 +80,10 @@ CMakeProject::CMakeProject(const FileName &fileName)
setDocument(new TextEditor::TextDocument);
document()->setFilePath(fileName);
setRootProjectNode(new CMakeListsNode(fileName));
setProjectContext(Core::Context(CMakeProjectManager::Constants::PROJECTCONTEXT));
setProjectLanguages(Core::Context(ProjectExplorer::Constants::CXX_LANGUAGE_ID));
rootProjectNode()->setDisplayName(fileName.parentDir().fileName());
connect(this, &CMakeProject::activeTargetChanged, this, &CMakeProject::handleActiveTargetChanged);
connect(&m_treeScanner, &TreeScanner::finished, this, &CMakeProject::handleTreeScanningFinished);
m_treeScanner.setFilter([this](const Utils::MimeType &mimeType, const Utils::FileName &fn) {
@@ -306,6 +302,8 @@ bool CMakeProject::hasBuildTarget(const QString &title) const
QString CMakeProject::displayName() const
{
if (!rootProjectNode())
return projectDirectory().fileName();
return rootProjectNode()->displayName();
}
@@ -70,17 +70,17 @@ GenericProject::GenericProject(const Utils::FileName &fileName)
{
setId(Constants::GENERICPROJECT_ID);
setDocument(new GenericProjectFile(this, fileName, GenericProject::Everything));
setRootProjectNode(new GenericProjectNode(this));
setProjectContext(Context(GenericProjectManager::Constants::PROJECTCONTEXT));
setProjectLanguages(Context(ProjectExplorer::Constants::CXX_LANGUAGE_ID));
const QFileInfo fileInfo = projectFilePath().toFileInfo();
const QDir dir = fileInfo.dir();
m_projectName = fileInfo.completeBaseName();
m_filesFileName = QFileInfo(dir, m_projectName + ".files").absoluteFilePath();
m_includesFileName = QFileInfo(dir, m_projectName + ".includes").absoluteFilePath();
m_configFileName = QFileInfo(dir, m_projectName + ".config").absoluteFilePath();
const QString projectName = fileInfo.completeBaseName();
m_filesFileName = QFileInfo(dir, projectName + ".files").absoluteFilePath();
m_includesFileName = QFileInfo(dir, projectName + ".includes").absoluteFilePath();
m_configFileName = QFileInfo(dir, projectName + ".config").absoluteFilePath();
m_filesIDocument = new GenericProjectFile(this, FileName::fromString(m_filesFileName), GenericProject::Files);
m_includesIDocument = new GenericProjectFile(this, FileName::fromString(m_includesFileName), GenericProject::Configuration);
@@ -407,7 +407,7 @@ QStringList GenericProject::files() const
QString GenericProject::displayName() const
{
return m_projectName;
return projectFilePath().toFileInfo().completeBaseName();
}
QStringList GenericProject::files(FilesMode fileMode) const
@@ -94,7 +94,6 @@ private:
QString m_filesFileName;
QString m_includesFileName;
QString m_configFileName;
QString m_projectName;
GenericProjectFile *m_filesIDocument;
GenericProjectFile *m_includesIDocument;
GenericProjectFile *m_configIDocument;
+4 -7
View File
@@ -56,12 +56,9 @@ const int MIN_TIME_BETWEEN_PROJECT_SCANS = 4500;
NimProject::NimProject(const FileName &fileName)
{
setId(Constants::C_NIMPROJECT_ID);
setDocument(new TextEditor::TextDocument);
document()->setFilePath(fileName);
QFileInfo fi = fileName.toFileInfo();
QDir dir = fi.dir();
setRootProjectNode(new NimProjectNode(*this, FileName::fromString(dir.absolutePath())));
rootProjectNode()->setDisplayName(dir.dirName());
auto doc = new TextEditor::TextDocument;
doc->setFilePath(fileName);
setDocument(doc);
m_projectScanTimer.setSingleShot(true);
connect(&m_projectScanTimer, &QTimer::timeout, this, &NimProject::collectProjectFiles);
@@ -73,7 +70,7 @@ NimProject::NimProject(const FileName &fileName)
QString NimProject::displayName() const
{
return rootProjectNode()->displayName();
return projectFilePath().toFileInfo().completeBaseName();
}
QStringList NimProject::files(FilesMode) const
+7
View File
@@ -416,6 +416,13 @@ void Project::setDocument(Core::IDocument *doc)
QTC_ASSERT(doc, return);
QTC_ASSERT(!d->m_document, return);
d->m_document = doc;
if (!d->m_rootProjectNode) {
auto newRoot = new ProjectNode(projectDirectory());
newRoot->setDisplayName(displayName());
newRoot->addNode(new FileNode(projectFilePath(), FileType::Project, false));
setRootProjectNode(newRoot);
}
}
void Project::setRootProjectNode(ProjectNode *root)
@@ -38,6 +38,7 @@
namespace ProjectExplorer {
class RunConfiguration;
class Project;
enum class NodeType : quint16 {
File = 1,
@@ -293,6 +294,8 @@ protected:
// this is just the in-memory representation, a subclass
// will add the persistent stuff
explicit ProjectNode(const Utils::FileName &projectFilePath);
friend class Project;
};
// Documentation inside.
+2
View File
@@ -200,6 +200,8 @@ void SessionManager::updateProjectTree(Project *pro)
break;
}
}
if (!currentPair)
return;
if (!currentPair)
return; // Project was already de-registered and is shutting down
@@ -93,7 +93,7 @@ class PythonProject : public Project
public:
explicit PythonProject(const Utils::FileName &filename);
QString displayName() const override { return m_projectName; }
QString displayName() const override;
QStringList files(FilesMode) const override { return m_files; }
QStringList files() const { return m_files; }
@@ -113,7 +113,6 @@ private:
QStringList processEntries(const QStringList &paths,
QHash<QString, QString> *map = 0) const;
QString m_projectName;
QStringList m_rawFileList;
QStringList m_files;
QHash<QString, QString> m_rawListEntries;
@@ -424,14 +423,14 @@ PythonProject::PythonProject(const FileName &fileName)
setId(PythonProjectId);
setDocument(new PythonProjectFile(this, fileName));
DocumentManager::addDocument(document());
setRootProjectNode(new PythonProjectNode(this));
setProjectContext(Context(PythonProjectContext));
setProjectLanguages(Context(ProjectExplorer::Constants::CXX_LANGUAGE_ID));
}
QFileInfo fileInfo = projectFilePath().toFileInfo();
m_projectName = fileInfo.completeBaseName();
QString PythonProject::displayName() const
{
return projectFilePath().toFileInfo().completeBaseName();
}
static QStringList readLines(const QString &absoluteFileName)
+1 -5
View File
@@ -117,7 +117,6 @@ private:
// --------------------------------------------------------------------
QbsProject::QbsProject(const FileName &fileName) :
m_projectName(fileName.toFileInfo().completeBaseName()),
m_qbsProjectParser(0),
m_qbsUpdateFutureInterface(0),
m_parsingScheduled(false),
@@ -131,9 +130,6 @@ QbsProject::QbsProject(const FileName &fileName) :
setId(Constants::PROJECT_ID);
setDocument(new QbsProjectFile(this, fileName));
DocumentManager::addDocument(document());
auto newRoot = new QbsRootProjectNode(this);
Internal::QbsNodeTreeBuilder::buildTree(this); // Populate with initial data
setRootProjectNode(newRoot);
setProjectContext(Context(Constants::PROJECT_ID));
setProjectLanguages(Context(ProjectExplorer::Constants::CXX_LANGUAGE_ID));
@@ -166,7 +162,7 @@ QbsProject::~QbsProject()
QString QbsProject::displayName() const
{
return m_projectName;
return projectFilePath().toFileInfo().completeBaseName();
}
QbsRootProjectNode *QbsProject::rootProjectNode() const
@@ -141,7 +141,6 @@ private:
static bool ensureWriteableQbsFile(const QString &file);
const QString m_projectName;
QHash<ProjectExplorer::Target *, qbs::Project> m_qbsProjects;
qbs::Project m_qbsProject;
qbs::ProjectData m_projectData;
@@ -209,7 +209,6 @@ QmakeProject::QmakeProject(const FileName &fileName) :
m_asyncUpdateTimer.setInterval(3000);
connect(&m_asyncUpdateTimer, &QTimer::timeout, this, &QmakeProject::asyncUpdate);
setRootProjectNode(new QmakeProFileNode(this, projectFilePath()));
m_rootProFile = std::make_unique<QmakeProFile>(this, projectFilePath());
connect(BuildManager::instance(), &BuildManager::buildQueueFinished,
+1 -4
View File
@@ -60,12 +60,9 @@ QmlProject::QmlProject(const Utils::FileName &fileName) :
setId("QmlProjectManager.QmlProject");
setDocument(new Internal::QmlProjectFile(this, fileName));
DocumentManager::addDocument(document(), true);
setRootProjectNode(new Internal::QmlProjectNode(this));
setProjectContext(Context(QmlProjectManager::Constants::PROJECTCONTEXT));
setProjectLanguages(Context(ProjectExplorer::Constants::QMLJS_LANGUAGE_ID));
m_projectName = projectFilePath().toFileInfo().completeBaseName();
}
QmlProject::~QmlProject()
@@ -273,7 +270,7 @@ void QmlProject::refreshFiles(const QSet<QString> &/*added*/, const QSet<QString
QString QmlProject::displayName() const
{
return m_projectName;
return projectFilePath().toFileInfo().completeBaseName();
}
bool QmlProject::supportsKit(Kit *k, QString *errorMessage) const
@@ -94,7 +94,6 @@ private:
QStringList convertToAbsoluteFiles(const QStringList &paths) const;
QmlJS::ModelManagerInterface *modelManager() const;
QString m_projectName;
QmlImport m_defaultImport;
ProjectExplorer::Target *m_activeTarget = 0;