move read/write XML for QgsMapThemeCollection::MapThemeRecord inside class

This commit is contained in:
Denis Rouzaud 2024-11-15 09:27:44 +01:00 committed by Nyall Dawson
parent f7b21861e2
commit 3e085e496b
6 changed files with 275 additions and 186 deletions

View File

@ -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

View File

@ -61,6 +61,7 @@ Sets the map layer for this record
QSet<QString> 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.

View File

@ -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

View File

@ -61,6 +61,7 @@ Sets the map layer for this record
QSet<QString> 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.

View File

@ -444,121 +444,10 @@ void QgsMapThemeCollection::readXml( const QDomDocument &doc )
QDomElement visPresetElem = visPresetsElem.firstChildElement( QStringLiteral( "visibility-preset" ) );
while ( !visPresetElem.isNull() )
{
QHash<QString, MapThemeLayerRecord> 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<QString> 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<QString> expandedGroupNodes;
if ( expandedStateInfo )
{
// expanded state of legend nodes
QDomElement expandedLegendNodesElem = visPresetElem.firstChildElement( QStringLiteral( "expanded-legend-nodes" ) );
while ( !expandedLegendNodesElem.isNull() )
{
QSet<QString> 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<QString> 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<QString> 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<QString> 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<QgsMapLayer *, QgsMapThemeCollection::MapThemeLayerRecord> QgsMapThemeColl
return validSet;
}
QgsMapThemeCollection::MapThemeRecord QgsMapThemeCollection::MapThemeRecord::readXml( const QDomElement &element, const QgsProject *project )
{
QHash<QString, MapThemeLayerRecord> 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<QString> 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<QString> expandedGroupNodes;
if ( expandedStateInfo )
{
// expanded state of legend nodes
QDomElement expandedLegendNodesElem = element.firstChildElement( QStringLiteral( "expanded-legend-nodes" ) );
while ( !expandedLegendNodesElem.isNull() )
{
QSet<QString> 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<QString> 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<QString> _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<QString> _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;

View File

@ -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<QString> &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<MapThemeLayerRecord> 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,