From 418084698d4863cfc67c7fb2b9c846521709562c Mon Sep 17 00:00:00 2001 From: Mathieu Pellerin Date: Fri, 12 May 2017 15:21:10 +0700 Subject: [PATCH] Display name of layers in need of rasterization when saving as PDF (#4539) --- python/core/qgsmapsettingsutils.sip | 4 ++-- src/app/qgsmapsavedialog.cpp | 18 +++++++++++++++++- src/core/composer/qgscomposermap.cpp | 2 +- src/core/qgsmapsettingsutils.cpp | 17 +++++++++++------ src/core/qgsmapsettingsutils.h | 2 +- src/ui/qgsmapsavedialog.ui | 7 +++++++ 6 files changed, 39 insertions(+), 11 deletions(-) diff --git a/python/core/qgsmapsettingsutils.sip b/python/core/qgsmapsettingsutils.sip index c15613480e2..d1b9f60b747 100644 --- a/python/core/qgsmapsettingsutils.sip +++ b/python/core/qgsmapsettingsutils.sip @@ -22,11 +22,11 @@ class QgsMapSettingsUtils %End public: - static bool containsAdvancedEffects( const QgsMapSettings &mapSettings ); + static const QStringList containsAdvancedEffects( const QgsMapSettings &mapSettings ); %Docstring Checks whether any of the layers attached to a map settings object contain advanced effects \param mapSettings map settings - :rtype: bool + :rtype: list of str %End static QString worldFileContent( const QgsMapSettings &mapSettings ); diff --git a/src/app/qgsmapsavedialog.cpp b/src/app/qgsmapsavedialog.cpp index b23fdd284a6..7c6025e279f 100644 --- a/src/app/qgsmapsavedialog.cpp +++ b/src/app/qgsmapsavedialog.cpp @@ -66,7 +66,23 @@ QgsMapSaveDialog::QgsMapSaveDialog( QWidget *parent, QgsMapCanvas *mapCanvas, co { mSaveWorldFile->setVisible( false ); - mSaveAsRaster->setChecked( QgsMapSettingsUtils::containsAdvancedEffects( mapCanvas->mapSettings() ) ); + QStringList layers = QgsMapSettingsUtils::containsAdvancedEffects( mapCanvas->mapSettings() ); + if ( !layers.isEmpty() ) + { + // Limit number of items to avoid extreme dialog height + if ( layers.count() >= 10 ) + { + layers = layers.mid( 0, 9 ); + layers << QChar( 0x2026 ); + } + mInfo->setText( tr( "The following layer(s) use advanced effects:\n%1\nRasterizing map is recommended for proper rendering." ).arg( + QChar( 0x2022 ) + QString( " " ) + layers.join( QString( "\n" ) + QChar( 0x2022 ) + QString( " " ) ) ) ); + mSaveAsRaster->setChecked( true ); + } + else + { + mSaveAsRaster->setChecked( false ); + } mSaveAsRaster->setVisible( true ); this->setWindowTitle( tr( "Save map as PDF" ) ); diff --git a/src/core/composer/qgscomposermap.cpp b/src/core/composer/qgscomposermap.cpp index e02cc1dbed0..45f30ed7b10 100644 --- a/src/core/composer/qgscomposermap.cpp +++ b/src/core/composer/qgscomposermap.cpp @@ -1082,7 +1082,7 @@ bool QgsComposerMap::containsAdvancedEffects() const QgsMapSettings ms; ms.setLayers( layersToRender() ); - return QgsMapSettingsUtils::containsAdvancedEffects( ms ); + return ( !QgsMapSettingsUtils::containsAdvancedEffects( ms ).isEmpty() ); } void QgsComposerMap::connectUpdateSlot() diff --git a/src/core/qgsmapsettingsutils.cpp b/src/core/qgsmapsettingsutils.cpp index df14aa73eb8..d049be50976 100644 --- a/src/core/qgsmapsettingsutils.cpp +++ b/src/core/qgsmapsettingsutils.cpp @@ -23,8 +23,10 @@ #include -bool QgsMapSettingsUtils::containsAdvancedEffects( const QgsMapSettings &mapSettings ) +const QStringList QgsMapSettingsUtils::containsAdvancedEffects( const QgsMapSettings &mapSettings ) { + QSet< QString > layers; + QgsTextFormat layerFormat; Q_FOREACH ( QgsMapLayer *layer, mapSettings.layers() ) { @@ -32,7 +34,7 @@ bool QgsMapSettingsUtils::containsAdvancedEffects( const QgsMapSettings &mapSett { if ( layer->blendMode() != QPainter::CompositionMode_SourceOver ) { - return true; + layers << layer->name(); } // if vector layer, check labels and feature blend mode QgsVectorLayer *currentVectorLayer = qobject_cast( layer ); @@ -40,11 +42,11 @@ bool QgsMapSettingsUtils::containsAdvancedEffects( const QgsMapSettings &mapSett { if ( currentVectorLayer->layerTransparency() != 0 ) { - return true; + layers << layer->name(); } if ( currentVectorLayer->featureBlendMode() != QPainter::CompositionMode_SourceOver ) { - return true; + layers << layer->name(); } // check label blend modes if ( QgsPalLabeling::staticWillUseLayer( currentVectorLayer ) ) @@ -52,12 +54,15 @@ bool QgsMapSettingsUtils::containsAdvancedEffects( const QgsMapSettings &mapSett // Check all label blending properties layerFormat.readFromLayer( currentVectorLayer ); if ( layerFormat.containsAdvancedEffects() ) - return true; + { + layers << layer->name(); + } } } } } - return false; + + return layers.toList(); } QString QgsMapSettingsUtils::worldFileContent( const QgsMapSettings &mapSettings ) diff --git a/src/core/qgsmapsettingsutils.h b/src/core/qgsmapsettingsutils.h index e3ece498f8e..ac326ca5936 100644 --- a/src/core/qgsmapsettingsutils.h +++ b/src/core/qgsmapsettingsutils.h @@ -35,7 +35,7 @@ class CORE_EXPORT QgsMapSettingsUtils /** Checks whether any of the layers attached to a map settings object contain advanced effects * \param mapSettings map settings */ - static bool containsAdvancedEffects( const QgsMapSettings &mapSettings ); + static const QStringList containsAdvancedEffects( const QgsMapSettings &mapSettings ); /** Creates the content of a world file. * \param mapSettings map settings diff --git a/src/ui/qgsmapsavedialog.ui b/src/ui/qgsmapsavedialog.ui index e8b66184be2..e8d09f99b22 100644 --- a/src/ui/qgsmapsavedialog.ui +++ b/src/ui/qgsmapsavedialog.ui @@ -16,6 +16,13 @@ + + + + false + + +