@@ -661,6 +661,7 @@ bool QgsLegend::writeXML( QDomNode & layer_node, QDomDocument & document )
661
661
QDomElement legendpropertynode;
662
662
QDomElement legendlayerfilenode;
663
663
QgsLegendLayerFile* llf;
664
+ Qt::CheckState cstate; // check state for legend layers
664
665
665
666
QTreeWidgetItem* currentItem = firstItem ();
666
667
while (currentItem)
@@ -706,6 +707,19 @@ bool QgsLegend::writeXML( QDomNode & layer_node, QDomDocument & document )
706
707
{
707
708
legendlayernode.setAttribute (" open" ," false" );
708
709
}
710
+ cstate = item->checkState (0 );
711
+ if (cstate == Qt::Checked)
712
+ {
713
+ legendlayernode.setAttribute (" checked" ," Qt::Checked" );
714
+ }
715
+ else if (cstate == Qt::Unchecked)
716
+ {
717
+ legendlayernode.setAttribute (" checked" ," Qt::Unchecked" );
718
+ }
719
+ else if (cstate == Qt::PartiallyChecked)
720
+ {
721
+ legendlayernode.setAttribute (" checked" ," Qt::PartiallyChecked" );
722
+ }
709
723
legendlayernode.setAttribute (" name" , item->text (0 ));
710
724
legendnode.appendChild (legendlayernode);
711
725
break ;
@@ -769,6 +783,132 @@ bool QgsLegend::writeXML( QDomNode & layer_node, QDomDocument & document )
769
783
return true ;
770
784
}
771
785
786
+ bool QgsLegend::readXML (QDomNode& legendnode)
787
+ {
788
+ QDomElement childelem;
789
+ QDomNode child;
790
+ QgsLegendGroup* lastGroup = 0 ; // pointer to the last inserted group
791
+ QgsLegendLayer* lastLayer = 0 ; // pointer to the last inserted legendlayer
792
+ QgsLegendLayerFileGroup* lastLayerFileGroup = 0 ; // pointer to the last inserted layerfilegroup
793
+
794
+ child = legendnode.firstChild ();
795
+
796
+ if (!child.isNull ())
797
+ {
798
+ clear (); // remove all items first
799
+ mStateOfCheckBoxes .clear ();
800
+
801
+ do
802
+ {
803
+ QDomElement childelem = child.toElement ();
804
+ QString name = childelem.attribute (" name" );
805
+
806
+ // test every possibility of element...
807
+ if (childelem.tagName ()==" legendgroup" )
808
+ {
809
+ QgsLegendGroup* theGroup = new QgsLegendGroup (this , name);
810
+ childelem.attribute (" open" ) == " true" ? expandItem (theGroup) : collapseItem (theGroup);
811
+ lastGroup = theGroup;
812
+ }
813
+ else if (childelem.tagName ()==" legendlayer" )
814
+ {
815
+ // add the legendlayer to the legend (but no legendlayerfile yet, follows later)
816
+ // if childelem is in a legendgroup element, add the layer to the group
817
+ QgsLegendLayer* theLayer;
818
+ if (child.parentNode ().toElement ().tagName () == " legendgroup" )
819
+ {
820
+ theLayer = new QgsLegendLayer (lastGroup, name);
821
+ }
822
+ else
823
+ {
824
+ theLayer = new QgsLegendLayer (this , name);
825
+ lastGroup = 0 ;
826
+ }
827
+ childelem.attribute (" open" ) == " true" ? expandItem (theLayer) : collapseItem (theLayer);
828
+
829
+ // set the checkbox of the legend layer to the right state
830
+ blockSignals (true );
831
+ QString checked = childelem.attribute (" checked" );
832
+ if (checked == " Qt::Checked" )
833
+ {
834
+ theLayer->setCheckState (0 , Qt::Checked);
835
+ mStateOfCheckBoxes .insert (std::make_pair (theLayer, Qt::Checked));
836
+ }
837
+ else if (checked == " Qt::Unchecked" )
838
+ {
839
+ theLayer->setCheckState (0 , Qt::Unchecked);
840
+ mStateOfCheckBoxes .insert (std::make_pair (theLayer, Qt::Unchecked));
841
+ }
842
+ else if (checked == " Qt::PartiallyChecked" )
843
+ {
844
+ theLayer->setCheckState (0 , Qt::PartiallyChecked);
845
+ mStateOfCheckBoxes .insert (std::make_pair (theLayer, Qt::PartiallyChecked));
846
+ }
847
+ blockSignals (false );
848
+
849
+ lastLayer = theLayer;
850
+ }
851
+ else if (childelem.tagName ()==" legendlayerfile" )
852
+ {
853
+ // find out the legendlayer
854
+ std::map<QString,QgsMapLayer*> mapLayers = QgsMapLayerRegistry::instance ()->mapLayers ();
855
+ std::map<QString, QgsMapLayer*>::const_iterator iter = mapLayers.find (childelem.attribute (" layerid" ));
856
+ if (iter != mapLayers.end () && lastLayerFileGroup)
857
+ {
858
+ QgsMapLayer* theMapLayer = iter->second ;
859
+ QgsLegendLayerFile* theLegendLayerFile = new QgsLegendLayerFile (lastLayerFileGroup, QgsLegendLayerFile::nameFromLayer (theMapLayer), theMapLayer);
860
+ // set the check state
861
+ blockSignals (true );
862
+ if (theMapLayer->visible ())
863
+ {
864
+ mStateOfCheckBoxes .insert (std::make_pair (theLegendLayerFile, Qt::Checked));
865
+ theLegendLayerFile->setCheckState (0 , Qt::Checked);
866
+ }
867
+ else
868
+ {
869
+ mStateOfCheckBoxes .insert (std::make_pair (theLegendLayerFile, Qt::Unchecked));
870
+ theLegendLayerFile->setCheckState (0 , Qt::Unchecked);
871
+ }
872
+ blockSignals (false );
873
+
874
+ }
875
+ }
876
+ else if (childelem.tagName ()==" filegroup" )
877
+ {
878
+ QgsLegendLayerFileGroup* theFileGroup = new QgsLegendLayerFileGroup (lastLayer, " Files" );
879
+ childelem.attribute (" open" ) == " true" ? expandItem (theFileGroup) : collapseItem (theFileGroup);
880
+ lastLayerFileGroup = theFileGroup;
881
+ }
882
+ else if (childelem.tagName () == " symbolgroup" )
883
+ {
884
+ QgsLegendSymbologyGroup* theSymbologyGroup = new QgsLegendSymbologyGroup (lastLayer, " Symbology" );
885
+ childelem.attribute (" open" ) == " true" ? expandItem (theSymbologyGroup) : collapseItem (theSymbologyGroup);
886
+ // set symbology parent for all layers
887
+ std::list<QgsMapLayer*> layerList = lastLayer->mapLayers ();
888
+ for (std::list<QgsMapLayer*>::iterator iter = layerList.begin (); iter != layerList.end (); ++iter)
889
+ {
890
+ (*iter)->setLegendSymbologyGroupParent (theSymbologyGroup);
891
+ }
892
+ // render the legend
893
+ if (lastLayer->firstMapLayer ())
894
+ {
895
+ lastLayer->firstMapLayer ()->refreshLegend ();
896
+ }
897
+ }
898
+ else if (childelem.tagName () == " propertygroup" )
899
+ {
900
+ QgsLegendPropertyGroup* thePropertyGroup = new QgsLegendPropertyGroup (lastLayer, " Properties" );
901
+ childelem.attribute (" open" ) == " true" ? expandItem (thePropertyGroup) : collapseItem (thePropertyGroup);
902
+ }
903
+
904
+ child = nextDomNode (child);
905
+ }
906
+ while (!(child.isNull ()));
907
+ }
908
+ return true ;
909
+ }
910
+
911
+ #if 0
772
912
bool QgsLegend::readXML(QDomNode& legendnode)
773
913
{
774
914
QString open;
@@ -995,6 +1135,7 @@ bool QgsLegend::readXML(QDomNode& legendnode)
995
1135
}
996
1136
return true;
997
1137
}
1138
+ #endif // 0
998
1139
999
1140
void QgsLegend::storeInitialPosition (QTreeWidgetItem* li)
1000
1141
{
@@ -1133,6 +1274,31 @@ QTreeWidgetItem* QgsLegend::previousSibling(QTreeWidgetItem* item)
1133
1274
}
1134
1275
}
1135
1276
1277
+ QDomNode QgsLegend::nextDomNode (const QDomNode& theNode)
1278
+ {
1279
+ if (!theNode.firstChild ().isNull ())
1280
+ {
1281
+ return (theNode.firstChild ());
1282
+ }
1283
+ else if (!theNode.nextSibling ().isNull ())
1284
+ {
1285
+ return (theNode.nextSibling ());
1286
+ }
1287
+ else if (!theNode.parentNode ().isNull () && !theNode.parentNode ().nextSibling ().isNull ())
1288
+ {
1289
+ return (theNode.parentNode ().nextSibling ());
1290
+ }
1291
+ else if (!theNode.parentNode ().isNull () && !theNode.parentNode ().parentNode ().isNull () && !theNode.parentNode ().parentNode ().nextSibling ().isNull ())
1292
+ {
1293
+ return (theNode.parentNode ().parentNode ().nextSibling ());
1294
+ }
1295
+ else
1296
+ {
1297
+ QDomNode nullNode;
1298
+ return nullNode;
1299
+ }
1300
+ }
1301
+
1136
1302
void QgsLegend::moveItem (QTreeWidgetItem* move, QTreeWidgetItem* after)
1137
1303
{
1138
1304
if (move->parent ())
0 commit comments