Skip to content

Commit 1b0d44b

Browse files
author
mhugent
committedJan 8, 2006
added a QgsLegend::readXML method which is simpler and thus easier to debug
git-svn-id: http://svn.osgeo.org/qgis/trunk@4617 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 5621048 commit 1b0d44b

File tree

3 files changed

+170
-1
lines changed

3 files changed

+170
-1
lines changed
 

‎qgis.dtd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ outlinecolor,outlinestyle,outlinewidth,fillcolor,fillpattern) >
122122
<!ELEMENT legendgroup>
123123
<!ATTLIST legendgroup open (1|0|true|false) "false" name CDATA> #open or closed
124124
<!ELEMENT legendlayer>
125-
<!ATTLIST legendlayer open (1|0|true|false) "false"> #open or closed
125+
<!ATTLIST legendlayer open (1|0|true|false) "false" checked (Qt::Checked|Qt::Unchecked|Qt::PartiallyChecked) "Qt::Checked"> #open or closed
126126
<!ELEMENT legendlayerfilegroup>
127127
<!ATTLIST legendlayerfile open (1|0|true|false) "false"> #open or closed
128128
<!ELEMENT legendlayerfile>

‎src/legend/qgslegend.cpp

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,7 @@ bool QgsLegend::writeXML( QDomNode & layer_node, QDomDocument & document )
661661
QDomElement legendpropertynode;
662662
QDomElement legendlayerfilenode;
663663
QgsLegendLayerFile* llf;
664+
Qt::CheckState cstate; //check state for legend layers
664665

665666
QTreeWidgetItem* currentItem = firstItem();
666667
while(currentItem)
@@ -706,6 +707,19 @@ bool QgsLegend::writeXML( QDomNode & layer_node, QDomDocument & document )
706707
{
707708
legendlayernode.setAttribute("open","false");
708709
}
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+
}
709723
legendlayernode.setAttribute("name", item->text(0));
710724
legendnode.appendChild(legendlayernode);
711725
break;
@@ -769,6 +783,132 @@ bool QgsLegend::writeXML( QDomNode & layer_node, QDomDocument & document )
769783
return true;
770784
}
771785

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
772912
bool QgsLegend::readXML(QDomNode& legendnode)
773913
{
774914
QString open;
@@ -995,6 +1135,7 @@ bool QgsLegend::readXML(QDomNode& legendnode)
9951135
}
9961136
return true;
9971137
}
1138+
#endif //0
9981139

9991140
void QgsLegend::storeInitialPosition(QTreeWidgetItem* li)
10001141
{
@@ -1133,6 +1274,31 @@ QTreeWidgetItem* QgsLegend::previousSibling(QTreeWidgetItem* item)
11331274
}
11341275
}
11351276

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+
11361302
void QgsLegend::moveItem(QTreeWidgetItem* move, QTreeWidgetItem* after)
11371303
{
11381304
if(move->parent())

‎src/legend/qgslegend.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ class QgsLegend : public QTreeWidget
120120
/**Returns the previous sibling of an item or 0 if there is none*/
121121
QTreeWidgetItem* previousSibling(QTreeWidgetItem* item);
122122

123+
/**Finds the next dom node. This function is used by QgsLegend, but probably its not a good place here*/
124+
static QDomNode nextDomNode(const QDomNode& theNode);
125+
123126
/**Moves an item after another one*/
124127
void moveItem(QTreeWidgetItem* move, QTreeWidgetItem* after);
125128

0 commit comments

Comments
 (0)
Please sign in to comment.