forked from qt-creator/qt-creator
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:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user