forked from qt-creator/qt-creator
QmlDesigner: Improve ownership of QmlProjectItem
Change-Id: Ibfe4b0b5314dada85a601a8f27003af135df78f1 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
@@ -15,8 +15,7 @@
|
|||||||
|
|
||||||
namespace QmlProjectManager {
|
namespace QmlProjectManager {
|
||||||
|
|
||||||
FileFilterBaseItem::FileFilterBaseItem(QObject *parent) :
|
FileFilterBaseItem::FileFilterBaseItem()
|
||||||
QmlProjectContentItem(parent)
|
|
||||||
{
|
{
|
||||||
m_updateFileListTimer.setSingleShot(true);
|
m_updateFileListTimer.setSingleShot(true);
|
||||||
m_updateFileListTimer.setInterval(50);
|
m_updateFileListTimer.setInterval(50);
|
||||||
@@ -271,8 +270,7 @@ QSet<QString> FileFilterBaseItem::filesInSubTree(const QDir &rootDir, const QDir
|
|||||||
return fileSet;
|
return fileSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImageFileFilterItem::ImageFileFilterItem(QObject *parent)
|
ImageFileFilterItem::ImageFileFilterItem()
|
||||||
: FileFilterBaseItem(parent)
|
|
||||||
{
|
{
|
||||||
QString filter;
|
QString filter;
|
||||||
// supported image formats according to
|
// supported image formats according to
|
||||||
@@ -284,8 +282,7 @@ ImageFileFilterItem::ImageFileFilterItem(QObject *parent)
|
|||||||
setFilter(filter);
|
setFilter(filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
FileFilterItem::FileFilterItem(const QString &fileFilter, QObject *parent)
|
FileFilterItem::FileFilterItem(const QString &fileFilter)
|
||||||
: FileFilterBaseItem(parent)
|
|
||||||
{
|
{
|
||||||
setFilter(fileFilter);
|
setFilter(fileFilter);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,9 +20,7 @@ class QmlProjectContentItem : public QObject
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QmlProjectContentItem(QObject *parent = nullptr)
|
QmlProjectContentItem() {}
|
||||||
: QObject(parent)
|
|
||||||
{}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class FileFilterBaseItem : public QmlProjectContentItem {
|
class FileFilterBaseItem : public QmlProjectContentItem {
|
||||||
@@ -35,7 +33,7 @@ class FileFilterBaseItem : public QmlProjectContentItem {
|
|||||||
Q_PROPERTY(QStringList files READ files NOTIFY filesChanged DESIGNABLE false)
|
Q_PROPERTY(QStringList files READ files NOTIFY filesChanged DESIGNABLE false)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FileFilterBaseItem(QObject *parent = nullptr);
|
FileFilterBaseItem();
|
||||||
|
|
||||||
QString directory() const;
|
QString directory() const;
|
||||||
void setDirectory(const QString &directoryPath);
|
void setDirectory(const QString &directoryPath);
|
||||||
@@ -99,12 +97,12 @@ private:
|
|||||||
|
|
||||||
class FileFilterItem : public FileFilterBaseItem {
|
class FileFilterItem : public FileFilterBaseItem {
|
||||||
public:
|
public:
|
||||||
FileFilterItem(const QString &fileFilter, QObject *parent = nullptr);
|
FileFilterItem(const QString &fileFilter);
|
||||||
};
|
};
|
||||||
|
|
||||||
class ImageFileFilterItem : public FileFilterBaseItem {
|
class ImageFileFilterItem : public FileFilterBaseItem {
|
||||||
public:
|
public:
|
||||||
ImageFileFilterItem(QObject *parent = nullptr);
|
ImageFileFilterItem();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace QmlProjectManager
|
} // namespace QmlProjectManager
|
||||||
|
|||||||
@@ -52,7 +52,8 @@ std::unique_ptr<QmlProjectManager::FileFilterBaseItem> setupFileFilterItem(
|
|||||||
|
|
||||||
namespace QmlProjectManager {
|
namespace QmlProjectManager {
|
||||||
|
|
||||||
QmlProjectItem *QmlProjectFileFormat::parseProjectFile(const Utils::FilePath &fileName, QString *errorMessage)
|
std::unique_ptr<QmlProjectItem> QmlProjectFileFormat::parseProjectFile(const Utils::FilePath &fileName,
|
||||||
|
QString *errorMessage)
|
||||||
{
|
{
|
||||||
QmlJS::SimpleReader simpleQmlJSReader;
|
QmlJS::SimpleReader simpleQmlJSReader;
|
||||||
|
|
||||||
@@ -67,7 +68,7 @@ QmlProjectItem *QmlProjectFileFormat::parseProjectFile(const Utils::FilePath &fi
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rootNode->name() == QLatin1String("Project")) {
|
if (rootNode->name() == QLatin1String("Project")) {
|
||||||
auto projectItem = new QmlProjectItem;
|
auto projectItem = std::make_unique<QmlProjectItem>();
|
||||||
|
|
||||||
const auto mainFileProperty = rootNode->property(QLatin1String("mainFile"));
|
const auto mainFileProperty = rootNode->property(QLatin1String("mainFile"));
|
||||||
if (mainFileProperty.isValid())
|
if (mainFileProperty.isValid())
|
||||||
@@ -137,8 +138,7 @@ QmlProjectItem *QmlProjectFileFormat::parseProjectFile(const Utils::FilePath &fi
|
|||||||
setupFileFilterItem(std::make_unique<FileFilterItem>("*.js"), childNode));
|
setupFileFilterItem(std::make_unique<FileFilterItem>("*.js"), childNode));
|
||||||
} else if (childNode->name() == QLatin1String("ImageFiles")) {
|
} else if (childNode->name() == QLatin1String("ImageFiles")) {
|
||||||
projectItem->appendContent(
|
projectItem->appendContent(
|
||||||
setupFileFilterItem(std::make_unique<ImageFileFilterItem>(projectItem),
|
setupFileFilterItem(std::make_unique<ImageFileFilterItem>(), childNode));
|
||||||
childNode));
|
|
||||||
} else if (childNode->name() == QLatin1String("CssFiles")) {
|
} else if (childNode->name() == QLatin1String("CssFiles")) {
|
||||||
projectItem->appendContent(
|
projectItem->appendContent(
|
||||||
setupFileFilterItem(std::make_unique<FileFilterItem>("*.css"), childNode));
|
setupFileFilterItem(std::make_unique<FileFilterItem>("*.css"), childNode));
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ class QmlProjectFileFormat
|
|||||||
Q_DECLARE_TR_FUNCTIONS(QmlProjectManager::QmlProjectFileFormat)
|
Q_DECLARE_TR_FUNCTIONS(QmlProjectManager::QmlProjectFileFormat)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static QmlProjectItem *parseProjectFile(const Utils::FilePath &fileName,
|
static std::unique_ptr<QmlProjectItem> parseProjectFile(const Utils::FilePath &fileName,
|
||||||
QString *errorMessage = nullptr);
|
QString *errorMessage = nullptr);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -191,8 +191,7 @@ void QmlBuildSystem::parseProject(RefreshOptions options)
|
|||||||
m_projectItem.reset();
|
m_projectItem.reset();
|
||||||
if (!m_projectItem) {
|
if (!m_projectItem) {
|
||||||
QString errorMessage;
|
QString errorMessage;
|
||||||
m_projectItem.reset(
|
m_projectItem = QmlProjectFileFormat::parseProjectFile(projectFilePath(), &errorMessage);
|
||||||
QmlProjectFileFormat::parseProjectFile(projectFilePath(), &errorMessage));
|
|
||||||
if (m_projectItem) {
|
if (m_projectItem) {
|
||||||
connect(m_projectItem.get(),
|
connect(m_projectItem.get(),
|
||||||
&QmlProjectItem::qmlFilesChanged,
|
&QmlProjectItem::qmlFilesChanged,
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ tst_FileFormat::tst_FileFormat()
|
|||||||
|
|
||||||
static QString testDataDir = QLatin1String(SRCDIR "/data");
|
static QString testDataDir = QLatin1String(SRCDIR "/data");
|
||||||
|
|
||||||
static QmlProjectItem *loadQmlProject(QString name, QString *error)
|
static std::unique_ptr<QmlProjectItem> loadQmlProject(QString name, QString *error)
|
||||||
{
|
{
|
||||||
return QmlProjectFileFormat::parseProjectFile(
|
return QmlProjectFileFormat::parseProjectFile(
|
||||||
Utils::FilePath::fromString(testDataDir).pathAppended(name + ".qmlproject"), error);
|
Utils::FilePath::fromString(testDataDir).pathAppended(name + ".qmlproject"), error);
|
||||||
@@ -54,7 +54,7 @@ void tst_FileFormat::testFileFilter()
|
|||||||
// Search for qml files in directory + subdirectories
|
// Search for qml files in directory + subdirectories
|
||||||
//
|
//
|
||||||
{
|
{
|
||||||
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter1"), &error);
|
auto project = loadQmlProject(QLatin1String("testFileFilter1"), &error);
|
||||||
QVERIFY(project);
|
QVERIFY(project);
|
||||||
QVERIFY(error.isEmpty());
|
QVERIFY(error.isEmpty());
|
||||||
|
|
||||||
@@ -64,14 +64,13 @@ void tst_FileFormat::testFileFilter()
|
|||||||
<< testDataDir + "/file2.qml"
|
<< testDataDir + "/file2.qml"
|
||||||
<< testDataDir + "/subdir/file3.qml");
|
<< testDataDir + "/subdir/file3.qml");
|
||||||
COMPARE_AS_SETS(project->files(), expectedFiles);
|
COMPARE_AS_SETS(project->files(), expectedFiles);
|
||||||
delete project;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// search for all qml files in directory
|
// search for all qml files in directory
|
||||||
//
|
//
|
||||||
{
|
{
|
||||||
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter2"), &error);
|
auto project = loadQmlProject(QLatin1String("testFileFilter2"), &error);
|
||||||
QVERIFY(project);
|
QVERIFY(project);
|
||||||
QVERIFY(error.isEmpty());
|
QVERIFY(error.isEmpty());
|
||||||
|
|
||||||
@@ -80,14 +79,13 @@ void tst_FileFormat::testFileFilter()
|
|||||||
QStringList expectedFiles(QStringList() << testDataDir + "/file1.qml"
|
QStringList expectedFiles(QStringList() << testDataDir + "/file1.qml"
|
||||||
<< testDataDir + "/file2.qml");
|
<< testDataDir + "/file2.qml");
|
||||||
COMPARE_AS_SETS(project->files(), expectedFiles);
|
COMPARE_AS_SETS(project->files(), expectedFiles);
|
||||||
delete project;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// search for all qml files in subdirectory
|
// search for all qml files in subdirectory
|
||||||
//
|
//
|
||||||
{
|
{
|
||||||
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter3"), &error);
|
auto project = loadQmlProject(QLatin1String("testFileFilter3"), &error);
|
||||||
QVERIFY(project);
|
QVERIFY(project);
|
||||||
QVERIFY(error.isEmpty());
|
QVERIFY(error.isEmpty());
|
||||||
|
|
||||||
@@ -95,14 +93,13 @@ void tst_FileFormat::testFileFilter()
|
|||||||
|
|
||||||
QStringList expectedFiles(QStringList() << testDataDir + "/subdir/file3.qml");
|
QStringList expectedFiles(QStringList() << testDataDir + "/subdir/file3.qml");
|
||||||
COMPARE_AS_SETS(project->files(), expectedFiles);
|
COMPARE_AS_SETS(project->files(), expectedFiles);
|
||||||
delete project;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// multiple entries
|
// multiple entries
|
||||||
//
|
//
|
||||||
{
|
{
|
||||||
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter4"), &error);
|
auto project = loadQmlProject(QLatin1String("testFileFilter4"), &error);
|
||||||
QVERIFY(project);
|
QVERIFY(project);
|
||||||
QVERIFY(error.isEmpty());
|
QVERIFY(error.isEmpty());
|
||||||
|
|
||||||
@@ -113,14 +110,13 @@ void tst_FileFormat::testFileFilter()
|
|||||||
<< testDataDir + "/subdir/file3.qml");
|
<< testDataDir + "/subdir/file3.qml");
|
||||||
QCOMPARE(project->files().size(), 3);
|
QCOMPARE(project->files().size(), 3);
|
||||||
COMPARE_AS_SETS(project->files(), expectedFiles);
|
COMPARE_AS_SETS(project->files(), expectedFiles);
|
||||||
delete project;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// include specific list
|
// include specific list
|
||||||
//
|
//
|
||||||
{
|
{
|
||||||
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter5"), &error);
|
auto project = loadQmlProject(QLatin1String("testFileFilter5"), &error);
|
||||||
QVERIFY(project);
|
QVERIFY(project);
|
||||||
QVERIFY(error.isEmpty());
|
QVERIFY(error.isEmpty());
|
||||||
|
|
||||||
@@ -129,14 +125,13 @@ void tst_FileFormat::testFileFilter()
|
|||||||
QStringList expectedFiles(QStringList() << testDataDir + "/file1.qml"
|
QStringList expectedFiles(QStringList() << testDataDir + "/file1.qml"
|
||||||
<< testDataDir + "/file2.qml");
|
<< testDataDir + "/file2.qml");
|
||||||
COMPARE_AS_SETS(project->files(), expectedFiles);
|
COMPARE_AS_SETS(project->files(), expectedFiles);
|
||||||
delete project;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// include specific list
|
// include specific list
|
||||||
//
|
//
|
||||||
{
|
{
|
||||||
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter6"), &error);
|
auto project = loadQmlProject(QLatin1String("testFileFilter6"), &error);
|
||||||
QVERIFY(project);
|
QVERIFY(project);
|
||||||
QVERIFY(error.isEmpty());
|
QVERIFY(error.isEmpty());
|
||||||
|
|
||||||
@@ -144,14 +139,13 @@ void tst_FileFormat::testFileFilter()
|
|||||||
|
|
||||||
QStringList expectedFiles(QStringList() << testDataDir + "/image.gif");
|
QStringList expectedFiles(QStringList() << testDataDir + "/image.gif");
|
||||||
COMPARE_AS_SETS(project->files(), expectedFiles);
|
COMPARE_AS_SETS(project->files(), expectedFiles);
|
||||||
delete project;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// use wildcards
|
// use wildcards
|
||||||
//
|
//
|
||||||
{
|
{
|
||||||
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter7"), &error);
|
auto project = loadQmlProject(QLatin1String("testFileFilter7"), &error);
|
||||||
QVERIFY(project);
|
QVERIFY(project);
|
||||||
QVERIFY(error.isEmpty());
|
QVERIFY(error.isEmpty());
|
||||||
|
|
||||||
@@ -159,14 +153,13 @@ void tst_FileFormat::testFileFilter()
|
|||||||
|
|
||||||
QStringList expectedFiles(QStringList() << testDataDir + "/image.gif");
|
QStringList expectedFiles(QStringList() << testDataDir + "/image.gif");
|
||||||
COMPARE_AS_SETS(project->files(), expectedFiles);
|
COMPARE_AS_SETS(project->files(), expectedFiles);
|
||||||
delete project;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// use Files element (1.1)
|
// use Files element (1.1)
|
||||||
//
|
//
|
||||||
{
|
{
|
||||||
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter8"), &error);
|
auto project = loadQmlProject(QLatin1String("testFileFilter8"), &error);
|
||||||
QVERIFY(project);
|
QVERIFY(project);
|
||||||
QVERIFY(error.isEmpty());
|
QVERIFY(error.isEmpty());
|
||||||
|
|
||||||
@@ -174,7 +167,6 @@ void tst_FileFormat::testFileFilter()
|
|||||||
|
|
||||||
QStringList expectedFiles(QStringList() << testDataDir + "/image.gif");
|
QStringList expectedFiles(QStringList() << testDataDir + "/image.gif");
|
||||||
COMPARE_AS_SETS(project->files(), expectedFiles);
|
COMPARE_AS_SETS(project->files(), expectedFiles);
|
||||||
delete project;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,7 +176,7 @@ void tst_FileFormat::testMatchesFile()
|
|||||||
//
|
//
|
||||||
// search for qml files in local directory
|
// search for qml files in local directory
|
||||||
//
|
//
|
||||||
QmlProjectItem *project = loadQmlProject(QLatin1String("testMatchesFile"), &error);
|
auto project = loadQmlProject(QLatin1String("testMatchesFile"), &error);
|
||||||
QVERIFY(project);
|
QVERIFY(project);
|
||||||
QVERIFY(error.isEmpty());
|
QVERIFY(error.isEmpty());
|
||||||
|
|
||||||
@@ -195,7 +187,6 @@ void tst_FileFormat::testMatchesFile()
|
|||||||
QVERIFY(project->matchesFile(testDataDir + "/subdir/notyetexistingfile.qml"));
|
QVERIFY(project->matchesFile(testDataDir + "/subdir/notyetexistingfile.qml"));
|
||||||
QVERIFY(project->matchesFile(testDataDir + "/script.js"));
|
QVERIFY(project->matchesFile(testDataDir + "/script.js"));
|
||||||
QVERIFY(!project->matchesFile(testDataDir + "/script.css"));
|
QVERIFY(!project->matchesFile(testDataDir + "/script.css"));
|
||||||
delete project;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_FileFormat::testLibraryPaths()
|
void tst_FileFormat::testLibraryPaths()
|
||||||
@@ -204,7 +195,7 @@ void tst_FileFormat::testLibraryPaths()
|
|||||||
//
|
//
|
||||||
// search for qml files in local directory
|
// search for qml files in local directory
|
||||||
//
|
//
|
||||||
QmlProjectItem *project = loadQmlProject(QLatin1String("testLibraryPaths"), &error);
|
auto project = loadQmlProject(QLatin1String("testLibraryPaths"), &error);
|
||||||
QVERIFY(project);
|
QVERIFY(project);
|
||||||
QVERIFY(error.isEmpty());
|
QVERIFY(error.isEmpty());
|
||||||
|
|
||||||
@@ -214,7 +205,6 @@ void tst_FileFormat::testLibraryPaths()
|
|||||||
const QStringList expectedPaths({base.relativeFilePath(SRCDIR "/otherLibrary"),
|
const QStringList expectedPaths({base.relativeFilePath(SRCDIR "/otherLibrary"),
|
||||||
base.relativeFilePath(SRCDIR "/data/library")});
|
base.relativeFilePath(SRCDIR "/data/library")});
|
||||||
COMPARE_AS_SETS(project->importPaths(), expectedPaths);
|
COMPARE_AS_SETS(project->importPaths(), expectedPaths);
|
||||||
delete project;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_FileFormat::testMainFile()
|
void tst_FileFormat::testMainFile()
|
||||||
@@ -223,12 +213,11 @@ void tst_FileFormat::testMainFile()
|
|||||||
//
|
//
|
||||||
// search for qml files in local directory
|
// search for qml files in local directory
|
||||||
//
|
//
|
||||||
QmlProjectItem *project = loadQmlProject(QLatin1String("testMainFile"), &error);
|
auto project = loadQmlProject(QLatin1String("testMainFile"), &error);
|
||||||
QVERIFY(project);
|
QVERIFY(project);
|
||||||
QVERIFY(error.isEmpty());
|
QVERIFY(error.isEmpty());
|
||||||
|
|
||||||
QCOMPARE(project->mainFile(), QString("file1.qml"));
|
QCOMPARE(project->mainFile(), QString("file1.qml"));
|
||||||
delete project;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QTEST_GUILESS_MAIN(tst_FileFormat);
|
QTEST_GUILESS_MAIN(tst_FileFormat);
|
||||||
|
|||||||
Reference in New Issue
Block a user