QmlDesigner: Improve ownership of QmlProjectItem

Change-Id: Ibfe4b0b5314dada85a601a8f27003af135df78f1
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Marco Bubke
2022-04-13 11:47:32 +02:00
committed by Tim Jenssen
parent 118d9d43d2
commit f51162a3fe
6 changed files with 26 additions and 43 deletions

View File

@@ -15,8 +15,7 @@
namespace QmlProjectManager {
FileFilterBaseItem::FileFilterBaseItem(QObject *parent) :
QmlProjectContentItem(parent)
FileFilterBaseItem::FileFilterBaseItem()
{
m_updateFileListTimer.setSingleShot(true);
m_updateFileListTimer.setInterval(50);
@@ -271,8 +270,7 @@ QSet<QString> FileFilterBaseItem::filesInSubTree(const QDir &rootDir, const QDir
return fileSet;
}
ImageFileFilterItem::ImageFileFilterItem(QObject *parent)
: FileFilterBaseItem(parent)
ImageFileFilterItem::ImageFileFilterItem()
{
QString filter;
// supported image formats according to
@@ -284,8 +282,7 @@ ImageFileFilterItem::ImageFileFilterItem(QObject *parent)
setFilter(filter);
}
FileFilterItem::FileFilterItem(const QString &fileFilter, QObject *parent)
: FileFilterBaseItem(parent)
FileFilterItem::FileFilterItem(const QString &fileFilter)
{
setFilter(fileFilter);
}

View File

@@ -20,9 +20,7 @@ class QmlProjectContentItem : public QObject
Q_OBJECT
public:
QmlProjectContentItem(QObject *parent = nullptr)
: QObject(parent)
{}
QmlProjectContentItem() {}
};
class FileFilterBaseItem : public QmlProjectContentItem {
@@ -35,7 +33,7 @@ class FileFilterBaseItem : public QmlProjectContentItem {
Q_PROPERTY(QStringList files READ files NOTIFY filesChanged DESIGNABLE false)
public:
FileFilterBaseItem(QObject *parent = nullptr);
FileFilterBaseItem();
QString directory() const;
void setDirectory(const QString &directoryPath);
@@ -99,12 +97,12 @@ private:
class FileFilterItem : public FileFilterBaseItem {
public:
FileFilterItem(const QString &fileFilter, QObject *parent = nullptr);
FileFilterItem(const QString &fileFilter);
};
class ImageFileFilterItem : public FileFilterBaseItem {
public:
ImageFileFilterItem(QObject *parent = nullptr);
ImageFileFilterItem();
};
} // namespace QmlProjectManager

View File

@@ -52,7 +52,8 @@ std::unique_ptr<QmlProjectManager::FileFilterBaseItem> setupFileFilterItem(
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;
@@ -67,7 +68,7 @@ QmlProjectItem *QmlProjectFileFormat::parseProjectFile(const Utils::FilePath &fi
}
if (rootNode->name() == QLatin1String("Project")) {
auto projectItem = new QmlProjectItem;
auto projectItem = std::make_unique<QmlProjectItem>();
const auto mainFileProperty = rootNode->property(QLatin1String("mainFile"));
if (mainFileProperty.isValid())
@@ -137,8 +138,7 @@ QmlProjectItem *QmlProjectFileFormat::parseProjectFile(const Utils::FilePath &fi
setupFileFilterItem(std::make_unique<FileFilterItem>("*.js"), childNode));
} else if (childNode->name() == QLatin1String("ImageFiles")) {
projectItem->appendContent(
setupFileFilterItem(std::make_unique<ImageFileFilterItem>(projectItem),
childNode));
setupFileFilterItem(std::make_unique<ImageFileFilterItem>(), childNode));
} else if (childNode->name() == QLatin1String("CssFiles")) {
projectItem->appendContent(
setupFileFilterItem(std::make_unique<FileFilterItem>("*.css"), childNode));

View File

@@ -17,7 +17,7 @@ class QmlProjectFileFormat
Q_DECLARE_TR_FUNCTIONS(QmlProjectManager::QmlProjectFileFormat)
public:
static QmlProjectItem *parseProjectFile(const Utils::FilePath &fileName,
static std::unique_ptr<QmlProjectItem> parseProjectFile(const Utils::FilePath &fileName,
QString *errorMessage = nullptr);
};

View File

@@ -191,8 +191,7 @@ void QmlBuildSystem::parseProject(RefreshOptions options)
m_projectItem.reset();
if (!m_projectItem) {
QString errorMessage;
m_projectItem.reset(
QmlProjectFileFormat::parseProjectFile(projectFilePath(), &errorMessage));
m_projectItem = QmlProjectFileFormat::parseProjectFile(projectFilePath(), &errorMessage);
if (m_projectItem) {
connect(m_projectItem.get(),
&QmlProjectItem::qmlFilesChanged,

View File

@@ -41,7 +41,7 @@ tst_FileFormat::tst_FileFormat()
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(
Utils::FilePath::fromString(testDataDir).pathAppended(name + ".qmlproject"), error);
@@ -54,7 +54,7 @@ void tst_FileFormat::testFileFilter()
// Search for qml files in directory + subdirectories
//
{
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter1"), &error);
auto project = loadQmlProject(QLatin1String("testFileFilter1"), &error);
QVERIFY(project);
QVERIFY(error.isEmpty());
@@ -64,14 +64,13 @@ void tst_FileFormat::testFileFilter()
<< testDataDir + "/file2.qml"
<< testDataDir + "/subdir/file3.qml");
COMPARE_AS_SETS(project->files(), expectedFiles);
delete project;
}
//
// search for all qml files in directory
//
{
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter2"), &error);
auto project = loadQmlProject(QLatin1String("testFileFilter2"), &error);
QVERIFY(project);
QVERIFY(error.isEmpty());
@@ -80,14 +79,13 @@ void tst_FileFormat::testFileFilter()
QStringList expectedFiles(QStringList() << testDataDir + "/file1.qml"
<< testDataDir + "/file2.qml");
COMPARE_AS_SETS(project->files(), expectedFiles);
delete project;
}
//
// search for all qml files in subdirectory
//
{
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter3"), &error);
auto project = loadQmlProject(QLatin1String("testFileFilter3"), &error);
QVERIFY(project);
QVERIFY(error.isEmpty());
@@ -95,14 +93,13 @@ void tst_FileFormat::testFileFilter()
QStringList expectedFiles(QStringList() << testDataDir + "/subdir/file3.qml");
COMPARE_AS_SETS(project->files(), expectedFiles);
delete project;
}
//
// multiple entries
//
{
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter4"), &error);
auto project = loadQmlProject(QLatin1String("testFileFilter4"), &error);
QVERIFY(project);
QVERIFY(error.isEmpty());
@@ -113,14 +110,13 @@ void tst_FileFormat::testFileFilter()
<< testDataDir + "/subdir/file3.qml");
QCOMPARE(project->files().size(), 3);
COMPARE_AS_SETS(project->files(), expectedFiles);
delete project;
}
//
// include specific list
//
{
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter5"), &error);
auto project = loadQmlProject(QLatin1String("testFileFilter5"), &error);
QVERIFY(project);
QVERIFY(error.isEmpty());
@@ -129,14 +125,13 @@ void tst_FileFormat::testFileFilter()
QStringList expectedFiles(QStringList() << testDataDir + "/file1.qml"
<< testDataDir + "/file2.qml");
COMPARE_AS_SETS(project->files(), expectedFiles);
delete project;
}
//
// include specific list
//
{
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter6"), &error);
auto project = loadQmlProject(QLatin1String("testFileFilter6"), &error);
QVERIFY(project);
QVERIFY(error.isEmpty());
@@ -144,14 +139,13 @@ void tst_FileFormat::testFileFilter()
QStringList expectedFiles(QStringList() << testDataDir + "/image.gif");
COMPARE_AS_SETS(project->files(), expectedFiles);
delete project;
}
//
// use wildcards
//
{
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter7"), &error);
auto project = loadQmlProject(QLatin1String("testFileFilter7"), &error);
QVERIFY(project);
QVERIFY(error.isEmpty());
@@ -159,14 +153,13 @@ void tst_FileFormat::testFileFilter()
QStringList expectedFiles(QStringList() << testDataDir + "/image.gif");
COMPARE_AS_SETS(project->files(), expectedFiles);
delete project;
}
//
// use Files element (1.1)
//
{
QmlProjectItem *project = loadQmlProject(QLatin1String("testFileFilter8"), &error);
auto project = loadQmlProject(QLatin1String("testFileFilter8"), &error);
QVERIFY(project);
QVERIFY(error.isEmpty());
@@ -174,7 +167,6 @@ void tst_FileFormat::testFileFilter()
QStringList expectedFiles(QStringList() << testDataDir + "/image.gif");
COMPARE_AS_SETS(project->files(), expectedFiles);
delete project;
}
}
@@ -184,7 +176,7 @@ void tst_FileFormat::testMatchesFile()
//
// search for qml files in local directory
//
QmlProjectItem *project = loadQmlProject(QLatin1String("testMatchesFile"), &error);
auto project = loadQmlProject(QLatin1String("testMatchesFile"), &error);
QVERIFY(project);
QVERIFY(error.isEmpty());
@@ -195,7 +187,6 @@ void tst_FileFormat::testMatchesFile()
QVERIFY(project->matchesFile(testDataDir + "/subdir/notyetexistingfile.qml"));
QVERIFY(project->matchesFile(testDataDir + "/script.js"));
QVERIFY(!project->matchesFile(testDataDir + "/script.css"));
delete project;
}
void tst_FileFormat::testLibraryPaths()
@@ -204,7 +195,7 @@ void tst_FileFormat::testLibraryPaths()
//
// search for qml files in local directory
//
QmlProjectItem *project = loadQmlProject(QLatin1String("testLibraryPaths"), &error);
auto project = loadQmlProject(QLatin1String("testLibraryPaths"), &error);
QVERIFY(project);
QVERIFY(error.isEmpty());
@@ -214,7 +205,6 @@ void tst_FileFormat::testLibraryPaths()
const QStringList expectedPaths({base.relativeFilePath(SRCDIR "/otherLibrary"),
base.relativeFilePath(SRCDIR "/data/library")});
COMPARE_AS_SETS(project->importPaths(), expectedPaths);
delete project;
}
void tst_FileFormat::testMainFile()
@@ -223,12 +213,11 @@ void tst_FileFormat::testMainFile()
//
// search for qml files in local directory
//
QmlProjectItem *project = loadQmlProject(QLatin1String("testMainFile"), &error);
auto project = loadQmlProject(QLatin1String("testMainFile"), &error);
QVERIFY(project);
QVERIFY(error.isEmpty());
QCOMPARE(project->mainFile(), QString("file1.qml"));
delete project;
}
QTEST_GUILESS_MAIN(tst_FileFormat);