mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-16 00:05:45 -04:00
[layouts] Fix layers are incorrectly shown when groups are unchecked
for a map theme Followup https://github.com/qgis/QGIS/pull/33099 Fixes #34257
This commit is contained in:
parent
4d381b7476
commit
38a3a2d478
@ -55,6 +55,8 @@ Returns map layer or ``None`` if the layer does not exist anymore
|
|||||||
Sets the map layer for this record
|
Sets the map layer for this record
|
||||||
%End
|
%End
|
||||||
|
|
||||||
|
bool isVisible;
|
||||||
|
|
||||||
bool usingCurrentStyle;
|
bool usingCurrentStyle;
|
||||||
QString currentStyle;
|
QString currentStyle;
|
||||||
bool usingLegendItems;
|
bool usingLegendItems;
|
||||||
|
@ -35,6 +35,7 @@ QgsMapThemeCollection::QgsMapThemeCollection( QgsProject *project )
|
|||||||
QgsMapThemeCollection::MapThemeLayerRecord QgsMapThemeCollection::createThemeLayerRecord( QgsLayerTreeLayer *nodeLayer, QgsLayerTreeModel *model )
|
QgsMapThemeCollection::MapThemeLayerRecord QgsMapThemeCollection::createThemeLayerRecord( QgsLayerTreeLayer *nodeLayer, QgsLayerTreeModel *model )
|
||||||
{
|
{
|
||||||
MapThemeLayerRecord layerRec( nodeLayer->layer() );
|
MapThemeLayerRecord layerRec( nodeLayer->layer() );
|
||||||
|
layerRec.isVisible = nodeLayer->isVisible();
|
||||||
layerRec.usingCurrentStyle = true;
|
layerRec.usingCurrentStyle = true;
|
||||||
layerRec.currentStyle = nodeLayer->layer()->styleManager()->currentStyle();
|
layerRec.currentStyle = nodeLayer->layer()->styleManager()->currentStyle();
|
||||||
layerRec.expandedLayerNode = nodeLayer->isExpanded();
|
layerRec.expandedLayerNode = nodeLayer->isExpanded();
|
||||||
@ -124,15 +125,20 @@ bool QgsMapThemeCollection::findRecordForLayer( QgsMapLayer *layer, const QgsMap
|
|||||||
void QgsMapThemeCollection::applyThemeToLayer( QgsLayerTreeLayer *nodeLayer, QgsLayerTreeModel *model, const QgsMapThemeCollection::MapThemeRecord &rec )
|
void QgsMapThemeCollection::applyThemeToLayer( QgsLayerTreeLayer *nodeLayer, QgsLayerTreeModel *model, const QgsMapThemeCollection::MapThemeRecord &rec )
|
||||||
{
|
{
|
||||||
MapThemeLayerRecord layerRec;
|
MapThemeLayerRecord layerRec;
|
||||||
bool isVisible = findRecordForLayer( nodeLayer->layer(), rec, layerRec );
|
const bool recordExists = findRecordForLayer( nodeLayer->layer(), rec, layerRec );
|
||||||
|
|
||||||
// Make sure the whole tree is visible
|
// Make sure the whole tree is visible
|
||||||
if ( isVisible )
|
if ( recordExists )
|
||||||
nodeLayer->setItemVisibilityCheckedParentRecursive( isVisible );
|
{
|
||||||
|
if ( rec.hasCheckedStateInfo() )
|
||||||
|
nodeLayer->setItemVisibilityChecked( true );
|
||||||
else
|
else
|
||||||
nodeLayer->setItemVisibilityChecked( isVisible );
|
nodeLayer->setItemVisibilityCheckedParentRecursive( true );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
nodeLayer->setItemVisibilityChecked( false );
|
||||||
|
|
||||||
if ( !isVisible )
|
if ( !recordExists )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ( layerRec.usingCurrentStyle )
|
if ( layerRec.usingCurrentStyle )
|
||||||
@ -322,7 +328,7 @@ QList<QgsMapLayer *> QgsMapThemeCollection::mapThemeVisibleLayers( const QString
|
|||||||
const auto records {mMapThemes.value( name ).mLayerRecords};
|
const auto records {mMapThemes.value( name ).mLayerRecords};
|
||||||
for ( const MapThemeLayerRecord &layerRec : records )
|
for ( const MapThemeLayerRecord &layerRec : records )
|
||||||
{
|
{
|
||||||
if ( layerRec.layer() )
|
if ( layerRec.isVisible && layerRec.layer() )
|
||||||
layers << layerRec.layer();
|
layers << layerRec.layer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -334,7 +340,7 @@ QList<QgsMapLayer *> QgsMapThemeCollection::mapThemeVisibleLayers( const QString
|
|||||||
const auto constRecs = recs;
|
const auto constRecs = recs;
|
||||||
for ( const MapThemeLayerRecord &layerRec : constRecs )
|
for ( const MapThemeLayerRecord &layerRec : constRecs )
|
||||||
{
|
{
|
||||||
if ( layerRec.layer() == layer )
|
if ( layerRec.isVisible && layerRec.layer() == layer )
|
||||||
layers << layerRec.layer();
|
layers << layerRec.layer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -448,6 +454,7 @@ void QgsMapThemeCollection::readXml( const QDomDocument &doc )
|
|||||||
if ( QgsMapLayer *layer = mProject->mapLayer( layerID ) )
|
if ( QgsMapLayer *layer = mProject->mapLayer( layerID ) )
|
||||||
{
|
{
|
||||||
layerRecords[layerID] = MapThemeLayerRecord( layer );
|
layerRecords[layerID] = MapThemeLayerRecord( layer );
|
||||||
|
layerRecords[layerID].isVisible = visPresetLayerElem.attribute( QStringLiteral( "visible" ), QStringLiteral( "1" ) ).toInt();
|
||||||
|
|
||||||
if ( visPresetLayerElem.hasAttribute( QStringLiteral( "style" ) ) )
|
if ( visPresetLayerElem.hasAttribute( QStringLiteral( "style" ) ) )
|
||||||
{
|
{
|
||||||
@ -575,6 +582,7 @@ void QgsMapThemeCollection::writeXml( QDomDocument &doc )
|
|||||||
QString layerID = layerRec.layer()->id();
|
QString layerID = layerRec.layer()->id();
|
||||||
QDomElement layerElem = doc.createElement( QStringLiteral( "layer" ) );
|
QDomElement layerElem = doc.createElement( QStringLiteral( "layer" ) );
|
||||||
layerElem.setAttribute( QStringLiteral( "id" ), layerID );
|
layerElem.setAttribute( QStringLiteral( "id" ), layerID );
|
||||||
|
layerElem.setAttribute( QStringLiteral( "visible" ), layerRec.isVisible ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
|
||||||
if ( layerRec.usingCurrentStyle )
|
if ( layerRec.usingCurrentStyle )
|
||||||
layerElem.setAttribute( QStringLiteral( "style" ), layerRec.currentStyle );
|
layerElem.setAttribute( QStringLiteral( "style" ), layerRec.currentStyle );
|
||||||
visPresetElem.appendChild( layerElem );
|
visPresetElem.appendChild( layerElem );
|
||||||
|
@ -63,7 +63,7 @@ class CORE_EXPORT QgsMapThemeCollection : public QObject
|
|||||||
|
|
||||||
bool operator==( const QgsMapThemeCollection::MapThemeLayerRecord &other ) const
|
bool operator==( const QgsMapThemeCollection::MapThemeLayerRecord &other ) const
|
||||||
{
|
{
|
||||||
return mLayer == other.mLayer &&
|
return mLayer == other.mLayer && isVisible == other.isVisible &&
|
||||||
usingCurrentStyle == other.usingCurrentStyle && currentStyle == other.currentStyle &&
|
usingCurrentStyle == other.usingCurrentStyle && currentStyle == other.currentStyle &&
|
||||||
usingLegendItems == other.usingLegendItems && checkedLegendItems == other.checkedLegendItems &&
|
usingLegendItems == other.usingLegendItems && checkedLegendItems == other.checkedLegendItems &&
|
||||||
expandedLegendItems == other.expandedLegendItems && expandedLayerNode == other.expandedLayerNode;
|
expandedLegendItems == other.expandedLegendItems && expandedLayerNode == other.expandedLayerNode;
|
||||||
@ -79,6 +79,12 @@ class CORE_EXPORT QgsMapThemeCollection : public QObject
|
|||||||
//! Sets the map layer for this record
|
//! Sets the map layer for this record
|
||||||
void setLayer( QgsMapLayer *layer );
|
void setLayer( QgsMapLayer *layer );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TRUE if the layer is visible in the associated theme.
|
||||||
|
* \since QGIS 3.14
|
||||||
|
*/
|
||||||
|
bool isVisible = true;
|
||||||
|
|
||||||
//! Whether current style is valid and should be applied
|
//! Whether current style is valid and should be applied
|
||||||
bool usingCurrentStyle = false;
|
bool usingCurrentStyle = false;
|
||||||
//! Name of the current style of the layer
|
//! Name of the current style of the layer
|
||||||
|
@ -244,12 +244,21 @@ void TestQgsMapThemeCollection::checkedState()
|
|||||||
QgsMapThemeCollection::MapThemeRecord recUnchecked = themes.mapThemeState( "all-unchecked" );
|
QgsMapThemeCollection::MapThemeRecord recUnchecked = themes.mapThemeState( "all-unchecked" );
|
||||||
QVERIFY( recUnchecked.hasCheckedStateInfo() );
|
QVERIFY( recUnchecked.hasCheckedStateInfo() );
|
||||||
QCOMPARE( recUnchecked.checkedGroupNodes().count(), 0 );
|
QCOMPARE( recUnchecked.checkedGroupNodes().count(), 0 );
|
||||||
|
QVERIFY( themes.mapThemeVisibleLayers( QStringLiteral( "all-unchecked" ) ).isEmpty() );
|
||||||
|
QVERIFY( themes.mapThemeVisibleLayerIds( QStringLiteral( "all-unchecked" ) ).isEmpty() );
|
||||||
QCOMPARE( mNodeLayerLines->itemVisibilityChecked(), false );
|
QCOMPARE( mNodeLayerLines->itemVisibilityChecked(), false );
|
||||||
QCOMPARE( mNodeLayerPolys->itemVisibilityChecked(), true );
|
QCOMPARE( mNodeLayerPolys->itemVisibilityChecked(), true );
|
||||||
|
|
||||||
QgsMapThemeCollection::MapThemeRecord recChecked = themes.mapThemeState( "all-checked" );
|
QgsMapThemeCollection::MapThemeRecord recChecked = themes.mapThemeState( "all-checked" );
|
||||||
QVERIFY( recChecked.hasCheckedStateInfo() );
|
QVERIFY( recChecked.hasCheckedStateInfo() );
|
||||||
QCOMPARE( recChecked.checkedGroupNodes().count(), 3 );
|
QCOMPARE( recChecked.checkedGroupNodes().count(), 3 );
|
||||||
|
QCOMPARE( themes.mapThemeVisibleLayers( QStringLiteral( "all-checked" ) ).size(), 2 );
|
||||||
|
QVERIFY( themes.mapThemeVisibleLayers( QStringLiteral( "all-checked" ) ).contains( mPolysLayer ) );
|
||||||
|
QVERIFY( themes.mapThemeVisibleLayers( QStringLiteral( "all-checked" ) ).contains( mPointsLayer ) );
|
||||||
|
QCOMPARE( themes.mapThemeVisibleLayerIds( QStringLiteral( "all-checked" ) ).size(), 2 );
|
||||||
|
QVERIFY( themes.mapThemeVisibleLayerIds( QStringLiteral( "all-checked" ) ).contains( mPolysLayer->id() ) );
|
||||||
|
QVERIFY( themes.mapThemeVisibleLayerIds( QStringLiteral( "all-checked" ) ).contains( mPointsLayer->id() ) );
|
||||||
|
|
||||||
QCOMPARE( mNodeLayerLines->itemVisibilityChecked(), false );
|
QCOMPARE( mNodeLayerLines->itemVisibilityChecked(), false );
|
||||||
QCOMPARE( mNodeLayerPolys->itemVisibilityChecked(), true );
|
QCOMPARE( mNodeLayerPolys->itemVisibilityChecked(), true );
|
||||||
|
|
||||||
@ -280,10 +289,18 @@ void TestQgsMapThemeCollection::checkedState()
|
|||||||
QgsMapThemeCollection::MapThemeRecord recUnchecked2 = themes2.mapThemeState( "all-unchecked" );
|
QgsMapThemeCollection::MapThemeRecord recUnchecked2 = themes2.mapThemeState( "all-unchecked" );
|
||||||
QVERIFY( recUnchecked2.hasCheckedStateInfo() );
|
QVERIFY( recUnchecked2.hasCheckedStateInfo() );
|
||||||
QCOMPARE( recUnchecked2.checkedGroupNodes().count(), 0 );
|
QCOMPARE( recUnchecked2.checkedGroupNodes().count(), 0 );
|
||||||
|
QVERIFY( themes2.mapThemeVisibleLayers( QStringLiteral( "all-unchecked" ) ).isEmpty() );
|
||||||
|
QVERIFY( themes2.mapThemeVisibleLayerIds( QStringLiteral( "all-unchecked" ) ).isEmpty() );
|
||||||
|
|
||||||
QgsMapThemeCollection::MapThemeRecord recChecked2 = themes2.mapThemeState( "all-checked" );
|
QgsMapThemeCollection::MapThemeRecord recChecked2 = themes2.mapThemeState( "all-checked" );
|
||||||
QVERIFY( recChecked2.hasCheckedStateInfo() );
|
QVERIFY( recChecked2.hasCheckedStateInfo() );
|
||||||
QCOMPARE( recChecked2.checkedGroupNodes().count(), 3 );
|
QCOMPARE( recChecked2.checkedGroupNodes().count(), 3 );
|
||||||
|
QCOMPARE( themes2.mapThemeVisibleLayers( QStringLiteral( "all-checked" ) ).size(), 2 );
|
||||||
|
QVERIFY( themes2.mapThemeVisibleLayers( QStringLiteral( "all-checked" ) ).contains( mPolysLayer ) );
|
||||||
|
QVERIFY( themes2.mapThemeVisibleLayers( QStringLiteral( "all-checked" ) ).contains( mPointsLayer ) );
|
||||||
|
QCOMPARE( themes2.mapThemeVisibleLayerIds( QStringLiteral( "all-checked" ) ).size(), 2 );
|
||||||
|
QVERIFY( themes2.mapThemeVisibleLayerIds( QStringLiteral( "all-checked" ) ).contains( mPolysLayer->id() ) );
|
||||||
|
QVERIFY( themes2.mapThemeVisibleLayerIds( QStringLiteral( "all-checked" ) ).contains( mPointsLayer->id() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
QGSTEST_MAIN( TestQgsMapThemeCollection )
|
QGSTEST_MAIN( TestQgsMapThemeCollection )
|
||||||
|
Loading…
x
Reference in New Issue
Block a user