From 3a206a6bbaf347c8f45df0d884225022759b4c6f Mon Sep 17 00:00:00 2001 From: Alexander Bruy Date: Tue, 10 Dec 2019 09:41:57 +0200 Subject: [PATCH] move guts of the set layer style to prepareAlgorithm() to keep it threaded --- .../qgsalgorithmapplylayerstyle.cpp | 22 +++++++++---------- .../processing/qgsalgorithmapplylayerstyle.h | 5 ++++- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/analysis/processing/qgsalgorithmapplylayerstyle.cpp b/src/analysis/processing/qgsalgorithmapplylayerstyle.cpp index b58dfe5a9d2..c5450143385 100644 --- a/src/analysis/processing/qgsalgorithmapplylayerstyle.cpp +++ b/src/analysis/processing/qgsalgorithmapplylayerstyle.cpp @@ -49,11 +49,6 @@ QString QgsApplyLayerStyleAlgorithm::shortHelpString() const return QObject::tr( "Applies the style to a layer. The style must be defined as QML file." ); } -QgsProcessingAlgorithm::Flags QgsApplyLayerStyleAlgorithm::flags() const -{ - return QgsProcessingAlgorithm::flags() | QgsProcessingAlgorithm::FlagNoThreading; -} - QgsApplyLayerStyleAlgorithm *QgsApplyLayerStyleAlgorithm::createInstance() const { return new QgsApplyLayerStyleAlgorithm(); @@ -66,24 +61,29 @@ void QgsApplyLayerStyleAlgorithm::initAlgorithm( const QVariantMap & ) addOutput( new QgsProcessingOutputMapLayer( QStringLiteral( "OUTPUT" ), QObject::tr( "Styled" ) ) ); } -QVariantMap QgsApplyLayerStyleAlgorithm::processAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback * ) +bool QgsApplyLayerStyleAlgorithm::prepareAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) { - QgsMapLayer *layer = parameterAsLayer( parameters, QStringLiteral( "INPUT" ), context ); + mLayer.reset( parameterAsLayer( parameters, QStringLiteral( "INPUT" ), context ) ); QString style = parameterAsFile( parameters, QStringLiteral( "STYLE" ), context ); - if ( !layer ) + if ( !mLayer ) throw QgsProcessingException( QObject::tr( "Invalid input layer" ) ); bool ok = false; - QString msg = layer->loadNamedStyle( style, ok ); + QString msg = mLayer->loadNamedStyle( style, ok ); if ( !ok ) { throw QgsProcessingException( QObject::tr( "Failed to apply style. Error: %1" ).arg( msg ) ); } - layer->triggerRepaint(); + mLayer->triggerRepaint(); + return true; +} + +QVariantMap QgsApplyLayerStyleAlgorithm::processAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback * ) +{ QVariantMap results; - results.insert( QStringLiteral( "OUTPUT" ), layer->id() ); + results.insert( QStringLiteral( "OUTPUT" ), mLayer->id() ); return results; } diff --git a/src/analysis/processing/qgsalgorithmapplylayerstyle.h b/src/analysis/processing/qgsalgorithmapplylayerstyle.h index 813f9936b5b..3317b194fea 100644 --- a/src/analysis/processing/qgsalgorithmapplylayerstyle.h +++ b/src/analysis/processing/qgsalgorithmapplylayerstyle.h @@ -32,7 +32,6 @@ class QgsApplyLayerStyleAlgorithm : public QgsProcessingAlgorithm { public: QgsApplyLayerStyleAlgorithm() = default; - Flags flags() const override; QString name() const override; QString displayName() const override; QStringList tags() const override; @@ -44,9 +43,13 @@ class QgsApplyLayerStyleAlgorithm : public QgsProcessingAlgorithm protected: + bool prepareAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override; QVariantMap processAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback * ) override; + private: + + std::unique_ptr< QgsMapLayer > mLayer; }; ///@endcond PRIVATE