From 9d77b7c105db6e523f52692a8964302c20f10433 Mon Sep 17 00:00:00 2001 From: Jarek Kobus <jkobus@trolltech.com> Date: Tue, 8 Jun 2010 12:15:43 +0200 Subject: [PATCH] When adding a form file to a project add also its qrc files Extract qrc paths from ui file by simple xml parsing. Reviewed-by: dt <qtc-committer@nokia.com> Reviewed-by: Friedemann Kleint <qtc-committer@nokia.com> Task-number: QTCREATORBUG-42 --- src/plugins/qt4projectmanager/qt4nodes.cpp | 55 +++++++++++++++++++++- src/plugins/qt4projectmanager/qt4nodes.h | 1 + 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 160ebef9cab..1c524d70f2e 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -59,6 +59,7 @@ #include <QtCore/QFile> #include <QtCore/QFileInfo> #include <QtCore/QCoreApplication> +#include <QtCore/QXmlStreamReader> #include <QtGui/QPainter> #include <QtGui/QMainWindow> @@ -597,9 +598,25 @@ bool Qt4PriFileNode::addFiles(const FileType fileType, const QStringList &filePa accept(&visitor); const QStringList &allFiles = visitor.filePaths(); + QStringList qrcFiles; // the list of qrc files referenced from ui files + if (fileType == ProjectExplorer::FormType) { + foreach (const QString &formFile, filePaths) { + QStringList resourceFiles = formResources(formFile); + foreach (const QString &resourceFile, resourceFiles) + if (!qrcFiles.contains(resourceFile)) + qrcFiles.append(resourceFile); + } + } + + QStringList uniqueQrcFiles; + foreach (const QString &file, qrcFiles) { + if (!allFiles.contains(file)) + uniqueQrcFiles.append(file); + } + QStringList uniqueFilePaths; foreach (const QString &file, filePaths) { - if(!allFiles.contains(file)) + if (!allFiles.contains(file)) uniqueFilePaths.append(file); } @@ -607,6 +624,9 @@ bool Qt4PriFileNode::addFiles(const FileType fileType, const QStringList &filePa changeFiles(fileType, uniqueFilePaths, &failedFiles, AddToProFile); if (notAdded) *notAdded = failedFiles; + changeFiles(ProjectExplorer::ResourceType, uniqueQrcFiles, &failedFiles, AddToProFile); + if (notAdded) + *notAdded += failedFiles; return failedFiles.isEmpty(); } @@ -699,6 +719,39 @@ bool Qt4PriFileNode::saveModifiedEditors() return true; } +QStringList Qt4PriFileNode::formResources(const QString &formFile) const +{ + QStringList resourceFiles; + QFile file(formFile); + file.open(QIODevice::ReadOnly); + QXmlStreamReader reader(&file); + + QFileInfo fi(formFile); + QDir formDir = fi.absoluteDir(); + while (!reader.atEnd()) { + reader.readNext(); + if (reader.isStartElement()) { + if (reader.name() == QLatin1String("iconset")) { + const QXmlStreamAttributes attributes = reader.attributes(); + if (attributes.hasAttribute(QLatin1String("resource"))) + resourceFiles.append(QDir::cleanPath(formDir.absoluteFilePath( + attributes.value(QLatin1String("resource")).toString()))); + } else if (reader.name() == QLatin1String("include")) { + const QXmlStreamAttributes attributes = reader.attributes(); + if (attributes.hasAttribute(QLatin1String("location"))) + resourceFiles.append(QDir::cleanPath(formDir.absoluteFilePath( + attributes.value(QLatin1String("location")).toString()))); + + } + } + } + + if (reader.hasError()) + qWarning() << "Could not read form file:" << formFile; + + return resourceFiles; +} + void Qt4PriFileNode::changeFiles(const FileType fileType, const QStringList &filePaths, QStringList *notChanged, diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h index b35f687b44c..f9d4551f37c 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.h +++ b/src/plugins/qt4projectmanager/qt4nodes.h @@ -173,6 +173,7 @@ private: void save(const QStringList &lines); bool priFileWritable(const QString &path); bool saveModifiedEditors(); + QStringList formResources(const QString &formFile) const; QStringList baseVPaths(ProFileReader *reader, const QString &projectDir); QStringList fullVPaths(const QStringList &baseVPaths, ProFileReader *reader, FileType type, const QString &qmakeVariable, const QString &projectDir); -- GitLab