diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp index c49a8c5035b..322adb7b4cf 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp @@ -30,10 +30,16 @@ #include "iwidgetplugin.h" #include +#include + +#include + #include "pluginmanager/widgetpluginmanager.h" #include #include +#include +#include #include enum { @@ -43,6 +49,30 @@ enum { namespace QmlDesigner { namespace Internal { + +static QString globalMetaInfoPath() +{ +#ifdef SHARE_QML_PATH + if (qEnvironmentVariableIsSet("LOAD_QML_FROM_SOURCE")) + return QLatin1String(SHARE_QML_PATH) + "/globalMetaInfo"; +#endif + return Core::ICore::resourcePath("qmldesigner/globalMetaInfo").toString(); +} + +Utils::FilePaths allGlobalMetaInfoFiles() +{ + static Utils::FilePaths paths; + + if (!paths.isEmpty()) + return paths; + + QDirIterator it(globalMetaInfoPath(), { "*.metainfo" }, QDir::Files, QDirIterator::Subdirectories); + while (it.hasNext()) + paths.append(Utils::FilePath::fromString(it.next())); + + return paths; +} + class MetaInfoPrivate { Q_DISABLE_COPY(MetaInfoPrivate) @@ -99,6 +129,19 @@ void MetaInfoPrivate::parseItemLibraryDescriptions() errorMessage); } } + + const Utils::FilePaths allMetaInfoFiles = allGlobalMetaInfoFiles(); + for (const Utils::FilePath &path : allMetaInfoFiles) { + Internal::MetaInfoReader reader(*m_q); + try { + reader.readMetaInfoFile(path.toString()); + } catch (const InvalidMetaInfoException &e) { + qWarning() << e.description(); + const QString errorMessage = path.toString() + QLatin1Char('\n') + QLatin1Char('\n') + reader.errors().join(QLatin1Char('\n')); + Core::AsynchronousMessageBox::warning(QCoreApplication::translate("QmlDesigner::Internal::MetaInfoPrivate", "Invalid meta info"), + errorMessage); + } + } #endif }