Skip to content

Commit 205daae

Browse files
committed
Support overriden layer styles also in the composer legend
1 parent ea64d32 commit 205daae

9 files changed

+95
-3
lines changed

python/core/composer/qgscomposermap.sip

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,12 @@ class QgsComposerMap : QgsComposerItem
755755
/**Is emitted when the map has been prepared for atlas rendering, just before actual rendering*/
756756
void preparedForAtlas();
757757

758+
/** Emitted when layer style overrides are changed... a means to let
759+
* associated legend items know they should update
760+
* @note added in 2.10
761+
*/
762+
void layerStyleOverridesChanged();
763+
758764
public slots:
759765

760766
/**Forces an update of the cached map image*/

python/core/layertree/qgslayertreemodel.sip

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,13 @@ class QgsLayerTreeModel : QAbstractItemModel
142142
//! @note added in 2.6
143143
void legendMapViewData( double *mapUnitsPerPixel /Out/, int *dpi /Out/, double *scale /Out/ );
144144

145+
//! Get map of map layer style overrides (key: layer ID, value: style name) where a different style should be used instead of the current one
146+
//! @note added in 2.10
147+
QMap<QString, QString> layerStyleOverrides() const;
148+
//! Set map of map layer style overrides (key: layer ID, value: style name) where a different style should be used instead of the current one
149+
//! @note added in 2.10
150+
void setLayerStyleOverrides( const QMap<QString, QString>& overrides );
151+
145152
//! Return true if index represents a legend node (instead of layer node)
146153
//! @deprecated use index2legendNode()
147154
bool isIndexSymbologyNode( const QModelIndex& index ) const /Deprecated/;

src/core/composer/qgscomposerlegend.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,7 @@ void QgsComposerLegend::setComposerMap( const QgsComposerMap* map )
510510
disconnect( mComposerMap, SIGNAL( destroyed( QObject* ) ), this, SLOT( invalidateCurrentMap() ) );
511511
disconnect( mComposerMap, SIGNAL( itemChanged() ), this, SLOT( updateFilterByMap() ) );
512512
disconnect( mComposerMap, SIGNAL( extentChanged() ), this, SLOT( updateFilterByMap() ) );
513+
disconnect( mComposerMap, SIGNAL( layerStyleOverridesChanged() ), this, SLOT( mapLayerStyleOverridesChanged() ) );
513514
}
514515

515516
mComposerMap = map;
@@ -519,6 +520,7 @@ void QgsComposerLegend::setComposerMap( const QgsComposerMap* map )
519520
QObject::connect( map, SIGNAL( destroyed( QObject* ) ), this, SLOT( invalidateCurrentMap() ) );
520521
QObject::connect( map, SIGNAL( itemChanged() ), this, SLOT( updateFilterByMap() ) );
521522
QObject::connect( map, SIGNAL( extentChanged() ), this, SLOT( updateFilterByMap() ) );
523+
QObject::connect( map, SIGNAL( layerStyleOverridesChanged() ), this, SLOT( mapLayerStyleOverridesChanged() ) );
522524
}
523525

524526
updateFilterByMap();
@@ -529,11 +531,33 @@ void QgsComposerLegend::invalidateCurrentMap()
529531
setComposerMap( 0 );
530532
}
531533

534+
void QgsComposerLegend::mapLayerStyleOverridesChanged()
535+
{
536+
if ( !mComposerMap )
537+
return;
538+
539+
// map's style has been changed, so make sure to update the legend here
540+
541+
mLegendModel2->setLayerStyleOverrides( mComposerMap->layerStyleOverrides() );
542+
543+
foreach ( QgsLayerTreeLayer* nodeLayer, mLegendModel2->rootGroup()->findLayers() )
544+
mLegendModel2->refreshLayerLegend( nodeLayer );
545+
546+
adjustBoxSize();
547+
update();
548+
}
549+
532550
void QgsComposerLegend::updateFilterByMap()
533551
{
534552
if ( isRemoved() )
535553
return;
536554

555+
if ( mComposerMap )
556+
mLegendModel2->setLayerStyleOverrides( mComposerMap->layerStyleOverrides() );
557+
else
558+
mLegendModel2->setLayerStyleOverrides( QMap<QString, QString>() );
559+
560+
537561
if ( mComposerMap && mLegendFilterByMap )
538562
{
539563
int dpi = mComposition->printResolution();

src/core/composer/qgscomposerlegend.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,9 @@ class CORE_EXPORT QgsComposerLegend : public QgsComposerItem
186186
private slots:
187187
void updateFilterByMap();
188188

189+
//! update legend in case style of associated map has changed
190+
void mapLayerStyleOverridesChanged();
191+
189192
private:
190193
QgsComposerLegend(); //forbidden
191194

src/core/composer/qgscomposermap.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1529,6 +1529,17 @@ void QgsComposerMap::storeCurrentLayerSet()
15291529
}
15301530
}
15311531

1532+
1533+
void QgsComposerMap::setLayerStyleOverrides(const QMap<QString, QString>& overrides)
1534+
{
1535+
if ( overrides == mLayerStyleOverrides )
1536+
return;
1537+
1538+
mLayerStyleOverrides = overrides;
1539+
emit layerStyleOverridesChanged(); // associated legends may listen to this
1540+
}
1541+
1542+
15321543
void QgsComposerMap::storeCurrentLayerStyles()
15331544
{
15341545
mLayerStyleOverrides.clear();

src/core/composer/qgscomposermap.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem
255255
/**Getter for stored overrides of styles for layers. @note added in 2.8 */
256256
QMap<QString, QString> layerStyleOverrides() const { return mLayerStyleOverrides; }
257257
/**Setter for stored overrides of styles for layers. @note added in 2.8 */
258-
void setLayerStyleOverrides( const QMap<QString, QString>& overrides ) { mLayerStyleOverrides = overrides; }
258+
void setLayerStyleOverrides( const QMap<QString, QString>& overrides );
259259
/**Stores the current layer styles into style overrides. @note added in 2.8 */
260260
void storeCurrentLayerStyles();
261261

@@ -794,6 +794,12 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem
794794
/**Is emitted when the map has been prepared for atlas rendering, just before actual rendering*/
795795
void preparedForAtlas();
796796

797+
/** Emitted when layer style overrides are changed... a means to let
798+
* associated legend items know they should update
799+
* @note added in 2.10
800+
*/
801+
void layerStyleOverridesChanged();
802+
797803
public slots:
798804

799805
/**Forces an update of the cached map image*/

src/core/layertree/qgslayertreemodel.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "qgsdataitem.h"
2525
#include "qgsmaphittest.h"
2626
#include "qgsmaplayerlegend.h"
27+
#include "qgsmaplayerstylemanager.h"
2728
#include "qgspluginlayer.h"
2829
#include "qgsrasterlayer.h"
2930
#include "qgsrendererv2.h"
@@ -602,6 +603,16 @@ void QgsLayerTreeModel::legendMapViewData( double* mapUnitsPerPixel, int* dpi, d
602603
if ( scale ) *scale = mLegendMapViewScale;
603604
}
604605

606+
QMap<QString, QString> QgsLayerTreeModel::layerStyleOverrides() const
607+
{
608+
return mLayerStyleOverrides;
609+
}
610+
611+
void QgsLayerTreeModel::setLayerStyleOverrides( const QMap<QString, QString>& overrides )
612+
{
613+
mLayerStyleOverrides = overrides;
614+
}
615+
605616
void QgsLayerTreeModel::nodeWillAddChildren( QgsLayerTreeNode* node, int indexFrom, int indexTo )
606617
{
607618
Q_ASSERT( node );
@@ -1064,10 +1075,15 @@ void QgsLayerTreeModel::addLegendToLayer( QgsLayerTreeLayer* nodeL )
10641075
if ( !nodeL->layer() )
10651076
return;
10661077

1067-
QgsMapLayerLegend* layerLegend = nodeL->layer()->legend();
1078+
QgsMapLayer* ml = nodeL->layer();
1079+
QgsMapLayerLegend* layerLegend = ml->legend();
10681080
if ( !layerLegend )
10691081
return;
10701082

1083+
bool hasStyleOverride = mLayerStyleOverrides.contains( ml->id() );
1084+
if ( hasStyleOverride )
1085+
ml->styleManager()->setOverrideStyle( mLayerStyleOverrides.value( ml->id() ) );
1086+
10711087
QList<QgsLayerTreeModelLegendNode*> lstNew = layerLegend->createLayerTreeModelLegendNodes( nodeL );
10721088

10731089
// apply filtering defined in layer node's custom properties (reordering, filtering, custom labels)
@@ -1099,6 +1115,9 @@ void QgsLayerTreeModel::addLegendToLayer( QgsLayerTreeLayer* nodeL )
10991115
mLegend[nodeL] = data;
11001116

11011117
if ( ! isEmbedded ) endInsertRows();
1118+
1119+
if ( hasStyleOverride )
1120+
ml->styleManager()->restoreOverrideStyle();
11021121
}
11031122

11041123

src/core/layertree/qgslayertreemodel.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,13 @@ class CORE_EXPORT QgsLayerTreeModel : public QAbstractItemModel
164164
//! @note added in 2.6
165165
void legendMapViewData( double *mapUnitsPerPixel, int *dpi, double *scale );
166166

167+
//! Get map of map layer style overrides (key: layer ID, value: style name) where a different style should be used instead of the current one
168+
//! @note added in 2.10
169+
QMap<QString, QString> layerStyleOverrides() const;
170+
//! Set map of map layer style overrides (key: layer ID, value: style name) where a different style should be used instead of the current one
171+
//! @note added in 2.10
172+
void setLayerStyleOverrides( const QMap<QString, QString>& overrides );
173+
167174
//! Return true if index represents a legend node (instead of layer node)
168175
//! @deprecated use index2legendNode()
169176
Q_DECL_DEPRECATED bool isIndexSymbologyNode( const QModelIndex& index ) const;
@@ -269,6 +276,10 @@ class CORE_EXPORT QgsLayerTreeModel : public QAbstractItemModel
269276

270277
void tryBuildLegendTree( LayerLegendData& data );
271278

279+
//! Overrides of map layers' styles: key = layer ID, value = style XML.
280+
//! This allows to show legend that is different from the current style of layers
281+
QMap<QString, QString> mLayerStyleOverrides;
282+
272283
//! Per layer data about layer's legend nodes
273284
QMap<QgsLayerTreeLayer*, LayerLegendData> mLegend;
274285

src/core/qgsmaplayerstylemanager.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ bool QgsMapLayerStyleManager::setOverrideStyle( const QString& styleDef )
166166
if ( mOverriddenOriginalStyle )
167167
return false; // cannot override the style more than once!
168168

169+
mLayer->blockSignals( true );
169170
if ( mStyles.contains( styleDef ) )
170171
{
171172
mOverriddenOriginalStyle = new QgsMapLayerStyle;
@@ -183,16 +184,20 @@ bool QgsMapLayerStyleManager::setOverrideStyle( const QString& styleDef )
183184
QgsMapLayerStyle overrideStyle( styleDef );
184185
overrideStyle.writeToLayer( mLayer );
185186
}
187+
mLayer->blockSignals( false );
186188

187-
return false;
189+
return true;
188190
}
189191

190192
bool QgsMapLayerStyleManager::restoreOverrideStyle()
191193
{
192194
if ( !mOverriddenOriginalStyle )
193195
return false;
194196

197+
mLayer->blockSignals( true );
195198
mOverriddenOriginalStyle->writeToLayer( mLayer );
199+
mLayer->blockSignals( false );
200+
196201
delete mOverriddenOriginalStyle;
197202
mOverriddenOriginalStyle = 0;
198203
return true;

0 commit comments

Comments
 (0)