2
/***************************************************************************
3
qgslegend.cpp - description
5
begin : Sun Jul 28 2002
6
copyright : (C) 2002 by Gary E.Sherman
7
email : sherman at mrcc dot com
8
Romans 3:23=>Romans 6:23=>Romans 10:9,10=>Romans 12
9
***************************************************************************/
11
/***************************************************************************
13
* This program is free software; you can redistribute it and/or modify *
14
* it under the terms of the GNU General Public License as published by *
15
* the Free Software Foundation; either version 2 of the License, or *
16
* (at your option) any later version. *
18
***************************************************************************/
19
/* $Id: qgslegend.cpp 6345 2006-12-29 20:23:45Z g_j_m $ */
22
#include "qgsapplication.h"
23
#include "qgslegend.h"
24
#include "qgslegendgroup.h"
25
#include "qgslegendlayer.h"
26
#include "qgslegendpropertygroup.h"
27
#include "qgslegendsymbologyitem.h"
28
#include "qgslegendlayerfile.h"
29
#include "qgslegendlayerfilegroup.h"
30
#include "qgsmapcanvas.h"
31
#include "qgsmaplayer.h"
32
#include "qgsmaplayerregistry.h"
33
#include "qgsproject.h"
34
#include "qgsrasterlayerproperties.h"
35
#include "qgsvectordataprovider.h"
38
#include <QCoreApplication>
40
#include <QMouseEvent>
42
#include <QTreeWidgetItem>
45
#include <QHeaderView>
47
static const char *const ident_ = "$Id: qgslegend.cpp 6345 2006-12-29 20:23:45Z g_j_m $";
49
const int AUTOSCROLL_MARGIN = 16;
54
set mItemBeingMoved pointer to 0 to prevent SuSE 9.0 crash
56
QgsLegend::QgsLegend(QgisApp* app, QWidget * parent, const char *name)
57
: QTreeWidget(parent), mApp(app), mMousePressedFlag(false), mItemBeingMoved(0), mMapCanvas(0), mShowLegendLayerFiles(false), mMinimumIconSize(20, 20), mCurrentLayer(0)
59
connect( this, SIGNAL(itemChanged(QTreeWidgetItem*, int)),
60
this, SLOT(handleItemChange(QTreeWidgetItem*, int)));
62
connect( this, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
63
this, SLOT(handleCurrentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)));
66
setSortingEnabled(false);
67
setDragEnabled(false);
69
QFont f("Arial", 10, QFont::Normal);
71
setBackgroundColor(QColor(192, 192, 192));
74
header()->setHidden(1);
75
setRootIsDecorated(true);
81
QgsLegend::~QgsLegend()
85
void QgsLegend::handleCurrentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous)
87
QgsMapLayer *layer = currentLayer();
88
if(layer != mCurrentLayer)
92
mApp->activateDeactivateLayerRelatedActions( layer );
96
mMapCanvas->setCurrentLayer( layer );
98
mCurrentLayer = layer;
100
emit currentLayerChanged ( layer );
103
void QgsLegend::addGroup()
105
QgsLegendGroup* group = new QgsLegendGroup(this, tr("group"));
106
mStateOfCheckBoxes.insert(std::make_pair(group, Qt::Checked)); //insert the check state into the map to query for changes later
107
setExpanded(indexFromItem(group), true);
110
void QgsLegend::removeAll()
112
mStateOfCheckBoxes.clear();
114
mPixmapWidthValues.clear();
115
mPixmapHeightValues.clear();
116
updateMapCanvasLayerSet();
117
setIconSize(mMinimumIconSize);
120
void QgsLegend::selectAll(bool select)
122
QTreeWidgetItem* theItem = firstItem();
126
QgsLegendItem* litem = dynamic_cast<QgsLegendItem*>(theItem);
127
if(litem && litem->type() == QgsLegendItem::LEGEND_LAYER_FILE)
129
theItem->setCheckState(0, (select ? Qt::Checked : Qt::Unchecked));
130
handleItemChange(theItem, 0);
132
theItem = nextItem(theItem);
136
void QgsLegend::removeLayer(QString layer_key)
138
QTreeWidgetItem* theItem = firstItem();
140
qWarning("in QgsLegend::removeLayer");
144
QgsLegendItem *li = dynamic_cast<QgsLegendItem*>(theItem);
147
QgsLegendLayerFile* llf = dynamic_cast<QgsLegendLayerFile*>(li);
150
if (llf->layer()&&llf->layer()->getLayerID() == layer_key)
152
//remove the map entry for the checkbox
153
mStateOfCheckBoxes.erase(llf);
160
theItem = nextItem(theItem);
163
updateMapCanvasLayerSet();
167
void QgsLegend::mousePressEvent(QMouseEvent * e)
169
if (e->button() == Qt::LeftButton)
171
mLastPressPos = e->pos();
172
mMousePressedFlag = true;
174
else if(e->button() == Qt::RightButton)
176
QTreeWidgetItem* item = itemAt(e->pos());
177
setCurrentItem(item);
178
handleRightClickEvent(item, e->globalPos());
180
QTreeWidget::mousePressEvent(e);
181
} // contentsMousePressEvent
183
void QgsLegend::mouseMoveEvent(QMouseEvent * e)
185
if(mMousePressedFlag)
187
//set the flag back such that the else if(mItemBeingMoved)
188
//code part is passed during the next mouse moves
189
mMousePressedFlag = false;
191
// remember item we've pressed as the one being moved
192
// and where it was originally
193
QTreeWidgetItem* item = itemAt(mLastPressPos);
196
mItemBeingMoved = item;
197
mItemBeingMovedOrigPos = getItemPos(mItemBeingMoved);
199
//store information to insert the item back to the original position
200
storeInitialPosition(mItemBeingMoved);
202
setCursor(Qt::SizeVerCursor);
205
else if (mItemBeingMoved)
210
// change the cursor appropriate to if drop is allowed
211
QTreeWidgetItem* item = itemAt(p);
212
QgsLegendItem* origin = dynamic_cast<QgsLegendItem*>(mItemBeingMoved);
213
QgsLegendItem* dest = dynamic_cast<QgsLegendItem*>(item);
215
if (item && (item != mItemBeingMoved))
217
QgsLegendItem::DRAG_ACTION action = dest->accept(origin);
218
if(action == QgsLegendItem::REORDER)
221
qWarning("mouseMoveEvent::REORDER");
223
if(!yCoordAboveCenter(dest, e->y())) //over bottom of item
225
if(origin->nextSibling() != dest)
227
if(origin->parent() != dest->parent())
229
moveItem(origin, dest);
230
moveItem(dest, origin);
234
moveItem(dest, origin);
238
else //over top of item
240
if (mItemBeingMoved != dest->nextSibling())
242
//origin->moveItem(dest);
243
moveItem(origin, dest);
246
setCurrentItem(origin);
248
else if(action == QgsLegendItem::INSERT)
251
qWarning("mouseMoveEvent::INSERT");
253
setCursor( QCursor(Qt::PointingHandCursor) );
254
if(origin->parent() != dest)
256
insertItem(origin, dest);
257
setCurrentItem(origin);
263
qWarning("mouseMoveEvent::NO_ACTION");
265
if(origin->type() == QgsLegendItem::LEGEND_LAYER_FILE && mItemBeingMovedOrigPos != getItemPos(mItemBeingMoved))
267
resetToInitialPosition(mItemBeingMoved);
269
setCursor( QCursor(Qt::ForbiddenCursor) );
275
void QgsLegend::mouseReleaseEvent(QMouseEvent * e)
277
QTreeWidget::mouseReleaseEvent(e);
278
setCursor(QCursor(Qt::ArrowCursor));
282
QTreeWidgetItem *destItem = itemAt(e->pos());
284
QgsLegendItem* origin = dynamic_cast<QgsLegendItem*>(mItemBeingMoved);
285
QgsLegendItem* dest = dynamic_cast<QgsLegendItem*>(destItem);
289
checkLayerOrderUpdate();
293
if(dest && origin && getItemPos(dest) != mItemBeingMovedOrigPos)
295
QgsLegendItem::LEGEND_ITEM_TYPE originType = origin->type();
296
QgsLegendItem::LEGEND_ITEM_TYPE destType = dest->type();
298
if(originType == QgsLegendItem::LEGEND_LAYER_FILE && destType == QgsLegendItem::LEGEND_LAYER_FILE_GROUP)
300
QgsMapLayer* origLayer = ((QgsLegendLayerFile*)(origin))->layer();
301
if(dest->childCount() > 1)
303
//find the first layer in the legend layer group != origLayer and copy its settings
304
QgsLegendItem* currentItem = dynamic_cast<QgsLegendItem*>(dest->child(0));
307
if(currentItem != origin)
309
QgsMapLayer* origLayer = ((QgsLegendLayerFile*)(origin))->layer();
310
QgsMapLayer* currentLayer = ((QgsLegendLayerFile*)(currentItem))->layer();
311
origLayer->copySymbologySettings(*currentLayer);
314
currentItem = currentItem->nextSibling();
316
mMapCanvas->refresh();
319
else if(originType == QgsLegendItem::LEGEND_LAYER_FILE && destType == QgsLegendItem::LEGEND_LAYER_FILE)
321
QgsMapLayer* origLayer = ((QgsLegendLayerFile*)(origin))->layer();
322
QgsMapLayer* destLayer = ((QgsLegendLayerFile*)(dest))->layer();
324
if(dest == origin)//origin item has been moved in mouseMoveEvent such that it is under the mouse cursor now
326
if(origin->parent()->childCount() > 1)
328
//find the first layer in the legend layer group != origLayer and copy its settings
329
QTreeWidgetItem* currentItem = dest->parent()->child(0);
332
if(currentItem != origin)
334
QgsMapLayer* origLayer = ((QgsLegendLayerFile*)(origin))->layer();
335
QgsMapLayer* currentLayer = ((QgsLegendLayerFile*)(currentItem))->layer();
336
origLayer->copySymbologySettings(*currentLayer);
339
currentItem = dynamic_cast<QgsLegendItem*>(currentItem)->nextSibling();
341
mMapCanvas->refresh();
346
QgsMapLayer* origLayer = ((QgsLegendLayerFile*)(origin))->layer();
347
QgsMapLayer* destLayer = ((QgsLegendLayerFile*)(dest))->layer();
348
origLayer->copySymbologySettings(*destLayer);
349
origLayer->setLegend((QgsLegend*)(dynamic_cast<QgsLegendItem*>(dest->parent())->nextSibling()));
352
checkLayerOrderUpdate();
355
mMousePressedFlag = false;
356
mItemBeingMoved = NULL;
359
void QgsLegend::mouseDoubleClickEvent(QMouseEvent* e)
361
QgsLegendItem* li = dynamic_cast<QgsLegendItem*>(currentItem());
366
if(li->type() == QgsLegendItem::LEGEND_LAYER_FILE)
368
QgsLegendLayerFile* llf = dynamic_cast<QgsLegendLayerFile*>(li);
371
else if(li->type() == QgsLegendItem::LEGEND_LAYER)
373
QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer*>(li);
374
ml = ll->firstMapLayer();
377
if (ml && ml->type() == QgsMapLayer::RASTER)
379
QgsRasterLayerProperties *rlp = new QgsRasterLayerProperties(ml);
383
QCoreApplication::processEvents();
388
ml->showLayerProperties();
393
void QgsLegend::handleRightClickEvent(QTreeWidgetItem* item, const QPoint& position)
397
QString iconsPath = QgsApplication::themePath();
399
if(mMapCanvas->isDrawing())
404
QgsLegendItem* li = dynamic_cast<QgsLegendItem*>(item);
407
if(li->type() == QgsLegendItem::LEGEND_LAYER_FILE)
409
(static_cast<QgsLegendLayerFile*>(li))->layer()->contextMenu()->exec(position);
412
else if(li->type() == QgsLegendItem::LEGEND_LAYER)
414
theMenu.addAction(tr("&Properties"), this, SLOT(legendLayerShowProperties()));
415
theMenu.addAction(tr("&Zoom to layer extent"), this, SLOT(zoomToLayerExtent()));
416
theMenu.addAction(QIcon(QPixmap(iconsPath+QString("/mActionAddAllToOverview.png"))), tr("&Add to overview"), this, SLOT(legendLayerAddToOverview()));
417
theMenu.addAction(QIcon(QPixmap(iconsPath+QString("/mActionRemoveAllFromOverview.png"))), tr("&Remove from overview"), this, SLOT(legendLayerRemoveFromOverview()));
418
theMenu.addAction(QIcon(QPixmap(iconsPath+QString("/mActionRemove.png"))), tr("&Remove"), this, SLOT(legendLayerRemove()));
421
theMenu.addAction(tr("&Make to toplevel item"), this, SLOT(makeToTopLevelItem()));
423
//add entry 'allow editing'
424
QAction* toggleEditingAction = theMenu.addAction(tr("&Allow editing"), this, SLOT(legendLayerToggleEditing()));
425
toggleEditingAction->setCheckable(true);
426
QgsLegendLayer* theLayer = dynamic_cast<QgsLegendLayer*>(li);
429
QgsVectorLayer* theVectorLayer = dynamic_cast<QgsVectorLayer*>(theLayer->firstMapLayer());
430
if(!theVectorLayer || theLayer->mapLayers().size() !=1)
432
toggleEditingAction->setEnabled(false);
436
if(theVectorLayer->getDataProvider()->capabilities() & QgsVectorDataProvider::SaveAsShapefile)
438
theMenu.addAction(tr("&Save as shapefile..."), this, SLOT(legendLayerSaveAsShapefile()));
443
toggleEditingAction->setChecked(theVectorLayer->isEditable());
447
else if(li->type() == QgsLegendItem::LEGEND_GROUP)
449
theMenu.addAction(QPixmap(iconsPath+QString("/mActionRemove.png")), tr("&Remove"), this, SLOT(legendGroupRemove()));
452
if(li->type() == QgsLegendItem::LEGEND_LAYER || li->type() == QgsLegendItem::LEGEND_GROUP)
454
theMenu.addAction(tr("Re&name"), this, SLOT(openEditor()));
460
theMenu.addAction(QIcon(QPixmap(iconsPath+QString("/folder_new.png"))), tr("&Add group"), this, SLOT(addGroup()));
461
theMenu.addAction(QIcon(QPixmap(iconsPath+QString("/mActionExpandTree.png"))), tr("&Expand all"), this, SLOT(expandAll()));
462
theMenu.addAction(QIcon(QPixmap(iconsPath+QString("/mActionCollapseTree.png"))), tr("&Collapse all"), this, SLOT(collapseAll()));
463
QAction* showFileGroupsAction = theMenu.addAction(tr("Show file groups"), this, SLOT(showLegendLayerFileGroups()));
464
showFileGroupsAction->setCheckable(true);
465
showFileGroupsAction->blockSignals(true);
466
showFileGroupsAction->setChecked(mShowLegendLayerFiles);
467
showFileGroupsAction->blockSignals(false);
468
theMenu.exec(position);
471
int QgsLegend::getItemPos(QTreeWidgetItem* item)
474
QTreeWidgetItem* theItem = firstItem();
481
theItem = nextItem(theItem);
487
void QgsLegend::addLayer( QgsMapLayer * layer )
489
QgsLegendLayer * llayer = new QgsLegendLayer(layer->name());//generate entry for mStateOfCheckBoxes below
490
QgsLegendLayerFileGroup * llfgroup = new QgsLegendLayerFileGroup(llayer,QString("Files"));
491
QgsLegendLayerFile * llfile = new QgsLegendLayerFile(llfgroup, QgsLegendLayerFile::nameFromLayer(layer), layer);
492
llayer->setLayerTypeIcon();
493
llayer->setToolTip(0, layer->publicSource());
495
//set the correct check states
499
llfile->setCheckState(0, Qt::Checked);
500
llayer->setCheckState(0, Qt::Checked);
501
mStateOfCheckBoxes.insert(std::make_pair(llfile, Qt::Checked)); //insert the check state into the map to query for changes later
502
mStateOfCheckBoxes.insert(std::make_pair(llayer, Qt::Checked));
506
llfile->setCheckState(0, Qt::Unchecked);
507
llayer->setCheckState(0, Qt::Unchecked);
508
mStateOfCheckBoxes.insert(std::make_pair(llfile, Qt::Unchecked)); //insert the check state into the map to query for changes later
509
mStateOfCheckBoxes.insert(std::make_pair(llayer, Qt::Unchecked));
513
layer->setLegend(this);
514
layer->setLegendLayerFile(llfile);
515
layer->initContextMenu(mApp);
516
insertTopLevelItem(0, llayer);
517
setItemExpanded(llayer, true);
518
setItemExpanded(llfgroup, false);
519
//only if qsetting for 'legend layer file visible' is not set
520
if(!mShowLegendLayerFiles)
522
llfgroup->setHidden(true);
525
updateMapCanvasLayerSet();
528
if (mMapCanvas->layerCount() == 1)
529
mMapCanvas->zoomFullExtent();
530
setCurrentItem(llayer);
531
//make the QTreeWidget item up-to-date
533
layer->refreshLegend();
536
QgsMapLayer* QgsLegend::currentLayer()
538
QgsLegendItem* citem=dynamic_cast<QgsLegendItem*>(currentItem());
542
QgsLegendLayerFile* llf=dynamic_cast<QgsLegendLayerFile*>(citem);
545
return llf->layer(); //the current item is itself a legend layer file
549
QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer*>(citem);
552
return ll->firstMapLayer(); //the current item is a legend layer, so return its first layer
556
QgsLegendLayer* lpl = dynamic_cast<QgsLegendLayer*>(citem->parent());
559
return lpl->firstMapLayer(); //the parent of the current item is a legend layer, return its first layer
574
void QgsLegend::legendGroupRemove()
576
QgsLegendGroup* lg = dynamic_cast<QgsLegendGroup*>(currentItem());
579
//delete the legend layers first
580
QTreeWidgetItem * child = lg->child(0);
583
setCurrentItem(child);
585
child = lg->child(0);
592
void QgsLegend::legendLayerRemove()
594
//if the current item is a legend layer: remove all layers of the current legendLayer
595
QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer*>(currentItem());
598
std::list<QgsMapLayer*> maplayers = ll->mapLayers();
599
mStateOfCheckBoxes.erase(ll);
601
//also remove the entries for the QgsLegendLayerFiles from the map
602
std::list<QgsLegendLayerFile*> llfiles = ll->legendLayerFiles();
603
for(std::list<QgsLegendLayerFile*>::iterator it = llfiles.begin(); it != llfiles.end(); ++it)
605
mStateOfCheckBoxes.erase(*it);
608
for(std::list<QgsMapLayer*>::iterator it = maplayers.begin(); it!=maplayers.end(); ++it)
613
QgsMapLayerRegistry::instance()->removeMapLayer((*it)->getLayerID());
617
if(maplayers.size()>0)
619
mMapCanvas->refresh();
627
//if the current item is a legend layer file
628
QgsLegendLayerFile* llf = dynamic_cast<QgsLegendLayerFile*>(currentItem());
633
//the map layer registry emits a signal an this will remove the legend layer
634
//from the legend and from memory by calling QgsLegend::removeLayer(QString layer key)
635
QgsMapLayerRegistry::instance()->removeMapLayer(llf->layer()->getLayerID());
641
void QgsLegend::legendLayerAddToOverview()
643
//add or remove all layers to/ from overview
644
QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer*>(currentItem());
650
std::list<QgsMapLayer*> maplayers = ll->mapLayers();
651
for(std::list<QgsMapLayer*>::iterator it = maplayers.begin(); it!=maplayers.end(); ++it)
655
(*it)->inOverview(true);
658
mMapCanvas->updateOverview();
661
void QgsLegend::legendLayerRemoveFromOverview()
663
//add or remove all layers to/ from overview
664
QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer*>(currentItem());
669
std::list<QgsMapLayer*> maplayers = ll->mapLayers();
671
for(std::list<QgsMapLayer*>::iterator it = maplayers.begin(); it!=maplayers.end(); ++it)
675
(*it)->inOverview(false); //else
678
mMapCanvas->updateOverview();
681
void QgsLegend::legendLayerShowProperties()
683
QgsLegendItem* citem=dynamic_cast<QgsLegendItem*>(currentItem());
688
QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer*>(citem);
693
QgsMapLayer* ml = ll->firstMapLayer();
698
ml->showLayerProperties();
701
void QgsLegend::legendLayerToggleEditing()
703
QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer*>(currentItem());
708
QgsVectorLayer* theVectorLayer = dynamic_cast<QgsVectorLayer*>(ll->firstMapLayer());
713
if(theVectorLayer->isEditable())
715
theVectorLayer->stopEditing();
719
theVectorLayer->startEditing();
723
void QgsLegend::legendLayerSaveAsShapefile()
725
QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer*>(currentItem());
730
QgsVectorLayer* theVectorLayer = dynamic_cast<QgsVectorLayer*>(ll->firstMapLayer());
735
theVectorLayer->saveAsShapefile();
738
void QgsLegend::expandAll()
740
QTreeWidgetItem* theItem = firstItem();
743
setExpanded(indexFromItem(theItem), true);
744
theItem = nextItem(theItem);
748
void QgsLegend::collapseAll()
750
QTreeWidgetItem* theItem = firstItem();
753
setExpanded(indexFromItem(theItem), false);
754
theItem = nextItem(theItem);
758
bool QgsLegend::writeXML( QDomNode & layer_node, QDomDocument & document )
760
QDomElement legendnode = document.createElement("legend");
761
layer_node.appendChild(legendnode);
763
QDomElement tmplegendnode = legendnode; /*copy of the legendnode*/
764
QDomElement legendgroupnode;
765
QDomElement legendlayernode;
766
QDomElement layerfilegroupnode;
767
QDomElement legendsymbolnode;
768
QDomElement legendpropertynode;
769
QDomElement legendlayerfilenode;
770
QgsLegendLayerFile* llf;
771
Qt::CheckState cstate; //check state for legend layers and legend groups
773
QTreeWidgetItem* currentItem = firstItem();
776
QgsLegendItem *item = dynamic_cast<QgsLegendItem*>(currentItem);
781
case QgsLegendItem::LEGEND_GROUP:
782
//make sure the legendnode is 'legend' again after a legend group
783
if(!(item->parent()))
785
legendnode = tmplegendnode;
787
legendgroupnode = document.createElement("legendgroup");
788
if(isItemExpanded(item))
790
legendgroupnode.setAttribute("open","true");
794
legendgroupnode.setAttribute("open","false");
796
legendgroupnode.setAttribute("name",item->text(0));
797
cstate = item->checkState(0);
798
if(cstate == Qt::Checked)
800
legendgroupnode.setAttribute("checked","Qt::Checked");
802
else if(cstate == Qt::Unchecked)
804
legendgroupnode.setAttribute("checked","Qt::Unchecked");
806
else if(cstate == Qt::PartiallyChecked)
808
legendgroupnode.setAttribute("checked","Qt::PartiallyChecked");
810
legendnode.appendChild(legendgroupnode);
811
tmplegendnode = legendnode;
812
legendnode = legendgroupnode;
815
case QgsLegendItem::LEGEND_LAYER:
816
//make sure the legendnode is 'legend' again after a legend group
817
if(!(item->parent()))
819
legendnode = tmplegendnode;
821
legendlayernode = document.createElement("legendlayer");
822
if(isItemExpanded(item))
824
legendlayernode.setAttribute("open","true");
828
legendlayernode.setAttribute("open","false");
830
cstate = item->checkState(0);
831
if(cstate == Qt::Checked)
833
legendlayernode.setAttribute("checked","Qt::Checked");
835
else if(cstate == Qt::Unchecked)
837
legendlayernode.setAttribute("checked","Qt::Unchecked");
839
else if(cstate == Qt::PartiallyChecked)
841
legendlayernode.setAttribute("checked","Qt::PartiallyChecked");
843
legendlayernode.setAttribute("name", item->text(0));
844
legendnode.appendChild(legendlayernode);
847
case QgsLegendItem::LEGEND_PROPERTY_GROUP:
848
legendpropertynode = document.createElement("propertygroup");
849
if(isItemExpanded(item))
851
legendpropertynode.setAttribute("open","true");
855
legendpropertynode.setAttribute("open","false");
857
legendlayernode.appendChild(legendpropertynode);
860
case QgsLegendItem::LEGEND_SYMBOL_GROUP:
861
legendsymbolnode = document.createElement("symbolgroup");
862
if(isItemExpanded(item))
864
legendsymbolnode.setAttribute("open", "true");
868
legendsymbolnode.setAttribute("open", "false");
870
legendlayernode.appendChild(legendsymbolnode);
874
case QgsLegendItem::LEGEND_LAYER_FILE_GROUP:
875
layerfilegroupnode = document.createElement("filegroup");
876
if(isItemExpanded(item))
878
layerfilegroupnode.setAttribute("open", "true");
882
layerfilegroupnode.setAttribute("open", "false");
884
if(isItemHidden(item))
886
layerfilegroupnode.setAttribute("hidden", "true");
890
layerfilegroupnode.setAttribute("hidden", "false");
893
legendlayernode.appendChild(layerfilegroupnode);
896
case QgsLegendItem::LEGEND_LAYER_FILE:
897
legendlayerfilenode = document.createElement("legendlayerfile");
898
llf = dynamic_cast<QgsLegendLayerFile*>(item);
901
legendlayerfilenode.setAttribute("layerid", llf->layer()->getLayerID());
902
layerfilegroupnode.appendChild(legendlayerfilenode);
906
default: //do nothing for the leaf nodes
910
currentItem = nextItem(currentItem);
915
bool QgsLegend::readXML(QDomNode& legendnode)
917
QDomElement childelem;
919
QgsLegendGroup* lastGroup = 0; //pointer to the last inserted group
920
QgsLegendLayer* lastLayer = 0; //pointer to the last inserted legendlayer
921
QgsLegendLayerFileGroup* lastLayerFileGroup = 0; //pointer to the last inserted layerfilegroup
923
child = legendnode.firstChild();
925
// For some unexplained reason, collapsing/expanding the legendLayer items
926
// immediately after they have been created doesn't work (they all end up
927
// expanded). The legendGroups and legendLayerFiles seems ok through. The
928
// workaround is to store the required states of the legendLayers and set
929
// them at the end of this function.
930
QList<QTreeWidgetItem*> collapsed, expanded;
934
clear(); //remove all items first
935
mStateOfCheckBoxes.clear();
939
QDomElement childelem = child.toElement();
940
QString name = childelem.attribute("name");
942
//test every possibility of element...
943
if(childelem.tagName()=="legendgroup")
945
QgsLegendGroup* theGroup = new QgsLegendGroup(this, name);
946
childelem.attribute("open") == "true" ? expandItem(theGroup) : collapseItem(theGroup);
947
//set the checkbox of the legend group to the right state
949
QString checked = childelem.attribute("checked");
950
if(checked == "Qt::Checked")
952
theGroup->setCheckState(0, Qt::Checked);
953
mStateOfCheckBoxes.insert(std::make_pair(theGroup, Qt::Checked));
955
else if(checked == "Qt::Unchecked")
957
theGroup->setCheckState(0, Qt::Unchecked);
958
mStateOfCheckBoxes.insert(std::make_pair(theGroup, Qt::Unchecked));
960
else if(checked == "Qt::PartiallyChecked")
962
theGroup->setCheckState(0, Qt::PartiallyChecked);
963
mStateOfCheckBoxes.insert(std::make_pair(theGroup, Qt::PartiallyChecked));
966
lastGroup = theGroup;
968
else if(childelem.tagName()=="legendlayer")
970
//add the legendlayer to the legend (but no legendlayerfile yet, follows later)
971
//if childelem is in a legendgroup element, add the layer to the group
972
QgsLegendLayer* theLayer;
973
if(child.parentNode().toElement().tagName() == "legendgroup")
975
theLayer = new QgsLegendLayer(lastGroup, name);
979
theLayer = new QgsLegendLayer(this, name);
983
childelem.attribute("open") == "true" ? expanded.push_back(theLayer) : collapsed.push_back(theLayer);
985
//set the checkbox of the legend layer to the right state
987
QString checked = childelem.attribute("checked");
988
if(checked == "Qt::Checked")
990
theLayer->setCheckState(0, Qt::Checked);
991
mStateOfCheckBoxes.insert(std::make_pair(theLayer, Qt::Checked));
993
else if(checked == "Qt::Unchecked")
995
theLayer->setCheckState(0, Qt::Unchecked);
996
mStateOfCheckBoxes.insert(std::make_pair(theLayer, Qt::Unchecked));
998
else if(checked == "Qt::PartiallyChecked")
1000
theLayer->setCheckState(0, Qt::PartiallyChecked);
1001
mStateOfCheckBoxes.insert(std::make_pair(theLayer, Qt::PartiallyChecked));
1003
blockSignals(false);
1005
lastLayer = theLayer;
1007
else if(childelem.tagName()=="legendlayerfile")
1009
//find out the legendlayer
1010
std::map<QString,QgsMapLayer*> mapLayers = QgsMapLayerRegistry::instance()->mapLayers();
1011
std::map<QString, QgsMapLayer*>::const_iterator iter = mapLayers.find(childelem.attribute("layerid"));
1012
if(iter != mapLayers.end() && lastLayerFileGroup)
1014
QgsMapLayer* theMapLayer = iter->second;
1015
QgsLegendLayerFile* theLegendLayerFile = new QgsLegendLayerFile(lastLayerFileGroup, QgsLegendLayerFile::nameFromLayer(theMapLayer), theMapLayer);
1016
theMapLayer->setLegendLayerFile(theLegendLayerFile);
1018
//set the check state
1020
if(theMapLayer->visible())
1022
mStateOfCheckBoxes.insert(std::make_pair(theLegendLayerFile, Qt::Checked));
1023
theLegendLayerFile->setCheckState(0, Qt::Checked);
1027
mStateOfCheckBoxes.insert(std::make_pair(theLegendLayerFile, Qt::Unchecked));
1028
theLegendLayerFile->setCheckState(0, Qt::Unchecked);
1030
blockSignals(false);
1032
theMapLayer->setLegend(this);
1033
if(child.nextSibling().isNull())
1035
theMapLayer->refreshLegend();
1038
//set the layer type icon if this legendlayerfile is the last in the file group
1039
if(child.nextSibling().isNull())
1041
static_cast<QgsLegendLayer*>(theLegendLayerFile->parent()->parent())->setLayerTypeIcon();
1045
else if(childelem.tagName()=="filegroup")
1047
QgsLegendLayerFileGroup* theFileGroup = new QgsLegendLayerFileGroup(lastLayer, "Files");
1048
childelem.attribute("open") == "true" ? expandItem(theFileGroup) : collapseItem(theFileGroup);
1049
childelem.attribute("hidden") == "true" ? theFileGroup->setHidden(true) : theFileGroup->setHidden(false);
1050
lastLayerFileGroup = theFileGroup;
1052
else if(childelem.tagName() == "propertygroup")
1054
QgsLegendPropertyGroup* thePropertyGroup = new QgsLegendPropertyGroup(lastLayer, "Properties");
1055
childelem.attribute("open") == "true" ? expandItem(thePropertyGroup) : collapseItem(thePropertyGroup);
1057
child = nextDomNode(child);
1059
while(!(child.isNull()));
1062
// Do the tree item expands and collapses.
1063
for (int i = 0; i < collapsed.size(); ++i)
1064
collapseItem(collapsed[i]);
1066
for (int i = 0; i < expanded.size(); ++i)
1067
expandItem(expanded[i]);
1072
void QgsLegend::storeInitialPosition(QTreeWidgetItem* li)
1074
if(li == firstItem()) //the item is the first item in the list view
1076
mRestoreInformation = FIRST_ITEM;
1079
else if(li->parent() == 0) //li is a toplevel item, but not the first one
1081
mRestoreInformation = YOUNGER_SIBLING;
1082
mRestoreItem = ((QgsLegendItem*)(li))->findYoungerSibling();
1084
else if(li == li->parent()->child(0))//li is not a toplevel item, but the first child
1086
mRestoreInformation = FIRST_CHILD;
1087
mRestoreItem = li->parent();
1091
mRestoreInformation = YOUNGER_SIBLING;
1092
mRestoreItem = ((QgsLegendItem*)(li))->findYoungerSibling();
1094
mLayersPriorToMove = layerIDs();
1097
void QgsLegend::resetToInitialPosition(QTreeWidgetItem* li)
1099
QgsLegendItem* formerParent = dynamic_cast<QgsLegendItem*>(li->parent()); //todo: make sure legend layers are updated
1100
if(mRestoreInformation == FIRST_ITEM)
1103
qWarning("FIRST_ITEM");
1106
insertTopLevelItem(0, li);
1108
else if(mRestoreInformation == FIRST_CHILD)
1111
qWarning("FIRST_CHILD");
1116
formerParent->release((QgsLegendItem*)li);
1118
mRestoreItem->insertChild(0, li);
1119
((QgsLegendItem*)mRestoreItem)->receive((QgsLegendItem*)li);
1121
else if(mRestoreInformation == YOUNGER_SIBLING)
1124
qWarning("YOUNGER_SIBLING");
1128
formerParent->release((QgsLegendItem*)li);
1130
dynamic_cast<QgsLegendItem*>(li)->moveItem(dynamic_cast<QgsLegendItem*>(mRestoreItem));
1131
if(mRestoreItem->parent())
1133
((QgsLegendItem*)(mRestoreItem->parent()))->receive((QgsLegendItem*)li);
1138
QgsLegendLayer* QgsLegend::findLegendLayer(const QString& layerKey)
1140
QgsLegendLayer* theLegendLayer = 0;
1141
std::list<QgsMapLayer*> theMapLayers;
1142
QTreeWidgetItem* theItem = firstItem();
1145
theLegendLayer = dynamic_cast<QgsLegendLayer*>(theItem);
1146
if(theLegendLayer) //item is a legend layer
1148
theMapLayers = theLegendLayer->mapLayers();
1149
for(std::list<QgsMapLayer*>::iterator it = theMapLayers.begin(); it != theMapLayers.end(); ++it)
1151
if((*it)->getLayerID() == layerKey)
1153
return theLegendLayer;
1158
while(theItem = nextItem(theItem));
1162
void QgsLegend::adjustIconSize()
1164
if(mPixmapWidthValues.size() > 0 && mPixmapHeightValues.size() > 0)
1166
std::multiset<int>::const_reverse_iterator width_it = mPixmapWidthValues.rbegin();
1167
std::multiset<int>::const_reverse_iterator height_it = mPixmapHeightValues.rbegin();
1168
int maxWidth = *width_it;
1169
int maxHeight = *height_it;
1171
QSize currentIconSize = iconSize();
1172
if(maxWidth == currentIconSize.width() && maxHeight == currentIconSize.height())
1174
//no resizing necessary
1178
//keep the minimum size
1179
if(maxWidth < mMinimumIconSize.width())
1181
maxWidth = mMinimumIconSize.width();
1183
if(maxHeight < mMinimumIconSize.height())
1185
maxHeight = mMinimumIconSize.height();
1188
setIconSize(QSize(maxWidth, maxHeight));
1192
bool QgsLegend::yCoordAboveCenter(QgsLegendItem* it, int ycoord)
1194
QRect rect = visualItemRect(it);
1195
int height = rect.height();
1196
int top = rect.top();
1197
int mid = top + (height / 2);
1198
if (ycoord > mid) //bottom, remember the y-coordinate increases downwards
1208
/**Returns the first item in the hierarchy*/
1209
QTreeWidgetItem* QgsLegend::firstItem()
1211
return topLevelItem(0);
1214
/**Returns the next item (next sibling or next item on level above)*/
1215
QTreeWidgetItem* QgsLegend::nextItem(QTreeWidgetItem* item)
1217
QgsLegendItem* litem = dynamic_cast<QgsLegendItem*>(item);
1218
if(litem->childCount() > 0)
1220
return litem->child(0);
1222
else if(litem->nextSibling())
1224
return litem->nextSibling();
1226
else if(!(litem->parent()))
1230
//go to other levels to find the next item
1231
else if(litem->parent() && ((QgsLegendItem*)(litem->parent()))->nextSibling())
1233
return (dynamic_cast<QgsLegendItem*>(litem->parent())->nextSibling());
1235
else if(litem->parent() && litem->parent()->parent() && ((QgsLegendItem*)(litem->parent()->parent()))->nextSibling())
1237
return (dynamic_cast<QgsLegendItem*>(litem->parent()->parent())->nextSibling());
1239
else if(litem->parent() && litem->parent()->parent() && litem->parent()->parent()->parent() &&\
1240
((QgsLegendItem*)(litem->parent()->parent()->parent()))->nextSibling())//maximum four nesting states in the current legend
1242
return (dynamic_cast<QgsLegendItem*>(litem->parent()->parent()->parent())->nextSibling());
1250
QTreeWidgetItem* QgsLegend::nextSibling(QTreeWidgetItem* item)
1252
QModelIndex thisidx = indexFromItem(item);
1253
QModelIndex nextsidx = thisidx.sibling(thisidx.row()+1, thisidx.column());
1254
if(nextsidx.isValid())
1256
return dynamic_cast<QgsLegendItem*>(itemFromIndex(nextsidx));
1264
QTreeWidgetItem* QgsLegend::previousSibling(QTreeWidgetItem* item)
1266
QModelIndex thisidx = indexFromItem(item);
1267
QModelIndex nextsidx = thisidx.sibling(thisidx.row()-1, thisidx.column());
1268
if(nextsidx.isValid())
1270
return dynamic_cast<QgsLegendItem*>(itemFromIndex(nextsidx));
1278
QDomNode QgsLegend::nextDomNode(const QDomNode& theNode)
1280
if(!theNode.firstChild().isNull())
1282
return (theNode.firstChild());
1285
QDomNode currentNode = theNode;
1288
if(!currentNode.nextSibling().isNull())
1290
return currentNode.nextSibling();
1292
currentNode = currentNode.parentNode();
1294
while(!currentNode.isNull());
1300
void QgsLegend::insertItem(QTreeWidgetItem* move, QTreeWidgetItem* into)
1302
QgsLegendItem* movedItem = dynamic_cast<QgsLegendItem*>(move);
1303
QgsLegendItem* intoItem = dynamic_cast<QgsLegendItem*>(into);
1305
if(movedItem && intoItem)
1307
QgsLegendItem* parentItem = dynamic_cast<QgsLegendItem*>(movedItem->parent());
1308
movedItem->storeAppearanceSettings();//store settings in the moved item and its children
1309
removeItem(movedItem);
1310
intoItem->insert(movedItem);
1313
parentItem->release(movedItem); //give the former parent item the possibility to do cleanups
1315
intoItem->receive(movedItem);
1316
movedItem->restoreAppearanceSettings();//apply the settings again
1320
void QgsLegend::moveItem(QTreeWidgetItem* move, QTreeWidgetItem* after)
1322
static_cast<QgsLegendItem*>(move)->storeAppearanceSettings();//store settings in the moved item and its childern
1325
move->parent()->takeChild(move->parent()->indexOfChild(move));
1327
else //move is toplevel item
1329
takeTopLevelItem(indexOfTopLevelItem(move));
1333
after->parent()->insertChild(after->parent()->indexOfChild(after)+1, move);
1335
else //toplevel item
1337
insertTopLevelItem(indexOfTopLevelItem(after)+1, move);
1339
static_cast<QgsLegendItem*>(move)->restoreAppearanceSettings();//apply the settings again
1342
void QgsLegend::removeItem(QTreeWidgetItem* item)
1346
item->parent()->takeChild(item->parent()->indexOfChild(item));
1350
takeTopLevelItem(indexOfTopLevelItem(item));
1354
void QgsLegend::updateMapCanvasLayerSet()
1356
std::deque<QString> layers = layerIDs();
1357
mMapCanvas->setLayerSet(layers);
1360
std::deque<QString> QgsLegend::layerIDs()
1362
std::deque<QString> layers;
1363
QTreeWidgetItem* theItem = firstItem();
1366
QgsLegendItem *li = dynamic_cast<QgsLegendItem*>(theItem);
1367
QgsLegendLayerFile* llf = dynamic_cast<QgsLegendLayerFile*>(li);
1370
QgsMapLayer *lyr = llf->layer();
1371
layers.push_front(lyr->getLayerID());
1373
theItem = nextItem(theItem);
1377
qWarning("QgsLegend::layerIDs()");
1378
for(std::deque<QString>::iterator it = layers.begin(); it != layers.end(); ++it)
1387
void QgsLegend::changeSymbologySettings(const QString& key, const std::list< std::pair<QString, QPixmap> >* newSymbologyItems)
1389
QgsMapLayer* theMapLayer = QgsMapLayerRegistry::instance()->mapLayer(key);
1394
QgsLegendLayer* theLegendLayer = findLegendLayer(key);
1395
QgsLegendSymbologyItem* theSymbologyItem = 0;
1401
//store the current item
1402
QTreeWidgetItem* theCurrentItem = currentItem();
1404
//remove the symbology items under the legend layer
1405
for(int i = theLegendLayer->childCount(); i >= 0; --i)
1407
theSymbologyItem = dynamic_cast<QgsLegendSymbologyItem*>((theLegendLayer)->child(i));
1408
if(theSymbologyItem)
1410
delete (theLegendLayer->takeChild(i));
1414
//add the new symbology items
1415
if(newSymbologyItems)
1417
int childposition = 0; //position to insert the items
1418
for(std::list< std::pair<QString, QPixmap> >::const_iterator it= newSymbologyItems->begin(); it != newSymbologyItems->end(); ++it)
1420
QgsLegendSymbologyItem* theItem = new QgsLegendSymbologyItem(it->second.width(), it->second.height());
1421
theItem->setLegend(this);
1422
theItem->setText(0, it->first);
1423
theItem->setIcon(0, QIcon(it->second));
1424
theLegendLayer->insertChild(childposition, theItem);
1429
//copy the legend settings for the other layer files in the same legend layer
1430
theLegendLayer->updateLayerSymbologySettings(theMapLayer);
1432
//restore the current item again
1433
setCurrentItem(theCurrentItem);
1435
setItemExpanded(theLegendLayer, true);//make sure the symbology items are visible
1438
void QgsLegend::addPixmapWidthValue(int width)
1440
mPixmapWidthValues.insert(width);
1443
void QgsLegend::addPixmapHeightValue(int height)
1445
mPixmapHeightValues.insert(height);
1448
void QgsLegend::removePixmapWidthValue(int width)
1450
std::multiset<int>::iterator it = mPixmapWidthValues.find(width);
1451
if (it != mPixmapWidthValues.end())
1453
mPixmapWidthValues.erase(it);
1455
//todo: adapt the icon size if width is the largest value and the size of the next element is higher than the minimum
1458
void QgsLegend::removePixmapHeightValue(int height)
1460
std::multiset<int>::iterator it = mPixmapHeightValues.find(height);
1461
if (it != mPixmapHeightValues.end())
1463
mPixmapHeightValues.erase(height);
1465
//todo: adapt the icon size if height is the largest value and the size of the next element is higher than the minimum
1468
void QgsLegend::setName(QgsLegendLayerFile* legendLayerFile,
1471
if (legendLayerFile)
1473
QTreeWidgetItem* p = legendLayerFile->parent();
1478
p->setText(0, layerName);
1484
void QgsLegend::handleItemChange(QTreeWidgetItem* item, int row)
1491
//close the editor (for QgsLegendLayer and QgsLegendGroup)
1492
closePersistentEditor(item, row);
1493
//if the text of a QgsLegendLayer has changed, change the display names of all its maplayers
1494
QgsLegendLayer* theLegendLayer = dynamic_cast<QgsLegendLayer*>(item); //item is a legend layer
1497
std::list<QgsMapLayer*> theMapLayers = theLegendLayer->mapLayers();
1498
for(std::list<QgsMapLayer*>::iterator it = theMapLayers.begin(); it != theMapLayers.end(); ++it)
1500
(*it)->setLayerName(theLegendLayer->text(0), false);
1504
std::map<QTreeWidgetItem*, Qt::CheckState>::iterator it = mStateOfCheckBoxes.find(item);
1505
if(it != mStateOfCheckBoxes.end())
1507
if(it->second != item->checkState(0)) //the checkState has changed
1510
QgsLegendLayerFile* llf = dynamic_cast<QgsLegendLayerFile*>(item); //item is a layer file
1515
llf->layer()->setVisible(item->checkState(0) == Qt::Checked);
1517
//update check state of the legend layer
1518
QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer*>(item->parent()->parent());
1521
ll->updateCheckState();
1522
mStateOfCheckBoxes[ll] = ll->checkState(0);
1524
//update check state of the legend group (if any)
1525
if(item->parent()->parent()->parent())
1527
QgsLegendGroup* lg = dynamic_cast<QgsLegendGroup*>(item->parent()->parent()->parent());
1530
lg->updateCheckState();
1531
mStateOfCheckBoxes[lg] = lg->checkState(0);
1534
mStateOfCheckBoxes[item] = item->checkState(0);
1535
// Setting the renderFlag to true will trigger a render,
1536
// so only do this if the flag is alread set to true.
1537
if (mMapCanvas->renderFlag())
1538
mMapCanvas->setRenderFlag(true);
1542
std::list<QgsLegendLayerFile*> subfiles;
1543
QgsLegendGroup* lg = dynamic_cast<QgsLegendGroup*>(item); //item is a legend group
1546
//set all the child layer files to the new check state
1547
subfiles = lg->legendLayerFiles();
1548
bool renderFlagState = mMapCanvas->renderFlag();
1549
mMapCanvas->setRenderFlag(false);
1550
for(std::list<QgsLegendLayerFile*>::iterator iter = subfiles.begin(); iter != subfiles.end(); ++iter)
1553
if(item->checkState(0) == Qt::Checked)
1555
qWarning("item checked");
1557
else if(item->checkState(0) == Qt::Unchecked)
1559
qWarning("item unchecked");
1561
else if(item->checkState(0) == Qt::PartiallyChecked)
1563
qWarning("item partially checked");
1567
(*iter)->setCheckState(0, item->checkState(0));
1568
blockSignals(false);
1569
mStateOfCheckBoxes[(*iter)] = item->checkState(0);
1570
if((*iter)->layer())
1572
(*iter)->layer()->setVisible(item->checkState(0) == Qt::Checked);
1576
//update the check states of all child legend layers
1577
for(int i = 0; i < lg->childCount(); ++i)
1579
static_cast<QgsLegendLayer*>(lg->child(i))->updateCheckState();
1580
mStateOfCheckBoxes[lg->child(i)] = lg->child(i)->checkState(0);
1582
// If it was on, turn it back on, otherwise leave it
1583
// off, as turning it on causes a refresh.
1584
if (renderFlagState)
1585
mMapCanvas->setRenderFlag(true);
1586
mStateOfCheckBoxes[item] = item->checkState(0);
1590
QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer*>(item); //item is a legend layer
1593
//set all the child layer files to the new check state
1594
subfiles = ll->legendLayerFiles();
1595
bool renderFlagState = mMapCanvas->renderFlag();
1596
mMapCanvas->setRenderFlag(false);
1597
for(std::list<QgsLegendLayerFile*>::iterator iter = subfiles.begin(); iter != subfiles.end(); ++iter)
1600
(*iter)->setCheckState(0, item->checkState(0));
1601
blockSignals(false);
1602
mStateOfCheckBoxes[(*iter)] = item->checkState(0);
1603
if((*iter)->layer())
1605
(*iter)->layer()->setVisible(item->checkState(0) == Qt::Checked);
1610
static_cast<QgsLegendGroup*>(ll->parent())->updateCheckState();
1611
mStateOfCheckBoxes[ll->parent()] = ll->parent()->checkState(0);
1613
// If it was on, turn it back on, otherwise leave it
1614
// off, as turning it on causes a refresh.
1615
if (renderFlagState)
1616
mMapCanvas->setRenderFlag(true);
1617
//update check state of the legend group
1619
mStateOfCheckBoxes[item] = item->checkState(0);
1624
void QgsLegend::openEditor()
1626
QTreeWidgetItem* theItem = currentItem();
1629
openPersistentEditor(theItem, 0);
1633
void QgsLegend::makeToTopLevelItem()
1635
QgsLegendItem* theItem = dynamic_cast<QgsLegendItem*>(currentItem());
1638
theItem->storeAppearanceSettings();
1639
removeItem(theItem);
1640
addTopLevelItem(theItem);
1641
theItem->restoreAppearanceSettings();
1645
void QgsLegend::showLegendLayerFileGroups()
1647
// Toggle the boolean associated with the checkbox
1648
mShowLegendLayerFiles = !mShowLegendLayerFiles;
1650
QgsLegendLayerFileGroup* theFileGroup = 0;
1651
QTreeWidgetItem* theItem = firstItem();
1660
// This call seems to fix a bug in Qt4.2 (qgis trac #405) whereby the
1661
// setHidden() call in the if statement below doesn't result in
1662
// correct drawing of the visible file group part of the tree,
1663
// but doing this setHidden() call does result in correct drawing.
1664
theItem->setHidden(false);
1666
theFileGroup = dynamic_cast<QgsLegendLayerFileGroup*>(theItem);
1669
theFileGroup->setHidden(!mShowLegendLayerFiles);
1672
while(theItem = nextItem(theItem));
1675
void QgsLegend::zoomToLayerExtent()
1677
//find current Layer
1678
QgsLegendLayer* currentLayer=dynamic_cast<QgsLegendLayer*>(currentItem());
1684
std::list<QgsLegendLayerFile*> layerFiles = currentLayer->legendLayerFiles();
1685
if(layerFiles.size() == 0)
1690
QgsRect transformedExtent;
1691
QgsRect layerExtent;
1692
QgsCoordinateTransform *ct;
1693
QgsMapLayer* theLayer;
1696
for(std::list<QgsLegendLayerFile*>::iterator it= layerFiles.begin(); it != layerFiles.end(); ++it)
1698
theLayer = (*it)->layer();
1701
layerExtent = theLayer->extent();
1703
if (theLayer->projectionsEnabled()
1704
&& (ct = theLayer->coordinateTransform()))
1708
layerExtent = ct->transformBoundingBox(layerExtent, QgsCoordinateTransform::FORWARD);
1710
catch (QgsCsException &cse)
1712
// Catch any exceptions, and by default the rest of the code
1713
// just gets the unprojected extent instead.
1716
// If the extent is odd, default to the unprojected extent.
1717
if (!layerExtent.isFinite())
1718
layerExtent = theLayer->extent();
1723
transformedExtent = layerExtent;
1728
transformedExtent.combineExtentWith(&layerExtent);
1733
//zoom to bounding box
1734
mMapCanvas->setExtent(transformedExtent);
1735
mMapCanvas->render();
1736
mMapCanvas->refresh();
1740
bool QgsLegend::checkLayerOrderUpdate()
1742
std::deque<QString> layersAfterRelease = layerIDs(); //test if canvas redraw is really necessary
1743
if(layersAfterRelease != mLayersPriorToMove)
1745
// z-order has changed - update layer set
1746
updateMapCanvasLayerSet();