Skip to content

Commit 5e17403

Browse files
authored
Merge pull request #4043 from nyalldawson/layer_composer_bridge
Bridge map canvas layers to composer map layers
2 parents 5e1339e + a188d14 commit 5e17403

51 files changed

Lines changed: 209 additions & 261 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎doc/api_break.dox‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,10 @@ to use the QgsProperty framework objects.
660660
QgsComposition {#qgis_api_break_3_0_QgsComposition}
661661
--------------
662662

663-
- constructor requires QgsProject instance as the second argument
663+
- The constructor no longer takes a reference to a QgsMapSettings object. This is no longer
664+
used by compositions. To set the layers to show in composer maps, the QgsComposerMap::setLayers()
665+
method should be used instead.
666+
- constructor requires QgsProject instance
664667
- addItemsFromXML() has been renamed to addItemsFromXml()
665668
- Constructor with QgsMapRenderer parameter has been removed. Use the variant with QgsMapSettings parameter.
666669
- mapRenderer() has been removed. Use mapSettings() instead.
@@ -674,6 +677,7 @@ were removed. Use setSnapTolerance() and snapTolerance() instead.
674677
- worldFileMap() and setWorldFileMap() have been renamed to referenceMap() and setReferenceMap()
675678
- dataDefinedProperty() and setDataDefinedProperty() now use the QgsProperty framework instead
676679
of QgsDataDefined objects.
680+
- mapSettings() was removed. Use QgsComposerMap::mapSettings() instead.
677681

678682

679683
QgsCoordinateReferenceSystem {#qgis_api_break_3_0_QgsCoordinateReferenceSystem}

‎python/core/composer/qgscomposition.sip‎

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class QgsComposition : QGraphicsScene, QgsExpressionContextGenerator
4040
Landscape
4141
};
4242

43-
explicit QgsComposition( const QgsMapSettings& mapSettings, QgsProject* project );
43+
explicit QgsComposition( QgsProject* project );
4444

4545
/** Composition atlas modes*/
4646
enum AtlasMode
@@ -366,10 +366,6 @@ class QgsComposition : QGraphicsScene, QgsExpressionContextGenerator
366366
/** Used to enable or disable advanced effects such as blend modes in a composition */
367367
void setUseAdvancedEffects( const bool effectsEnabled );
368368

369-
//! Return setting of QGIS map canvas
370-
//! @note added in 2.4
371-
const QgsMapSettings& mapSettings() const;
372-
373369
QgsComposition::PlotStyle plotStyle() const;
374370
void setPlotStyle( const QgsComposition::PlotStyle style );
375371

‎python/gui/layertree/qgslayertreemapcanvasbridge.sip‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class QgsLayerTreeMapCanvasBridge : QObject
6363
signals:
6464
void hasCustomLayerOrderChanged( bool );
6565
void customLayerOrderChanged( const QStringList& order );
66+
void canvasLayersChanged( const QList< QgsMapLayer* >& layers );
6667

6768
protected:
6869

‎src/app/composer/qgscomposer.cpp‎

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
547547
connect( mActionShowRulers, SIGNAL( triggered( bool ) ), this, SLOT( toggleRulers( bool ) ) );
548548

549549
//init undo/redo buttons
550-
mComposition = new QgsComposition( mQgis->mapCanvas()->mapSettings(), QgsProject::instance() );
550+
mComposition = new QgsComposition( QgsProject::instance() );
551551

552552
mActionUndo->setEnabled( false );
553553
mActionRedo->setEnabled( false );
@@ -934,6 +934,23 @@ bool QgsComposer::loadFromTemplate( const QDomDocument& templateDoc, bool clearE
934934
return result;
935935
}
936936

937+
void QgsComposer::onCanvasLayersChanged( const QList<QgsMapLayer*>& layers )
938+
{
939+
if ( !mComposition )
940+
return;
941+
942+
QList< QgsComposerMap* > maps;
943+
mComposition->composerItems( maps );
944+
945+
Q_FOREACH ( QgsComposerMap* map, maps )
946+
{
947+
if ( map->keepLayerSet() )
948+
continue;
949+
950+
map->setLayers( layers );
951+
}
952+
}
953+
937954
void QgsComposer::updateStatusCursorPos( QPointF cursorPosition )
938955
{
939956
if ( !mComposition )
@@ -3543,7 +3560,7 @@ void QgsComposer::readXml( const QDomElement& composerElem, const QDomDocument&
35433560
createComposerView();
35443561

35453562
//read composition settings
3546-
mComposition = new QgsComposition( mQgis->mapCanvas()->mapSettings(), QgsProject::instance() );
3563+
mComposition = new QgsComposition( QgsProject::instance() );
35473564
QDomNodeList compositionNodeList = composerElem.elementsByTagName( QStringLiteral( "Composition" ) );
35483565
if ( compositionNodeList.size() > 0 )
35493566
{

‎src/app/composer/qgscomposer.h‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,16 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
114114
*/
115115
bool loadFromTemplate( const QDomDocument& templateDoc, bool clearExisting );
116116

117+
public slots:
118+
119+
/**
120+
* Should be called whenever the app's canvas layers change (or layer order
121+
* changes). Required to update composer maps which are synced to the canvas
122+
* layer set with the new canvas layer set.
123+
* @note added in QGIS 3.0
124+
*/
125+
void onCanvasLayersChanged( const QList< QgsMapLayer* >& layers );
126+
117127
protected:
118128
//! Move event
119129
virtual void moveEvent( QMoveEvent * ) override;

‎src/app/composer/qgscomposermapwidget.cpp‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -905,20 +905,20 @@ void QgsComposerMapWidget::on_mKeepLayerListCheckBox_stateChanged( int state )
905905
return;
906906
}
907907

908+
// update map
909+
storeCurrentLayerSet();
910+
mComposerMap->setKeepLayerSet( state == Qt::Checked );
911+
912+
// update gui
908913
if ( state == Qt::Checked )
909914
{
910-
storeCurrentLayerSet();
911-
mComposerMap->setKeepLayerSet( true );
912-
913915
// mutually exclusive with following a preset
914916
mFollowVisibilityPresetCheckBox->setCheckState( Qt::Unchecked );
915917
}
916918
else
917919
{
918-
mComposerMap->setLayers( QList<QgsMapLayer*>() );
919-
mComposerMap->setKeepLayerSet( false );
920-
921920
mKeepLayerStylesCheckBox->setChecked( Qt::Unchecked );
921+
mComposerMap->updateCachedImage();
922922
}
923923

924924
mKeepLayerStylesCheckBox->setEnabled( state == Qt::Checked );

‎src/app/qgisapp.cpp‎

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6773,9 +6773,11 @@ QgsComposer* QgisApp::createNewComposer( QString title )
67736773
mPrintComposersMenu->addAction( newComposerObject->windowAction() );
67746774
newComposerObject->open();
67756775
emit composerAdded( newComposerObject->view() );
6776-
connect( newComposerObject, SIGNAL( composerAdded( QgsComposerView* ) ), this, SIGNAL( composerAdded( QgsComposerView* ) ) );
6777-
connect( newComposerObject, SIGNAL( composerWillBeRemoved( QgsComposerView* ) ), this, SIGNAL( composerWillBeRemoved( QgsComposerView* ) ) );
6778-
connect( newComposerObject, SIGNAL( atlasPreviewFeatureChanged() ), this, SLOT( refreshMapCanvas() ) );
6776+
connect( newComposerObject, &QgsComposer::composerAdded, this, &QgisApp::composerAdded );
6777+
connect( newComposerObject, &QgsComposer::composerWillBeRemoved, this, &QgisApp::composerWillBeRemoved );
6778+
connect( newComposerObject, &QgsComposer::atlasPreviewFeatureChanged, this, &QgisApp::refreshMapCanvas );
6779+
connect( mLayerTreeCanvasBridge, &QgsLayerTreeMapCanvasBridge::canvasLayersChanged, newComposerObject, &QgsComposer::onCanvasLayersChanged );
6780+
67796781
markDirty();
67806782
return newComposerObject;
67816783
}
@@ -6875,9 +6877,10 @@ bool QgisApp::loadComposersFromProject( const QDomDocument& doc )
68756877
composerView->updateRulers();
68766878
}
68776879
emit composerAdded( composer->view() );
6878-
connect( composer, SIGNAL( composerAdded( QgsComposerView* ) ), this, SIGNAL( composerAdded( QgsComposerView* ) ) );
6879-
connect( composer, SIGNAL( composerWillBeRemoved( QgsComposerView* ) ), this, SIGNAL( composerWillBeRemoved( QgsComposerView* ) ) );
6880-
connect( composer, SIGNAL( atlasPreviewFeatureChanged() ), this, SLOT( refreshMapCanvas() ) );
6880+
connect( composer, &QgsComposer::composerAdded, this, &QgisApp::composerAdded );
6881+
connect( composer, &QgsComposer::composerWillBeRemoved, this, &QgisApp::composerWillBeRemoved );
6882+
connect( composer, &QgsComposer::atlasPreviewFeatureChanged, this, &QgisApp::refreshMapCanvas );
6883+
connect( mLayerTreeCanvasBridge, &QgsLayerTreeMapCanvasBridge::canvasLayersChanged, composer, &QgsComposer::onCanvasLayersChanged );
68816884

68826885
QgsDebugMsg( QString( "Loaded composer %1: %2ms" ).arg( title ).arg( t.elapsed() ) );
68836886
}

‎src/core/composer/qgscomposermap.cpp‎

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -523,15 +523,11 @@ QList<QgsMapLayer*> QgsComposerMap::layersToRender( const QgsExpressionContext*
523523
if ( mComposition->project()->mapThemeCollection()->hasMapTheme( presetName ) )
524524
renderLayers = mComposition->project()->mapThemeCollection()->mapThemeVisibleLayers( presetName );
525525
else // fallback to using map canvas layers
526-
renderLayers = mComposition->mapSettings().layers();
527-
}
528-
else if ( mKeepLayerSet )
529-
{
530-
renderLayers = layers();
526+
renderLayers = layers();
531527
}
532528
else
533529
{
534-
renderLayers = mComposition->mapSettings().layers();
530+
renderLayers = layers();
535531
}
536532

537533
bool ok = false;

‎src/core/composer/qgscomposermap.h‎

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,14 +202,36 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem
202202
PreviewMode previewMode() const {return mPreviewMode;}
203203
void setPreviewMode( PreviewMode m );
204204

205-
//! Getter for flag that determines if the stored layer set should be used or the current layer set of the qgis mapcanvas
205+
/**
206+
* Getter for flag that determines if a stored layer set should be used
207+
* or the current layer set of the QGIS map canvas.
208+
* @see setKeepLayerSet()
209+
* @see layers()
210+
*/
206211
bool keepLayerSet() const {return mKeepLayerSet;}
207-
//! Setter for flag that determines if the stored layer set should be used or the current layer set of the qgis mapcanvas
212+
213+
/**
214+
* Setter for flag that determines if the stored layer set should be used
215+
* or the current layer set of the QGIS map canvas.
216+
* @see keepLayerSet()
217+
* @see layers()
218+
*/
208219
void setKeepLayerSet( bool enabled ) {mKeepLayerSet = enabled;}
209220

210-
//! Getter for stored layer set that is used if mKeepLayerSet is true
221+
/**
222+
* Getter for stored layer set. This will usually be synchronized with the main app canvas
223+
* layer set (and layer order), unless the keepLayerSet() flag is true.
224+
* @see setLayers()
225+
* @see keepLayerSet()
226+
*/
211227
QList<QgsMapLayer*> layers() const;
212-
//! Setter for stored layer set that is used if mKeepLayerSet is true
228+
229+
/**
230+
* Setter for stored layer set. This will usually be synchronized with the main app canvas
231+
* layer set (and layer order), unless the keepLayerSet() flag is true.
232+
* @see layers()
233+
* @see keepLayerSet()
234+
*/
213235
void setLayers( const QList<QgsMapLayer*> layers );
214236

215237
//! Getter for flag that determines if current styles of layers should be overridden by previously stored styles. @note added in 2.8

‎src/core/composer/qgscomposition.cpp‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,8 @@
6060
#include "gdal.h"
6161
#include "cpl_conv.h"
6262

63-
QgsComposition::QgsComposition( const QgsMapSettings& mapSettings, QgsProject* project )
63+
QgsComposition::QgsComposition( QgsProject* project )
6464
: QGraphicsScene( nullptr )
65-
, mMapSettings( mapSettings )
6665
, mProject( project )
6766
, mAtlasComposition( this )
6867
{

0 commit comments

Comments
 (0)