From 09ac50fd3647431b5d6d42a475dba6085926b10a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Bartoletti?= Date: Tue, 27 Jun 2023 08:07:59 +0200 Subject: [PATCH] move logic to QgsProcessingUtils and create a convenient method resolveDefaultEncoding() --- .../processing/qgsprocessingutils.sip.in | 10 ++++++++ .../plugins/processing/tools/dataobjects.py | 9 +++---- src/core/processing/qgsprocessingutils.cpp | 15 ++++++++++++ src/core/processing/qgsprocessingutils.h | 10 ++++++++ .../qgsprocessingoutputdestinationwidget.cpp | 24 ++++--------------- 5 files changed, 42 insertions(+), 26 deletions(-) diff --git a/python/core/auto_generated/processing/qgsprocessingutils.sip.in b/python/core/auto_generated/processing/qgsprocessingutils.sip.in index f9779f3c739..1495d5457f2 100644 --- a/python/core/auto_generated/processing/qgsprocessingutils.sip.in +++ b/python/core/auto_generated/processing/qgsprocessingutils.sip.in @@ -615,6 +615,16 @@ Pre-processes a set of ``parameter`` values for the qgis_process command. In particular, this function upgrades encoded data defined values to :py:class:`QgsProperty` objects. .. versionadded:: 3.30 +%End + + static QString resolveDefaultEncoding(); +%Docstring +Returns the default encoding. + +The default encoding could be the one from "/Processing/encoding" or when it's not an allowed encoding name +like "System", the default encoding system (mostly UTF-8 on Unix-like, windows-1252 on Windows). + +.. versionadded:: 3.32 %End }; diff --git a/python/plugins/processing/tools/dataobjects.py b/python/plugins/processing/tools/dataobjects.py index 5bdc67924dd..3c106f3c171 100644 --- a/python/plugins/processing/tools/dataobjects.py +++ b/python/plugins/processing/tools/dataobjects.py @@ -29,12 +29,13 @@ from qgis.core import (QgsDataProvider, QgsProject, QgsSettings, QgsProcessingContext, + QgsProcessingUtils, QgsFeatureRequest, QgsExpressionContext, QgsExpressionContextUtils, QgsExpressionContextScope) from qgis.gui import QgsSublayersDialog -from qgis.PyQt.QtCore import QCoreApplication, QTextCodec +from qgis.PyQt.QtCore import QCoreApplication from qgis.utils import iface from processing.core.ProcessingConfig import ProcessingConfig @@ -70,11 +71,7 @@ def createContext(feedback=None): context.setInvalidGeometryCheck(invalid_features_method) settings = QgsSettings() - default_codec = "System" - system_codec = QTextCodec.codecForLocale() - if (system_codec): - default_codec = system_codec.name().data().decode() - context.setDefaultEncoding(settings.value("/Processing/encoding", default_codec)) + context.setDefaultEncoding(settings.value("/Processing/encoding", QgsProcessingUtils.resolveDefaultEncoding())) context.setExpressionContext(createExpressionContext()) diff --git a/src/core/processing/qgsprocessingutils.cpp b/src/core/processing/qgsprocessingutils.cpp index b40032dc5f5..28d3effef18 100644 --- a/src/core/processing/qgsprocessingutils.cpp +++ b/src/core/processing/qgsprocessingutils.cpp @@ -38,6 +38,7 @@ #include "qgsannotationlayer.h" #include "qgstiledmeshlayer.h" #include +#include #include QList QgsProcessingUtils::compatibleRasterLayers( QgsProject *project, bool sort ) @@ -1573,6 +1574,20 @@ QVariantMap QgsProcessingUtils::preprocessQgisProcessParameters( const QVariantM return output; } +QString QgsProcessingUtils::resolveDefaultEncoding( const QString &defaultEncoding ) +{ + if ( ! QTextCodec::availableCodecs().contains( defaultEncoding.toLatin1() ) ) + { + const QString systemCodec = QTextCodec::codecForLocale()->name(); + if ( ! systemCodec.isEmpty() ) + { + return systemCodec; + } + } + + return defaultEncoding; +} + // // QgsProcessingFeatureSource // diff --git a/src/core/processing/qgsprocessingutils.h b/src/core/processing/qgsprocessingutils.h index 48d91687de1..c689d760392 100644 --- a/src/core/processing/qgsprocessingutils.h +++ b/src/core/processing/qgsprocessingutils.h @@ -589,6 +589,16 @@ class CORE_EXPORT QgsProcessingUtils */ static QVariantMap preprocessQgisProcessParameters( const QVariantMap ¶meters, bool &ok, QString &error ); + /** + * Returns the default encoding. + * + * The default encoding could be the one from "/Processing/encoding" or when it's not an allowed encoding name + * like "System", the default encoding system (mostly UTF-8 on Unix-like, windows-1252 on Windows). + * + * \since QGIS 3.32 + */ + static QString resolveDefaultEncoding(const QString &defaultEncoding = "System"); + private: static bool canUseLayer( const QgsRasterLayer *layer ); static bool canUseLayer( const QgsMeshLayer *layer ); diff --git a/src/gui/processing/qgsprocessingoutputdestinationwidget.cpp b/src/gui/processing/qgsprocessingoutputdestinationwidget.cpp index af0f9f4088b..d9b69d45ecb 100644 --- a/src/gui/processing/qgsprocessingoutputdestinationwidget.cpp +++ b/src/gui/processing/qgsprocessingoutputdestinationwidget.cpp @@ -53,17 +53,8 @@ QgsProcessingLayerOutputDestinationWidget::QgsProcessingLayerOutputDestinationWi mSelectButton->setPopupMode( QToolButton::InstantPopup ); QgsSettings settings; - mEncoding = settings.value( QStringLiteral( "/Processing/encoding" ), QStringLiteral( "System" ) ).toString(); - - if ( ( mEncoding == "System" ) || ( ! QTextCodec::availableCodecs().contains( mEncoding.toLatin1() ) ) ) - { - const QString systemCodec = QTextCodec::codecForLocale()->name(); - if ( ! systemCodec.isEmpty() ) - { - mEncoding = systemCodec; - settings.setValue( QStringLiteral( "/Processing/encoding" ), mEncoding ); - } - } + mEncoding = QgsProcessingUtils::resolveDefaultEncoding( settings.value( QStringLiteral( "/Processing/encoding" ), QStringLiteral( "System" ) ).toString() ); + settings.setValue( QStringLiteral( "/Processing/encoding" ), mEncoding ); if ( !mParameter->defaultValueForGui().isValid() ) { @@ -614,18 +605,11 @@ void QgsProcessingLayerOutputDestinationWidget::selectEncoding() QgsEncodingSelectionDialog dialog( this, tr( "File encoding" ), mEncoding ); if ( dialog.exec() ) { - mEncoding = dialog.encoding(); - if ( ( mEncoding == "System" ) || ( ! QTextCodec::availableCodecs().contains( mEncoding.toLatin1() ) ) ) - { - const QString systemCodec = QTextCodec::codecForLocale()->name(); - if ( ! systemCodec.isEmpty() ) - { - mEncoding = systemCodec; - } - } + mEncoding = QgsProcessingUtils::resolveDefaultEncoding( dialog.encoding() ); QgsSettings settings; settings.setValue( QStringLiteral( "/Processing/encoding" ), mEncoding ); + emit destinationChanged(); } }