@@ -84,6 +84,7 @@ QgsLegend::~QgsLegend()
84
84
void QgsLegend::addGroup ()
85
85
{
86
86
QgsLegendGroup* group = new QgsLegendGroup (this , tr (" group" ));
87
+ mStateOfCheckBoxes .insert (std::make_pair (group, Qt::Checked)); // insert the check state into the map to query for changes later
87
88
setExpanded (indexFromItem (group), true );
88
89
}
89
90
@@ -224,8 +225,7 @@ void QgsLegend::mouseMoveEvent(QMouseEvent * e)
224
225
setCursor ( QCursor (Qt::PointingHandCursor) );
225
226
if (origin->parent () != dest)
226
227
{
227
- removeItem (origin);
228
- dest->insert (origin, false );
228
+ insertItem (origin, dest);
229
229
setCurrentItem (origin);
230
230
}
231
231
}
@@ -438,7 +438,7 @@ int QgsLegend::getItemPos(QTreeWidgetItem* item)
438
438
439
439
void QgsLegend::addLayer ( QgsMapLayer * layer )
440
440
{
441
- QgsLegendLayer * llayer = new QgsLegendLayer (QString ( layer->name () ));
441
+ QgsLegendLayer * llayer = new QgsLegendLayer (layer->name ());
442
442
mStateOfCheckBoxes .insert (std::make_pair (llayer, Qt::Checked)); // insert the check state into the map to query for changes later
443
443
QgsLegendLayerFileGroup * llfgroup = new QgsLegendLayerFileGroup (llayer,QString (" Files" ));
444
444
QgsLegendLayerFile * llfile = new QgsLegendLayerFile (llfgroup, QgsLegendLayerFile::nameFromLayer (layer), layer);
@@ -681,7 +681,7 @@ bool QgsLegend::writeXML( QDomNode & layer_node, QDomDocument & document )
681
681
QDomElement legendpropertynode;
682
682
QDomElement legendlayerfilenode;
683
683
QgsLegendLayerFile* llf;
684
- Qt::CheckState cstate; // check state for legend layers
684
+ Qt::CheckState cstate; // check state for legend layers and legend groups
685
685
686
686
QTreeWidgetItem* currentItem = firstItem ();
687
687
while (currentItem)
@@ -707,6 +707,19 @@ bool QgsLegend::writeXML( QDomNode & layer_node, QDomDocument & document )
707
707
legendgroupnode.setAttribute (" open" ," false" );
708
708
}
709
709
legendgroupnode.setAttribute (" name" ,item->text (0 ));
710
+ cstate = item->checkState (0 );
711
+ if (cstate == Qt::Checked)
712
+ {
713
+ legendgroupnode.setAttribute (" checked" ," Qt::Checked" );
714
+ }
715
+ else if (cstate == Qt::Unchecked)
716
+ {
717
+ legendgroupnode.setAttribute (" checked" ," Qt::Unchecked" );
718
+ }
719
+ else if (cstate == Qt::PartiallyChecked)
720
+ {
721
+ legendgroupnode.setAttribute (" checked" ," Qt::PartiallyChecked" );
722
+ }
710
723
legendnode.appendChild (legendgroupnode);
711
724
tmplegendnode = legendnode;
712
725
legendnode = legendgroupnode;
@@ -837,6 +850,25 @@ bool QgsLegend::readXML(QDomNode& legendnode)
837
850
{
838
851
QgsLegendGroup* theGroup = new QgsLegendGroup (this , name);
839
852
childelem.attribute (" open" ) == " true" ? expandItem (theGroup) : collapseItem (theGroup);
853
+ // set the checkbox of the legend group to the right state
854
+ blockSignals (true );
855
+ QString checked = childelem.attribute (" checked" );
856
+ if (checked == " Qt::Checked" )
857
+ {
858
+ theGroup->setCheckState (0 , Qt::Checked);
859
+ mStateOfCheckBoxes .insert (std::make_pair (theGroup, Qt::Checked));
860
+ }
861
+ else if (checked == " Qt::Unchecked" )
862
+ {
863
+ theGroup->setCheckState (0 , Qt::Unchecked);
864
+ mStateOfCheckBoxes .insert (std::make_pair (theGroup, Qt::Unchecked));
865
+ }
866
+ else if (checked == " Qt::PartiallyChecked" )
867
+ {
868
+ theGroup->setCheckState (0 , Qt::PartiallyChecked);
869
+ mStateOfCheckBoxes .insert (std::make_pair (theGroup, Qt::PartiallyChecked));
870
+ }
871
+ blockSignals (false );
840
872
lastGroup = theGroup;
841
873
}
842
874
else if (childelem.tagName ()==" legendlayer" )
@@ -1121,6 +1153,20 @@ QDomNode QgsLegend::nextDomNode(const QDomNode& theNode)
1121
1153
}
1122
1154
}
1123
1155
1156
+ void QgsLegend::insertItem (QTreeWidgetItem* move, QTreeWidgetItem* into)
1157
+ {
1158
+ QgsLegendItem* movedItem = dynamic_cast <QgsLegendItem*>(move);
1159
+ QgsLegendItem* intoItem = dynamic_cast <QgsLegendItem*>(into);
1160
+
1161
+ if (movedItem && intoItem)
1162
+ {
1163
+ movedItem->storeAppearanceSettings ();// store settings in the moved item and its children
1164
+ removeItem (movedItem);
1165
+ intoItem->insert (movedItem);
1166
+ movedItem->restoreAppearanceSettings ();// apply the settings again
1167
+ }
1168
+ }
1169
+
1124
1170
void QgsLegend::moveItem (QTreeWidgetItem* move, QTreeWidgetItem* after)
1125
1171
{
1126
1172
static_cast <QgsLegendItem*>(move)->storeAppearanceSettings ();// store settings in the moved item and its childern
@@ -1227,7 +1273,138 @@ void QgsLegend::changeSymbologySettings(const QString& key, const std::list< std
1227
1273
1228
1274
void QgsLegend::handleItemChange (QTreeWidgetItem* item, int row)
1229
1275
{
1276
+ if (!item)
1277
+ {
1278
+ return ;
1279
+ }
1280
+
1230
1281
closePersistentEditor (item, row);
1282
+
1283
+ std::map<QTreeWidgetItem*, Qt::CheckState>::iterator it = mStateOfCheckBoxes .find (item);
1284
+ if (it != mStateOfCheckBoxes .end ())
1285
+ {
1286
+ if (it->second != item->checkState (0 )) // the checkState has changed
1287
+ {
1288
+
1289
+ QgsLegendLayerFile* llf = dynamic_cast <QgsLegendLayerFile*>(item); // item is a layer file
1290
+ if (llf)
1291
+ {
1292
+ if (llf->layer ())
1293
+ {
1294
+ llf->layer ()->setVisible (item->checkState (0 ) == Qt::Checked);
1295
+ }
1296
+ // update check state of the legend layer
1297
+ QgsLegendLayer* ll = dynamic_cast <QgsLegendLayer*>(item->parent ()->parent ());
1298
+ if (ll)
1299
+ {
1300
+ ll->updateCheckState ();
1301
+ mStateOfCheckBoxes [ll] = ll->checkState (0 );
1302
+ }
1303
+ // update check state of the legend group (if any)
1304
+ if (item->parent ()->parent ()->parent ())
1305
+ {
1306
+ QgsLegendGroup* lg = dynamic_cast <QgsLegendGroup*>(item->parent ()->parent ()->parent ());
1307
+ if (lg)
1308
+ {
1309
+ lg->updateCheckState ();
1310
+ mStateOfCheckBoxes [lg] = lg->checkState (0 );
1311
+ }
1312
+ }
1313
+ mStateOfCheckBoxes [item] = item->checkState (0 );
1314
+ return ;
1315
+ }
1316
+
1317
+ std::list<QgsLegendLayerFile*> subfiles;
1318
+ QgsLegendGroup* lg = dynamic_cast <QgsLegendGroup*>(item); // item is a legend group
1319
+ if (lg)
1320
+ {
1321
+ // set all the child layer files to the new check state
1322
+ subfiles = lg->legendLayerFiles ();
1323
+ mMapCanvas ->setRenderFlag (false );
1324
+ for (std::list<QgsLegendLayerFile*>::iterator iter = subfiles.begin (); iter != subfiles.end (); ++iter)
1325
+ {
1326
+ #ifdef QGISDEBUG
1327
+ if (item->checkState (0 ) == Qt::Checked)
1328
+ {
1329
+ qWarning (" item checked" );
1330
+ }
1331
+ else if (item->checkState (0 ) == Qt::Unchecked)
1332
+ {
1333
+ qWarning (" item unchecked" );
1334
+ }
1335
+ else if (item->checkState (0 ) == Qt::PartiallyChecked)
1336
+ {
1337
+ qWarning (" item partially checked" );
1338
+ }
1339
+ #endif
1340
+ blockSignals (true );
1341
+ (*iter)->setCheckState (0 , item->checkState (0 ));
1342
+ blockSignals (false );
1343
+ mStateOfCheckBoxes [(*iter)] = item->checkState (0 );
1344
+ if ((*iter)->layer ())
1345
+ {
1346
+ (*iter)->layer ()->setVisible (item->checkState (0 ) == Qt::Checked);
1347
+ }
1348
+ }
1349
+
1350
+ // update the check states of all child legend layers
1351
+ for (int i = 0 ; i < lg->childCount (); ++i)
1352
+ {
1353
+ static_cast <QgsLegendLayer*>(lg->child (i))->updateCheckState ();
1354
+ mStateOfCheckBoxes [lg->child (i)] = lg->child (i)->checkState (0 );
1355
+ }
1356
+ mMapCanvas ->setRenderFlag (true );
1357
+ mStateOfCheckBoxes [item] = item->checkState (0 );
1358
+ return ;
1359
+ }
1360
+
1361
+ QgsLegendLayer* ll = dynamic_cast <QgsLegendLayer*>(item); // item is a legend layer
1362
+ if (ll)
1363
+ {
1364
+ // set all the child layer files to the new check state
1365
+ subfiles = ll->legendLayerFiles ();
1366
+ mMapCanvas ->setRenderFlag (false );
1367
+ for (std::list<QgsLegendLayerFile*>::iterator iter = subfiles.begin (); iter != subfiles.end (); ++iter)
1368
+ {
1369
+ blockSignals (true );
1370
+ (*iter)->setCheckState (0 , item->checkState (0 ));
1371
+ blockSignals (false );
1372
+ mStateOfCheckBoxes [(*iter)] = item->checkState (0 );
1373
+ if ((*iter)->layer ())
1374
+ {
1375
+ (*iter)->layer ()->setVisible (item->checkState (0 ) == Qt::Checked);
1376
+ }
1377
+ }
1378
+ if (ll->parent ())
1379
+ {
1380
+ static_cast <QgsLegendGroup*>(ll->parent ())->updateCheckState ();
1381
+ mStateOfCheckBoxes [ll->parent ()] = ll->parent ()->checkState (0 );
1382
+ }
1383
+ mMapCanvas ->setRenderFlag (true );
1384
+ // update check state of the legend group
1385
+ }
1386
+ mStateOfCheckBoxes [item] = item->checkState (0 );
1387
+ }
1388
+ }
1389
+ #if 0
1390
+ QgsLegendGroup* lg = dynamic_cast<QgsLegendGroup*>(item);
1391
+ if(lg)
1392
+ {
1393
+ #ifdef QGISDEBUG
1394
+ qWarning("detected legend group in QgsLegend::handleItemChange");
1395
+ #endif
1396
+ std::map<QTreeWidgetItem*, Qt::CheckState>::iterator it = mStateOfCheckBoxes.find(item);
1397
+ if(it != mStateOfCheckBoxes.end())
1398
+ {
1399
+ if(it->second != item->checkState(0)) //the checkState has changed
1400
+ {
1401
+ bool checked = (item->checkState(0) == Qt::Checked);
1402
+
1403
+ }
1404
+ }
1405
+ return;
1406
+ }
1407
+
1231
1408
QgsLegendLayerFile* llf = dynamic_cast<QgsLegendLayerFile*>(item);
1232
1409
if(llf)
1233
1410
{
@@ -1244,7 +1421,7 @@ void QgsLegend::handleItemChange(QTreeWidgetItem* item, int row)
1244
1421
{
1245
1422
bool checked = (item->checkState(0) == Qt::Checked);
1246
1423
theLayer->setVisible(checked);
1247
- // todo: check, how the checkbox of the legendlayer needs to be updated
1424
+ //check, how the checkbox of the legendlayer needs to be updated
1248
1425
QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer*>(item->parent()->parent());
1249
1426
std::list<QgsLegendLayerFile*> llfiles = ll->legendLayerFiles();
1250
1427
std::list<QgsLegendLayerFile*>::iterator iter = llfiles.begin();
@@ -1304,6 +1481,7 @@ void QgsLegend::handleItemChange(QTreeWidgetItem* item, int row)
1304
1481
}
1305
1482
}
1306
1483
}
1484
+ #endif // 0
1307
1485
}
1308
1486
1309
1487
void QgsLegend::openEditor ()
@@ -1317,11 +1495,13 @@ void QgsLegend::openEditor()
1317
1495
1318
1496
void QgsLegend::makeToTopLevelItem ()
1319
1497
{
1320
- QTreeWidgetItem * theItem = currentItem ();
1498
+ QgsLegendItem * theItem = dynamic_cast <QgsLegendItem*>( currentItem () );
1321
1499
if (theItem)
1322
1500
{
1501
+ theItem->storeAppearanceSettings ();
1323
1502
removeItem (theItem);
1324
1503
addTopLevelItem (theItem);
1504
+ theItem->restoreAppearanceSettings ();
1325
1505
}
1326
1506
}
1327
1507
0 commit comments