Skip to content

Commit

Permalink
reading/writing of the legend from/to project files. At the moment, r…
Browse files Browse the repository at this point in the history
…eadXML 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
  • Loading branch information
mhugent committed Oct 1, 2005
1 parent 5e33e89 commit 08e33d0
Show file tree
Hide file tree
Showing 10 changed files with 246 additions and 11 deletions.
2 changes: 1 addition & 1 deletion qgis.dtd
Expand Up @@ -120,7 +120,7 @@ outlinecolor,outlinestyle,outlinewidth,fillcolor,fillpattern) >
<!ELEMENT legend (legendgroup* | legendlayer*) >
<!ATTLIST legend open (1|0|true|false) "false"> #open or closed
<!ELEMENT legendgroup>
<!ATTLIST legendgroup open (1|0|true|false) "false"> #open or closed
<!ATTLIST legendgroup open (1|0|true|false) "false" name CDATA> #open or closed
<!ELEMENT legendlayer>
<!ATTLIST legendlayer open (1|0|true|false) "false"> #open or closed
<!ELEMENT legendlayerfilegroup>
Expand Down
196 changes: 196 additions & 0 deletions src/legend/qgslegend.cpp
Expand Up @@ -633,3 +633,199 @@ void QgsLegend::collapseAll()
++it;
}
}

bool QgsLegend::writeXML( QDomNode & layer_node, QDomDocument & document )
{
QDomElement legendnode = document.createElement("legend");
layer_node.appendChild(legendnode);

QDomElement tmplegendnode = legendnode; /*copy of the legendnode*/
QDomElement legendgroupnode;
QDomElement legendlayernode;
QDomElement layerfilegroupnode;
QDomElement legendsymbolnode;
QDomElement legendpropertynode;

QListViewItemIterator it(this);
while(it.current())
{
QgsLegendItem *item = dynamic_cast<QgsLegendItem*>(it.current());
if(item)
{
switch(item->type())
{
case QgsLegendItem::LEGEND_GROUP:
//make sure the legendnode is 'legend' again after a legend group
if(!(item->parent()))
{
legendnode = tmplegendnode;
}
legendgroupnode = document.createElement("legendgroup");
if(item->isOpen())
{
legendgroupnode.setAttribute("open","true");
}
else
{
legendgroupnode.setAttribute("open","false");
}
legendgroupnode.setAttribute("name",item->text(0));
legendnode.appendChild(legendgroupnode);
tmplegendnode = legendnode;
legendnode = legendgroupnode;
break;

case QgsLegendItem::LEGEND_LAYER:
//make sure the legendnode is 'legend' again after a legend group
if(!(item->parent()))
{
legendnode = tmplegendnode;
}
legendlayernode = document.createElement("legendlayer");
if(item->isOpen())
{
legendlayernode.setAttribute("open","true");
}
else
{
legendlayernode.setAttribute("open","false");
}
legendnode.appendChild(legendlayernode);
break;

case QgsLegendItem::LEGEND_PROPERTY_GROUP:
legendpropertynode = document.createElement("propertygroup");
if(item->isOpen())
{
legendpropertynode.setAttribute("open","true");
}
else
{
legendpropertynode.setAttribute("open","false");
}
legendlayernode.appendChild(legendpropertynode);
break;

case QgsLegendItem::LEGEND_SYMBOL_GROUP:
legendsymbolnode = document.createElement("symbolgroup");
if(item->isOpen())
{
legendsymbolnode.setAttribute("open", "true");
}
else
{
legendsymbolnode.setAttribute("open", "false");
}
legendlayernode.appendChild(legendsymbolnode);
break;


case QgsLegendItem::LEGEND_LAYER_FILE_GROUP:
layerfilegroupnode = document.createElement("filegroup");
if(item->isOpen())
{
layerfilegroupnode.setAttribute("open", "true");
}
else
{
layerfilegroupnode.setAttribute("open", "false");
}
legendlayernode.appendChild(layerfilegroupnode);
break;

default: //do nothing for the leaf nodes
break;
}
}
++it;
}
return true;
}

bool QgsLegend::readXML(QDomNode& legendnode)
{
QString open;
QListViewItemIterator it(this);
QListViewItem* theItem = firstChild(); //first level hierarchy items
QListViewItem* prevchild = 0; //store last value of theItem because of legend group
QListViewItem* secondLevelItem = 0; //second level item
QgsLegendGroup* group = 0; //pointer to the last inserted legend group

QDomNode child = legendnode.firstChild();
if(!child.isNull())
{
do //iterate over legend layers/ legend groups
{
//simplified: only legend layers
QDomElement legendlayerelem = child.toElement();//todo: distinguish between legend layer and legend group

if(legendlayerelem.tagName()=="legendgroup")
{
group = new QgsLegendGroup(this, legendlayerelem.attribute("name"));
open = legendlayerelem.attribute("open");
if(open == "true")
{
group->setOpen(true);
}
if(theItem != firstChild())
{
group->moveItem(prevchild);
theItem = group->nextSibling(); //go one hierarchy step down
child = child.firstChild();
}
continue;
}

open = legendlayerelem.attribute("open");
if(child.parentNode().toElement().tagName()=="legendgroup")
{
group->insertItem(theItem);
}
if(open == "true")
{
theItem->setOpen(true);
}

//file group
secondLevelItem = theItem->firstChild();
QDomNode filegroupnode = child.firstChild();
QDomElement filegroupelem = filegroupnode.toElement();
open = filegroupelem.attribute("open");
if(open == "true")
{
secondLevelItem->setOpen(true);
}

//symbology group
secondLevelItem = secondLevelItem->nextSibling();
QDomNode symbologygroupnode = filegroupnode.nextSibling();
QDomElement symbologygroupelem = symbologygroupnode.toElement();
open = symbologygroupelem.attribute("open");
if(open == "true")
{
secondLevelItem->setOpen(true);
}

//property group
secondLevelItem = secondLevelItem->nextSibling();
QDomNode propertygroupnode = symbologygroupnode.nextSibling();
QDomElement propertygroupelem = propertygroupnode.toElement();
open = propertygroupelem.attribute("open");
{
secondLevelItem->setOpen(true);
}

if(!theItem->nextSibling() && theItem->parent()) //go one hierarchy step up
{
theItem = theItem->parent();
child = child.parentNode();
}

prevchild = theItem;
theItem = theItem->nextSibling();
child=child.nextSibling();
}
while(!(child.isNull()));
}
return true;
}
6 changes: 6 additions & 0 deletions src/legend/qgslegend.h
Expand Up @@ -101,6 +101,12 @@ class QgsLegend : public QListView
/**Removes a checkbox from mCheckBoxes. Does not delete the objects*/
void unregisterCheckBox(QListViewItem* item);

/**Writes the content of the legend to a project file*/
bool writeXML(QDomNode & layer_node, QDomDocument & document);

/**Restores the legend from a project file*/
bool readXML(QDomNode& legendnode);

public slots:

/*!Adds a new layer group with the maplayer to the canvas*/
Expand Down
5 changes: 4 additions & 1 deletion src/legend/qgslegendlayerfile.cpp
Expand Up @@ -37,7 +37,10 @@ QgsLegendLayerFile::QgsLegendLayerFile(QListViewItem * theLegendItem, QString th
//visibility check box
mVisibilityCheckBox = new QCheckBox(listView());
((QgsLegend*)(listView()))->registerCheckBox(this, mVisibilityCheckBox);
mVisibilityCheckBox->setChecked(true);
if(mLayer->visible())
{
mVisibilityCheckBox->setChecked(true);
}
mVisibilityCheckBox->hide();
QObject::connect(mVisibilityCheckBox, SIGNAL(toggled(bool)), mLayer, SLOT(setVisible(bool)));

Expand Down
4 changes: 2 additions & 2 deletions src/qgscontinuouscolrenderer.cpp
Expand Up @@ -176,15 +176,15 @@ void QgsContinuousColRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl
QDomNode lsymbolnode = lowernode.namedItem("symbol");
if( ! lsymbolnode.isNull() )
{
QgsSymbol* lsy = new QgsSymbol();
QgsSymbol* lsy = new QgsSymbol(mVectorType);
lsy->readXML ( lsymbolnode );
this->setMinimumSymbol(lsy);
}
QDomNode uppernode = rnode.namedItem("highestsymbol");
QDomNode usymbolnode = uppernode.namedItem("symbol");
if( ! usymbolnode.isNull() )
{
QgsSymbol* usy = new QgsSymbol();
QgsSymbol* usy = new QgsSymbol(mVectorType);
usy->readXML ( usymbolnode );
this->setMaximumSymbol(usy);
}
Expand Down
2 changes: 1 addition & 1 deletion src/qgsgraduatedsymrenderer.cpp
Expand Up @@ -152,7 +152,7 @@ void QgsGraduatedSymRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
QDomNode symbolnode = rnode.namedItem("symbol");
while (!symbolnode.isNull())
{
QgsSymbol* sy = new QgsSymbol();
QgsSymbol* sy = new QgsSymbol(mVectorType);
sy->readXML ( symbolnode );
this->addSymbol(sy);

Expand Down
7 changes: 5 additions & 2 deletions src/qgsmaplayer.cpp
Expand Up @@ -371,8 +371,11 @@ void QgsMapLayer::setVisible(bool vis)
if (m_visible != vis)
{
m_visible = vis;
mLegendLayerFile->toggleCheckBox(vis);
emit visibilityChanged();
if(mLegendLayerFile)
{
mLegendLayerFile->toggleCheckBox(vis);
}
emit visibilityChanged();
}
}

Expand Down
31 changes: 29 additions & 2 deletions src/qgsproject.cpp
Expand Up @@ -23,6 +23,7 @@

using namespace std;

#include "qgslegend.h"
#include "qgsrect.h"
#include "qgsvectorlayer.h"
#include "qgsrasterlayer.h"
Expand Down Expand Up @@ -865,6 +866,7 @@ static pair< bool, list<QDomNode> > _getMapLayers(QDomDocument const &doc)
if ( mapLayer->readXML(node) )
{
mapLayer = QgsMapLayerRegistry::instance()->addMapLayer(mapLayer);
mapLayer->refreshLegend();
}
else
{
Expand All @@ -883,8 +885,6 @@ static pair< bool, list<QDomNode> > _getMapLayers(QDomDocument const &doc)
} // _getMapLayers




/**
Sets the given canvas' extents
Expand Down Expand Up @@ -1122,6 +1122,22 @@ bool QgsProject::read()
// return false;
}

//restore legend
QgsMapCanvas *theMapCanvas = _findMapCanvas("theMapCanvas");
if(theMapCanvas)
{
QgsLegend* theLegend = theMapCanvas->getLegend();
if(theLegend)
{
QDomNodeList ll = doc->elementsByTagName("legend");
if(ll.count()==1)
{
QDomNode legendnode = ll.item(0);
theLegend->readXML(legendnode);
}
}
}

// can't be dirty since we're allegedly in pristine state
dirty(false);

Expand Down Expand Up @@ -1271,6 +1287,17 @@ bool QgsProject::write()
{
theMapCanvas->writeXML(qgisNode, *doc);
}

//save legend settings
if(theMapCanvas)
{
QgsLegend* theLegend = theMapCanvas->getLegend();
if(theLegend)
{
theLegend->writeXML(qgisNode, *doc);
}
}

// now add the optional extra properties

dump_(imp_->properties_);
Expand Down
2 changes: 1 addition & 1 deletion src/qgssinglesymrenderer.cpp
Expand Up @@ -122,7 +122,7 @@ void QgsSingleSymRenderer::renderFeature(QPainter * p, QgsFeature * f, QPicture*
void QgsSingleSymRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
{
mVectorType = vl.vectorType();
QgsSymbol* sy = new QgsSymbol();
QgsSymbol* sy = new QgsSymbol(mVectorType);

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

Expand Down
2 changes: 1 addition & 1 deletion src/qgsuniquevalrenderer.cpp
Expand Up @@ -158,7 +158,7 @@ void QgsUniqueValRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
QDomNode symbolnode = rnode.namedItem("symbol");
while (!symbolnode.isNull())
{
QgsSymbol* msy = new QgsSymbol();
QgsSymbol* msy = new QgsSymbol(mVectorType);
msy->readXML ( symbolnode );
this->insertValue(msy->lowerValue(),msy);
symbolnode = symbolnode.nextSibling();
Expand Down

0 comments on commit 08e33d0

Please sign in to comment.