diff --git a/src/app/main.cpp b/src/app/main.cpp index 0537b4abd1..3d110e3edf 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -116,9 +116,6 @@ int main( int argc, char **argv ) QtWebView::initialize(); - if ( !customLanguage.isEmpty() ) - QgsApplication::setTranslation( customLanguage ); - PlatformUtilities *platformUtils = PlatformUtilities::instance(); platformUtils->initSystem(); @@ -129,6 +126,15 @@ int main( int argc, char **argv ) QgsApplication app( argc, argv, true, profilePath, QStringLiteral( "mobile" ) ); + if ( !customLanguage.isEmpty() ) + { + QLocale customLocale( customLanguage ); + QLocale::setDefault( customLocale ); + QgsApplication::setTranslation( customLanguage ); + // Set locale to emit QgsApplication's localeChanged signal + QgsApplication::setLocale( QLocale() ); + } + const QString qfieldFont( qgetenv( "QFIELD_FONT_TTF" ) ); if ( !qfieldFont.isEmpty() ) { diff --git a/src/core/featurelistmodel.cpp b/src/core/featurelistmodel.cpp index c47d7fb31f..b7e31e7efe 100644 --- a/src/core/featurelistmodel.cpp +++ b/src/core/featurelistmodel.cpp @@ -262,39 +262,43 @@ void FeatureListModel::gatherFeatureList() request.setSubsetOfAttributes( referencedColumns, fields ); - if ( !mFilterExpression.isEmpty() - && ( !QgsValueRelationFieldFormatter::expressionRequiresFormScope( mFilterExpression ) - || QgsValueRelationFieldFormatter::expressionIsUsable( mFilterExpression, mCurrentFormFeature ) ) ) - { - QgsExpression exp( mFilterExpression ); - QgsExpressionContext filterContext = QgsExpressionContext( QgsExpressionContextUtils::globalProjectLayerScopes( mCurrentLayer ) ); - - if ( mCurrentFormFeature.isValid() && QgsValueRelationFieldFormatter::expressionRequiresFormScope( mFilterExpression ) ) - filterContext.appendScope( QgsExpressionContextUtils::formScope( mCurrentFormFeature ) ); - - request.setExpressionContext( filterContext ); - request.setFilterExpression( mFilterExpression ); - } - QString fieldDisplayString = displayValueIndex >= 0 ? QgsExpression::quotedColumnRef( mDisplayValueField ) : QStringLiteral( " ( %1 ) " ).arg( mCurrentLayer->displayExpression() ); + QString searchTermExpression; if ( !mSearchTerm.isEmpty() ) { QString escapedSearchTerm = QgsExpression::quotedValue( mSearchTerm ).replace( QRegularExpression( QStringLiteral( "^'|'$" ) ), QString( "" ) ); - QString searchTermExpression = QStringLiteral( " %1 ILIKE '%%2%' " ).arg( fieldDisplayString, escapedSearchTerm ); + searchTermExpression = QStringLiteral( " %1 ILIKE '%%2%' " ).arg( fieldDisplayString, escapedSearchTerm ); const QStringList searchTermParts = escapedSearchTerm.split( QRegularExpression( QStringLiteral( "\\s+" ) ), Qt::SkipEmptyParts ); for ( const QString &searchTermPart : searchTermParts ) { searchTermExpression += QStringLiteral( " OR %1 ILIKE '%%2%' " ).arg( fieldDisplayString, searchTermPart ); } + } + if ( !mSearchTerm.isEmpty() || !mFilterExpression.isEmpty() ) + { + QgsExpressionContext filterContext = QgsExpressionContext( QgsExpressionContextUtils::globalProjectLayerScopes( mCurrentLayer ) ); + + if ( mCurrentFormFeature.isValid() && QgsValueRelationFieldFormatter::expressionRequiresFormScope( mFilterExpression ) ) + filterContext.appendScope( QgsExpressionContextUtils::formScope( mCurrentFormFeature ) ); + + request.setExpressionContext( filterContext ); if ( mFilterExpression.isEmpty() ) + { request.setFilterExpression( QStringLiteral( " (%1) " ).arg( searchTermExpression ) ); + } + else if ( mSearchTerm.isEmpty() ) + { + request.setFilterExpression( mFilterExpression ); + } else + { request.setFilterExpression( QStringLiteral( " (%1) AND (%2) " ).arg( mFilterExpression, searchTermExpression ) ); + } } cleanupGatherer(); diff --git a/src/core/fieldexpressionvaluesgatherer.h b/src/core/fieldexpressionvaluesgatherer.h index 1076ae1b41..6867d86729 100644 --- a/src/core/fieldexpressionvaluesgatherer.h +++ b/src/core/fieldexpressionvaluesgatherer.h @@ -49,6 +49,7 @@ class FeatureExpressionValuesGatherer : public QThread const QStringList &identifierFields = QStringList() ) : mSource( new QgsVectorLayerFeatureSource( layer ) ) , mDisplayExpression( displayExpression.isEmpty() ? layer->displayExpression() : displayExpression ) + , mExpressionContext( layer->createExpressionContext() ) , mRequest( request ) , mIdentifierFields( identifierFields ) {