Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Revise advanced effects warning to account for GeoPDF capabilities
when exporting canvas to GeoPDF
  • Loading branch information
nyalldawson committed Jun 8, 2020
1 parent 0a9d61a commit 777c75b
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 26 deletions.
16 changes: 13 additions & 3 deletions python/core/auto_generated/qgsmapsettingsutils.sip.in
Expand Up @@ -23,11 +23,18 @@ Utilities for map settings.
%End
public:

static const QStringList containsAdvancedEffects( const QgsMapSettings &mapSettings );
enum class EffectsCheckFlag
{
IgnoreGeoPdfSupportedEffects,
};
typedef QFlags<QgsMapSettingsUtils::EffectsCheckFlag> EffectsCheckFlags;


static QStringList containsAdvancedEffects( const QgsMapSettings &mapSettings, EffectsCheckFlags flags = 0 );
%Docstring
Checks whether any of the layers attached to a map settings object contain advanced effects
Checks whether any of the layers attached to a map settings object contain advanced effects.

:param mapSettings: map settings
The optional ``flags`` argument can be used to fine-tune the check behavior.
%End

static void worldFileParameters( const QgsMapSettings &mapSettings, double &a /Out/, double &b /Out/, double &c /Out/, double &d /Out/, double &e /Out/, double &f /Out/ );
Expand Down Expand Up @@ -57,6 +64,9 @@ Creates the content of a world file.

};

QFlags<QgsMapSettingsUtils::EffectsCheckFlag> operator|(QgsMapSettingsUtils::EffectsCheckFlag f1, QFlags<QgsMapSettingsUtils::EffectsCheckFlag> f2);


/************************************************************************
* This file has been generated automatically from *
* *
Expand Down
44 changes: 26 additions & 18 deletions src/app/qgsmapsavedialog.cpp
Expand Up @@ -99,25 +99,13 @@ QgsMapSaveDialog::QgsMapSaveDialog( QWidget *parent, QgsMapCanvas *mapCanvas, co
{
case Pdf:
{
QStringList layers = QgsMapSettingsUtils::containsAdvancedEffects( mMapCanvas->mapSettings() );
if ( !layers.isEmpty() )
connect( mInfo, &QLabel::linkActivated, this, [this]( const QString & )
{
mInfoDetails = tr( "The following layer(s) use advanced effects:\n\n%1\n\nRasterizing map is recommended for proper rendering." ).arg(
QChar( 0x2022 ) + QStringLiteral( " " ) + layers.join( QStringLiteral( "\n" ) + QChar( 0x2022 ) + QStringLiteral( " " ) ) );
connect( mInfo, &QLabel::linkActivated, this, [this]( const QString & )
{
QgsMessageViewer *viewer = new QgsMessageViewer( this );
viewer->setWindowTitle( tr( "Advanced effects warning" ) );
viewer->setMessageAsPlainText( mInfoDetails );
viewer->exec();
} );
mInfo->setText( tr( "%1A number of layers%2 use advanced effects, rasterizing map is recommended for proper rendering." ).arg( QStringLiteral( "<a href='#'>" ), QStringLiteral( "</a>" ) ) );
mSaveAsRaster->setChecked( true );
}
else
{
mSaveAsRaster->setChecked( false );
}
QgsMessageViewer *viewer = new QgsMessageViewer( this );
viewer->setWindowTitle( tr( "Advanced effects warning" ) );
viewer->setMessageAsPlainText( mInfoDetails );
viewer->exec();
} );

this->setWindowTitle( tr( "Save Map as PDF" ) );

Expand All @@ -143,6 +131,9 @@ QgsMapSaveDialog::QgsMapSaveDialog( QWidget *parent, QgsMapCanvas *mapCanvas, co
mGeoPdfFormatComboBox->addItem( tr( "ISO 32000 Extension (recommended)" ) );
mGeoPdfFormatComboBox->addItem( tr( "OGC Best Practice" ) );
}

connect( mGeoPDFGroupBox, &QGroupBox::toggled, this, &QgsMapSaveDialog::updatePdfExportWarning );
updatePdfExportWarning();
break;
}

Expand Down Expand Up @@ -574,6 +565,23 @@ void QgsMapSaveDialog::onAccepted()
}
}

void QgsMapSaveDialog::updatePdfExportWarning()
{
QStringList layers = QgsMapSettingsUtils::containsAdvancedEffects( mMapCanvas->mapSettings(), mGeoPDFGroupBox->isChecked() ? QgsMapSettingsUtils::EffectsCheckFlags( QgsMapSettingsUtils::EffectsCheckFlag::IgnoreGeoPdfSupportedEffects ) : nullptr );
if ( !layers.isEmpty() )
{
mInfoDetails = tr( "The following layer(s) use advanced effects:\n\n%1\n\nRasterizing map is recommended for proper rendering." ).arg(
QChar( 0x2022 ) + QStringLiteral( " " ) + layers.join( QStringLiteral( "\n" ) + QChar( 0x2022 ) + QStringLiteral( " " ) ) );
mInfo->setText( tr( "%1A number of layers%2 use advanced effects, rasterizing map is recommended for proper rendering." ).arg( QStringLiteral( "<a href='#'>" ), QStringLiteral( "</a>" ) ) );
mSaveAsRaster->setChecked( true );
}
else
{
mSaveAsRaster->setChecked( false );
mInfo->clear();
}
}

void QgsMapSaveDialog::showHelp()
{
QgsHelp::openHelp( QStringLiteral( "introduction/qgis_gui.html#exporting-the-map-view" ) );
Expand Down
2 changes: 2 additions & 0 deletions src/app/qgsmapsavedialog.h
Expand Up @@ -86,6 +86,8 @@ class APP_EXPORT QgsMapSaveDialog: public QDialog, private Ui::QgsMapSaveDialog
private slots:
void onAccepted();

void updatePdfExportWarning();

private:

void lockChanged( bool locked );
Expand Down
18 changes: 16 additions & 2 deletions src/core/qgsmapsettingsutils.cpp
Expand Up @@ -20,10 +20,11 @@
#include "qgspallabeling.h"
#include "qgstextformat.h"
#include "qgsvectorlayer.h"
#include "qgsabstractgeopdfexporter.h"

#include <QString>

const QStringList QgsMapSettingsUtils::containsAdvancedEffects( const QgsMapSettings &mapSettings )
QStringList QgsMapSettingsUtils::containsAdvancedEffects( const QgsMapSettings &mapSettings, EffectsCheckFlags flags )
{
QSet< QString > layers;

Expand All @@ -33,15 +34,28 @@ const QStringList QgsMapSettingsUtils::containsAdvancedEffects( const QgsMapSett
{
if ( layer && layer->isInScaleRange( mapSettings.scale() ) )
{
bool layerHasAdvancedBlendMode = false;
if ( layer->blendMode() != QPainter::CompositionMode_SourceOver )
{
if ( flags & EffectsCheckFlag::IgnoreGeoPdfSupportedEffects )
{
layerHasAdvancedBlendMode = !QgsAbstractGeoPdfExporter::compositionModeSupported( layer->blendMode() );
}
else
{
layerHasAdvancedBlendMode = true;
}
}

if ( layerHasAdvancedBlendMode )
{
layers << layer->name();
}
// if vector layer, check labels and feature blend mode
QgsVectorLayer *currentVectorLayer = qobject_cast<QgsVectorLayer *>( layer );
if ( currentVectorLayer )
{
if ( !qgsDoubleNear( currentVectorLayer->opacity(), 1.0 ) )
if ( !qgsDoubleNear( currentVectorLayer->opacity(), 1.0 ) && !( flags & EffectsCheckFlag::IgnoreGeoPdfSupportedEffects ) )
{
layers << layer->name();
}
Expand Down
19 changes: 16 additions & 3 deletions src/core/qgsmapsettingsutils.h
Expand Up @@ -34,10 +34,21 @@ class CORE_EXPORT QgsMapSettingsUtils
public:

/**
* Checks whether any of the layers attached to a map settings object contain advanced effects
* \param mapSettings map settings
* Flags for controlling the behavior of containsAdvancedEffects()
* \since QGIS 3.14
*/
static const QStringList containsAdvancedEffects( const QgsMapSettings &mapSettings );
enum class EffectsCheckFlag
{
IgnoreGeoPdfSupportedEffects = 1 << 0, //!< Ignore advanced effects which are supported in GeoPDF exports
};
Q_DECLARE_FLAGS( EffectsCheckFlags, EffectsCheckFlag )

/**
* Checks whether any of the layers attached to a map settings object contain advanced effects.
*
* The optional \a flags argument can be used to fine-tune the check behavior.
*/
static QStringList containsAdvancedEffects( const QgsMapSettings &mapSettings, EffectsCheckFlags flags = nullptr );

/**
* Computes the six parameters of a world file.
Expand All @@ -61,4 +72,6 @@ class CORE_EXPORT QgsMapSettingsUtils

};

Q_DECLARE_OPERATORS_FOR_FLAGS( QgsMapSettingsUtils::EffectsCheckFlags )

#endif
10 changes: 10 additions & 0 deletions tests/src/core/testqgsmapsettingsutils.cpp
Expand Up @@ -80,12 +80,22 @@ void TestQgsMapSettingsUtils::containsAdvancedEffects()
mapSettings.setLayers( layers );

QCOMPARE( QgsMapSettingsUtils::containsAdvancedEffects( mapSettings ).size(), 1 );
QCOMPARE( QgsMapSettingsUtils::containsAdvancedEffects( mapSettings, QgsMapSettingsUtils::EffectsCheckFlag::IgnoreGeoPdfSupportedEffects ).size(), 0 );

// set the layer scale-based visibility so it falls outside of the map settings scale
layer->setScaleBasedVisibility( true );
layer->setMaximumScale( 10 );

QCOMPARE( QgsMapSettingsUtils::containsAdvancedEffects( mapSettings ).size(), 0 );

layer->setScaleBasedVisibility( false );
layer->setBlendMode( QPainter::CompositionMode_SourceOver );
QCOMPARE( QgsMapSettingsUtils::containsAdvancedEffects( mapSettings ).size(), 0 );
QCOMPARE( QgsMapSettingsUtils::containsAdvancedEffects( mapSettings, QgsMapSettingsUtils::EffectsCheckFlag::IgnoreGeoPdfSupportedEffects ).size(), 0 );

layer->setOpacity( 0.5 );
QCOMPARE( QgsMapSettingsUtils::containsAdvancedEffects( mapSettings ).size(), 1 );
QCOMPARE( QgsMapSettingsUtils::containsAdvancedEffects( mapSettings, QgsMapSettingsUtils::EffectsCheckFlag::IgnoreGeoPdfSupportedEffects ).size(), 0 );
}

QGSTEST_MAIN( TestQgsMapSettingsUtils )
Expand Down

0 comments on commit 777c75b

Please sign in to comment.