From 8d6e3e547c45d2ea1c28e8ad4e01efbbf6184f2a Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 12 Mar 2020 04:17:48 +0100 Subject: [PATCH] [libcalamaresui] Add qmlSearch for non-modules - Refactor into a support method and two API points - Use std::transform for doing-things-to-a-list - Add searchQmlFile that only takes a name, for non-modules to use. --- src/libcalamaresui/utils/Qml.cpp | 58 +++++++++++++++++++++++++------- src/libcalamaresui/utils/Qml.h | 1 + 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/src/libcalamaresui/utils/Qml.cpp b/src/libcalamaresui/utils/Qml.cpp index 5dca2fba1..0b2c84616 100644 --- a/src/libcalamaresui/utils/Qml.cpp +++ b/src/libcalamaresui/utils/Qml.cpp @@ -52,30 +52,48 @@ callQMLFunction( QQuickItem* qmlObject, const char* method ) } } - -QString -searchQmlFile( QmlSearch method, const QString& configuredName, const Calamares::ModuleSystem::InstanceKey& i ) +/** @brief Appends to @p candidates suitable expansions of @p names + * + * Depending on @p method, adds search expansions for branding, or QRC, + * or both (with branding having precedence). + */ +static void +addExpansions( QmlSearch method, QStringList& candidates, const QStringList& names ) { QString bPath( QStringLiteral( "%1/%2.qml" ) ); QString qrPath( QStringLiteral( ":/%1.qml" ) ); - cDebug() << "Looking for QML for" << i.toString(); - QStringList candidates; - if ( configuredName.startsWith( '/' ) ) - { - candidates << configuredName; - } if ( ( method == QmlSearch::Both ) || ( method == QmlSearch::BrandingOnly ) ) { QString brandDir = Calamares::Branding::instance()->componentDirectory(); - candidates << ( configuredName.isEmpty() ? QString() : bPath.arg( brandDir, configuredName ) ) - << bPath.arg( brandDir, i.toString() ) << bPath.arg( brandDir, i.module() ); + std::transform( names.constBegin(), + names.constEnd(), + std::back_inserter( candidates ), + [&]( const QString& s ) { return s.isEmpty() ? QString() : bPath.arg( brandDir, s ); } ); } if ( ( method == QmlSearch::Both ) || ( method == QmlSearch::QrcOnly ) ) { - candidates << ( configuredName.isEmpty() ? QString() : qrPath.arg( configuredName ) ) - << qrPath.arg( i.toString() ) << qrPath.arg( i.module() ); + std::transform( names.constBegin(), + names.constEnd(), + std::back_inserter( candidates ), + [&]( const QString& s ) { return s.isEmpty() ? QString() : qrPath.arg( s ); } ); + } +} + +/** @brief Does actual search and returns result. + * + * Empty items in @p candidates are ignored. + */ +static QString +searchQmlFile( QmlSearch method, const QString& configuredName, const QStringList& hints ) +{ + QStringList candidates; + if ( configuredName.startsWith( '/' ) ) + { + candidates << configuredName; } + addExpansions( method, candidates, hints ); + for ( const QString& candidate : candidates ) { if ( candidate.isEmpty() ) @@ -98,6 +116,20 @@ searchQmlFile( QmlSearch method, const QString& configuredName, const Calamares: return QString(); } +QString +searchQmlFile( QmlSearch method, const QString& configuredName, const Calamares::ModuleSystem::InstanceKey& i ) +{ + cDebug() << "Looking for QML for" << i.toString(); + return searchQmlFile( method, configuredName, { configuredName, i.toString(), i.module() } ); +} + +QString +searchQmlFile( QmlSearch method, const QString& configuredName ) +{ + cDebug() << "Looking for QML for" << configuredName; + return searchQmlFile( method, configuredName, { configuredName } ); +} + const NamedEnumTable< QmlSearch >& qmlSearchNames() { diff --git a/src/libcalamaresui/utils/Qml.h b/src/libcalamaresui/utils/Qml.h index f859add21..f4c722fba 100644 --- a/src/libcalamaresui/utils/Qml.h +++ b/src/libcalamaresui/utils/Qml.h @@ -70,6 +70,7 @@ UIDLLEXPORT const NamedEnumTable< QmlSearch >& qmlSearchNames(); UIDLLEXPORT QString searchQmlFile( QmlSearch method, const QString& configuredName, const Calamares::ModuleSystem::InstanceKey& i ); +UIDLLEXPORT QString searchQmlFile( QmlSearch method, const QString& fileNameNoSuffix ); } // namespace CalamaresUtils