Skip to content

Commit f9c736c

Browse files
author
Hugo Mercier
committed
Only filter legend nodes that are checked.
Keep unchecked legend items when filtered by expression
1 parent 5676430 commit f9c736c

File tree

10 files changed

+23
-13
lines changed

10 files changed

+23
-13
lines changed

src/app/qgisapp.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4938,13 +4938,13 @@ void QgisApp::toggleFilterLegendByExpression( bool checked )
49384938

49394939
void QgisApp::updateFilterLegend()
49404940
{
4941-
if ( mActionFilterLegend->isChecked() )
4941+
bool hasExpressions = mLegendExpressionFilterButton->isChecked() && QgsLayerTreeUtils::hasLegendFilterExpression( *mLayerTreeView->layerTreeModel()->rootGroup() );
4942+
if ( mActionFilterLegend->isChecked() || hasExpressions )
49424943
{
4943-
layerTreeView()->layerTreeModel()->setLegendFilterByMap( &mMapCanvas->mapSettings() );
4944-
}
4945-
else if ( QgsLayerTreeUtils::hasLegendFilterExpression( *mLayerTreeView->layerTreeModel()->rootGroup() ) )
4946-
{
4947-
layerTreeView()->layerTreeModel()->setLegendFilter( &mMapCanvas->mapSettings(), /* useExtent */ false );
4944+
layerTreeView()->layerTreeModel()->setLegendFilter( &mMapCanvas->mapSettings(),
4945+
/* useExtent */ mActionFilterLegend->isChecked(),
4946+
/* polygon */ QgsGeometry(),
4947+
hasExpressions );
49484948
}
49494949
else
49504950
{

src/core/layertree/qgslayertreemodel.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ QgsLayerTreeModel::QgsLayerTreeModel( QgsLayerTreeGroup* rootNode, QObject *pare
3939
, mFlags( ShowLegend | AllowLegendChangeState | DeferredLegendInvalidation )
4040
, mAutoCollapseLegendNodesCount( -1 )
4141
, mLegendFilterByScale( 0 )
42+
, mLegendFilterUsesExtent( false )
4243
, mLegendMapViewMupp( 0 )
4344
, mLegendMapViewDpi( 0 )
4445
, mLegendMapViewScale( 0 )
@@ -590,6 +591,7 @@ void QgsLayerTreeModel::setLegendFilter( const QgsMapSettings* settings, bool us
590591
mLegendFilterMapSettings.reset( new QgsMapSettings( *settings ) );
591592
mLegendFilterMapSettings->setLayerStyleOverrides( mLayerStyleOverrides );
592593
QgsMapHitTest::LayerFilterExpression exprs;
594+
mLegendFilterUsesExtent = useExtent;
593595
// collect expression filters
594596
if ( useExpressions )
595597
{
@@ -1098,8 +1100,9 @@ QList<QgsLayerTreeModelLegendNode*> QgsLayerTreeModel::filterLegendNodes( const
10981100
{
10991101
Q_FOREACH ( QgsLayerTreeModelLegendNode* node, nodes )
11001102
{
1101-
QgsSymbolV2* symbolKey = reinterpret_cast< QgsSymbolV2* >( node->data( QgsSymbolV2LegendNode::SymbolV2LegacyRuleKeyRole ).value<void*>() );
1102-
if ( symbolKey )
1103+
QgsSymbolV2* ruleKey = reinterpret_cast< QgsSymbolV2* >( node->data( QgsSymbolV2LegendNode::SymbolV2LegacyRuleKeyRole ).value<void*>() );
1104+
bool checked = mLegendFilterUsesExtent || node->data( Qt::CheckStateRole ).toInt() == Qt::Checked;
1105+
if ( ruleKey && checked )
11031106
{
11041107
QString ruleKey = node->data( QgsSymbolV2LegendNode::RuleKeyRole ).toString();
11051108
if ( QgsVectorLayer* vl = qobject_cast<QgsVectorLayer*>( node->layerNode()->layer() ) )
@@ -1108,7 +1111,7 @@ QList<QgsLayerTreeModelLegendNode*> QgsLayerTreeModel::filterLegendNodes( const
11081111
filtered << node;
11091112
}
11101113
}
1111-
else // unknown node type
1114+
else // unknown node type or unchecked
11121115
filtered << node;
11131116
}
11141117
}

src/core/layertree/qgslayertreemodel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,9 @@ class CORE_EXPORT QgsLayerTreeModel : public QAbstractItemModel
337337
QScopedPointer<QgsMapSettings> mLegendFilterMapSettings;
338338
QScopedPointer<QgsMapHitTest> mLegendFilterHitTest;
339339

340+
//! whether to use map filtering
341+
bool mLegendFilterUsesExtent;
342+
340343
double mLegendMapViewMupp;
341344
int mLegendMapViewDpi;
342345
double mLegendMapViewScale;

tests/src/core/testqgslegendrenderer.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -458,9 +458,11 @@ void TestQgsLegendRenderer::testFilterByPolygon()
458458
// again with useExtent to true
459459
legendModel.setLegendFilter( &mapSettings, /*useExtent*/ true, *geom.data() );
460460

461+
QString testName2 = testName + "2";
462+
QString report2 = mReport + "2";
461463
_setStandardTestFont( settings );
462-
_renderLegend( testName, &legendModel, settings );
463-
QVERIFY( _verifyImage( testName, mReport ) );
464+
_renderLegend( testName2, &legendModel, settings );
465+
QVERIFY( _verifyImage( testName2, report2 ) );
464466
}
465467

466468
void TestQgsLegendRenderer::testFilterByExpression()
@@ -497,9 +499,11 @@ void TestQgsLegendRenderer::testFilterByExpression()
497499
legendModel.setLegendFilterByMap( 0 );
498500
legendModel.setLegendFilter( &mapSettings, /*useExtent*/ false );
499501

502+
QString testName2 = testName + "2";
503+
QString report2 = mReport + "2";
500504
_setStandardTestFont( settings );
501-
_renderLegend( testName, &legendModel, settings );
502-
QVERIFY( _verifyImage( testName, mReport ) );
505+
_renderLegend( testName2, &legendModel, settings );
506+
QVERIFY( _verifyImage( testName2, report2 ) );
503507
}
504508

505509
QTEST_MAIN( TestQgsLegendRenderer )
11.4 KB
Loading
15.3 KB
Loading
2.51 KB
Loading
3.43 KB
Loading
8.86 KB
Loading
11.8 KB
Loading

0 commit comments

Comments
 (0)