Skip to content

Commit b41f3a7

Browse files
committedJan 24, 2017
[composer] Don't use canvas map settings to determine canvas layers
Instead make the layer tree canvas bridge advise on layer set changes, and tie this into composer. So now composer acts as a go-between to sync the composer map item's layer set to the layer tree/canvas layers. It's not an ideal solution, but avoids the hard link between compositions and the map canvas.
1 parent 9816938 commit b41f3a7

File tree

9 files changed

+83
-25
lines changed

9 files changed

+83
-25
lines changed
 

‎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: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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 )

‎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/gui/layertree/qgslayertreemapcanvasbridge.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ QgsLayerTreeMapCanvasBridge::QgsLayerTreeMapCanvasBridge( QgsLayerTreeGroup *roo
3434
, mAutoEnableCrsTransform( true )
3535
, mLastLayerCount( !root->findLayers().isEmpty() )
3636
{
37-
connect( root, SIGNAL( addedChildren( QgsLayerTreeNode*, int, int ) ), this, SLOT( nodeAddedChildren( QgsLayerTreeNode*, int, int ) ) );
38-
connect( root, SIGNAL( customPropertyChanged( QgsLayerTreeNode*, QString ) ), this, SLOT( nodeCustomPropertyChanged( QgsLayerTreeNode*, QString ) ) );
39-
connect( root, SIGNAL( removedChildren( QgsLayerTreeNode*, int, int ) ), this, SLOT( nodeRemovedChildren() ) );
37+
connect( root, &QgsLayerTreeGroup::addedChildren, this, &QgsLayerTreeMapCanvasBridge::nodeAddedChildren );
38+
connect( root, &QgsLayerTreeGroup::customPropertyChanged, this, &QgsLayerTreeMapCanvasBridge::nodeCustomPropertyChanged );
39+
connect( root, &QgsLayerTreeGroup::removedChildren, this, &QgsLayerTreeMapCanvasBridge::nodeRemovedChildren );
4040
connect( root, &QgsLayerTreeNode::visibilityChanged, this, &QgsLayerTreeMapCanvasBridge::nodeVisibilityChanged );
4141

4242
setCanvasLayers();
@@ -205,6 +205,8 @@ void QgsLayerTreeMapCanvasBridge::setCanvasLayers()
205205
mFirstCRS = QgsCoordinateReferenceSystem();
206206

207207
mPendingCanvasUpdate = false;
208+
209+
emit canvasLayersChanged( canvasLayers );
208210
}
209211

210212
void QgsLayerTreeMapCanvasBridge::readProject( const QDomDocument& doc )

‎src/gui/layertree/qgslayertreemapcanvasbridge.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,13 @@ class GUI_EXPORT QgsLayerTreeMapCanvasBridge : public QObject
9292
void hasCustomLayerOrderChanged( bool );
9393
void customLayerOrderChanged( const QStringList& order );
9494

95+
/**
96+
* Emitted when the set of layers (or order of layers) visible in the
97+
* canvas changes.
98+
* @note added in QGIS 3.0
99+
*/
100+
void canvasLayersChanged( const QList< QgsMapLayer* >& layers );
101+
95102
protected:
96103

97104
void defaultLayerOrder( QgsLayerTreeNode* node, QStringList& order ) const;

0 commit comments

Comments
 (0)
Please sign in to comment.