Skip to content

Commit c601e3b

Browse files
committed
Merge pull request #1424 from manisandro/autoupdate_composer_legend_symbols
Update composer legend entry when layer symbology changes.
2 parents 151d1f1 + 8ed8d15 commit c601e3b

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

src/core/composer/qgslegendmodel.cpp

+58
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,14 @@ void QgsLegendModel::removeLayer( const QString& layerId )
509509

510510
if ( layerId == lItem->layerID() )
511511
{
512+
if ( QgsMapLayerRegistry::instance() )
513+
{
514+
QgsMapLayer* layer = QgsMapLayerRegistry::instance()->mapLayer( lItem->layerID() );
515+
if ( layer )
516+
{
517+
disconnect( layer, SIGNAL( rendererChanged() ), this, SLOT( updateLayer() ) );
518+
}
519+
}
512520
removeRow( i ); //todo: also remove the subitems and their symbols...
513521
emit layersChanged();
514522
return;
@@ -554,9 +562,30 @@ void QgsLegendModel::addLayer( QgsMapLayer* theMapLayer, double scaleDenominator
554562
default:
555563
break;
556564
}
565+
566+
if ( mAutoUpdate )
567+
{
568+
connect( theMapLayer, SIGNAL( rendererChanged() ), this, SLOT( updateLayer() ) );
569+
}
570+
557571
emit layersChanged();
558572
}
559573

574+
void QgsLegendModel::updateLayer()
575+
{
576+
QString layerId = qobject_cast<QgsMapLayer*>( QObject::sender() )->id();
577+
578+
for ( int i = 0, n = rowCount(); i < n ; ++i )
579+
{
580+
QgsComposerLayerItem* lItem = dynamic_cast<QgsComposerLayerItem*>( item( i ) );
581+
if ( lItem && layerId == lItem->layerID() )
582+
{
583+
updateLayer( lItem );
584+
emit layersChanged();
585+
return;
586+
}
587+
}
588+
}
560589

561590
bool QgsLegendModel::writeXML( QDomElement& composerLegendElem, QDomDocument& doc ) const
562591
{
@@ -595,6 +624,9 @@ bool QgsLegendModel::readXML( const QDomElement& legendModelElem, const QDomDocu
595624
}
596625

597626
clear();
627+
//disable autoupdates here in order to have a setAutoUpdate(true)
628+
//below connect the rendererChanged signals to the layers
629+
setAutoUpdate( false );
598630

599631
QDomNodeList topLevelItemList = legendModelElem.childNodes();
600632
QDomElement currentElem;
@@ -834,6 +866,19 @@ void QgsLegendModel::setAutoUpdate( bool autoUpdate )
834866
{
835867
connect( QgsMapLayerRegistry::instance(), SIGNAL( layerWillBeRemoved( QString ) ), this, SLOT( removeLayer( const QString& ) ) );
836868
connect( QgsMapLayerRegistry::instance(), SIGNAL( layerWasAdded( QgsMapLayer* ) ), this, SLOT( addLayer( QgsMapLayer* ) ) );
869+
870+
for ( int i = 0, n = rowCount(); i < n ; ++i )
871+
{
872+
QgsComposerLayerItem* lItem = dynamic_cast<QgsComposerLayerItem*>( item( i ) );
873+
if ( lItem )
874+
{
875+
QgsMapLayer* layer = QgsMapLayerRegistry::instance()->mapLayer( lItem->layerID() );
876+
if ( layer )
877+
{
878+
connect( layer, SIGNAL( rendererChanged() ), this, SLOT( updateLayer() ) );
879+
}
880+
}
881+
}
837882
}
838883
}
839884
else
@@ -842,6 +887,19 @@ void QgsLegendModel::setAutoUpdate( bool autoUpdate )
842887
{
843888
disconnect( QgsMapLayerRegistry::instance(), SIGNAL( layerWillBeRemoved( QString ) ), this, SLOT( removeLayer( const QString& ) ) );
844889
disconnect( QgsMapLayerRegistry::instance(), SIGNAL( layerWasAdded( QgsMapLayer* ) ), this, SLOT( addLayer( QgsMapLayer* ) ) );
890+
891+
for ( int i = 0, n = rowCount(); i < n ; ++i )
892+
{
893+
QgsComposerLayerItem* lItem = dynamic_cast<QgsComposerLayerItem*>( item( i ) );
894+
if ( lItem )
895+
{
896+
QgsMapLayer* layer = QgsMapLayerRegistry::instance()->mapLayer( lItem->layerID() );
897+
if ( layer )
898+
{
899+
disconnect( layer, SIGNAL( rendererChanged() ), this, SLOT( updateLayer() ) );
900+
}
901+
}
902+
}
845903
}
846904
}
847905
}

src/core/composer/qgslegendmodel.h

+3
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ class CORE_EXPORT QgsLegendModel : public QStandardItemModel
9999
void removeLayer( const QString& layerId );
100100
void addLayer( QgsMapLayer* theMapLayer, double scaleDenominator = -1, QString rule = "" );
101101

102+
private slots:
103+
void updateLayer();
104+
102105
signals:
103106
void layersChanged();
104107

0 commit comments

Comments
 (0)