From 3e085e496b37bae9ad1a4c3551b290d2e4458b89 Mon Sep 17 00:00:00 2001 From: Denis Rouzaud Date: Fri, 15 Nov 2024 09:27:44 +0100 Subject: [PATCH] move read/write XML for QgsMapThemeCollection::MapThemeRecord inside class --- .../auto_additions/qgsmapthemecollection.py | 4 + .../qgsmapthemecollection.sip.in | 27 +- .../auto_additions/qgsmapthemecollection.py | 4 + .../qgsmapthemecollection.sip.in | 27 +- src/core/qgsmapthemecollection.cpp | 378 +++++++++--------- src/core/qgsmapthemecollection.h | 21 +- 6 files changed, 275 insertions(+), 186 deletions(-) diff --git a/python/PyQt6/core/auto_additions/qgsmapthemecollection.py b/python/PyQt6/core/auto_additions/qgsmapthemecollection.py index 0f72aaae147..0fc822578d3 100644 --- a/python/PyQt6/core/auto_additions/qgsmapthemecollection.py +++ b/python/PyQt6/core/auto_additions/qgsmapthemecollection.py @@ -9,3 +9,7 @@ try: QgsMapThemeCollection.__signal_arguments__ = {'mapThemeChanged': ['theme: str'], 'mapThemeRenamed': ['name: str', 'newName: str']} except NameError: pass +try: + QgsMapThemeCollection.MapThemeRecord.readXml = staticmethod(QgsMapThemeCollection.MapThemeRecord.readXml) +except NameError: + pass diff --git a/python/PyQt6/core/auto_generated/qgsmapthemecollection.sip.in b/python/PyQt6/core/auto_generated/qgsmapthemecollection.sip.in index 6bf586535c8..a0f8779ab79 100644 --- a/python/PyQt6/core/auto_generated/qgsmapthemecollection.sip.in +++ b/python/PyQt6/core/auto_generated/qgsmapthemecollection.sip.in @@ -61,6 +61,7 @@ Sets the map layer for this record QSet expandedLegendItems; bool expandedLayerNode; + }; class MapThemeRecord @@ -158,6 +159,30 @@ Sets a set of group identifiers for group nodes that should have expanded state. Sets a set of group identifiers for group nodes that should have checked state. See :py:func:`~MapThemeRecord.checkedGroupNodes`. .. versionadded:: 3.10.1 +%End + + static MapThemeRecord readXml( const QDomElement &element, const QgsProject *project ); +%Docstring +Reads the map theme record from XML + +:param element: DOM element +:param project: the QGIS project + +.. seealso:: :py:func:`writeXml` + +.. versionadded:: 3.42 +%End + + void writeXml( QDomElement element, QDomDocument &document ) const; +%Docstring +Writes the map theme record to XML. + +:param element: DOM element +:param document: DOM document + +.. seealso:: :py:func:`readXml` + +.. versionadded:: 3.42 %End }; @@ -251,7 +276,7 @@ Reads the map theme collection state from XML .. seealso:: :py:func:`writeXml` %End - void writeXml( QDomDocument &doc ); + void writeXml( QDomDocument &doc ) const; %Docstring Writes the map theme collection state to XML. diff --git a/python/core/auto_additions/qgsmapthemecollection.py b/python/core/auto_additions/qgsmapthemecollection.py index 0f72aaae147..0fc822578d3 100644 --- a/python/core/auto_additions/qgsmapthemecollection.py +++ b/python/core/auto_additions/qgsmapthemecollection.py @@ -9,3 +9,7 @@ try: QgsMapThemeCollection.__signal_arguments__ = {'mapThemeChanged': ['theme: str'], 'mapThemeRenamed': ['name: str', 'newName: str']} except NameError: pass +try: + QgsMapThemeCollection.MapThemeRecord.readXml = staticmethod(QgsMapThemeCollection.MapThemeRecord.readXml) +except NameError: + pass diff --git a/python/core/auto_generated/qgsmapthemecollection.sip.in b/python/core/auto_generated/qgsmapthemecollection.sip.in index 6bf586535c8..a0f8779ab79 100644 --- a/python/core/auto_generated/qgsmapthemecollection.sip.in +++ b/python/core/auto_generated/qgsmapthemecollection.sip.in @@ -61,6 +61,7 @@ Sets the map layer for this record QSet expandedLegendItems; bool expandedLayerNode; + }; class MapThemeRecord @@ -158,6 +159,30 @@ Sets a set of group identifiers for group nodes that should have expanded state. Sets a set of group identifiers for group nodes that should have checked state. See :py:func:`~MapThemeRecord.checkedGroupNodes`. .. versionadded:: 3.10.1 +%End + + static MapThemeRecord readXml( const QDomElement &element, const QgsProject *project ); +%Docstring +Reads the map theme record from XML + +:param element: DOM element +:param project: the QGIS project + +.. seealso:: :py:func:`writeXml` + +.. versionadded:: 3.42 +%End + + void writeXml( QDomElement element, QDomDocument &document ) const; +%Docstring +Writes the map theme record to XML. + +:param element: DOM element +:param document: DOM document + +.. seealso:: :py:func:`readXml` + +.. versionadded:: 3.42 %End }; @@ -251,7 +276,7 @@ Reads the map theme collection state from XML .. seealso:: :py:func:`writeXml` %End - void writeXml( QDomDocument &doc ); + void writeXml( QDomDocument &doc ) const; %Docstring Writes the map theme collection state to XML. diff --git a/src/core/qgsmapthemecollection.cpp b/src/core/qgsmapthemecollection.cpp index 7238c2a8436..3aff4bc1afa 100644 --- a/src/core/qgsmapthemecollection.cpp +++ b/src/core/qgsmapthemecollection.cpp @@ -444,121 +444,10 @@ void QgsMapThemeCollection::readXml( const QDomDocument &doc ) QDomElement visPresetElem = visPresetsElem.firstChildElement( QStringLiteral( "visibility-preset" ) ); while ( !visPresetElem.isNull() ) { - QHash layerRecords; // key = layer ID - - bool expandedStateInfo = false; - if ( visPresetElem.hasAttribute( QStringLiteral( "has-expanded-info" ) ) ) - expandedStateInfo = visPresetElem.attribute( QStringLiteral( "has-expanded-info" ) ).toInt(); - - bool checkedStateInfo = false; - if ( visPresetElem.hasAttribute( QStringLiteral( "has-checked-group-info" ) ) ) - checkedStateInfo = visPresetElem.attribute( QStringLiteral( "has-checked-group-info" ) ).toInt(); - QString presetName = visPresetElem.attribute( QStringLiteral( "name" ) ); - QDomElement visPresetLayerElem = visPresetElem.firstChildElement( QStringLiteral( "layer" ) ); - while ( !visPresetLayerElem.isNull() ) - { - QString layerID = visPresetLayerElem.attribute( QStringLiteral( "id" ) ); - if ( QgsMapLayer *layer = mProject->mapLayer( layerID ) ) - { - layerRecords[layerID] = MapThemeLayerRecord( layer ); - layerRecords[layerID].isVisible = visPresetLayerElem.attribute( QStringLiteral( "visible" ), QStringLiteral( "1" ) ).toInt(); - - if ( visPresetLayerElem.hasAttribute( QStringLiteral( "style" ) ) ) - { - layerRecords[layerID].usingCurrentStyle = true; - layerRecords[layerID].currentStyle = visPresetLayerElem.attribute( QStringLiteral( "style" ) ); - } - - if ( visPresetLayerElem.hasAttribute( QStringLiteral( "expanded" ) ) ) - layerRecords[layerID].expandedLayerNode = visPresetLayerElem.attribute( QStringLiteral( "expanded" ) ).toInt(); - } - visPresetLayerElem = visPresetLayerElem.nextSiblingElement( QStringLiteral( "layer" ) ); - } - - QDomElement checkedLegendNodesElem = visPresetElem.firstChildElement( QStringLiteral( "checked-legend-nodes" ) ); - while ( !checkedLegendNodesElem.isNull() ) - { - QSet checkedLegendNodes; - - QDomElement checkedLegendNodeElem = checkedLegendNodesElem.firstChildElement( QStringLiteral( "checked-legend-node" ) ); - while ( !checkedLegendNodeElem.isNull() ) - { - checkedLegendNodes << checkedLegendNodeElem.attribute( QStringLiteral( "id" ) ); - checkedLegendNodeElem = checkedLegendNodeElem.nextSiblingElement( QStringLiteral( "checked-legend-node" ) ); - } - - QString layerID = checkedLegendNodesElem.attribute( QStringLiteral( "id" ) ); - if ( mProject->mapLayer( layerID ) ) // only use valid IDs - { - layerRecords[layerID].usingLegendItems = true; - layerRecords[layerID].checkedLegendItems = checkedLegendNodes; - } - checkedLegendNodesElem = checkedLegendNodesElem.nextSiblingElement( QStringLiteral( "checked-legend-nodes" ) ); - } - - QSet expandedGroupNodes; - if ( expandedStateInfo ) - { - // expanded state of legend nodes - QDomElement expandedLegendNodesElem = visPresetElem.firstChildElement( QStringLiteral( "expanded-legend-nodes" ) ); - while ( !expandedLegendNodesElem.isNull() ) - { - QSet expandedLegendNodes; - - QDomElement expandedLegendNodeElem = expandedLegendNodesElem.firstChildElement( QStringLiteral( "expanded-legend-node" ) ); - while ( !expandedLegendNodeElem.isNull() ) - { - expandedLegendNodes << expandedLegendNodeElem.attribute( QStringLiteral( "id" ) ); - expandedLegendNodeElem = expandedLegendNodeElem.nextSiblingElement( QStringLiteral( "expanded-legend-node" ) ); - } - - QString layerID = expandedLegendNodesElem.attribute( QStringLiteral( "id" ) ); - if ( mProject->mapLayer( layerID ) ) // only use valid IDs - { - layerRecords[layerID].expandedLegendItems = expandedLegendNodes; - } - expandedLegendNodesElem = expandedLegendNodesElem.nextSiblingElement( QStringLiteral( "expanded-legend-nodes" ) ); - } - - // expanded state of group nodes - QDomElement expandedGroupNodesElem = visPresetElem.firstChildElement( QStringLiteral( "expanded-group-nodes" ) ); - if ( !expandedGroupNodesElem.isNull() ) - { - QDomElement expandedGroupNodeElem = expandedGroupNodesElem.firstChildElement( QStringLiteral( "expanded-group-node" ) ); - while ( !expandedGroupNodeElem.isNull() ) - { - expandedGroupNodes << expandedGroupNodeElem.attribute( QStringLiteral( "id" ) ); - expandedGroupNodeElem = expandedGroupNodeElem.nextSiblingElement( QStringLiteral( "expanded-group-node" ) ); - } - } - } - - QSet checkedGroupNodes; - if ( checkedStateInfo ) - { - // expanded state of legend nodes - QDomElement checkedGroupNodesElem = visPresetElem.firstChildElement( QStringLiteral( "checked-group-nodes" ) ); - if ( !checkedGroupNodesElem.isNull() ) - { - QDomElement checkedGroupNodeElem = checkedGroupNodesElem.firstChildElement( QStringLiteral( "checked-group-node" ) ); - while ( !checkedGroupNodeElem.isNull() ) - { - checkedGroupNodes << checkedGroupNodeElem.attribute( QStringLiteral( "id" ) ); - checkedGroupNodeElem = checkedGroupNodeElem.nextSiblingElement( QStringLiteral( "checked-group-node" ) ); - } - } - } - - MapThemeRecord rec; - rec.setLayerRecords( layerRecords.values() ); - rec.setHasExpandedStateInfo( expandedStateInfo ); - rec.setExpandedGroupNodes( expandedGroupNodes ); - rec.setHasCheckedStateInfo( checkedStateInfo ); - rec.setCheckedGroupNodes( checkedGroupNodes ); + QgsMapThemeCollection::MapThemeRecord rec = QgsMapThemeCollection::MapThemeRecord::readXml( visPresetElem, mProject ); mMapThemes.insert( presetName, rec ); emit mapThemeChanged( presetName ); - visPresetElem = visPresetElem.nextSiblingElement( QStringLiteral( "visibility-preset" ) ); } @@ -566,7 +455,7 @@ void QgsMapThemeCollection::readXml( const QDomDocument &doc ) emit mapThemesChanged(); } -void QgsMapThemeCollection::writeXml( QDomDocument &doc ) +void QgsMapThemeCollection::writeXml( QDomDocument &doc ) const { QDomElement visPresetsElem = doc.createElement( QStringLiteral( "visibility-presets" ) ); @@ -578,77 +467,9 @@ void QgsMapThemeCollection::writeXml( QDomDocument &doc ) { const MapThemeRecord &rec = mMapThemes.value( grpName ); QDomElement visPresetElem = doc.createElement( QStringLiteral( "visibility-preset" ) ); + visPresetElem.setAttribute( QStringLiteral( "name" ), grpName ); - if ( rec.hasExpandedStateInfo() ) - visPresetElem.setAttribute( QStringLiteral( "has-expanded-info" ), QStringLiteral( "1" ) ); - if ( rec.hasCheckedStateInfo() ) - visPresetElem.setAttribute( QStringLiteral( "has-checked-group-info" ), QStringLiteral( "1" ) ); - for ( const MapThemeLayerRecord &layerRec : std::as_const( rec.mLayerRecords ) ) - { - if ( !layerRec.layer() ) - continue; - QString layerID = layerRec.layer()->id(); - QDomElement layerElem = doc.createElement( QStringLiteral( "layer" ) ); - layerElem.setAttribute( QStringLiteral( "id" ), layerID ); - layerElem.setAttribute( QStringLiteral( "visible" ), layerRec.isVisible ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ); - if ( layerRec.usingCurrentStyle ) - layerElem.setAttribute( QStringLiteral( "style" ), layerRec.currentStyle ); - visPresetElem.appendChild( layerElem ); - - if ( layerRec.usingLegendItems ) - { - QDomElement checkedLegendNodesElem = doc.createElement( QStringLiteral( "checked-legend-nodes" ) ); - checkedLegendNodesElem.setAttribute( QStringLiteral( "id" ), layerID ); - for ( const QString &checkedLegendNode : std::as_const( layerRec.checkedLegendItems ) ) - { - QDomElement checkedLegendNodeElem = doc.createElement( QStringLiteral( "checked-legend-node" ) ); - checkedLegendNodeElem.setAttribute( QStringLiteral( "id" ), checkedLegendNode ); - checkedLegendNodesElem.appendChild( checkedLegendNodeElem ); - } - visPresetElem.appendChild( checkedLegendNodesElem ); - } - - if ( rec.hasExpandedStateInfo() ) - { - layerElem.setAttribute( QStringLiteral( "expanded" ), layerRec.expandedLayerNode ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ); - - QDomElement expandedLegendNodesElem = doc.createElement( QStringLiteral( "expanded-legend-nodes" ) ); - expandedLegendNodesElem.setAttribute( QStringLiteral( "id" ), layerID ); - for ( const QString &expandedLegendNode : std::as_const( layerRec.expandedLegendItems ) ) - { - QDomElement expandedLegendNodeElem = doc.createElement( QStringLiteral( "expanded-legend-node" ) ); - expandedLegendNodeElem.setAttribute( QStringLiteral( "id" ), expandedLegendNode ); - expandedLegendNodesElem.appendChild( expandedLegendNodeElem ); - } - visPresetElem.appendChild( expandedLegendNodesElem ); - } - } - - if ( rec.hasCheckedStateInfo() ) - { - QDomElement checkedGroupElems = doc.createElement( QStringLiteral( "checked-group-nodes" ) ); - const QSet checkedGroupNodes = rec.checkedGroupNodes(); - for ( const QString &groupId : checkedGroupNodes ) - { - QDomElement checkedGroupElem = doc.createElement( QStringLiteral( "checked-group-node" ) ); - checkedGroupElem.setAttribute( QStringLiteral( "id" ), groupId ); - checkedGroupElems.appendChild( checkedGroupElem ); - } - visPresetElem.appendChild( checkedGroupElems ); - } - - if ( rec.hasExpandedStateInfo() ) - { - QDomElement expandedGroupElems = doc.createElement( QStringLiteral( "expanded-group-nodes" ) ); - const QSet expandedGroupNodes = rec.expandedGroupNodes(); - for ( const QString &groupId : expandedGroupNodes ) - { - QDomElement expandedGroupElem = doc.createElement( QStringLiteral( "expanded-group-node" ) ); - expandedGroupElem.setAttribute( QStringLiteral( "id" ), groupId ); - expandedGroupElems.appendChild( expandedGroupElem ); - } - visPresetElem.appendChild( expandedGroupElems ); - } + rec.writeXml( visPresetElem, doc ); visPresetsElem.appendChild( visPresetElem ); } @@ -741,6 +562,197 @@ QHash QgsMapThemeColl return validSet; } +QgsMapThemeCollection::MapThemeRecord QgsMapThemeCollection::MapThemeRecord::readXml( const QDomElement &element, const QgsProject *project ) +{ + QHash layerRecords; // key = layer ID + + bool expandedStateInfo = false; + if ( element.hasAttribute( QStringLiteral( "has-expanded-info" ) ) ) + expandedStateInfo = element.attribute( QStringLiteral( "has-expanded-info" ) ).toInt(); + + bool checkedStateInfo = false; + if ( element.hasAttribute( QStringLiteral( "has-checked-group-info" ) ) ) + checkedStateInfo = element.attribute( QStringLiteral( "has-checked-group-info" ) ).toInt(); + + QDomElement visPresetLayerElem = element.firstChildElement( QStringLiteral( "layer" ) ); + while ( !visPresetLayerElem.isNull() ) + { + QString layerID = visPresetLayerElem.attribute( QStringLiteral( "id" ) ); + if ( QgsMapLayer *layer = project->mapLayer( layerID ) ) + { + layerRecords[layerID] = MapThemeLayerRecord( layer ); + layerRecords[layerID].isVisible = visPresetLayerElem.attribute( QStringLiteral( "visible" ), QStringLiteral( "1" ) ).toInt(); + + if ( visPresetLayerElem.hasAttribute( QStringLiteral( "style" ) ) ) + { + layerRecords[layerID].usingCurrentStyle = true; + layerRecords[layerID].currentStyle = visPresetLayerElem.attribute( QStringLiteral( "style" ) ); + } + + if ( visPresetLayerElem.hasAttribute( QStringLiteral( "expanded" ) ) ) + layerRecords[layerID].expandedLayerNode = visPresetLayerElem.attribute( QStringLiteral( "expanded" ) ).toInt(); + } + visPresetLayerElem = visPresetLayerElem.nextSiblingElement( QStringLiteral( "layer" ) ); + } + + QDomElement checkedLegendNodesElem = element.firstChildElement( QStringLiteral( "checked-legend-nodes" ) ); + while ( !checkedLegendNodesElem.isNull() ) + { + QSet checkedLegendNodes; + + QDomElement checkedLegendNodeElem = checkedLegendNodesElem.firstChildElement( QStringLiteral( "checked-legend-node" ) ); + while ( !checkedLegendNodeElem.isNull() ) + { + checkedLegendNodes << checkedLegendNodeElem.attribute( QStringLiteral( "id" ) ); + checkedLegendNodeElem = checkedLegendNodeElem.nextSiblingElement( QStringLiteral( "checked-legend-node" ) ); + } + + QString layerID = checkedLegendNodesElem.attribute( QStringLiteral( "id" ) ); + if ( project->mapLayer( layerID ) ) // only use valid IDs + { + layerRecords[layerID].usingLegendItems = true; + layerRecords[layerID].checkedLegendItems = checkedLegendNodes; + } + checkedLegendNodesElem = checkedLegendNodesElem.nextSiblingElement( QStringLiteral( "checked-legend-nodes" ) ); + } + + QSet expandedGroupNodes; + if ( expandedStateInfo ) + { + // expanded state of legend nodes + QDomElement expandedLegendNodesElem = element.firstChildElement( QStringLiteral( "expanded-legend-nodes" ) ); + while ( !expandedLegendNodesElem.isNull() ) + { + QSet expandedLegendNodes; + + QDomElement expandedLegendNodeElem = expandedLegendNodesElem.firstChildElement( QStringLiteral( "expanded-legend-node" ) ); + while ( !expandedLegendNodeElem.isNull() ) + { + expandedLegendNodes << expandedLegendNodeElem.attribute( QStringLiteral( "id" ) ); + expandedLegendNodeElem = expandedLegendNodeElem.nextSiblingElement( QStringLiteral( "expanded-legend-node" ) ); + } + + QString layerID = expandedLegendNodesElem.attribute( QStringLiteral( "id" ) ); + if ( project->mapLayer( layerID ) ) // only use valid IDs + { + layerRecords[layerID].expandedLegendItems = expandedLegendNodes; + } + expandedLegendNodesElem = expandedLegendNodesElem.nextSiblingElement( QStringLiteral( "expanded-legend-nodes" ) ); + } + + // expanded state of group nodes + QDomElement expandedGroupNodesElem = element.firstChildElement( QStringLiteral( "expanded-group-nodes" ) ); + if ( !expandedGroupNodesElem.isNull() ) + { + QDomElement expandedGroupNodeElem = expandedGroupNodesElem.firstChildElement( QStringLiteral( "expanded-group-node" ) ); + while ( !expandedGroupNodeElem.isNull() ) + { + expandedGroupNodes << expandedGroupNodeElem.attribute( QStringLiteral( "id" ) ); + expandedGroupNodeElem = expandedGroupNodeElem.nextSiblingElement( QStringLiteral( "expanded-group-node" ) ); + } + } + } + + QSet checkedGroupNodes; + if ( checkedStateInfo ) + { + // expanded state of legend nodes + QDomElement checkedGroupNodesElem = element.firstChildElement( QStringLiteral( "checked-group-nodes" ) ); + if ( !checkedGroupNodesElem.isNull() ) + { + QDomElement checkedGroupNodeElem = checkedGroupNodesElem.firstChildElement( QStringLiteral( "checked-group-node" ) ); + while ( !checkedGroupNodeElem.isNull() ) + { + checkedGroupNodes << checkedGroupNodeElem.attribute( QStringLiteral( "id" ) ); + checkedGroupNodeElem = checkedGroupNodeElem.nextSiblingElement( QStringLiteral( "checked-group-node" ) ); + } + } + } + + MapThemeRecord rec; + rec.setLayerRecords( layerRecords.values() ); + rec.setHasExpandedStateInfo( expandedStateInfo ); + rec.setExpandedGroupNodes( expandedGroupNodes ); + rec.setHasCheckedStateInfo( checkedStateInfo ); + rec.setCheckedGroupNodes( checkedGroupNodes ); + + return rec; +} + +void QgsMapThemeCollection::MapThemeRecord::writeXml( QDomElement element, QDomDocument &document ) const +{ + if ( hasExpandedStateInfo() ) + element.setAttribute( QStringLiteral( "has-expanded-info" ), QStringLiteral( "1" ) ); + if ( hasCheckedStateInfo() ) + element.setAttribute( QStringLiteral( "has-checked-group-info" ), QStringLiteral( "1" ) ); + for ( const MapThemeLayerRecord &layerRec : std::as_const( mLayerRecords ) ) + { + if ( !layerRec.layer() ) + continue; + QString layerID = layerRec.layer()->id(); + QDomElement layerElem = document.createElement( QStringLiteral( "layer" ) ); + layerElem.setAttribute( QStringLiteral( "id" ), layerID ); + layerElem.setAttribute( QStringLiteral( "visible" ), layerRec.isVisible ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ); + if ( layerRec.usingCurrentStyle ) + layerElem.setAttribute( QStringLiteral( "style" ), layerRec.currentStyle ); + element.appendChild( layerElem ); + + if ( layerRec.usingLegendItems ) + { + QDomElement checkedLegendNodesElem = document.createElement( QStringLiteral( "checked-legend-nodes" ) ); + checkedLegendNodesElem.setAttribute( QStringLiteral( "id" ), layerID ); + for ( const QString &checkedLegendNode : std::as_const( layerRec.checkedLegendItems ) ) + { + QDomElement checkedLegendNodeElem = document.createElement( QStringLiteral( "checked-legend-node" ) ); + checkedLegendNodeElem.setAttribute( QStringLiteral( "id" ), checkedLegendNode ); + checkedLegendNodesElem.appendChild( checkedLegendNodeElem ); + } + element.appendChild( checkedLegendNodesElem ); + } + + if ( hasExpandedStateInfo() ) + { + layerElem.setAttribute( QStringLiteral( "expanded" ), layerRec.expandedLayerNode ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ); + + QDomElement expandedLegendNodesElem = document.createElement( QStringLiteral( "expanded-legend-nodes" ) ); + expandedLegendNodesElem.setAttribute( QStringLiteral( "id" ), layerID ); + for ( const QString &expandedLegendNode : std::as_const( layerRec.expandedLegendItems ) ) + { + QDomElement expandedLegendNodeElem = document.createElement( QStringLiteral( "expanded-legend-node" ) ); + expandedLegendNodeElem.setAttribute( QStringLiteral( "id" ), expandedLegendNode ); + expandedLegendNodesElem.appendChild( expandedLegendNodeElem ); + } + element.appendChild( expandedLegendNodesElem ); + } + } + + if ( hasCheckedStateInfo() ) + { + QDomElement checkedGroupElems = document.createElement( QStringLiteral( "checked-group-nodes" ) ); + const QSet _checkedGroupNodes = checkedGroupNodes(); + for ( const QString &groupId : _checkedGroupNodes ) + { + QDomElement checkedGroupElem = document.createElement( QStringLiteral( "checked-group-node" ) ); + checkedGroupElem.setAttribute( QStringLiteral( "id" ), groupId ); + checkedGroupElems.appendChild( checkedGroupElem ); + } + element.appendChild( checkedGroupElems ); + } + + if ( hasExpandedStateInfo() ) + { + QDomElement expandedGroupElems = document.createElement( QStringLiteral( "expanded-group-nodes" ) ); + const QSet _expandedGroupNodes = expandedGroupNodes(); + for ( const QString &groupId : _expandedGroupNodes ) + { + QDomElement expandedGroupElem = document.createElement( QStringLiteral( "expanded-group-node" ) ); + expandedGroupElem.setAttribute( QStringLiteral( "id" ), groupId ); + expandedGroupElems.appendChild( expandedGroupElem ); + } + element.appendChild( expandedGroupElems ); + } +} + void QgsMapThemeCollection::MapThemeLayerRecord::setLayer( QgsMapLayer *layer ) { mLayer = layer; diff --git a/src/core/qgsmapthemecollection.h b/src/core/qgsmapthemecollection.h index 63cf0a98308..581a3a75635 100644 --- a/src/core/qgsmapthemecollection.h +++ b/src/core/qgsmapthemecollection.h @@ -105,6 +105,7 @@ class CORE_EXPORT QgsMapThemeCollection : public QObject * \since QGIS 3.2 */ bool expandedLayerNode = false; + private: //! Weak pointer to the layer QgsWeakMapLayerPointer mLayer; @@ -203,6 +204,24 @@ class CORE_EXPORT QgsMapThemeCollection : public QObject */ void setCheckedGroupNodes( const QSet &checkedGroupNodes ) { mCheckedGroupNodes = checkedGroupNodes; } + /** + * Reads the map theme record from XML + * \param element DOM element + * \param project the QGIS project + * \see writeXml + * \since QGIS 3.42 + */ + static MapThemeRecord readXml( const QDomElement &element, const QgsProject *project ); + + /** + * Writes the map theme record to XML. + * \param element DOM element + * \param document DOM document + * \see readXml + * \since QGIS 3.42 + */ + void writeXml( QDomElement element, QDomDocument &document ) const; + private: //! Layer-specific records for the theme. Only visible layers are listed. QList mLayerRecords; @@ -309,7 +328,7 @@ class CORE_EXPORT QgsMapThemeCollection : public QObject * \param doc DOM document * \see readXml */ - void writeXml( QDomDocument &doc ); + void writeXml( QDomDocument &doc ) const; /** * Static method to create theme from the current state of layer visibilities in layer tree,