@@ -48,10 +48,10 @@ static const char *const ident_ = "$Id$";
4848const int AUTOSCROLL_MARGIN = 16 ;
4949
5050QgsLegend::QgsLegend ( QgsMapCanvas *canvas, QWidget * parent, const char *name )
51- : QTreeWidget( parent )
52- , mMousePressedFlag( false )
53- , mMapCanvas( canvas )
54- , mMinimumIconSize( 20 , 20 )
51+ : QTreeWidget( parent )
52+ , mMousePressedFlag( false )
53+ , mMapCanvas( canvas )
54+ , mMinimumIconSize( 20 , 20 )
5555{
5656 setObjectName ( name );
5757
@@ -161,7 +161,6 @@ int QgsLegend::addGroup( QString name, bool expand )
161161 else
162162 group = new QgsLegendGroup ( this , name );
163163
164- group->setData ( 0 , Qt::UserRole, Qt::Checked );
165164 QModelIndex groupIndex = indexFromItem ( group );
166165 setExpanded ( groupIndex, expand );
167166 setCurrentItem ( group );
@@ -235,7 +234,6 @@ void QgsLegend::removeLayer( QString layerId )
235234 delete ll;
236235 break ;
237236 }
238-
239237 }
240238 }
241239
@@ -280,14 +278,14 @@ void QgsLegend::mouseMoveEvent( QMouseEvent * e )
280278 QgsDebugMsg ( " layers prior to move: " + mLayersPriorToMove .join ( " , " ) );
281279
282280 // record which items were selected and hide them
283- foreach ( QTreeWidgetItem *item, selectedItems () )
281+ foreach ( QTreeWidgetItem * item, selectedItems () )
284282 {
285283 item->setHidden ( true );
286284 mItemsBeingMoved << item;
287285 }
288286
289287 // remove and unhide items, whose parent is already to be moved
290- foreach ( QTreeWidgetItem *item, mItemsBeingMoved )
288+ foreach ( QTreeWidgetItem * item, mItemsBeingMoved )
291289 {
292290 QTreeWidgetItem *parent = item->parent ();
293291
@@ -423,7 +421,7 @@ void QgsLegend::mouseReleaseEvent( QMouseEvent * e )
423421 hideLine ();
424422
425423 // unhide
426- foreach ( QTreeWidgetItem *item, mItemsBeingMoved )
424+ foreach ( QTreeWidgetItem * item, mItemsBeingMoved )
427425 {
428426 item->setHidden ( false );
429427 }
@@ -441,7 +439,7 @@ void QgsLegend::mouseReleaseEvent( QMouseEvent * e )
441439
442440 showItem ( " prev sibling" , mDropTarget );
443441
444- foreach ( QTreeWidgetItem *item, mItemsBeingMoved )
442+ foreach ( QTreeWidgetItem * item, mItemsBeingMoved )
445443 {
446444 moveItem ( item, mDropTarget );
447445 mDropTarget = item;
@@ -468,7 +466,7 @@ void QgsLegend::mouseReleaseEvent( QMouseEvent * e )
468466 {
469467 showItem ( " drop after" , mDropTarget );
470468
471- foreach ( QTreeWidgetItem *item, mItemsBeingMoved )
469+ foreach ( QTreeWidgetItem * item, mItemsBeingMoved )
472470 {
473471 moveItem ( item, mDropTarget );
474472 mDropTarget = item;
@@ -479,7 +477,7 @@ void QgsLegend::mouseReleaseEvent( QMouseEvent * e )
479477 {
480478 showItem ( " insert into" , mDropTarget );
481479
482- foreach ( QTreeWidgetItem *item, mItemsBeingMoved )
480+ foreach ( QTreeWidgetItem * item, mItemsBeingMoved )
483481 {
484482 insertItem ( item, mDropTarget );
485483 }
@@ -592,12 +590,10 @@ void QgsLegend::addLayer( QgsMapLayer * layer )
592590 if ( llayer->isVisible () )
593591 {
594592 llayer->setCheckState ( 0 , Qt::Checked );
595- llayer->setData ( 0 , Qt::UserRole, Qt::Checked );
596593 }
597594 else
598595 {
599596 llayer->setCheckState ( 0 , Qt::Unchecked );
600- llayer->setData ( 0 , Qt::UserRole, Qt::Unchecked );
601597 }
602598 blockSignals ( false );
603599
@@ -677,7 +673,7 @@ QList<QgsMapLayer *> QgsLegend::selectedLayers()
677673{
678674 QList<QgsMapLayer *> layers;
679675
680- foreach ( QTreeWidgetItem *item, selectedItems () )
676+ foreach ( QTreeWidgetItem * item, selectedItems () )
681677 {
682678 QgsLegendLayer *ll = dynamic_cast <QgsLegendLayer *>( item );
683679 if ( ll )
@@ -803,7 +799,7 @@ bool QgsLegend::writeXML( QDomNode &legendnode, QDomDocument &document )
803799
804800bool QgsLegend::writeXML ( QList<QTreeWidgetItem *> items, QDomNode &node, QDomDocument &document )
805801{
806- foreach ( QTreeWidgetItem *currentItem, items )
802+ foreach ( QTreeWidgetItem * currentItem, items )
807803 {
808804 QgsLegendItem *item = dynamic_cast <QgsLegendItem *>( currentItem );
809805 if ( !item )
@@ -944,17 +940,14 @@ bool QgsLegend::readXML( QgsLegendGroup *parent, const QDomNode &node )
944940 if ( checked == " Qt::Checked" )
945941 {
946942 theGroup->setCheckState ( 0 , Qt::Checked );
947- theGroup->setData ( 0 , Qt::UserRole, Qt::Checked );
948943 }
949944 else if ( checked == " Qt::Unchecked" )
950945 {
951946 theGroup->setCheckState ( 0 , Qt::Unchecked );
952- theGroup->setData ( 0 , Qt::UserRole, Qt::Checked );
953947 }
954948 else if ( checked == " Qt::PartiallyChecked" )
955949 {
956950 theGroup->setCheckState ( 0 , Qt::PartiallyChecked );
957- theGroup->setData ( 0 , Qt::UserRole, Qt::PartiallyChecked );
958951 }
959952 blockSignals ( false );
960953
@@ -1070,13 +1063,11 @@ QgsLegendLayer* QgsLegend::readLayerFromXML( QDomElement& childelem, bool& isOpe
10701063 {
10711064 ll->setVisible ( true );
10721065 ll->setCheckState ( 0 , Qt::Checked );
1073- ll->setData ( 0 , Qt::UserRole, Qt::Checked );
10741066 }
10751067 else if ( checked == " Qt::Unchecked" )
10761068 {
10771069 ll->setVisible ( false );
10781070 ll->setCheckState ( 0 , Qt::Unchecked );
1079- ll->setData ( 0 , Qt::UserRole, Qt::Unchecked );
10801071 }
10811072 blockSignals ( false );
10821073
@@ -1535,13 +1526,22 @@ void QgsLegend::handleItemChange( QTreeWidgetItem* item, int row )
15351526 if ( item->data ( 0 , Qt::UserRole ).toInt () == item->checkState ( 0 ) )
15361527 return ;
15371528
1529+ saveCheckStates ( invisibleRootItem () );
1530+
15381531 bool renderFlagState = mMapCanvas ->renderFlag ();
15391532 if ( renderFlagState )
15401533 mMapCanvas ->setRenderFlag ( false );
15411534
1542- foreach ( QTreeWidgetItem *i, selectedItems () )
1535+ if ( !item-> isSelected () )
15431536 {
1544- propagateItemChange ( i, item->checkState ( 0 ) );
1537+ propagateItemChange ( item, item->checkState ( 0 ) );
1538+ }
1539+ else
1540+ {
1541+ foreach ( QTreeWidgetItem * i, selectedItems () )
1542+ {
1543+ propagateItemChange ( i, item->checkState ( 0 ) );
1544+ }
15451545 }
15461546
15471547 // update layer set
@@ -1553,6 +1553,16 @@ void QgsLegend::handleItemChange( QTreeWidgetItem* item, int row )
15531553 mMapCanvas ->setRenderFlag ( true );
15541554}
15551555
1556+ void QgsLegend::saveCheckStates ( QTreeWidgetItem *item )
1557+ {
1558+ for ( int i = 0 ; i < item->childCount (); i++ )
1559+ {
1560+ QTreeWidgetItem *child = item->child ( i );
1561+ child->setData ( 0 , Qt::UserRole, child->checkState ( 0 ) );
1562+ saveCheckStates ( child );
1563+ }
1564+ }
1565+
15561566void QgsLegend::propagateItemChange ( QTreeWidgetItem *item, Qt::CheckState state )
15571567{
15581568 QgsLegendGroup* lg = dynamic_cast <QgsLegendGroup *>( item ); // item is a legend group
@@ -1588,17 +1598,14 @@ void QgsLegend::propagateItemChange( QTreeWidgetItem *item, Qt::CheckState state
15881598 items << lg->child ( i );
15891599 }
15901600 }
1591-
1592- item->setData ( 0 , Qt::UserRole, state );
15931601 }
15941602
15951603 QgsLegendLayer* ll = dynamic_cast <QgsLegendLayer *>( item ); // item is a legend layer
15961604 if ( ll )
15971605 {
15981606 blockSignals ( true );
15991607 ll->setCheckState ( 0 , state );
1600- blockSignals ( false );
1601- ll->setData ( 0 , Qt::UserRole, ll->checkState ( 0 ) );
1608+
16021609 if ( ll->layer () )
16031610 {
16041611 ll->setVisible ( state == Qt::Checked );
@@ -1608,11 +1615,10 @@ void QgsLegend::propagateItemChange( QTreeWidgetItem *item, Qt::CheckState state
16081615 while ( lg )
16091616 {
16101617 lg->updateCheckState ();
1611- lg->setData ( 0 , Qt::UserRole, lg->checkState ( 0 ) );
16121618 lg = dynamic_cast <QgsLegendGroup*>( lg->parent () );
16131619 }
1614- // update check state of the legend group
1615- item-> setData ( 0 , Qt::UserRole, state );
1620+
1621+ blockSignals ( false );
16161622 }
16171623}
16181624
@@ -1820,7 +1826,7 @@ void QgsLegend::removeSelectedLayers()
18201826 if ( renderFlagState )
18211827 mMapCanvas ->setRenderFlag ( false );
18221828
1823- foreach ( QTreeWidgetItem *item, selectedItems () )
1829+ foreach ( QTreeWidgetItem * item, selectedItems () )
18241830 {
18251831 QgsLegendGroup* lg = dynamic_cast <QgsLegendGroup *>( item );
18261832 if ( lg )
0 commit comments