Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix map canvas decoration not shown when exporting temporal animation
  • Loading branch information
nirvn committed May 18, 2020
1 parent 32d341f commit f55de3c
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 17 deletions.
21 changes: 7 additions & 14 deletions src/app/qgisapp.cpp
Expand Up @@ -7524,7 +7524,7 @@ void QgisApp::updateFilterLegend()
}
}

void QgisApp::saveMapAsImage()
QList< QgsDecorationItem * > QgisApp::activeDecorationItems()
{
QList< QgsDecorationItem * > decorations;
const auto constMDecorationItems = mDecorationItems;
Expand All @@ -7535,25 +7535,18 @@ void QgisApp::saveMapAsImage()
decorations << decoration;
}
}

QgsMapSaveDialog *dlg = new QgsMapSaveDialog( this, mMapCanvas, decorations, QgsProject::instance()->annotationManager()->annotations() );
return decorations;
}
void QgisApp::saveMapAsImage()
{
QgsMapSaveDialog *dlg = new QgsMapSaveDialog( this, mMapCanvas, activeDecorationItems(), QgsProject::instance()->annotationManager()->annotations() );
dlg->setAttribute( Qt::WA_DeleteOnClose );
dlg->show();
} // saveMapAsImage

void QgisApp::saveMapAsPdf()
{
QList< QgsDecorationItem * > decorations;
const auto constMDecorationItems = mDecorationItems;
for ( QgsDecorationItem *decoration : constMDecorationItems )
{
if ( decoration->enabled() )
{
decorations << decoration;
}
}

QgsMapSaveDialog *dlg = new QgsMapSaveDialog( this, mMapCanvas, decorations, QgsProject::instance()->annotationManager()->annotations(), QgsMapSaveDialog::Pdf );
QgsMapSaveDialog *dlg = new QgsMapSaveDialog( this, mMapCanvas, activeDecorationItems(), QgsProject::instance()->annotationManager()->annotations(), QgsMapSaveDialog::Pdf );
dlg->setAttribute( Qt::WA_DeleteOnClose );
dlg->show();
} // saveMapAsPdf
Expand Down
1 change: 1 addition & 0 deletions src/app/qgisapp.h
Expand Up @@ -695,6 +695,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow

void emitCustomCrsValidation( QgsCoordinateReferenceSystem &crs );

QList<QgsDecorationItem *> activeDecorationItems();
QList<QgsDecorationItem *> decorationItems() { return mDecorationItems; }
void addDecorationItem( QgsDecorationItem *item ) { mDecorationItems.append( item ); }

Expand Down
19 changes: 18 additions & 1 deletion src/app/qgsanimationexportdialog.cpp
Expand Up @@ -17,14 +17,15 @@

#include "qgsanimationexportdialog.h"
#include "qgsmapcanvas.h"
#include "qgsdecorationitem.h"
#include "qgsexpressioncontextutils.h"
#include "qgstemporalnavigationobject.h"
#include "qgsprojecttimesettings.h"
#include "qgstemporalutils.h"

Q_GUI_EXPORT extern int qt_defaultDpiX();

QgsAnimationExportDialog::QgsAnimationExportDialog( QWidget *parent, QgsMapCanvas *mapCanvas )
QgsAnimationExportDialog::QgsAnimationExportDialog( QWidget *parent, QgsMapCanvas *mapCanvas, const QList< QgsDecorationItem * > &decorations )
: QDialog( parent )
, mMapCanvas( mapCanvas )
{
Expand All @@ -44,6 +45,17 @@ QgsAnimationExportDialog::QgsAnimationExportDialog( QWidget *parent, QgsMapCanva
mStartDateTime->setDisplayFormat( "yyyy-MM-dd HH:mm:ss" );
mEndDateTime->setDisplayFormat( "yyyy-MM-dd HH:mm:ss" );

QString activeDecorations;
const auto constDecorations = decorations;
for ( QgsDecorationItem *decoration : constDecorations )
{
if ( activeDecorations.isEmpty() )
activeDecorations = decoration->name().toLower();
else
activeDecorations += QStringLiteral( ", %1" ).arg( decoration->name().toLower() );
}
mDrawDecorations->setText( tr( "Draw active decorations: %1" ).arg( !activeDecorations.isEmpty() ? activeDecorations : tr( "none" ) ) );

QgsSettings settings;

const QString templateText = settings.value( QStringLiteral( "ExportAnimation/fileNameTemplate" ),
Expand Down Expand Up @@ -275,3 +287,8 @@ void QgsAnimationExportDialog::lockChanged( const bool locked )
mExtentGroupBox->setRatio( QSize( 0, 0 ) );
}
}

bool QgsAnimationExportDialog::drawDecorations() const
{
return mDrawDecorations->isChecked();
}
7 changes: 6 additions & 1 deletion src/app/qgsanimationexportdialog.h
Expand Up @@ -44,7 +44,9 @@ class APP_EXPORT QgsAnimationExportDialog: public QDialog, private Ui::QgsAnimat
/**
* Constructor for QgsAnimationExportDialog
*/
QgsAnimationExportDialog( QWidget *parent = nullptr, QgsMapCanvas *mapCanvas = nullptr );
QgsAnimationExportDialog( QWidget *parent = nullptr,
QgsMapCanvas *mapCanvas = nullptr,
const QList< QgsDecorationItem * > &decorations = QList< QgsDecorationItem * >() );

//! Returns extent rectangle
QgsRectangle extent() const;
Expand All @@ -67,6 +69,9 @@ class APP_EXPORT QgsAnimationExportDialog: public QDialog, private Ui::QgsAnimat
//! configure a map settings object
void applyMapSettings( QgsMapSettings &mapSettings );

//! returns whether the draw decorations element is checked
bool drawDecorations() const;

signals:

void startExport();
Expand Down
15 changes: 14 additions & 1 deletion src/app/qgstemporalcontrollerdockwidget.cpp
Expand Up @@ -19,7 +19,9 @@
#include "qgstemporalcontrollerwidget.h"
#include "qgspanelwidgetstack.h"
#include "qgsanimationexportdialog.h"
#include "qgsdecorationitem.h"
#include "qgsmapcanvas.h"
#include "qgsmapdecoration.h"

#include "qgstemporalutils.h"
#include "qgstaskmanager.h"
Expand Down Expand Up @@ -51,7 +53,7 @@ QgsTemporalController *QgsTemporalControllerDockWidget::temporalController()

void QgsTemporalControllerDockWidget::exportAnimation()
{
QgsAnimationExportDialog *dlg = new QgsAnimationExportDialog( this, QgisApp::instance()->mapCanvas() );
QgsAnimationExportDialog *dlg = new QgsAnimationExportDialog( this, QgisApp::instance()->mapCanvas(), QgisApp::instance()->activeDecorationItems() );
connect( dlg, &QgsAnimationExportDialog::startExport, this, [ = ]
{
QgsMapSettings s = QgisApp::instance()->mapCanvas()->mapSettings();
Expand Down Expand Up @@ -82,11 +84,22 @@ void QgsTemporalControllerDockWidget::exportAnimation()

connect( &progressDialog, &QProgressDialog::canceled, &progressFeedback, &QgsFeedback::cancel );

QList<QgsMapDecoration *> decorations;
if ( dlg->drawDecorations() )
{
const QList<QgsDecorationItem *> decorationItems = QgisApp::instance()->activeDecorationItems();
for ( QgsMapDecoration *decoration : decorationItems )
{
decorations << decoration;
}
}

QgsTemporalUtils::AnimationExportSettings animationSettings;
animationSettings.frameDuration = frameDuration;
animationSettings.animationRange = animationRange;
animationSettings.outputDirectory = outputDir;
animationSettings.fileNameTemplate = fileNameExpression;
animationSettings.decorations = decorations;

bool success = QgsTemporalUtils::exportAnimation(
s,
Expand Down
11 changes: 11 additions & 0 deletions src/core/qgstemporalutils.cpp
Expand Up @@ -23,6 +23,7 @@
#include "qgsrasterlayertemporalproperties.h"
#include "qgsmeshlayertemporalproperties.h"
#include "qgstemporalnavigationobject.h"
#include "qgsmapdecoration.h"
#include "qgsmapsettings.h"
#include "qgsmaprenderercustompainterjob.h"
#include "qgsexpressioncontextutils.h"
Expand Down Expand Up @@ -118,6 +119,16 @@ bool QgsTemporalUtils::exportAnimation( const QgsMapSettings &mapSettings, const
QgsMapRendererCustomPainterJob job( ms, &p );
job.start();
job.waitForFinished();

QgsRenderContext context = QgsRenderContext::fromMapSettings( ms );
context.setPainter( &p );

const auto constMDecorations = settings.decorations;
for ( QgsMapDecoration *decoration : constMDecorations )
{
decoration->render( ms, context );
}

p.end();

img.save( path );
Expand Down
4 changes: 4 additions & 0 deletions src/core/qgstemporalutils.h
Expand Up @@ -23,6 +23,7 @@
class QgsProject;
class QgsMapSettings;
class QgsFeedback;
class QgsMapDecoration;

/**
* \ingroup core
Expand Down Expand Up @@ -64,6 +65,9 @@ class CORE_EXPORT QgsTemporalUtils
* e.g. my###.jpg will create frames my001.jpg, my002.jpg, etc
*/
QString fileNameTemplate;

//! List of decorations to draw onto exported frames.
QList<QgsMapDecoration *> decorations;

};

Expand Down
10 changes: 10 additions & 0 deletions src/ui/qgsanimationexportdialogbase.ui
Expand Up @@ -234,6 +234,16 @@
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QCheckBox" name="mDrawDecorations">
<property name="text">
<string>Draw active decorations</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
Expand Down

0 comments on commit f55de3c

Please sign in to comment.