Skip to content

Commit

Permalink
restored reading/writing XML for the legend settings, but there are s…
Browse files Browse the repository at this point in the history
…till some bugs

git-svn-id: http://svn.osgeo.org/qgis/trunk@4360 c8812cc2-4d05-0410-92ff-de0c093fc19c
  • Loading branch information
mhugent committed Dec 21, 2005
1 parent 63be448 commit 9261431
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 172 deletions.
210 changes: 46 additions & 164 deletions src/legend/qgslegend.cpp
@@ -1,3 +1,4 @@

/***************************************************************************
qgslegend.cpp - description
-------------------
Expand Down Expand Up @@ -68,7 +69,6 @@ QgsLegend::~QgsLegend()
void QgsLegend::addGroup()
{
QgsLegendGroup* group = new QgsLegendGroup(this, tr("group"));
group->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable);
setExpanded(indexFromItem(group), true);
}

Expand Down Expand Up @@ -759,12 +759,10 @@ bool QgsLegend::writeXML( QDomNode & layer_node, QDomDocument & document )

bool QgsLegend::readXML(QDomNode& legendnode)
{
#if 0 //todo: port to qt4
QString open;
Q3ListViewItemIterator it(this);
Q3ListViewItem* theItem = firstChild(); //first level hierarchy items
Q3ListViewItem* prevchild = 0; //store last value of theItem because of legend group
Q3ListViewItem* secondLevelItem = 0; //second level item
QgsLegendItem* theItem = dynamic_cast<QgsLegendItem*>(topLevelItem(0)); //first level hierarchy items
QgsLegendItem* prevchild = 0; //store last value of theItem because of legend group
QgsLegendItem* secondLevelItem = 0; //second level item
QgsLegendGroup* group = 0; //pointer to the last inserted legend group

QDomNode child = legendnode.firstChild();
Expand All @@ -781,16 +779,16 @@ bool QgsLegend::readXML(QDomNode& legendnode)

if(legendlayerelem.tagName()=="legendgroup")
{
group = new QgsLegendGroup(this, legendlayerelem.attribute("name"));
group->setRenameEnabled(0, true);
group = new QgsLegendGroup(legendlayerelem.attribute("name"));
insertTopLevelItem(0, group);
open = legendlayerelem.attribute("open");
if(open == "true")
{
group->setOpen(true);
expandItem(group);
}
if(prevchild)
{
group->moveItem(prevchild);
moveItem(group, prevchild);
}
theItem = group->nextSibling();
if(!child.firstChild().isNull())
Expand All @@ -807,25 +805,23 @@ bool QgsLegend::readXML(QDomNode& legendnode)
open = legendlayerelem.attribute("open");
if(child.parentNode().toElement().tagName()=="legendgroup")
{
group->insertItem(theItem);
Q3ListViewItem* currentChild = group->firstChild();
removeItem(theItem);
group->insertChild(0, theItem);
QgsLegendItem* currentChild = group->firstChild();
if(!currentChild)
{
group->insertItem(theItem);//insert the first child in the group
removeItem(theItem);
group->insertChild(0, theItem);//insert the first child in the group
}
else //find the last child and insert the new one after it
{
while(currentChild->nextSibling() != 0)
{
currentChild = currentChild->nextSibling();
}
group->insertItem(theItem);
theItem->moveItem(currentChild);
removeItem(theItem);
group->addChild(theItem);
}
}
if(open == "true")
{
theItem->setOpen(true);
expandItem(theItem);
}
theItem->setText(0, legendlayerelem.attribute("name"));

Expand All @@ -836,20 +832,19 @@ bool QgsLegend::readXML(QDomNode& legendnode)
open = filegroupelem.attribute("open");
if(open == "true")
{
secondLevelItem->setOpen(true);
expandItem(secondLevelItem);
}
QDomNode layerfilenode = filegroupnode.firstChild();
QDomElement layerfileelem = layerfilenode.toElement();

//remove the existing legendlayerfile and insert the one(s) according to the entries in the XML file
if(secondLevelItem->firstChild())
if(secondLevelItem->child(0))
{
QgsLegendLayerFile* llfdelete = dynamic_cast<QgsLegendLayerFile*>(secondLevelItem->firstChild());
QgsLegendLayerFile* llfdelete = dynamic_cast<QgsLegendLayerFile*>(secondLevelItem->child(0));
if(llfdelete)
{
unregisterCheckBox(llfdelete);
delete llfdelete;
placeCheckBoxes();
removeItem(llfdelete);
mStateOfCheckBoxes.erase(llfdelete);
}
}

Expand All @@ -866,15 +861,23 @@ bool QgsLegend::readXML(QDomNode& legendnode)
if(it != layers.end())
{
QgsMapLayer* newlayer = it->second;
QgsLegendLayerFile* newfile = new QgsLegendLayerFile(secondLevelItem, QgsLegendLayerFile::nameFromLayer(newlayer), newlayer);
QgsLegendLayerFile* newfile = new QgsLegendLayerFile(secondLevelItem, QgsLegendLayerFile::nameFromLayer(newlayer), newlayer);
if(newlayer->visible())
{
mStateOfCheckBoxes.insert(std::make_pair(newfile, Qt::Checked));
}
else
{
mStateOfCheckBoxes.insert(std::make_pair(newfile, Qt::Unchecked));
}
newlayer->setLegendLayerFile(newfile);
newlayer->initContextMenu(mApp);

//move newfile as the last child of the legendlayerfilegroup
Q3ListViewItem* curitem = newfile;
QgsLegendItem* curitem = newfile;
while(curitem = newfile->nextSibling())
{
newfile->moveItem(curitem);
moveItem(newfile, curitem);
}
}
layerfilenode = layerfilenode.nextSibling();
Expand All @@ -888,7 +891,7 @@ bool QgsLegend::readXML(QDomNode& legendnode)
open = symbologygroupelem.attribute("open");
if(open == "true")
{
secondLevelItem->setOpen(true);
expandItem(secondLevelItem);
}

//property group
Expand All @@ -897,7 +900,7 @@ bool QgsLegend::readXML(QDomNode& legendnode)
QDomElement propertygroupelem = propertygroupnode.toElement();
open = propertygroupelem.attribute("open");
{
secondLevelItem->setOpen(true);
expandItem(secondLevelItem);
}

if(child.nextSibling().isNull() && !child.parentNode().isNull()) //go one hierarchy step up
Expand All @@ -906,7 +909,7 @@ bool QgsLegend::readXML(QDomNode& legendnode)
}
if(theItem->nextSibling() == 0)
{
theItem = theItem->parent();
theItem = dynamic_cast<QgsLegendItem*>(theItem->parent());
}

if(!theItem)
Expand All @@ -924,139 +927,9 @@ bool QgsLegend::readXML(QDomNode& legendnode)
}
while(!(child.isNull()));
}
placeCheckBoxes();
#endif //0
return true;
}

void QgsLegend::saveToProject()
{
#if 0 //todo: port to qt4
int toplayeridx=0;
int lgroupidx=0;
int llayeridx=0;
QString groupstring; //string which have to be prepended if an element is into a group

Q3ListViewItemIterator it(this);
while(it.current())
{
QgsLegendItem *item = dynamic_cast<QgsLegendItem*>(it.current());
if(item)
{
switch(item->type())
{
case QgsLegendItem::LEGEND_GROUP:
++lgroupidx;
groupstring = "/LegendGroup"+QString::number(lgroupidx);
QgsProject::instance()->writeEntry("Legend","/LegendGroup"+QString::number(lgroupidx)+"/Name",item->text(0));
++toplayeridx;
QgsProject::instance()->writeEntry("Legend","/LegendGroup"+QString::number(lgroupidx)+"/TopLayerIndex",toplayeridx);
if(item->isOpen())
{
QgsProject::instance()->writeEntry("Legend","/LegendGroup"+QString::number(lgroupidx)+"/Open",true);
}
else
{
QgsProject::instance()->writeEntry("Legend","/LegendGroup"+QString::number(lgroupidx)+"/Open",true);
}
break;

case QgsLegendItem::LEGEND_LAYER:
++llayeridx;
if(item->parent()==0)//legend layer is not in a group
{
groupstring="";
++toplayeridx;
QgsProject::instance()->writeEntry("Legend",groupstring+"/LegendLayer"+QString::number(llayeridx)+"/TopLayerIndex",toplayeridx);
}
else //set TopLayerIndex -1 if a LegendLayer is not a toplevel item
{
QgsProject::instance()->writeEntry("Legend",groupstring+"/LegendLayer"+QString::number(llayeridx)+"/TopLayerIndex",-1);
}
QgsProject::instance()->writeEntry("Legend",groupstring+"/LegendLayer"+QString::number(llayeridx)+"/Name",item->text(0));
if(item->isOpen())
{
QgsProject::instance()->writeEntry("Legend",groupstring+"/LegendLayer"+QString::number(llayeridx)+"/Open",true);
}
else
{
QgsProject::instance()->writeEntry("Legend",groupstring+"/LegendLayer"+QString::number(llayeridx)+"/Open",false);
}
break;

case QgsLegendItem::LEGEND_PROPERTY_GROUP:
if(item->isOpen())
{
QgsProject::instance()->writeEntry("Legend",groupstring+"/LegendLayer"+QString::number(llayeridx)+"/LegendPropertyGroup/Open", true);
}
else
{
QgsProject::instance()->writeEntry("Legend",groupstring+"/LegendLayer"+QString::number(llayeridx)+"/LegendPropertyGroup/Open", false);
}
break;

case QgsLegendItem::LEGEND_SYMBOL_GROUP:
if(item->isOpen())
{
QgsProject::instance()->writeEntry("Legend",groupstring+"/LegendLayer"+QString::number(llayeridx)+"/LegendSymbolGroup/Open", true);
}
else
{
QgsProject::instance()->writeEntry("Legend",groupstring+"/LegendLayer"+QString::number(llayeridx)+"/LegendSymbolGroup/Open", false);
}
break;

case QgsLegendItem::LEGEND_LAYER_FILE_GROUP:
if(item->isOpen())
{
QgsProject::instance()->writeEntry("Legend",groupstring+"/LegendLayer"+QString::number(llayeridx)+"/LegendLayerFileGroup/Open", true);
}
else
{
QgsProject::instance()->writeEntry("Legend",groupstring+"/LegendLayer"+QString::number(llayeridx)+"/LegendLayerFileGroup/Open", false);
}
break;

default: //do nothing for the leaf nodes
break;
}
}
++it;
}
#endif //0
}

void QgsLegend::restoreFromProject()
{
#if 0 //todo: port to qt4
int legendlayercount = 0;
int legendgroupcount = 0;
QStringList legendlayerlist;
QStringList legendgrouplist;
bool ok;

legendlayerlist = QgsProject::instance()->readListEntry("Legend","/LegendLayer"+QString::number(legendlayercount+1), &ok);
if(ok)
{
++legendlayercount;
for(QStringList::Iterator it = legendlayerlist.begin(); it != legendlayerlist.end(); ++it)
{
qWarning(*it);
}
}

legendgrouplist = QgsProject::instance()->readListEntry("Legend","/LegendGroup"+QString::number(legendgroupcount+1), &ok);
if(ok)
{
++legendgroupcount;
for(QStringList::Iterator it = legendgrouplist.begin(); it != legendgrouplist.end(); ++it)
{
qWarning(*it);
}
}
#endif
}

void QgsLegend::storeInitialPosition(QTreeWidgetItem* li)
{
if(li == firstItem()) //the item is the first item in the list view
Expand Down Expand Up @@ -1146,10 +1019,19 @@ QTreeWidgetItem* QgsLegend::nextItem(QTreeWidgetItem* item)
{
return 0;
}
//todo: implement this in a nicer and safer way
else if(dynamic_cast<QgsLegendItem*>(litem->parent())->nextSibling())
{
return (dynamic_cast<QgsLegendItem*>(litem->parent())->nextSibling());//todo: make this for deeper trees
}
return (dynamic_cast<QgsLegendItem*>(litem->parent())->nextSibling());
}
else if(dynamic_cast<QgsLegendItem*>(litem->parent()->parent())->nextSibling())
{
return (dynamic_cast<QgsLegendItem*>(litem->parent()->parent())->nextSibling());
}
/*else if(dynamic_cast<QgsLegendItem*>(litem->parent()->parent()->parent())->nextSibling())//maximum four nesting states in the current legend
{
return (dynamic_cast<QgsLegendItem*>(litem->parent()->parent()->parent())->nextSibling());
}*/
else
{
return 0;
Expand Down
6 changes: 0 additions & 6 deletions src/legend/qgslegend.h
Expand Up @@ -99,15 +99,9 @@ class QgsLegend : public QTreeWidget
Else, 0 is returned.*/
QgsMapLayer* currentLayer();

/**Writes the content of the legend using the key system of QgsProject*/
void saveToProject();

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

/**Restores the legend from a project file using the key system of QgsProject*/
void restoreFromProject();

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

Expand Down
14 changes: 14 additions & 0 deletions src/legend/qgslegendgroup.cpp
Expand Up @@ -48,6 +48,20 @@ QgsLegendGroup::QgsLegendGroup(QTreeWidget* theListView, QString theString)
setIcon(0, myIcon);
}

QgsLegendGroup::QgsLegendGroup(QString name): QgsLegendItem()
{
mType=LEGEND_GROUP;
#if defined(Q_OS_MACX) || defined(WIN32)
QString pkgDataPath(QCoreApplication::applicationDirPath()+QString("/share/qgis"));
#else
QString pkgDataPath(PKGDATAPATH);
#endif
setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
QIcon myIcon(pkgDataPath+QString("/images/icons/folder.png"));
setText(0, name);
setIcon(0, myIcon);
}

QgsLegendGroup::~QgsLegendGroup()
{}

Expand Down
1 change: 1 addition & 0 deletions src/legend/qgslegendgroup.h
Expand Up @@ -32,6 +32,7 @@ class QgsLegendGroup : public QgsLegendItem
public:
QgsLegendGroup(QTreeWidgetItem * ,QString);
QgsLegendGroup(QTreeWidget*,QString);
QgsLegendGroup(QString name);
~QgsLegendGroup();

QgsLegendItem::DRAG_ACTION accept(LEGEND_ITEM_TYPE type);
Expand Down
14 changes: 12 additions & 2 deletions src/qgsproject.cpp
Expand Up @@ -748,7 +748,18 @@ static QgsMapCanvas * _findMapCanvas(QString const &canonicalMapCanvasName)
}

delete list; // delete the list, not the widgets
#endif
#else
QWidgetList wlist = QApplication::topLevelWidgets();
foreach (QWidget *widget, QApplication::topLevelWidgets())
{
theMapCanvas = dynamic_cast <QgsMapCanvas *>(widget->child(canonicalMapCanvasName.toLocal8Bit().data(), 0, true));
if(theMapCanvas)
{
break;
}
}
#endif //QT_VERSION < 0x040000


if (theMapCanvas)
{
Expand Down Expand Up @@ -1158,7 +1169,6 @@ bool QgsProject::read()
{
QDomNode legendnode = ll.item(0);
theLegend->readXML(legendnode);
theLegend->restoreFromProject();
}
}
}
Expand Down

0 comments on commit 9261431

Please sign in to comment.