@@ -43,9 +43,10 @@ QgsLayerTreeModel::QgsLayerTreeModel( QgsLayerTreeGroup* rootNode, QObject *pare
4343
4444QgsLayerTreeModel::~QgsLayerTreeModel ()
4545{
46- foreach ( QList<QgsLayerTreeModelLegendNode*> nodeL, mSymbologyNodes )
46+ foreach ( QList<QgsLayerTreeModelLegendNode*> nodeL, mOriginalSymbologyNodes )
4747 qDeleteAll ( nodeL );
48- mSymbologyNodes .clear ();
48+ mOriginalSymbologyNodes .clear ();
49+ mSymbologyNodes .clear (); // does not own the nodes
4950}
5051
5152QgsLayerTreeNode* QgsLayerTreeModel::index2node ( const QModelIndex& index ) const
@@ -458,6 +459,7 @@ void QgsLayerTreeModel::setRootGroup( QgsLayerTreeGroup* newRootGroup )
458459 disconnectFromRootNode ();
459460
460461 Q_ASSERT ( mSymbologyNodes .isEmpty () );
462+ Q_ASSERT ( mOriginalSymbologyNodes .isEmpty () );
461463
462464 mRootNode = newRootGroup;
463465
@@ -541,6 +543,16 @@ QFont QgsLayerTreeModel::layerTreeNodeFont( int nodeType ) const
541543 }
542544}
543545
546+ void QgsLayerTreeModel::setLegendFilterByScale ( double scaleDenominator )
547+ {
548+ mLegendFilterByScale = scaleDenominator;
549+
550+ // this could be later done in more efficient way
551+ // by just updating active legend nodes, without refreshing original legend nodes
552+ foreach ( QgsLayerTreeLayer* nodeLayer, mRootNode ->findLayers () )
553+ refreshLayerSymbology ( nodeLayer );
554+ }
555+
544556void QgsLayerTreeModel::nodeWillAddChildren ( QgsLayerTreeNode* node, int indexFrom, int indexTo )
545557{
546558 Q_ASSERT ( node );
@@ -664,7 +676,8 @@ void QgsLayerTreeModel::removeSymbologyFromLayer( QgsLayerTreeLayer* nodeLayer )
664676{
665677 if ( mSymbologyNodes .contains ( nodeLayer ) )
666678 {
667- qDeleteAll ( mSymbologyNodes [nodeLayer] );
679+ qDeleteAll ( mOriginalSymbologyNodes [nodeLayer] );
680+ mOriginalSymbologyNodes .remove ( nodeLayer );
668681 mSymbologyNodes .remove ( nodeLayer );
669682 }
670683}
@@ -681,12 +694,15 @@ void QgsLayerTreeModel::addSymbologyToLayer( QgsLayerTreeLayer* nodeL )
681694
682695 QList<QgsLayerTreeModelLegendNode*> lstNew = layerLegend->createLayerTreeModelLegendNodes ( nodeL );
683696
684- beginInsertRows ( node2index ( nodeL ), 0 , lstNew.count () - 1 );
697+ QList<QgsLayerTreeModelLegendNode*> filteredLstNew = filterLegendNodes ( lstNew );
698+
699+ beginInsertRows ( node2index ( nodeL ), 0 , filteredLstNew.count () - 1 );
685700
686701 foreach ( QgsLayerTreeModelLegendNode* n, lstNew )
687702 n->setParent ( nodeL );
688703
689- mSymbologyNodes [nodeL] = lstNew;
704+ mOriginalSymbologyNodes [nodeL] = lstNew;
705+ mSymbologyNodes [nodeL] = filteredLstNew;
690706
691707 endInsertRows ();
692708}
@@ -954,3 +970,16 @@ const QIcon& QgsLayerTreeModel::iconGroup()
954970
955971 return icon;
956972}
973+
974+ QList<QgsLayerTreeModelLegendNode*> QgsLayerTreeModel::filterLegendNodes ( const QList<QgsLayerTreeModelLegendNode*>& nodes )
975+ {
976+ QList<QgsLayerTreeModelLegendNode*> filtered;
977+ foreach ( QgsLayerTreeModelLegendNode* node, nodes )
978+ {
979+ if ( mLegendFilterByScale > 0 && !node->isScaleOK ( mLegendFilterByScale ) )
980+ continue ;
981+
982+ filtered << node;
983+ }
984+ return filtered;
985+ }
0 commit comments