Skip to content

Commit 08e33d0

Browse files
author
mhugent
committedOct 1, 2005
reading/writing of the legend from/to project files. At the moment, readXML and writeXML functions are used. This may be changed to use QgsProject or QSettings functions in future
git-svn-id: http://svn.osgeo.org/qgis/trunk@4017 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 5e33e89 commit 08e33d0

10 files changed

+246
-11
lines changed
 

‎qgis.dtd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ outlinecolor,outlinestyle,outlinewidth,fillcolor,fillpattern) >
120120
<!ELEMENT legend (legendgroup* | legendlayer*) >
121121
<!ATTLIST legend open (1|0|true|false) "false"> #open or closed
122122
<!ELEMENT legendgroup>
123-
<!ATTLIST legendgroup open (1|0|true|false) "false"> #open or closed
123+
<!ATTLIST legendgroup open (1|0|true|false) "false" name CDATA> #open or closed
124124
<!ELEMENT legendlayer>
125125
<!ATTLIST legendlayer open (1|0|true|false) "false"> #open or closed
126126
<!ELEMENT legendlayerfilegroup>

‎src/legend/qgslegend.cpp

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,3 +633,199 @@ void QgsLegend::collapseAll()
633633
++it;
634634
}
635635
}
636+
637+
bool QgsLegend::writeXML( QDomNode & layer_node, QDomDocument & document )
638+
{
639+
QDomElement legendnode = document.createElement("legend");
640+
layer_node.appendChild(legendnode);
641+
642+
QDomElement tmplegendnode = legendnode; /*copy of the legendnode*/
643+
QDomElement legendgroupnode;
644+
QDomElement legendlayernode;
645+
QDomElement layerfilegroupnode;
646+
QDomElement legendsymbolnode;
647+
QDomElement legendpropertynode;
648+
649+
QListViewItemIterator it(this);
650+
while(it.current())
651+
{
652+
QgsLegendItem *item = dynamic_cast<QgsLegendItem*>(it.current());
653+
if(item)
654+
{
655+
switch(item->type())
656+
{
657+
case QgsLegendItem::LEGEND_GROUP:
658+
//make sure the legendnode is 'legend' again after a legend group
659+
if(!(item->parent()))
660+
{
661+
legendnode = tmplegendnode;
662+
}
663+
legendgroupnode = document.createElement("legendgroup");
664+
if(item->isOpen())
665+
{
666+
legendgroupnode.setAttribute("open","true");
667+
}
668+
else
669+
{
670+
legendgroupnode.setAttribute("open","false");
671+
}
672+
legendgroupnode.setAttribute("name",item->text(0));
673+
legendnode.appendChild(legendgroupnode);
674+
tmplegendnode = legendnode;
675+
legendnode = legendgroupnode;
676+
break;
677+
678+
case QgsLegendItem::LEGEND_LAYER:
679+
//make sure the legendnode is 'legend' again after a legend group
680+
if(!(item->parent()))
681+
{
682+
legendnode = tmplegendnode;
683+
}
684+
legendlayernode = document.createElement("legendlayer");
685+
if(item->isOpen())
686+
{
687+
legendlayernode.setAttribute("open","true");
688+
}
689+
else
690+
{
691+
legendlayernode.setAttribute("open","false");
692+
}
693+
legendnode.appendChild(legendlayernode);
694+
break;
695+
696+
case QgsLegendItem::LEGEND_PROPERTY_GROUP:
697+
legendpropertynode = document.createElement("propertygroup");
698+
if(item->isOpen())
699+
{
700+
legendpropertynode.setAttribute("open","true");
701+
}
702+
else
703+
{
704+
legendpropertynode.setAttribute("open","false");
705+
}
706+
legendlayernode.appendChild(legendpropertynode);
707+
break;
708+
709+
case QgsLegendItem::LEGEND_SYMBOL_GROUP:
710+
legendsymbolnode = document.createElement("symbolgroup");
711+
if(item->isOpen())
712+
{
713+
legendsymbolnode.setAttribute("open", "true");
714+
}
715+
else
716+
{
717+
legendsymbolnode.setAttribute("open", "false");
718+
}
719+
legendlayernode.appendChild(legendsymbolnode);
720+
break;
721+
722+
723+
case QgsLegendItem::LEGEND_LAYER_FILE_GROUP:
724+
layerfilegroupnode = document.createElement("filegroup");
725+
if(item->isOpen())
726+
{
727+
layerfilegroupnode.setAttribute("open", "true");
728+
}
729+
else
730+
{
731+
layerfilegroupnode.setAttribute("open", "false");
732+
}
733+
legendlayernode.appendChild(layerfilegroupnode);
734+
break;
735+
736+
default: //do nothing for the leaf nodes
737+
break;
738+
}
739+
}
740+
++it;
741+
}
742+
return true;
743+
}
744+
745+
bool QgsLegend::readXML(QDomNode& legendnode)
746+
{
747+
QString open;
748+
QListViewItemIterator it(this);
749+
QListViewItem* theItem = firstChild(); //first level hierarchy items
750+
QListViewItem* prevchild = 0; //store last value of theItem because of legend group
751+
QListViewItem* secondLevelItem = 0; //second level item
752+
QgsLegendGroup* group = 0; //pointer to the last inserted legend group
753+
754+
QDomNode child = legendnode.firstChild();
755+
if(!child.isNull())
756+
{
757+
do //iterate over legend layers/ legend groups
758+
{
759+
//simplified: only legend layers
760+
QDomElement legendlayerelem = child.toElement();//todo: distinguish between legend layer and legend group
761+
762+
if(legendlayerelem.tagName()=="legendgroup")
763+
{
764+
group = new QgsLegendGroup(this, legendlayerelem.attribute("name"));
765+
open = legendlayerelem.attribute("open");
766+
if(open == "true")
767+
{
768+
group->setOpen(true);
769+
}
770+
if(theItem != firstChild())
771+
{
772+
group->moveItem(prevchild);
773+
theItem = group->nextSibling(); //go one hierarchy step down
774+
child = child.firstChild();
775+
}
776+
continue;
777+
}
778+
779+
open = legendlayerelem.attribute("open");
780+
if(child.parentNode().toElement().tagName()=="legendgroup")
781+
{
782+
group->insertItem(theItem);
783+
}
784+
if(open == "true")
785+
{
786+
theItem->setOpen(true);
787+
}
788+
789+
//file group
790+
secondLevelItem = theItem->firstChild();
791+
QDomNode filegroupnode = child.firstChild();
792+
QDomElement filegroupelem = filegroupnode.toElement();
793+
open = filegroupelem.attribute("open");
794+
if(open == "true")
795+
{
796+
secondLevelItem->setOpen(true);
797+
}
798+
799+
//symbology group
800+
secondLevelItem = secondLevelItem->nextSibling();
801+
QDomNode symbologygroupnode = filegroupnode.nextSibling();
802+
QDomElement symbologygroupelem = symbologygroupnode.toElement();
803+
open = symbologygroupelem.attribute("open");
804+
if(open == "true")
805+
{
806+
secondLevelItem->setOpen(true);
807+
}
808+
809+
//property group
810+
secondLevelItem = secondLevelItem->nextSibling();
811+
QDomNode propertygroupnode = symbologygroupnode.nextSibling();
812+
QDomElement propertygroupelem = propertygroupnode.toElement();
813+
open = propertygroupelem.attribute("open");
814+
{
815+
secondLevelItem->setOpen(true);
816+
}
817+
818+
if(!theItem->nextSibling() && theItem->parent()) //go one hierarchy step up
819+
{
820+
theItem = theItem->parent();
821+
child = child.parentNode();
822+
}
823+
824+
prevchild = theItem;
825+
theItem = theItem->nextSibling();
826+
child=child.nextSibling();
827+
}
828+
while(!(child.isNull()));
829+
}
830+
return true;
831+
}

‎src/legend/qgslegend.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,12 @@ class QgsLegend : public QListView
101101
/**Removes a checkbox from mCheckBoxes. Does not delete the objects*/
102102
void unregisterCheckBox(QListViewItem* item);
103103

104+
/**Writes the content of the legend to a project file*/
105+
bool writeXML(QDomNode & layer_node, QDomDocument & document);
106+
107+
/**Restores the legend from a project file*/
108+
bool readXML(QDomNode& legendnode);
109+
104110
public slots:
105111

106112
/*!Adds a new layer group with the maplayer to the canvas*/

‎src/legend/qgslegendlayerfile.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ QgsLegendLayerFile::QgsLegendLayerFile(QListViewItem * theLegendItem, QString th
3737
//visibility check box
3838
mVisibilityCheckBox = new QCheckBox(listView());
3939
((QgsLegend*)(listView()))->registerCheckBox(this, mVisibilityCheckBox);
40-
mVisibilityCheckBox->setChecked(true);
40+
if(mLayer->visible())
41+
{
42+
mVisibilityCheckBox->setChecked(true);
43+
}
4144
mVisibilityCheckBox->hide();
4245
QObject::connect(mVisibilityCheckBox, SIGNAL(toggled(bool)), mLayer, SLOT(setVisible(bool)));
4346

‎src/qgscontinuouscolrenderer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,15 +176,15 @@ void QgsContinuousColRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl
176176
QDomNode lsymbolnode = lowernode.namedItem("symbol");
177177
if( ! lsymbolnode.isNull() )
178178
{
179-
QgsSymbol* lsy = new QgsSymbol();
179+
QgsSymbol* lsy = new QgsSymbol(mVectorType);
180180
lsy->readXML ( lsymbolnode );
181181
this->setMinimumSymbol(lsy);
182182
}
183183
QDomNode uppernode = rnode.namedItem("highestsymbol");
184184
QDomNode usymbolnode = uppernode.namedItem("symbol");
185185
if( ! usymbolnode.isNull() )
186186
{
187-
QgsSymbol* usy = new QgsSymbol();
187+
QgsSymbol* usy = new QgsSymbol(mVectorType);
188188
usy->readXML ( usymbolnode );
189189
this->setMaximumSymbol(usy);
190190
}

‎src/qgsgraduatedsymrenderer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ void QgsGraduatedSymRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
152152
QDomNode symbolnode = rnode.namedItem("symbol");
153153
while (!symbolnode.isNull())
154154
{
155-
QgsSymbol* sy = new QgsSymbol();
155+
QgsSymbol* sy = new QgsSymbol(mVectorType);
156156
sy->readXML ( symbolnode );
157157
this->addSymbol(sy);
158158

‎src/qgsmaplayer.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,11 @@ void QgsMapLayer::setVisible(bool vis)
371371
if (m_visible != vis)
372372
{
373373
m_visible = vis;
374-
mLegendLayerFile->toggleCheckBox(vis);
375-
emit visibilityChanged();
374+
if(mLegendLayerFile)
375+
{
376+
mLegendLayerFile->toggleCheckBox(vis);
377+
}
378+
emit visibilityChanged();
376379
}
377380
}
378381

‎src/qgsproject.cpp

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
using namespace std;
2525

26+
#include "qgslegend.h"
2627
#include "qgsrect.h"
2728
#include "qgsvectorlayer.h"
2829
#include "qgsrasterlayer.h"
@@ -865,6 +866,7 @@ static pair< bool, list<QDomNode> > _getMapLayers(QDomDocument const &doc)
865866
if ( mapLayer->readXML(node) )
866867
{
867868
mapLayer = QgsMapLayerRegistry::instance()->addMapLayer(mapLayer);
869+
mapLayer->refreshLegend();
868870
}
869871
else
870872
{
@@ -883,8 +885,6 @@ static pair< bool, list<QDomNode> > _getMapLayers(QDomDocument const &doc)
883885
} // _getMapLayers
884886

885887

886-
887-
888888
/**
889889
Sets the given canvas' extents
890890
@@ -1122,6 +1122,22 @@ bool QgsProject::read()
11221122
// return false;
11231123
}
11241124

1125+
//restore legend
1126+
QgsMapCanvas *theMapCanvas = _findMapCanvas("theMapCanvas");
1127+
if(theMapCanvas)
1128+
{
1129+
QgsLegend* theLegend = theMapCanvas->getLegend();
1130+
if(theLegend)
1131+
{
1132+
QDomNodeList ll = doc->elementsByTagName("legend");
1133+
if(ll.count()==1)
1134+
{
1135+
QDomNode legendnode = ll.item(0);
1136+
theLegend->readXML(legendnode);
1137+
}
1138+
}
1139+
}
1140+
11251141
// can't be dirty since we're allegedly in pristine state
11261142
dirty(false);
11271143

@@ -1271,6 +1287,17 @@ bool QgsProject::write()
12711287
{
12721288
theMapCanvas->writeXML(qgisNode, *doc);
12731289
}
1290+
1291+
//save legend settings
1292+
if(theMapCanvas)
1293+
{
1294+
QgsLegend* theLegend = theMapCanvas->getLegend();
1295+
if(theLegend)
1296+
{
1297+
theLegend->writeXML(qgisNode, *doc);
1298+
}
1299+
}
1300+
12741301
// now add the optional extra properties
12751302

12761303
dump_(imp_->properties_);

‎src/qgssinglesymrenderer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ void QgsSingleSymRenderer::renderFeature(QPainter * p, QgsFeature * f, QPicture*
122122
void QgsSingleSymRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
123123
{
124124
mVectorType = vl.vectorType();
125-
QgsSymbol* sy = new QgsSymbol();
125+
QgsSymbol* sy = new QgsSymbol(mVectorType);
126126

127127
QDomNode synode = rnode.namedItem("symbol");
128128

‎src/qgsuniquevalrenderer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ void QgsUniqueValRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
158158
QDomNode symbolnode = rnode.namedItem("symbol");
159159
while (!symbolnode.isNull())
160160
{
161-
QgsSymbol* msy = new QgsSymbol();
161+
QgsSymbol* msy = new QgsSymbol(mVectorType);
162162
msy->readXML ( symbolnode );
163163
this->insertValue(msy->lowerValue(),msy);
164164
symbolnode = symbolnode.nextSibling();

0 commit comments

Comments
 (0)
Please sign in to comment.