forked from qt-creator/qt-creator
QmlProjectManager: Add initial support for multiple qmlproject files
This patch adds read-only support for sub MCU projects. Task-number: QDS-12575 Change-Id: I0dc3b6ff37731f30875c03a3896bbabc4867c4fc Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
50
src/plugins/qmlprojectmanager/.clang-format
Normal file
50
src/plugins/qmlprojectmanager/.clang-format
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
Language: Cpp
|
||||||
|
AccessModifierOffset: -4
|
||||||
|
AlignEscapedNewlines: DontAlign
|
||||||
|
AllowShortFunctionsOnASingleLine: Inline
|
||||||
|
AlwaysBreakTemplateDeclarations: true # use with clang 19
|
||||||
|
BinPackArguments: false
|
||||||
|
BinPackParameters: false
|
||||||
|
BraceWrapping:
|
||||||
|
AfterClass: true
|
||||||
|
AfterFunction: true
|
||||||
|
AfterStruct: true
|
||||||
|
SplitEmptyFunction: false
|
||||||
|
SplitEmptyRecord: false
|
||||||
|
SplitEmptyNamespace: false
|
||||||
|
BreakBeforeBinaryOperators: All
|
||||||
|
BreakBeforeBraces: Custom
|
||||||
|
BreakConstructorInitializers: BeforeComma
|
||||||
|
BreakInheritanceList: AfterComma
|
||||||
|
# BreakTemplateDeclarations: Yes # use with clang 19
|
||||||
|
ColumnLimit: 100
|
||||||
|
IncludeCategories:
|
||||||
|
- Regex: 'Q.*'
|
||||||
|
Priority: 8
|
||||||
|
CaseSensitive: true
|
||||||
|
IndentPPDirectives: AfterHash
|
||||||
|
IndentWidth: 4
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||||
|
# Do not add QT_BEGIN_NAMESPACE/QT_END_NAMESPACE as this will indent lines in between.
|
||||||
|
ObjCBlockIndentWidth: 4
|
||||||
|
PPIndentWidth: 2
|
||||||
|
PackConstructorInitializers: Never
|
||||||
|
PenaltyBreakAssignment: 500
|
||||||
|
PenaltyBreakBeforeFirstCallParameter: 150
|
||||||
|
PenaltyBreakComment: 500
|
||||||
|
PenaltyBreakFirstLessLess: 400
|
||||||
|
PenaltyBreakString: 600
|
||||||
|
PenaltyExcessCharacter: 7
|
||||||
|
PenaltyReturnTypeOnItsOwnLine: 300
|
||||||
|
QualifierAlignment: Custom
|
||||||
|
QualifierOrder: ['friend', 'inline', 'static', 'constexpr', 'const', 'type']
|
||||||
|
ReferenceAlignment: Right
|
||||||
|
ReflowComments: false
|
||||||
|
SeparateDefinitionBlocks: Always
|
||||||
|
SortUsingDeclarations: Lexicographic
|
||||||
|
SpaceAfterCStyleCast: true
|
||||||
|
SpaceAfterTemplateKeyword: false
|
||||||
|
SpaceBeforeParens: ControlStatementsExceptControlMacros
|
||||||
|
SpacesInContainerLiterals: false
|
||||||
|
StatementAttributeLikeMacros: [emit]
|
||||||
|
TabWidth: 4
|
@@ -79,7 +79,7 @@ void QmlProjectItem::setupFileFilters()
|
|||||||
connect(fileFilterItem.get(),
|
connect(fileFilterItem.get(),
|
||||||
&FileFilterItem::filesChanged,
|
&FileFilterItem::filesChanged,
|
||||||
this,
|
this,
|
||||||
&QmlProjectItem::qmlFilesChanged);
|
&QmlProjectItem::filesChanged);
|
||||||
#endif
|
#endif
|
||||||
m_content.push_back(std::move(fileFilterItem));
|
m_content.push_back(std::move(fileFilterItem));
|
||||||
};
|
};
|
||||||
@@ -105,10 +105,7 @@ void QmlProjectItem::setupFileFilters()
|
|||||||
fileFilterItem->setDefaultDirectory(m_projectFile.parentDir().toString());
|
fileFilterItem->setDefaultDirectory(m_projectFile.parentDir().toString());
|
||||||
fileFilterItem->setDirectory(groupDir.toString());
|
fileFilterItem->setDirectory(groupDir.toString());
|
||||||
#ifndef TESTS_ENABLED_QMLPROJECTITEM
|
#ifndef TESTS_ENABLED_QMLPROJECTITEM
|
||||||
connect(fileFilterItem.get(),
|
connect(fileFilterItem.get(), &FileFilterItem::filesChanged, this, &QmlProjectItem::filesChanged);
|
||||||
&FileFilterItem::filesChanged,
|
|
||||||
this,
|
|
||||||
&QmlProjectItem::qmlFilesChanged);
|
|
||||||
#endif
|
#endif
|
||||||
m_content.push_back(std::move(fileFilterItem));
|
m_content.push_back(std::move(fileFilterItem));
|
||||||
};
|
};
|
||||||
|
@@ -92,7 +92,7 @@ public:
|
|||||||
void setEnableCMakeGeneration(bool enable);
|
void setEnableCMakeGeneration(bool enable);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void qmlFilesChanged(const QSet<QString> &, const QSet<QString> &);
|
void filesChanged(const QSet<QString> &, const QSet<QString> &);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef QSharedPointer<QmlProjectItem> ShrdPtrQPI;
|
typedef QSharedPointer<QmlProjectItem> ShrdPtrQPI;
|
||||||
|
@@ -37,6 +37,8 @@
|
|||||||
#include "projectnode/qmlprojectnodes.h"
|
#include "projectnode/qmlprojectnodes.h"
|
||||||
|
|
||||||
#include "utils/algorithm.h"
|
#include "utils/algorithm.h"
|
||||||
|
#include "utils/filepath.h"
|
||||||
|
#include "utils/filesystemwatcher.h"
|
||||||
#include "utils/qtcassert.h"
|
#include "utils/qtcassert.h"
|
||||||
|
|
||||||
#include "texteditor/textdocument.h"
|
#include "texteditor/textdocument.h"
|
||||||
@@ -220,17 +222,56 @@ void QmlBuildSystem::refresh(RefreshOptions options)
|
|||||||
void QmlBuildSystem::initProjectItem()
|
void QmlBuildSystem::initProjectItem()
|
||||||
{
|
{
|
||||||
m_projectItem.reset(new QmlProjectItem{projectFilePath()});
|
m_projectItem.reset(new QmlProjectItem{projectFilePath()});
|
||||||
connect(m_projectItem.get(),
|
|
||||||
&QmlProjectItem::qmlFilesChanged,
|
|
||||||
this,
|
|
||||||
&QmlBuildSystem::refreshFiles);
|
|
||||||
|
|
||||||
connect(m_projectItem.get(),
|
connect(m_projectItem.data(), &QmlProjectItem::filesChanged, this, &QmlBuildSystem::refreshFiles);
|
||||||
&QmlProjectItem::qmlFilesChanged,
|
connect(m_projectItem.data(),
|
||||||
|
&QmlProjectItem::filesChanged,
|
||||||
m_cmakeGen,
|
m_cmakeGen,
|
||||||
&GenerateCmake::CMakeGenerator::update);
|
&GenerateCmake::CMakeGenerator::update);
|
||||||
|
|
||||||
m_cmakeGen->setEnabled(m_projectItem->enableCMakeGeneration());
|
m_cmakeGen->setEnabled(m_projectItem->enableCMakeGeneration());
|
||||||
|
|
||||||
|
initMcuProjectItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QmlBuildSystem::initMcuProjectItems()
|
||||||
|
{
|
||||||
|
m_mcuProjectItems.clear();
|
||||||
|
m_mcuProjectFilesWatcher.clear();
|
||||||
|
|
||||||
|
Utils::FilePath projectDir = projectFilePath().parentDir();
|
||||||
|
// traverse the project dir and find all other mcu projects (.qmlproject files) in the project tree
|
||||||
|
// and add them to the m_mcuProjectItems vector
|
||||||
|
QDirIterator it(projectDir.toString(), QDir::Files, QDirIterator::Subdirectories);
|
||||||
|
while (it.hasNext()) {
|
||||||
|
it.next();
|
||||||
|
if (it.fileInfo().suffix() == "qmlproject" && it.filePath() != projectFilePath().toString()) {
|
||||||
|
auto qmlProjectItem = QSharedPointer<QmlProjectItem>(
|
||||||
|
new QmlProjectItem{Utils::FilePath::fromString(it.filePath())});
|
||||||
|
|
||||||
|
m_mcuProjectItems.append(qmlProjectItem);
|
||||||
|
connect(qmlProjectItem.data(),
|
||||||
|
&QmlProjectItem::filesChanged,
|
||||||
|
this,
|
||||||
|
&QmlBuildSystem::refreshFiles);
|
||||||
|
connect(qmlProjectItem.data(),
|
||||||
|
&QmlProjectItem::filesChanged,
|
||||||
|
m_cmakeGen,
|
||||||
|
&GenerateCmake::CMakeGenerator::update);
|
||||||
|
|
||||||
|
m_mcuProjectFilesWatcher.addFile(it.filePath(),
|
||||||
|
Utils::FileSystemWatcher::WatchModifiedDate);
|
||||||
|
|
||||||
|
connect(&m_mcuProjectFilesWatcher,
|
||||||
|
&Utils::FileSystemWatcher::fileChanged,
|
||||||
|
this,
|
||||||
|
[this](const QString &file) {
|
||||||
|
Q_UNUSED(file)
|
||||||
|
initMcuProjectItems();
|
||||||
|
refresh(RefreshOptions::Files);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmlBuildSystem::parseProjectFiles()
|
void QmlBuildSystem::parseProjectFiles()
|
||||||
@@ -239,7 +280,6 @@ void QmlBuildSystem::parseProjectFiles()
|
|||||||
modelManager->updateSourceFiles(m_projectItem->files(), true);
|
modelManager->updateSourceFiles(m_projectItem->files(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const QString mainFileName = m_projectItem->mainFile();
|
const QString mainFileName = m_projectItem->mainFile();
|
||||||
if (!mainFileName.isEmpty()) {
|
if (!mainFileName.isEmpty()) {
|
||||||
Utils::FilePath mainFilePath = canonicalProjectDir().resolvePath(mainFileName);
|
Utils::FilePath mainFilePath = canonicalProjectDir().resolvePath(mainFileName);
|
||||||
@@ -265,6 +305,16 @@ void QmlBuildSystem::generateProjectTree()
|
|||||||
: FileNode::fileTypeForFileName(file);
|
: FileNode::fileTypeForFileName(file);
|
||||||
newRoot->addNestedNode(std::make_unique<FileNode>(file, fileType));
|
newRoot->addNestedNode(std::make_unique<FileNode>(file, fileType));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const auto &mcuProjectItem : m_mcuProjectItems) {
|
||||||
|
for (const auto &file : mcuProjectItem->files()) {
|
||||||
|
// newRoot->addNestedNode(std::make_unique<FileNode>(file, FileType::Project));
|
||||||
|
const FileType fileType = (file == projectFilePath())
|
||||||
|
? FileType::Project
|
||||||
|
: FileNode::fileTypeForFileName(file);
|
||||||
|
newRoot->addNestedNode(std::make_unique<FileNode>(file, fileType));
|
||||||
|
}
|
||||||
|
}
|
||||||
newRoot->addNestedNode(std::make_unique<FileNode>(projectFilePath(), FileType::Project));
|
newRoot->addNestedNode(std::make_unique<FileNode>(projectFilePath(), FileType::Project));
|
||||||
|
|
||||||
setRootProjectNode(std::move(newRoot));
|
setRootProjectNode(std::move(newRoot));
|
||||||
@@ -692,11 +742,6 @@ QStringList QmlBuildSystem::absoluteImportPaths()
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Utils::FilePaths QmlBuildSystem::files() const
|
|
||||||
{
|
|
||||||
return m_projectItem->files();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QmlBuildSystem::versionQt() const
|
QString QmlBuildSystem::versionQt() const
|
||||||
{
|
{
|
||||||
return m_projectItem->versionQt();
|
return m_projectItem->versionQt();
|
||||||
|
@@ -7,9 +7,12 @@
|
|||||||
|
|
||||||
#include "../qmlprojectmanager_global.h"
|
#include "../qmlprojectmanager_global.h"
|
||||||
#include <projectexplorer/buildsystem.h>
|
#include <projectexplorer/buildsystem.h>
|
||||||
|
#include <QtCore/qfilesystemwatcher.h>
|
||||||
|
|
||||||
#include "qmlprojectmanager/cmakegen/cmakegenerator.h"
|
#include "qmlprojectmanager/cmakegen/cmakegenerator.h"
|
||||||
|
|
||||||
|
#include "utils/filesystemwatcher.h"
|
||||||
|
|
||||||
namespace QmlProjectManager {
|
namespace QmlProjectManager {
|
||||||
|
|
||||||
class QmlProject;
|
class QmlProject;
|
||||||
@@ -91,7 +94,6 @@ public:
|
|||||||
|
|
||||||
QStringList shaderToolArgs() const;
|
QStringList shaderToolArgs() const;
|
||||||
QStringList shaderToolFiles() const;
|
QStringList shaderToolFiles() const;
|
||||||
Utils::FilePaths files() const;
|
|
||||||
|
|
||||||
QString versionQt() const;
|
QString versionQt() const;
|
||||||
QString versionQtQuick() const;
|
QString versionQtQuick() const;
|
||||||
@@ -117,10 +119,15 @@ private:
|
|||||||
const Utils::FilePath &mainFilePath,
|
const Utils::FilePath &mainFilePath,
|
||||||
const QString &oldFile);
|
const QString &oldFile);
|
||||||
|
|
||||||
|
// this is the main project item
|
||||||
QSharedPointer<QmlProjectItem> m_projectItem;
|
QSharedPointer<QmlProjectItem> m_projectItem;
|
||||||
|
// these are the mcu project items which can be found in the project tree
|
||||||
|
QVector<QSharedPointer<QmlProjectItem>> m_mcuProjectItems;
|
||||||
|
Utils::FileSystemWatcher m_mcuProjectFilesWatcher;
|
||||||
bool m_blockFilesUpdate = false;
|
bool m_blockFilesUpdate = false;
|
||||||
|
|
||||||
void initProjectItem();
|
void initProjectItem();
|
||||||
|
void initMcuProjectItems();
|
||||||
void parseProjectFiles();
|
void parseProjectFiles();
|
||||||
void generateProjectTree();
|
void generateProjectTree();
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user