Skip to content

Commit

Permalink
[gui] Write/read stacked diagram state to/from XML (QGIS project)
Browse files Browse the repository at this point in the history
  • Loading branch information
gacarrillor committed Sep 3, 2024
1 parent 82e827f commit 1a11da8
Show file tree
Hide file tree
Showing 5 changed files with 133 additions and 3 deletions.
14 changes: 14 additions & 0 deletions python/PyQt6/core/auto_generated/qgsdiagramrenderer.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -804,6 +804,13 @@ Returns the paint device dpi (or -1 in case of error
Reads internal QgsDiagramRenderer state from a DOM element.

.. seealso:: _writeXml
%End

void _readXmlSubdiagrams( const QDomElement &elem, const QgsReadWriteContext &context );
%Docstring
Reads Stacked Diagram's subdiagram state from a DOM element.

.. seealso:: _writeXmlSubDiagrams
%End

void _writeXml( QDomElement &rendererElem, QDomDocument &doc, const QgsReadWriteContext &context ) const;
Expand All @@ -813,6 +820,13 @@ Writes internal QgsDiagramRenderer diagram state to a DOM element.
.. seealso:: _readXml
%End

void _writeXmlSubDiagrams( QDomElement &rendererElem, QDomDocument &doc, const QgsReadWriteContext &context ) const;
%Docstring
Writes Stacked Diagram's subdiagram state to a DOM element.

.. seealso:: _readXmlSubdiagrams
%End


};

Expand Down
14 changes: 14 additions & 0 deletions python/core/auto_generated/qgsdiagramrenderer.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -804,6 +804,13 @@ Returns the paint device dpi (or -1 in case of error
Reads internal QgsDiagramRenderer state from a DOM element.

.. seealso:: _writeXml
%End

void _readXmlSubdiagrams( const QDomElement &elem, const QgsReadWriteContext &context );
%Docstring
Reads Stacked Diagram's subdiagram state from a DOM element.

.. seealso:: _writeXmlSubDiagrams
%End

void _writeXml( QDomElement &rendererElem, QDomDocument &doc, const QgsReadWriteContext &context ) const;
Expand All @@ -813,6 +820,13 @@ Writes internal QgsDiagramRenderer diagram state to a DOM element.
.. seealso:: _readXml
%End

void _writeXmlSubDiagrams( QDomElement &rendererElem, QDomDocument &doc, const QgsReadWriteContext &context ) const;
%Docstring
Writes Stacked Diagram's subdiagram state to a DOM element.

.. seealso:: _readXmlSubdiagrams
%End


};

Expand Down
94 changes: 92 additions & 2 deletions src/core/qgsdiagramrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -652,7 +652,7 @@ void QgsDiagramRenderer::_readXml( const QDomElement &elem, const QgsReadWriteCo
}
else if ( diagramType == QLatin1String( "Stacked" ) )
{
mDiagram.reset( new QgsStackedDiagram() );
_readXmlSubdiagrams( elem, context );
}
else
{
Expand All @@ -662,6 +662,67 @@ void QgsDiagramRenderer::_readXml( const QDomElement &elem, const QgsReadWriteCo
mShowAttributeLegend = ( elem.attribute( QStringLiteral( "attributeLegend" ), QStringLiteral( "1" ) ) != QLatin1String( "0" ) );
}

void QgsDiagramRenderer::_readXmlSubdiagrams( const QDomElement &elem, const QgsReadWriteContext &context )
{
Q_UNUSED( context )
const QDomElement subdiagramsElem = elem.firstChildElement( QStringLiteral( "Subdiagrams" ) );

if ( !subdiagramsElem.isNull() )
{
const QDomNodeList subdiagrams = elem.elementsByTagName( QStringLiteral( "Subdiagram" ) );

if ( subdiagrams.length() > 0 )
{
std::unique_ptr< QgsStackedDiagram > stackedDiagram = std::make_unique< QgsStackedDiagram >();

for ( int i = 0; i < subdiagrams.size(); i++ )
{
const QDomElement subdiagramElem = subdiagrams.at( i ).toElement();
const QString diagramType = subdiagramElem.attribute( QStringLiteral( "diagramType" ) );
const QDomElement categoryElem = subdiagramElem.firstChildElement( QStringLiteral( "DiagramCategory" ) );

if ( !categoryElem.isNull() )
{
std::unique_ptr< QgsDiagram > diagram;
std::unique_ptr< QgsDiagramSettings > ds = std::make_unique< QgsDiagramSettings >();
ds->readXml( categoryElem, context );

if ( diagramType == QLatin1String( "Pie" ) )
{
diagram = std::make_unique< QgsPieDiagram >();
}
else if ( diagramType == QLatin1String( "Text" ) )
{
diagram = std::make_unique< QgsTextDiagram >();
}
else if ( diagramType == QLatin1String( "Histogram" ) )
{
diagram = std::make_unique< QgsHistogramDiagram >();
}
else if ( diagramType == QLatin1String( "StackedBar" ) )
{
diagram = std::make_unique< QgsStackedBarDiagram >();
}

if ( diagram )
{
stackedDiagram->addSubDiagram( diagram.release(), ds.release() );
}
}
}

if ( stackedDiagram->subDiagramCount() > 1 )
{
mDiagram.reset( stackedDiagram.release() );
return;
}
}
}

// Fallback
mDiagram.reset( new QgsStackedDiagram() );
}

void QgsDiagramRenderer::_writeXml( QDomElement &rendererElem, QDomDocument &doc, const QgsReadWriteContext &context ) const
{
Q_UNUSED( doc )
Expand All @@ -674,6 +735,24 @@ void QgsDiagramRenderer::_writeXml( QDomElement &rendererElem, QDomDocument &doc
rendererElem.setAttribute( QStringLiteral( "attributeLegend" ), mShowAttributeLegend );
}

void QgsDiagramRenderer::_writeXmlSubDiagrams( QDomElement &rendererElem, QDomDocument &doc, const QgsReadWriteContext &context ) const
{
QDomElement subDiagramsElem = doc.createElement( QStringLiteral( "Subdiagrams" ) );

// Iterate subdiagrams and write their settings to a DOM object
const QgsStackedDiagram *stackedDiagram = qgis::down_cast< const QgsStackedDiagram *>( mDiagram.get() );

for ( int i = 0; i < stackedDiagram->subDiagramCount(); i++ )
{
QDomElement subDiagramElem = doc.createElement( QStringLiteral( "Subdiagram" ) );
subDiagramElem.setAttribute( QStringLiteral( "diagramType" ), stackedDiagram->subDiagramType( i ) );
const QgsDiagramSettings *subSettings = stackedDiagram->subDiagramSettings( i );
subSettings->writeXml( subDiagramElem, doc, context );
subDiagramsElem.appendChild( subDiagramElem );
}
rendererElem.appendChild( subDiagramsElem );
}

QgsSingleCategoryDiagramRenderer *QgsSingleCategoryDiagramRenderer::clone() const
{
return new QgsSingleCategoryDiagramRenderer( *this );
Expand Down Expand Up @@ -736,10 +815,15 @@ void QgsSingleCategoryDiagramRenderer::writeXml( QDomElement &layerElem, QDomDoc
QDomElement rendererElem = doc.createElement( QStringLiteral( "SingleCategoryDiagramRenderer" ) );
mSettings.writeXml( rendererElem, doc, context );
_writeXml( rendererElem, doc, context );

if ( mDiagram->diagramName() == QStringLiteral( "Stacked" ) )
{
_writeXmlSubDiagrams( rendererElem, doc, context );
}

layerElem.appendChild( rendererElem );
}


QgsLinearlyInterpolatedDiagramRenderer::QgsLinearlyInterpolatedDiagramRenderer()
{
mInterpolationSettings.classificationAttributeIsExpression = false;
Expand Down Expand Up @@ -917,6 +1001,12 @@ void QgsLinearlyInterpolatedDiagramRenderer::writeXml( QDomElement &layerElem, Q
}

_writeXml( rendererElem, doc, context );

if ( mDiagram->diagramName() == QStringLiteral( "Stacked" ) )
{
_writeXmlSubDiagrams( rendererElem, doc, context );
}

layerElem.appendChild( rendererElem );
}

Expand Down
12 changes: 12 additions & 0 deletions src/core/qgsdiagramrenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -852,12 +852,24 @@ class CORE_EXPORT QgsDiagramRenderer
*/
void _readXml( const QDomElement &elem, const QgsReadWriteContext &context );

/**
* Reads Stacked Diagram's subdiagram state from a DOM element.
* \see _writeXmlSubDiagrams()
*/
void _readXmlSubdiagrams( const QDomElement &elem, const QgsReadWriteContext &context );

/**
* Writes internal QgsDiagramRenderer diagram state to a DOM element.
* \see _readXml()
*/
void _writeXml( QDomElement &rendererElem, QDomDocument &doc, const QgsReadWriteContext &context ) const;

/**
* Writes Stacked Diagram's subdiagram state to a DOM element.
* \see _readXmlSubdiagrams()
*/
void _writeXmlSubDiagrams( QDomElement &rendererElem, QDomDocument &doc, const QgsReadWriteContext &context ) const;

//! Reference to the object that does the real diagram rendering
std::unique_ptr< QgsDiagram > mDiagram;

Expand Down
2 changes: 1 addition & 1 deletion src/gui/vector/qgsstackeddiagramproperties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ void QgsStackedDiagramProperties::apply()
{
diagram = std::make_unique< QgsStackedBarDiagram >();
}
else // if ( diagramProperties->mDiagramType == DIAGRAM_NAME_HISTOGRAM )
else // DIAGRAM_NAME_HISTOGRAM
{
diagram = std::make_unique< QgsHistogramDiagram >();
}
Expand Down

0 comments on commit 1a11da8

Please sign in to comment.