move logic to QgsProcessingUtils and create a convenient method resolveDefaultEncoding()

This commit is contained in:
Loïc Bartoletti 2023-06-27 08:07:59 +02:00 committed by Nyall Dawson
parent ed1867436d
commit 09ac50fd36
5 changed files with 42 additions and 26 deletions

View File

@ -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
};

View File

@ -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())

View File

@ -38,6 +38,7 @@
#include "qgsannotationlayer.h"
#include "qgstiledmeshlayer.h"
#include <QRegularExpression>
#include <QTextCodec>
#include <QUuid>
QList<QgsRasterLayer *> 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
//

View File

@ -589,6 +589,16 @@ class CORE_EXPORT QgsProcessingUtils
*/
static QVariantMap preprocessQgisProcessParameters( const QVariantMap &parameters, 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 );

View File

@ -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();
}
}