@@ -52,6 +52,7 @@ QgsLegend::QgsLegend( QgsMapCanvas *canvas, QWidget * parent, const char *name )
52
52
, mMousePressedFlag( false )
53
53
, mMapCanvas( canvas )
54
54
, mMinimumIconSize( 20 , 20 )
55
+ , mChanging( false )
55
56
{
56
57
setObjectName ( name );
57
58
@@ -145,6 +146,7 @@ void QgsLegend::handleCurrentItemChanged( QTreeWidgetItem* current, QTreeWidgetI
145
146
{
146
147
mMapCanvas ->setCurrentLayer ( layer );
147
148
}
149
+
148
150
emit currentLayerChanged ( layer );
149
151
}
150
152
@@ -406,7 +408,13 @@ void QgsLegend::updateGroupCheckStates( QTreeWidgetItem *item )
406
408
updateGroupCheckStates ( item->child ( i ) );
407
409
}
408
410
409
- lg->updateCheckState ();
411
+ Qt::CheckState theState = lg->pendingCheckState ();
412
+ if ( theState != lg->checkState ( 0 ) )
413
+ {
414
+ blockSignals ( true );
415
+ lg->setCheckState ( 0 , theState );
416
+ blockSignals ( false );
417
+ }
410
418
}
411
419
412
420
void QgsLegend::mouseReleaseEvent ( QMouseEvent * e )
@@ -587,14 +595,7 @@ void QgsLegend::addLayer( QgsMapLayer * layer )
587
595
588
596
// set the correct check states
589
597
blockSignals ( true );
590
- if ( llayer->isVisible () )
591
- {
592
- llayer->setCheckState ( 0 , Qt::Checked );
593
- }
594
- else
595
- {
596
- llayer->setCheckState ( 0 , Qt::Unchecked );
597
- }
598
+ llayer->setCheckState ( 0 , llayer->isVisible () ? Qt::Checked : Qt::Unchecked );
598
599
blockSignals ( false );
599
600
600
601
QgsLegendGroup *lg = dynamic_cast <QgsLegendGroup *>( currentItem () );
@@ -1507,119 +1508,106 @@ void QgsLegend::removePixmapHeightValue( int height )
1507
1508
}
1508
1509
1509
1510
1510
- void QgsLegend::handleItemChange ( QTreeWidgetItem* item, int row )
1511
+ void QgsLegend::handleItemChange ( QTreeWidgetItem* item, int column )
1511
1512
{
1512
1513
if ( !item )
1513
1514
{
1514
1515
return ;
1515
1516
}
1516
1517
1517
- // if the text of a QgsLegendLayer has changed, change the display names of all its maplayers
1518
- // TODO: is this still necessary?
1519
- QgsLegendLayer* theLegendLayer = dynamic_cast <QgsLegendLayer *>( item ); // item is a legend layer
1520
- if ( theLegendLayer )
1521
- {
1522
- theLegendLayer->layer ()->setLayerName ( theLegendLayer->text ( 0 ) );
1523
- }
1524
-
1525
- // has the checkState changed?
1526
- if ( item->data ( 0 , Qt::UserRole ).toInt () == item->checkState ( 0 ) )
1527
- return ;
1528
-
1529
- saveCheckStates ( invisibleRootItem () );
1518
+ QgsLegendLayer *ll = dynamic_cast <QgsLegendLayer *>( item );
1519
+ QgsLegendGroup *lg = dynamic_cast <QgsLegendGroup *>( item );
1530
1520
1531
- bool renderFlagState = mMapCanvas ->renderFlag ();
1532
- if ( renderFlagState )
1533
- mMapCanvas ->setRenderFlag ( false );
1534
-
1535
- if ( !item->isSelected () )
1521
+ if ( !ll && !lg )
1536
1522
{
1537
- propagateItemChange ( item, item-> checkState ( 0 ) ) ;
1523
+ return ;
1538
1524
}
1525
+
1526
+ #ifdef QGISDEBUG
1527
+ if ( item->checkState ( 0 ) == Qt::Checked )
1528
+ showItem ( " handleItemChange[checked]" , item );
1529
+ else if ( item->checkState ( 0 ) == Qt::Unchecked )
1530
+ showItem ( " handleItemChange[unchecked]" , item );
1531
+ else if ( item->checkState ( 0 ) == Qt::PartiallyChecked )
1532
+ showItem ( " handleItemChange[partially]" , item );
1539
1533
else
1534
+ showItem ( " handleItemChange[?]" , item );
1535
+ #endif
1536
+
1537
+ if ( ll )
1540
1538
{
1541
- foreach ( QTreeWidgetItem * i, selectedItems () )
1542
- {
1543
- propagateItemChange ( i, item->checkState ( 0 ) );
1544
- }
1539
+ // if the text of a QgsLegendLayer has changed, change the display names of all its maplayers
1540
+ // TODO: is this still necessary?
1541
+ ll->layer ()->setLayerName ( ll->text ( 0 ) );
1545
1542
}
1546
1543
1547
- // update layer set
1548
- updateMapCanvasLayerSet ();
1544
+ bool renderFlagState;
1545
+ bool changing = mChanging ;
1546
+ mChanging = true ;
1549
1547
1550
- // If it was on, turn it back on, otherwise leave it
1551
- // off, as turning it on causes a refresh.
1552
- if ( renderFlagState )
1553
- mMapCanvas ->setRenderFlag ( true );
1554
- }
1555
-
1556
- void QgsLegend::saveCheckStates ( QTreeWidgetItem *item )
1557
- {
1558
- for ( int i = 0 ; i < item->childCount (); i++ )
1548
+ if ( !changing )
1559
1549
{
1560
- QTreeWidgetItem *child = item->child ( i );
1561
- child->setData ( 0 , Qt::UserRole, child->checkState ( 0 ) );
1562
- saveCheckStates ( child );
1563
- }
1564
- }
1550
+ renderFlagState = mMapCanvas ->renderFlag ();
1551
+ if ( renderFlagState )
1552
+ mMapCanvas ->setRenderFlag ( false );
1565
1553
1566
- void QgsLegend::propagateItemChange ( QTreeWidgetItem *item, Qt::CheckState state )
1567
- {
1568
- QgsLegendGroup* lg = dynamic_cast <QgsLegendGroup *>( item ); // item is a legend group
1569
- if ( lg )
1570
- {
1571
- QList<QTreeWidgetItem *> items;
1572
- items << item;
1573
- while ( !items.isEmpty () )
1554
+ if ( item->isSelected () )
1574
1555
{
1575
- QTreeWidgetItem *litem = items.takeFirst ();
1576
-
1577
- QgsLegendLayer *ll = dynamic_cast <QgsLegendLayer *>( litem );
1578
- if ( ll )
1556
+ foreach ( QTreeWidgetItem * i, selectedItems () )
1579
1557
{
1580
- blockSignals ( true );
1581
- ll->setCheckState ( 0 , state );
1582
- blockSignals ( false );
1583
-
1584
- if ( ll->layer () )
1558
+ if ( i != item )
1585
1559
{
1586
- ll-> setVisible ( lg ->checkState ( 0 ) == Qt::Checked );
1560
+ i-> setCheckState ( 0 , item ->checkState ( 0 ) );
1587
1561
}
1588
1562
}
1589
-
1590
- QgsLegendGroup *lg = dynamic_cast <QgsLegendGroup *>( litem );
1591
- if ( lg )
1592
- {
1593
- blockSignals ( true );
1594
- lg->setCheckState ( 0 , state );
1595
- blockSignals ( false );
1596
-
1597
- for ( int i = 0 ; i < lg->childCount (); i++ )
1598
- items << lg->child ( i );
1599
- }
1600
1563
}
1601
1564
}
1602
1565
1603
- QgsLegendLayer* ll = dynamic_cast <QgsLegendLayer *>( item ); // item is a legend layer
1604
1566
if ( ll )
1605
1567
{
1606
- blockSignals ( true );
1607
- ll-> setCheckState ( 0 , state );
1568
+ ll-> setVisible ( ll-> checkState ( 0 ) == Qt::Checked );
1569
+ }
1608
1570
1609
- if ( ll->layer () )
1571
+ if ( lg && lg->checkState ( 0 ) != Qt::PartiallyChecked )
1572
+ {
1573
+ Qt::CheckState theState = lg->checkState ( 0 );
1574
+ for ( int i = 0 ; i < item->childCount (); i++ )
1610
1575
{
1611
- ll->setVisible ( state == Qt::Checked );
1576
+ QTreeWidgetItem *child = item->child ( i );
1577
+ if ( child->checkState ( 0 ) != item->checkState ( 0 ) )
1578
+ child->setCheckState ( 0 , theState );
1612
1579
}
1580
+ }
1613
1581
1614
- QgsLegendGroup *lg = dynamic_cast <QgsLegendGroup*>( ll->parent () );
1615
- while ( lg )
1582
+ // propagate updates to upper groups
1583
+ for (
1584
+ QgsLegendGroup *plg = dynamic_cast <QgsLegendGroup *>( item->parent () );
1585
+ plg;
1586
+ plg = dynamic_cast <QgsLegendGroup *>( plg->parent () )
1587
+ )
1588
+ {
1589
+ Qt::CheckState theState = plg->pendingCheckState ();
1590
+
1591
+ if ( theState != plg->checkState ( 0 ) )
1616
1592
{
1617
- lg->updateCheckState ();
1618
- lg = dynamic_cast <QgsLegendGroup*>( lg->parent () );
1593
+ blockSignals ( true );
1594
+ plg->setCheckState ( 0 , theState );
1595
+ blockSignals ( false );
1619
1596
}
1597
+ }
1620
1598
1621
- blockSignals ( false );
1599
+ if ( !changing )
1600
+ {
1601
+ // update layer set
1602
+ updateMapCanvasLayerSet ();
1603
+
1604
+ // If it was on, turn it back on, otherwise leave it
1605
+ // off, as turning it on causes a refresh.
1606
+ if ( renderFlagState )
1607
+ mMapCanvas ->setRenderFlag ( true );
1622
1608
}
1609
+
1610
+ mChanging = changing;
1623
1611
}
1624
1612
1625
1613
void QgsLegend::openEditor ()
0 commit comments