Resolve demos and examples also relative to qt install paths.

Qt5 has the manifest files in QT_INSTALL_DOCS but the actual examples in
QT_INSTALL_EXAMPLES/DEMOS, which can be completely independent.
The patch tries to resolves files relative to the manifest, and if that
fails, relative to the install paths.

Change-Id: I7d449e1edab01f18680a5ffe6edcb508e7b194f6
Reviewed-by: hjk <qthjk@ovi.com>
This commit is contained in:
Eike Ziller
2012-11-27 17:13:02 +01:00
committed by hjk
parent fbe6834a16
commit 110c31b1da
2 changed files with 45 additions and 16 deletions

View File

@@ -101,7 +101,23 @@ static inline QStringList trimStringList(const QStringList &stringlist)
return returnList; return returnList;
} }
QList<ExampleItem> ExamplesListModel::parseExamples(QXmlStreamReader* reader, const QString& projectsOffset) static QString relativeOrInstallPath(const QString &path, const QString &manifestPath,
const QString &installPath)
{
const QChar slash = QLatin1Char('/');
const QString relativeResolvedPath = manifestPath + slash + path;
const QString installResolvedPath = installPath + slash + path;
if (QFile::exists(relativeResolvedPath))
return relativeResolvedPath;
else if (QFile::exists(installResolvedPath))
return installResolvedPath;
// doesn't exist, just return relative
return relativeResolvedPath;
}
QList<ExampleItem> ExamplesListModel::parseExamples(QXmlStreamReader *reader,
const QString &projectsOffset,
const QString &examplesInstallPath)
{ {
QList<ExampleItem> examples; QList<ExampleItem> examples;
ExampleItem item; ExampleItem item;
@@ -116,12 +132,12 @@ QList<ExampleItem> ExamplesListModel::parseExamples(QXmlStreamReader* reader, co
item.name = attributes.value(QLatin1String("name")).toString(); item.name = attributes.value(QLatin1String("name")).toString();
item.projectPath = attributes.value(QLatin1String("projectPath")).toString(); item.projectPath = attributes.value(QLatin1String("projectPath")).toString();
item.hasSourceCode = !item.projectPath.isEmpty(); item.hasSourceCode = !item.projectPath.isEmpty();
item.projectPath.prepend(slash); item.projectPath = relativeOrInstallPath(item.projectPath, projectsOffset, examplesInstallPath);
item.projectPath.prepend(projectsOffset);
item.imageUrl = attributes.value(QLatin1String("imageUrl")).toString(); item.imageUrl = attributes.value(QLatin1String("imageUrl")).toString();
item.docUrl = attributes.value(QLatin1String("docUrl")).toString(); item.docUrl = attributes.value(QLatin1String("docUrl")).toString();
} else if (reader->name() == QLatin1String("fileToOpen")) { } else if (reader->name() == QLatin1String("fileToOpen")) {
item.filesToOpen.append(projectsOffset + slash + reader->readElementText(QXmlStreamReader::ErrorOnUnexpectedElement)); item.filesToOpen.append(relativeOrInstallPath(reader->readElementText(QXmlStreamReader::ErrorOnUnexpectedElement),
projectsOffset, examplesInstallPath));
} else if (reader->name() == QLatin1String("description")) { } else if (reader->name() == QLatin1String("description")) {
item.description = fixStringForTags(reader->readElementText(QXmlStreamReader::ErrorOnUnexpectedElement)); item.description = fixStringForTags(reader->readElementText(QXmlStreamReader::ErrorOnUnexpectedElement));
} else if (reader->name() == QLatin1String("dependency")) { } else if (reader->name() == QLatin1String("dependency")) {
@@ -151,7 +167,9 @@ QList<ExampleItem> ExamplesListModel::parseExamples(QXmlStreamReader* reader, co
return examples; return examples;
} }
QList<ExampleItem> ExamplesListModel::parseDemos(QXmlStreamReader* reader, const QString& projectsOffset) QList<ExampleItem> ExamplesListModel::parseDemos(QXmlStreamReader *reader,
const QString &projectsOffset,
const QString &demosInstallPath)
{ {
QList<ExampleItem> demos; QList<ExampleItem> demos;
ExampleItem item; ExampleItem item;
@@ -166,12 +184,12 @@ QList<ExampleItem> ExamplesListModel::parseDemos(QXmlStreamReader* reader, const
item.name = attributes.value(QLatin1String("name")).toString(); item.name = attributes.value(QLatin1String("name")).toString();
item.projectPath = attributes.value(QLatin1String("projectPath")).toString(); item.projectPath = attributes.value(QLatin1String("projectPath")).toString();
item.hasSourceCode = !item.projectPath.isEmpty(); item.hasSourceCode = !item.projectPath.isEmpty();
item.projectPath.prepend(slash); item.projectPath = relativeOrInstallPath(item.projectPath, projectsOffset, demosInstallPath);
item.projectPath.prepend(projectsOffset);
item.imageUrl = attributes.value(QLatin1String("imageUrl")).toString(); item.imageUrl = attributes.value(QLatin1String("imageUrl")).toString();
item.docUrl = attributes.value(QLatin1String("docUrl")).toString(); item.docUrl = attributes.value(QLatin1String("docUrl")).toString();
} else if (reader->name() == QLatin1String("fileToOpen")) { } else if (reader->name() == QLatin1String("fileToOpen")) {
item.filesToOpen.append(projectsOffset + slash + reader->readElementText(QXmlStreamReader::ErrorOnUnexpectedElement)); item.filesToOpen.append(relativeOrInstallPath(reader->readElementText(QXmlStreamReader::ErrorOnUnexpectedElement),
projectsOffset, demosInstallPath));
} else if (reader->name() == QLatin1String("description")) { } else if (reader->name() == QLatin1String("description")) {
item.description = fixStringForTags(reader->readElementText(QXmlStreamReader::ErrorOnUnexpectedElement)); item.description = fixStringForTags(reader->readElementText(QXmlStreamReader::ErrorOnUnexpectedElement));
} else if (reader->name() == QLatin1String("dependency")) { } else if (reader->name() == QLatin1String("dependency")) {
@@ -258,11 +276,14 @@ void ExamplesListModel::handleQtVersionsChanged()
void ExamplesListModel::updateExamples() void ExamplesListModel::updateExamples()
{ {
clear(); clear();
QString examplesInstallPath;
QString demosInstallPath;
QString examplesFallback; QString examplesFallback;
QString demosFallback; QString demosFallback;
QString sourceFallback; QString sourceFallback;
foreach (const QString &exampleSource, foreach (const QString &exampleSource,
exampleSources(&examplesFallback, &demosFallback, &sourceFallback)) { exampleSources(&examplesInstallPath, &demosInstallPath,
&examplesFallback, &demosFallback, &sourceFallback)) {
QFile exampleFile(exampleSource); QFile exampleFile(exampleSource);
if (!exampleFile.open(QIODevice::ReadOnly)) { if (!exampleFile.open(QIODevice::ReadOnly)) {
qDebug() << Q_FUNC_INFO << "Could not open file" << exampleSource; qDebug() << Q_FUNC_INFO << "Could not open file" << exampleSource;
@@ -291,9 +312,9 @@ void ExamplesListModel::updateExamples()
switch (reader.readNext()) { switch (reader.readNext()) {
case QXmlStreamReader::StartElement: case QXmlStreamReader::StartElement:
if (reader.name() == QLatin1String("examples")) if (reader.name() == QLatin1String("examples"))
addItems(parseExamples(&reader, examplesDir.path())); addItems(parseExamples(&reader, examplesDir.path(), examplesInstallPath));
else if (reader.name() == QLatin1String("demos")) else if (reader.name() == QLatin1String("demos"))
addItems(parseDemos(&reader, demosDir.path())); addItems(parseDemos(&reader, demosDir.path(), demosInstallPath));
else if (reader.name() == QLatin1String("tutorials")) else if (reader.name() == QLatin1String("tutorials"))
addItems(parseTutorials(&reader, examplesDir.path())); addItems(parseTutorials(&reader, examplesDir.path()));
break; break;
@@ -310,7 +331,8 @@ void ExamplesListModel::updateExamples()
emit tagsUpdated(); emit tagsUpdated();
} }
QStringList ExamplesListModel::exampleSources(QString *examplesFallback, QString *demosFallback, QStringList ExamplesListModel::exampleSources(QString *examplesInstallPath, QString *demosInstallPath,
QString *examplesFallback, QString *demosFallback,
QString *sourceFallback) QString *sourceFallback)
{ {
QTC_CHECK(examplesFallback); QTC_CHECK(examplesFallback);
@@ -379,6 +401,10 @@ QStringList ExamplesListModel::exampleSources(QString *examplesFallback, QString
if (!fis.isEmpty()) { if (!fis.isEmpty()) {
foreach (const QFileInfo &fi, fis) foreach (const QFileInfo &fi, fis)
sources.append(fi.filePath()); sources.append(fi.filePath());
if (examplesInstallPath)
*examplesInstallPath = version->examplesPath();
if (demosInstallPath)
*demosInstallPath = version->demosPath();
return sources; return sources;
} }
} }

View File

@@ -92,11 +92,14 @@ public slots:
private: private:
void addItems(const QList<ExampleItem> &items); void addItems(const QList<ExampleItem> &items);
QList<ExampleItem> parseExamples(QXmlStreamReader* reader, const QString& projectsOffset); QList<ExampleItem> parseExamples(QXmlStreamReader *reader, const QString &projectsOffset,
QList<ExampleItem> parseDemos(QXmlStreamReader* reader, const QString& projectsOffset); const QString &examplesInstallPath);
QList<ExampleItem> parseDemos(QXmlStreamReader *reader, const QString &projectsOffset,
const QString &demosInstallPath);
QList<ExampleItem> parseTutorials(QXmlStreamReader *reader, const QString &projectsOffset); QList<ExampleItem> parseTutorials(QXmlStreamReader *reader, const QString &projectsOffset);
void clear(); void clear();
QStringList exampleSources(QString *examplesFallback, QString *demosFallback, QStringList exampleSources(QString *examplesInstallPath, QString *demosInstallPath,
QString *examplesFallback, QString *demosFallback,
QString *sourceFallback); QString *sourceFallback);
QList<ExampleItem> exampleItems; QList<ExampleItem> exampleItems;
QStringList m_tags; QStringList m_tags;