@@ -36,19 +36,9 @@ QgsLayerTreeModel::QgsLayerTreeModel( QgsLayerTreeGroup* rootNode, QObject *pare
36
36
, mFlags( ShowSymbology | AllowSymbologyChangeState )
37
37
, mAutoCollapseSymNodesCount( -1 )
38
38
{
39
- Q_ASSERT ( mRootNode );
40
-
41
- connect ( mRootNode , SIGNAL ( willAddChildren ( QgsLayerTreeNode*, int , int ) ), this , SLOT ( nodeWillAddChildren ( QgsLayerTreeNode*, int , int ) ) );
42
- connect ( mRootNode , SIGNAL ( addedChildren ( QgsLayerTreeNode*, int , int ) ), this , SLOT ( nodeAddedChildren ( QgsLayerTreeNode*, int , int ) ) );
43
- connect ( mRootNode , SIGNAL ( willRemoveChildren ( QgsLayerTreeNode*, int , int ) ), this , SLOT ( nodeWillRemoveChildren ( QgsLayerTreeNode*, int , int ) ) );
44
- connect ( mRootNode , SIGNAL ( removedChildren ( QgsLayerTreeNode*, int , int ) ), this , SLOT ( nodeRemovedChildren () ) );
45
- connect ( mRootNode , SIGNAL ( visibilityChanged ( QgsLayerTreeNode*, Qt::CheckState ) ), this , SLOT ( nodeVisibilityChanged ( QgsLayerTreeNode* ) ) );
46
-
47
- connect ( mRootNode , SIGNAL ( customPropertyChanged ( QgsLayerTreeNode*, QString ) ), this , SLOT ( nodeCustomPropertyChanged ( QgsLayerTreeNode*, QString ) ) );
39
+ connectToRootNode ();
48
40
49
41
mFontLayer .setBold ( true );
50
-
51
- connectToLayers ( mRootNode );
52
42
}
53
43
54
44
QgsLayerTreeModel::~QgsLayerTreeModel ()
@@ -461,6 +451,21 @@ QgsLayerTreeGroup*QgsLayerTreeModel::rootGroup()
461
451
return mRootNode ;
462
452
}
463
453
454
+ void QgsLayerTreeModel::setRootGroup ( QgsLayerTreeGroup* newRootGroup )
455
+ {
456
+ beginResetModel ();
457
+
458
+ disconnectFromRootNode ();
459
+
460
+ Q_ASSERT ( mSymbologyNodes .isEmpty () );
461
+
462
+ mRootNode = newRootGroup;
463
+
464
+ connectToRootNode ();
465
+
466
+ endResetModel ();
467
+ }
468
+
464
469
void QgsLayerTreeModel::refreshLayerSymbology ( QgsLayerTreeLayer* nodeLayer )
465
470
{
466
471
// update title
@@ -609,6 +614,18 @@ void QgsLayerTreeModel::nodeLayerLoaded()
609
614
connectToLayer ( nodeLayer );
610
615
}
611
616
617
+ void QgsLayerTreeModel::nodeLayerWillBeUnloaded ()
618
+ {
619
+ QgsLayerTreeLayer* nodeLayer = qobject_cast<QgsLayerTreeLayer*>( sender () );
620
+ if ( !nodeLayer )
621
+ return ;
622
+
623
+ disconnectFromLayer ( nodeLayer );
624
+
625
+ // wait for the layer to appear again
626
+ connect ( nodeLayer, SIGNAL ( layerLoaded () ), this , SLOT ( nodeLayerLoaded () ) );
627
+ }
628
+
612
629
void QgsLayerTreeModel::layerLegendChanged ()
613
630
{
614
631
if ( !testFlag ( ShowSymbology ) )
@@ -685,6 +702,9 @@ void QgsLayerTreeModel::connectToLayer( QgsLayerTreeLayer* nodeLayer )
685
702
return ;
686
703
}
687
704
705
+ // watch if the layer is getting removed
706
+ connect ( nodeLayer, SIGNAL ( layerWillBeUnloaded () ), this , SLOT ( nodeLayerWillBeUnloaded () ) );
707
+
688
708
if ( testFlag ( ShowSymbology ) )
689
709
{
690
710
addSymbologyToLayer ( nodeLayer );
@@ -733,6 +753,8 @@ static int _numLayerCount( QgsLayerTreeGroup* group, const QString& layerId )
733
753
734
754
void QgsLayerTreeModel::disconnectFromLayer ( QgsLayerTreeLayer* nodeLayer )
735
755
{
756
+ disconnect ( nodeLayer, 0 , this , 0 ); // disconnect from delayed load of layer
757
+
736
758
if ( !nodeLayer->layer () )
737
759
return ; // we were never connected
738
760
@@ -759,6 +781,39 @@ void QgsLayerTreeModel::connectToLayers( QgsLayerTreeGroup* parentGroup )
759
781
}
760
782
}
761
783
784
+ void QgsLayerTreeModel::disconnectFromLayers ( QgsLayerTreeGroup* parentGroup )
785
+ {
786
+ foreach ( QgsLayerTreeNode* node, parentGroup->children () )
787
+ {
788
+ if ( QgsLayerTree::isGroup ( node ) )
789
+ disconnectFromLayers ( QgsLayerTree::toGroup ( node ) );
790
+ else if ( QgsLayerTree::isLayer ( node ) )
791
+ disconnectFromLayer ( QgsLayerTree::toLayer ( node ) );
792
+ }
793
+ }
794
+
795
+ void QgsLayerTreeModel::connectToRootNode ()
796
+ {
797
+ Q_ASSERT ( mRootNode );
798
+
799
+ connect ( mRootNode , SIGNAL ( willAddChildren ( QgsLayerTreeNode*, int , int ) ), this , SLOT ( nodeWillAddChildren ( QgsLayerTreeNode*, int , int ) ) );
800
+ connect ( mRootNode , SIGNAL ( addedChildren ( QgsLayerTreeNode*, int , int ) ), this , SLOT ( nodeAddedChildren ( QgsLayerTreeNode*, int , int ) ) );
801
+ connect ( mRootNode , SIGNAL ( willRemoveChildren ( QgsLayerTreeNode*, int , int ) ), this , SLOT ( nodeWillRemoveChildren ( QgsLayerTreeNode*, int , int ) ) );
802
+ connect ( mRootNode , SIGNAL ( removedChildren ( QgsLayerTreeNode*, int , int ) ), this , SLOT ( nodeRemovedChildren () ) );
803
+ connect ( mRootNode , SIGNAL ( visibilityChanged ( QgsLayerTreeNode*, Qt::CheckState ) ), this , SLOT ( nodeVisibilityChanged ( QgsLayerTreeNode* ) ) );
804
+
805
+ connect ( mRootNode , SIGNAL ( customPropertyChanged ( QgsLayerTreeNode*, QString ) ), this , SLOT ( nodeCustomPropertyChanged ( QgsLayerTreeNode*, QString ) ) );
806
+
807
+ connectToLayers ( mRootNode );
808
+ }
809
+
810
+ void QgsLayerTreeModel::disconnectFromRootNode ()
811
+ {
812
+ disconnect ( mRootNode , 0 , this , 0 );
813
+
814
+ disconnectFromLayers ( mRootNode );
815
+ }
816
+
762
817
void QgsLayerTreeModel::recursivelyEmitDataChanged ( const QModelIndex& idx )
763
818
{
764
819
QgsLayerTreeNode* node = index2node ( idx );
0 commit comments