From d1af3d949cbb7e43c1806a61b65acc4c76ad57fc Mon Sep 17 00:00:00 2001
From: Joachim Wuttke <j.wuttke@fz-juelich.de>
Date: Wed, 10 Jul 2024 23:31:32 +0200
Subject: [PATCH] provide XML::writeTaggedElement and use it use it where we
 had t.writeTo or t->writeTo

---
 GUI/Model/Beam/BeamDistributionItem.cpp    |  4 +-
 GUI/Model/Beam/GrazingScanItem.cpp         |  8 +---
 GUI/Model/Beam/SourceItems.cpp             | 20 +++-------
 GUI/Model/Data/Data2DItem.cpp              |  4 +-
 GUI/Model/Data/DataItem.cpp                |  8 +---
 GUI/Model/Detector/DetectorItem.cpp        | 20 +++-------
 GUI/Model/Detector/OffspecDetectorItem.cpp |  8 +---
 GUI/Model/Job/JobItem.cpp                  | 32 ++++------------
 GUI/Model/Mask/MaskItems.cpp               |  4 +-
 GUI/Model/Material/MaterialItem.cpp        |  4 +-
 GUI/Model/Material/MaterialsSet.cpp        |  4 +-
 GUI/Model/Mini/MinimizerItems.cpp          | 44 ++++++----------------
 GUI/Model/Par/ParameterTreeItems.cpp       |  4 +-
 GUI/Model/Sample/CoreAndShellItem.cpp      |  8 +---
 GUI/Model/Sample/InterferenceItems.cpp     | 24 +++---------
 GUI/Model/Sample/ItemWithParticles.cpp     |  8 +---
 GUI/Model/Sample/LayerItem.cpp             |  8 +---
 GUI/Model/Sample/MesocrystalItem.cpp       | 20 +++-------
 GUI/Model/Sample/ParticleItem.cpp          |  4 +-
 GUI/Model/Sample/ParticleLayoutItem.cpp    |  4 +-
 GUI/Model/Sample/SampleItem.cpp            | 12 ++----
 GUI/Model/Sample/SamplesSet.cpp            |  4 +-
 GUI/Model/Sim/InstrumentItems.cpp          | 32 ++++------------
 GUI/Model/Sim/InstrumentsSet.cpp           |  4 +-
 GUI/Model/Tune/FitParameterItem.cpp        | 20 +++-------
 GUI/Model/Tune/FitParameterLinkItem.cpp    |  4 +-
 GUI/Model/Tune/FitSuiteItem.cpp            |  8 +---
 GUI/Model/Util/UtilXML.h                   |  6 +++
 28 files changed, 87 insertions(+), 243 deletions(-)

diff --git a/GUI/Model/Beam/BeamDistributionItem.cpp b/GUI/Model/Beam/BeamDistributionItem.cpp
index ce6e01cd3ad..7b8d5a62cfb 100644
--- a/GUI/Model/Beam/BeamDistributionItem.cpp
+++ b/GUI/Model/Beam/BeamDistributionItem.cpp
@@ -30,9 +30,7 @@ BeamDistributionItem::~BeamDistributionItem() = default;
 void BeamDistributionItem::writeTo(QXmlStreamWriter* w) const
 {
     XML::writeAttribute(w, XML::Attrib::version, uint(2));
-    w->writeStartElement(Tag::Distribution);
-    m_distribution.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::Distribution, m_distribution);
 }
 
 void BeamDistributionItem::readFrom(QXmlStreamReader* r)
diff --git a/GUI/Model/Beam/GrazingScanItem.cpp b/GUI/Model/Beam/GrazingScanItem.cpp
index 0bee467e8ef..9783edfc795 100644
--- a/GUI/Model/Beam/GrazingScanItem.cpp
+++ b/GUI/Model/Beam/GrazingScanItem.cpp
@@ -86,16 +86,12 @@ void GrazingScanItem::writeTo(QXmlStreamWriter* w) const
 
     // uniform axis
     if (m_uniform_alpha_axis) {
-        w->writeStartElement(Tag::UniformAxis);
-        m_uniform_alpha_axis->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::UniformAxis, *m_uniform_alpha_axis);
     }
 
     // pointwise axis
     if (m_pointwise_alpha_axis) {
-        w->writeStartElement(Tag::ListScan);
-        m_pointwise_alpha_axis->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::ListScan, *m_pointwise_alpha_axis);
     }
 }
 
diff --git a/GUI/Model/Beam/SourceItems.cpp b/GUI/Model/Beam/SourceItems.cpp
index 1aea8195948..64c1adf468c 100644
--- a/GUI/Model/Beam/SourceItems.cpp
+++ b/GUI/Model/Beam/SourceItems.cpp
@@ -65,16 +65,10 @@ void SourceItem::writeTo(QXmlStreamWriter* w) const
 
     // intensity
     m_intensity.writeTo2(w, Tag::Intensity);
-    w->writeStartElement(Tag::Wavelength);
-    m_wavelength_item->writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::AzimuthalAngle);
-    m_azimuthal_angle_item->writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::Wavelength, *m_wavelength_item);
+    XML::writeTaggedElement(w, Tag::AzimuthalAngle, *m_azimuthal_angle_item);
     XML::writeTaggedValue(w, Tag::ExpandBeamParametersGroupbox, expandBeamParameters);
-    w->writeStartElement(Tag::Footprint);
-    m_footprint.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::Footprint, m_footprint);
     XML::writeTaggedValue(w, Tag::ExpandFootprintGroupbox, expandFootprint);
 }
 
@@ -182,9 +176,7 @@ void BeamItem::writeTo(QXmlStreamWriter* w) const
     w->writeStartElement(Tag::BaseData);
     SourceItem::writeTo(w);
     w->writeEndElement();
-    w->writeStartElement(Tag::InclinationAngle);
-    m_inclination_angle_item->writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::InclinationAngle, *m_inclination_angle_item);
 }
 
 void BeamItem::readFrom(QXmlStreamReader* r)
@@ -270,9 +262,7 @@ void ScanItem::writeTo(QXmlStreamWriter* w) const
     w->writeStartElement(Tag::BaseData);
     SourceItem::writeTo(w);
     w->writeEndElement();
-    w->writeStartElement(Tag::GrazingScan);
-    m_grazing_scan_item->writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::GrazingScan, *m_grazing_scan_item);
 }
 
 void ScanItem::readFrom(QXmlStreamReader* r)
diff --git a/GUI/Model/Data/Data2DItem.cpp b/GUI/Model/Data/Data2DItem.cpp
index 53d47322e47..09cc58582f8 100644
--- a/GUI/Model/Data/Data2DItem.cpp
+++ b/GUI/Model/Data/Data2DItem.cpp
@@ -218,9 +218,7 @@ void Data2DItem::writeTo(QXmlStreamWriter* w) const
     DataItem::writeBaseTo(w);
     w->writeEndElement();
     XML::writeTaggedValue(w, Tag::Interpolation, m_is_interpolated);
-    w->writeStartElement(Tag::ZAxis);
-    m_z_axis->writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::ZAxis, *m_z_axis);
 }
 
 void Data2DItem::readFrom(QXmlStreamReader* r)
diff --git a/GUI/Model/Data/DataItem.cpp b/GUI/Model/Data/DataItem.cpp
index c0fa568eea3..1cd2886745b 100644
--- a/GUI/Model/Data/DataItem.cpp
+++ b/GUI/Model/Data/DataItem.cpp
@@ -217,12 +217,8 @@ void DataItem::writeBaseTo(QXmlStreamWriter* w) const
 {
     XML::writeAttribute(w, XML::Attrib::version, uint(3));
     XML::writeTaggedValue(w, Tag::FileName, m_fname);
-    w->writeStartElement(Tag::XAxis);
-    m_x_axis->writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::YAxis);
-    m_y_axis->writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::XAxis, *m_x_axis);
+    XML::writeTaggedElement(w, Tag::YAxis, *m_y_axis);
 }
 
 void DataItem::readBaseFrom(QXmlStreamReader* r)
diff --git a/GUI/Model/Detector/DetectorItem.cpp b/GUI/Model/Detector/DetectorItem.cpp
index ff99e7f7c71..5e2defa996b 100644
--- a/GUI/Model/Detector/DetectorItem.cpp
+++ b/GUI/Model/Detector/DetectorItem.cpp
@@ -89,22 +89,12 @@ std::unique_ptr<IResolutionFunction2D> DetectorItem::createResolutionFunction()
 void DetectorItem::writeTo(QXmlStreamWriter* w) const
 {
     XML::writeAttribute(w, XML::Attrib::version, uint(2));
-    w->writeStartElement(Tag::PhiAxis);
-    m_phi_axis.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::AlphaAxis);
-    m_alpha_axis.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::ResolutionFunction);
-    m_resolution_function.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::PhiAxis, m_phi_axis);
+    XML::writeTaggedElement(w, Tag::AlphaAxis, m_alpha_axis);
+    XML::writeTaggedElement(w, Tag::ResolutionFunction, m_resolution_function);
     XML::writeTaggedValue(w, Tag::ExpandResolutionFuncGroupbox, expandResolutionFunc);
-    w->writeStartElement(Tag::MaskContainer);
-    m_masks->writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::ProjectionContainer);
-    m_prjns->writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::MaskContainer, *m_masks);
+    XML::writeTaggedElement(w, Tag::ProjectionContainer, *m_prjns);
 }
 
 void DetectorItem::readFrom(QXmlStreamReader* r)
diff --git a/GUI/Model/Detector/OffspecDetectorItem.cpp b/GUI/Model/Detector/OffspecDetectorItem.cpp
index 4694bcb82a0..b73d69e8b41 100644
--- a/GUI/Model/Detector/OffspecDetectorItem.cpp
+++ b/GUI/Model/Detector/OffspecDetectorItem.cpp
@@ -44,12 +44,8 @@ OffspecDetectorItem::OffspecDetectorItem()
 void OffspecDetectorItem::writeTo(QXmlStreamWriter* w) const
 {
     XML::writeAttribute(w, XML::Attrib::version, uint(1));
-    w->writeStartElement(Tag::PhiAxis);
-    m_phi_axis.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::AlphaAxis);
-    m_alpha_axis.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::PhiAxis, m_phi_axis);
+    XML::writeTaggedElement(w, Tag::AlphaAxis, m_alpha_axis);
 }
 
 void OffspecDetectorItem::readFrom(QXmlStreamReader* r)
diff --git a/GUI/Model/Job/JobItem.cpp b/GUI/Model/Job/JobItem.cpp
index bfb03869508..52a20648133 100644
--- a/GUI/Model/Job/JobItem.cpp
+++ b/GUI/Model/Job/JobItem.cpp
@@ -208,42 +208,26 @@ void JobItem::cropRealData()
 void JobItem::writeTo(QXmlStreamWriter* w) const
 {
     XML::writeAttribute(w, XML::Attrib::version, uint(2));
-    w->writeStartElement(Tag::SimulationOptions);
-    m_simulation_options_item->writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::Instrument);
-    m_instrument.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::Sample);
-    m_sample_item->writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::ParameterContainer);
-    m_parameter_container->writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::BatchInfo);
-    m_batch_info->writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::SimulationOptions, *m_simulation_options_item);
+    XML::writeTaggedElement(w, Tag::Instrument, m_instrument);
+    XML::writeTaggedElement(w, Tag::Sample, *m_sample_item);
+    XML::writeTaggedElement(w, Tag::ParameterContainer, *m_parameter_container);
+    XML::writeTaggedElement(w, Tag::BatchInfo, *m_batch_info);
     XML::writeTaggedValue(w, Tag::Activity, m_activity);
 
     // simulated data
     if (m_simulated_data_item) {
-        w->writeStartElement(Tag::SimulatedData);
-        m_simulated_data_item->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::SimulatedData, *m_simulated_data_item);
     }
 
     // real item
     if (m_dfile_item) {
-        w->writeStartElement(Tag::DatafileItem);
-        m_dfile_item->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::DatafileItem, *m_dfile_item);
     }
 
     // fit suite
     if (m_fit_suite_item) {
-        w->writeStartElement(Tag::FitSuite);
-        m_fit_suite_item->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::FitSuite, *m_fit_suite_item);
     }
 }
 
diff --git a/GUI/Model/Mask/MaskItems.cpp b/GUI/Model/Mask/MaskItems.cpp
index 907dde80b84..8303126d7a8 100644
--- a/GUI/Model/Mask/MaskItems.cpp
+++ b/GUI/Model/Mask/MaskItems.cpp
@@ -228,9 +228,7 @@ void PolygonItem::writeTo(QXmlStreamWriter* w) const
 
     // polygon points
     for (const auto* p : m_points) {
-        w->writeStartElement(Tag::Vertex);
-        p->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::Vertex, *p);
     }
 }
 
diff --git a/GUI/Model/Material/MaterialItem.cpp b/GUI/Model/Material/MaterialItem.cpp
index febd2d32d16..b306d8a92b1 100644
--- a/GUI/Model/Material/MaterialItem.cpp
+++ b/GUI/Model/Material/MaterialItem.cpp
@@ -137,9 +137,7 @@ void MaterialItem::writeTo(QXmlStreamWriter* w) const
     XML::writeTaggedValue(w, Tag::Name, m_name);
     XML::writeTaggedValue(w, Tag::Id, m_id);
     XML::writeTaggedValue(w, Tag::Color, m_color);
-    w->writeStartElement(Tag::Magnetization);
-    m_magnetization.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::Magnetization, m_magnetization);
     XML::writeTaggedValue(w, Tag::UseRefractiveIndex, m_use_refractive_index);
 
     if (m_use_refractive_index) {
diff --git a/GUI/Model/Material/MaterialsSet.cpp b/GUI/Model/Material/MaterialsSet.cpp
index 036f2d71efb..a6479d902d9 100644
--- a/GUI/Model/Material/MaterialsSet.cpp
+++ b/GUI/Model/Material/MaterialsSet.cpp
@@ -157,9 +157,7 @@ void MaterialsSet::writeTo(QXmlStreamWriter* w) const
 
     // materials
     for (const auto* material : *this) {
-        w->writeStartElement(Tag::Material);
-        material->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::Material, *material);
     }
 }
 
diff --git a/GUI/Model/Mini/MinimizerItems.cpp b/GUI/Model/Mini/MinimizerItems.cpp
index 303b8494165..f29fe7087ed 100644
--- a/GUI/Model/Mini/MinimizerItems.cpp
+++ b/GUI/Model/Mini/MinimizerItems.cpp
@@ -287,33 +287,15 @@ std::unique_ptr<ObjectiveMetric> MinimizerContainerItem::createMetric() const
 void MinimizerContainerItem::writeTo(QXmlStreamWriter* w) const
 {
     XML::writeAttribute(w, XML::Attrib::version, uint(1));
-    w->writeStartElement(Tag::Algorithm);
-    m_algorithm.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::Minimizer);
-    m_minimizer.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::Metric);
-    m_metric.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::Norm);
-    m_norm.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::MinuitMinimizer);
-    m_MinuitMinimizer->writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::GSLMultiMinimizer);
-    m_GSLMultiMinimizer->writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::GeneticMinimizer);
-    m_GeneticMinimizer->writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::SimAnMinimizer);
-    m_SimAnMinimizer->writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::GSLLMAMinimizer);
-    m_GSLLMAMinimizer->writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::Algorithm, m_algorithm);
+    XML::writeTaggedElement(w, Tag::Minimizer, m_minimizer);
+    XML::writeTaggedElement(w, Tag::Metric, m_metric);
+    XML::writeTaggedElement(w, Tag::Norm, m_norm);
+    XML::writeTaggedElement(w, Tag::MinuitMinimizer, *m_MinuitMinimizer);
+    XML::writeTaggedElement(w, Tag::GSLMultiMinimizer, *m_GSLMultiMinimizer);
+    XML::writeTaggedElement(w, Tag::GeneticMinimizer, *m_GeneticMinimizer);
+    XML::writeTaggedElement(w, Tag::SimAnMinimizer, *m_SimAnMinimizer);
+    XML::writeTaggedElement(w, Tag::GSLLMAMinimizer, *m_GSLLMAMinimizer);
 }
 
 void MinimizerContainerItem::readFrom(QXmlStreamReader* r)
@@ -417,9 +399,7 @@ std::unique_ptr<IMinimizer> MinuitMinimizerItem::createMinimizer() const
 void MinuitMinimizerItem::writeTo(QXmlStreamWriter* w) const
 {
     XML::writeAttribute(w, XML::Attrib::version, uint(1));
-    w->writeStartElement(Tag::Algorithm);
-    m_algorithm.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::Algorithm, m_algorithm);
     XML::writeTaggedValue(w, Tag::Strategy, m_strategy);
     XML::writeTaggedValue(w, Tag::ErrorDef, m_error_def);
     XML::writeTaggedValue(w, Tag::Tolerance, m_tolerance);
@@ -489,9 +469,7 @@ std::unique_ptr<IMinimizer> GSLMultiMinimizerItem::createMinimizer() const
 void GSLMultiMinimizerItem::writeTo(QXmlStreamWriter* w) const
 {
     XML::writeAttribute(w, XML::Attrib::version, uint(1));
-    w->writeStartElement(Tag::Algorithm);
-    m_algorithm.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::Algorithm, m_algorithm);
     XML::writeTaggedValue(w, Tag::MaxIterations, m_max_iterations);
 }
 
diff --git a/GUI/Model/Par/ParameterTreeItems.cpp b/GUI/Model/Par/ParameterTreeItems.cpp
index c806e9522b0..1d41a80afeb 100644
--- a/GUI/Model/Par/ParameterTreeItems.cpp
+++ b/GUI/Model/Par/ParameterTreeItems.cpp
@@ -157,9 +157,7 @@ void ParameterContainerItem::writeTo(QXmlStreamWriter* w) const
     XML::writeTaggedValue(w, Tag::CurrentIndex, m_current_index);
     w->writeStartElement(Tag::Backups);
     for (const auto& backup : m_backup_values) {
-        w->writeStartElement(Tag::Backup);
-        backup->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::Backup, *backup);
     }
     w->writeEndElement();
     w->writeStartElement(Tag::ParameterLabels);
diff --git a/GUI/Model/Sample/CoreAndShellItem.cpp b/GUI/Model/Sample/CoreAndShellItem.cpp
index 1070403e101..d6d88c81794 100644
--- a/GUI/Model/Sample/CoreAndShellItem.cpp
+++ b/GUI/Model/Sample/CoreAndShellItem.cpp
@@ -56,16 +56,12 @@ void CoreAndShellItem::writeTo(QXmlStreamWriter* w) const
 
     // core
     if (m_core) {
-        w->writeStartElement(Tag::Core);
-        m_core->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::Core, *m_core);
     }
 
     // shell
     if (m_shell) {
-        w->writeStartElement(Tag::Shell);
-        m_shell->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::Shell, *m_shell);
     }
     XML::writeTaggedValue(w, Tag::ExpandMainGroupbox, expandMain);
     XML::writeTaggedValue(w, Tag::ExpandCoreGroupbox, expandCore);
diff --git a/GUI/Model/Sample/InterferenceItems.cpp b/GUI/Model/Sample/InterferenceItems.cpp
index 3030874e648..316815f732a 100644
--- a/GUI/Model/Sample/InterferenceItems.cpp
+++ b/GUI/Model/Sample/InterferenceItems.cpp
@@ -105,9 +105,7 @@ void Interference1DLatticeItem::writeTo(QXmlStreamWriter* w) const
 
     // rotation angle
     m_rotation_angle.writeTo2(w, Tag::RotationAngle);
-    w->writeStartElement(Tag::DecayFunction);
-    m_decay_function.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::DecayFunction, m_decay_function);
 }
 
 void Interference1DLatticeItem::readFrom(QXmlStreamReader* r)
@@ -142,9 +140,7 @@ void Interference2DAbstractLatticeItem::writeTo(QXmlStreamWriter* w) const
     InterferenceItem::writeTo(w);
     w->writeEndElement();
     XML::writeTaggedValue(w, Tag::IntegrateOverXi, m_xi_integration);
-    w->writeStartElement(Tag::LatticeType);
-    m_lattice_type.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::LatticeType, m_lattice_type);
 }
 
 void Interference2DAbstractLatticeItem::readFrom(QXmlStreamReader* r)
@@ -204,9 +200,7 @@ void Interference2DLatticeItem::writeTo(QXmlStreamWriter* w) const
     w->writeStartElement(Tag::BaseData);
     Interference2DAbstractLatticeItem::writeTo(w);
     w->writeEndElement();
-    w->writeStartElement(Tag::DecayFunction);
-    m_decay_function.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::DecayFunction, m_decay_function);
 }
 
 void Interference2DLatticeItem::readFrom(QXmlStreamReader* r)
@@ -277,12 +271,8 @@ void Interference2DParacrystalItem::writeTo(QXmlStreamWriter* w) const
 
     // domain size 2
     m_domain_size2.writeTo2(w, Tag::DomainSize2);
-    w->writeStartElement(Tag::PDF1);
-    m_pdf1.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::PDF2);
-    m_pdf2.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::PDF1, m_pdf1);
+    XML::writeTaggedElement(w, Tag::PDF2, m_pdf2);
 }
 
 void Interference2DParacrystalItem::readFrom(QXmlStreamReader* r)
@@ -460,9 +450,7 @@ void InterferenceRadialParacrystalItem::writeTo(QXmlStreamWriter* w) const
 
     // kappa
     m_kappa.writeTo2(w, Tag::Kappa);
-    w->writeStartElement(Tag::PDF);
-    m_pdf.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::PDF, m_pdf);
 }
 
 void InterferenceRadialParacrystalItem::readFrom(QXmlStreamReader* r)
diff --git a/GUI/Model/Sample/ItemWithParticles.cpp b/GUI/Model/Sample/ItemWithParticles.cpp
index 738cfc42253..07bf9d50658 100644
--- a/GUI/Model/Sample/ItemWithParticles.cpp
+++ b/GUI/Model/Sample/ItemWithParticles.cpp
@@ -49,12 +49,8 @@ void ItemWithParticles::writeTo(QXmlStreamWriter* w) const
 
     // abundance
     m_abundance.writeTo2(w, Tag::Abundance);
-    w->writeStartElement(Tag::Position);
-    m_position.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::Rotation);
-    m_rotation.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::Position, m_position);
+    XML::writeTaggedElement(w, Tag::Rotation, m_rotation);
 }
 
 void ItemWithParticles::readFrom(QXmlStreamReader* r)
diff --git a/GUI/Model/Sample/LayerItem.cpp b/GUI/Model/Sample/LayerItem.cpp
index d2b2032782d..a411441d131 100644
--- a/GUI/Model/Sample/LayerItem.cpp
+++ b/GUI/Model/Sample/LayerItem.cpp
@@ -129,15 +129,11 @@ void LayerItem::writeTo(QXmlStreamWriter* w) const
 
     // thickness
     m_thickness.writeTo2(w, Tag::Thickness);
-    w->writeStartElement(Tag::Roughness);
-    m_roughness.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::Roughness, m_roughness);
 
     // particle layouts
     for (const auto* layout : m_layouts) {
-        w->writeStartElement(Tag::Layout);
-        layout->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::Layout, *layout);
     }
     XML::writeTaggedValue(w, Tag::ExpandLayerGroupbox, expandLayer);
 }
diff --git a/GUI/Model/Sample/MesocrystalItem.cpp b/GUI/Model/Sample/MesocrystalItem.cpp
index adc8a4655cf..64d58f972aa 100644
--- a/GUI/Model/Sample/MesocrystalItem.cpp
+++ b/GUI/Model/Sample/MesocrystalItem.cpp
@@ -67,21 +67,11 @@ void MesocrystalItem::writeTo(QXmlStreamWriter* w) const
     w->writeStartElement(Tag::BaseData);
     ItemWithParticles::writeTo(w);
     w->writeEndElement();
-    w->writeStartElement(Tag::VectorA);
-    m_vectorA.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::VectorB);
-    m_vectorB.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::VectorC);
-    m_vectorC.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::OuterShape);
-    m_outer_shape.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::BasisParticle);
-    m_basis_particle.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::VectorA, m_vectorA);
+    XML::writeTaggedElement(w, Tag::VectorB, m_vectorB);
+    XML::writeTaggedElement(w, Tag::VectorC, m_vectorC);
+    XML::writeTaggedElement(w, Tag::OuterShape, m_outer_shape);
+    XML::writeTaggedElement(w, Tag::BasisParticle, m_basis_particle);
     XML::writeTaggedValue(w, Tag::ExpandMesocrystalGroupbox, expandMesocrystal);
 }
 
diff --git a/GUI/Model/Sample/ParticleItem.cpp b/GUI/Model/Sample/ParticleItem.cpp
index 85873363333..ab38ec63bec 100644
--- a/GUI/Model/Sample/ParticleItem.cpp
+++ b/GUI/Model/Sample/ParticleItem.cpp
@@ -53,9 +53,7 @@ void ParticleItem::writeTo(QXmlStreamWriter* w) const
     w->writeStartElement(Tag::MaterialData);
     ItemWithMaterial::writeTo(w);
     w->writeEndElement();
-    w->writeStartElement(Tag::FormFactor);
-    m_form_factor.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::FormFactor, m_form_factor);
     XML::writeTaggedValue(w, Tag::ExpandParticleGroupbox, expandParticle);
 }
 
diff --git a/GUI/Model/Sample/ParticleLayoutItem.cpp b/GUI/Model/Sample/ParticleLayoutItem.cpp
index be08a57efd1..955c9a06664 100644
--- a/GUI/Model/Sample/ParticleLayoutItem.cpp
+++ b/GUI/Model/Sample/ParticleLayoutItem.cpp
@@ -107,9 +107,7 @@ void ParticleLayoutItem::writeTo(QXmlStreamWriter* w) const
 
     // own density
     m_own_density.writeTo2(w, Tag::OwnDensity);
-    w->writeStartElement(Tag::InterferenceFunction);
-    m_interference.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::InterferenceFunction, m_interference);
 
     // particles
     for (auto* t : m_particles) {
diff --git a/GUI/Model/Sample/SampleItem.cpp b/GUI/Model/Sample/SampleItem.cpp
index 86386705f63..95a9864ec0d 100644
--- a/GUI/Model/Sample/SampleItem.cpp
+++ b/GUI/Model/Sample/SampleItem.cpp
@@ -132,18 +132,12 @@ void SampleItem::writeTo(QXmlStreamWriter* w) const
 
     // cross-correlation length
     m_cross_correlation_length.writeTo2(w, Tag::CrossCorrelationLength);
-    w->writeStartElement(Tag::ExternalField);
-    m_external_field.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::MaterialsSet);
-    m_materials.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::ExternalField, m_external_field);
+    XML::writeTaggedElement(w, Tag::MaterialsSet, m_materials);
 
     // layers
     for (const auto* layer : m_layers) {
-        w->writeStartElement(Tag::Layer);
-        layer->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::Layer, *layer);
     }
     XML::writeTaggedValue(w, Tag::ExpandInfoGroupbox, expandInfo);
 }
diff --git a/GUI/Model/Sample/SamplesSet.cpp b/GUI/Model/Sample/SamplesSet.cpp
index 67ac7e7614e..e80c61ed00f 100644
--- a/GUI/Model/Sample/SamplesSet.cpp
+++ b/GUI/Model/Sample/SamplesSet.cpp
@@ -34,9 +34,7 @@ void SamplesSet::writeTo(QXmlStreamWriter* w) const
 
     // samples
     for (const auto* t : *this) {
-        w->writeStartElement(Tag::Sample);
-        t->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::Sample, *t);
     }
     XML::writeTaggedValue(w, Tag::CurrentIndex, currentIndex());
 }
diff --git a/GUI/Model/Sim/InstrumentItems.cpp b/GUI/Model/Sim/InstrumentItems.cpp
index 27f58c492fc..0d416d37888 100644
--- a/GUI/Model/Sim/InstrumentItems.cpp
+++ b/GUI/Model/Sim/InstrumentItems.cpp
@@ -130,16 +130,10 @@ void InstrumentItem::writeTo(QXmlStreamWriter* w) const
     XML::writeTaggedValue(w, Tag::Name, name());
     XML::writeTaggedValue(w, Tag::Description, description());
     XML::writeTaggedValue(w, Tag::WithPolarizer, m_with_polarizer);
-    w->writeStartElement(Tag::PolarizerBlochVector);
-    m_polarizer_bloch_vector.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::PolarizerBlochVector, m_polarizer_bloch_vector);
     XML::writeTaggedValue(w, Tag::WithAnalyzer, m_with_analyzer);
-    w->writeStartElement(Tag::AnalyzerBlochVector);
-    m_analyzer_bloch_vector.writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::Background);
-    m_background.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::AnalyzerBlochVector, m_analyzer_bloch_vector);
+    XML::writeTaggedElement(w, Tag::Background, m_background);
     XML::writeTaggedValue(w, Tag::ExpandInfoGroupbox, expandInfo);
     XML::writeTaggedValue(w, Tag::ExpandPolarizerAnalyzerGroupbox, expandPolarizerAnalyzer);
     XML::writeTaggedValue(w, Tag::ExpandEnvironmentGroupbox, expandEnvironment);
@@ -237,9 +231,7 @@ std::unique_ptr<PhysicalScan> ScanningInstrumentItem::createScan(const Scale& ax
 void ScanningInstrumentItem::writeScanTo(QXmlStreamWriter* w) const
 {
     XML::writeAttribute(w, XML::Attrib::version, uint(1));
-    w->writeStartElement(Tag::Scan);
-    m_scan_item->writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::Scan, *m_scan_item);
 }
 
 void ScanningInstrumentItem::readScanFrom(QXmlStreamReader* r)
@@ -322,12 +314,8 @@ void Scatter2DInstrumentItem::writeTo(QXmlStreamWriter* w) const
     w->writeStartElement(Tag::BaseData);
     InstrumentItem::writeTo(w);
     w->writeEndElement();
-    w->writeStartElement(Tag::Beam);
-    m_beam_item->writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::Detector);
-    m_detector_item->writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::Beam, *m_beam_item);
+    XML::writeTaggedElement(w, Tag::Detector, *m_detector_item);
 }
 
 void Scatter2DInstrumentItem::readFrom(QXmlStreamReader* r)
@@ -423,9 +411,7 @@ void OffspecInstrumentItem::writeTo(QXmlStreamWriter* w) const
     w->writeStartElement(Tag::ScanParameters);
     ScanningInstrumentItem::writeScanTo(w);
     w->writeEndElement();
-    w->writeStartElement(Tag::Detector);
-    m_detector->writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::Detector, *m_detector);
 }
 
 void OffspecInstrumentItem::readFrom(QXmlStreamReader* r)
@@ -626,9 +612,7 @@ void DepthprobeInstrumentItem::writeTo(QXmlStreamWriter* w) const
     w->writeStartElement(Tag::ScanParameters);
     ScanningInstrumentItem::writeScanTo(w);
     w->writeEndElement();
-    w->writeStartElement(Tag::ZAxis);
-    m_z_axis.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::ZAxis, m_z_axis);
 }
 
 void DepthprobeInstrumentItem::readFrom(QXmlStreamReader* r)
diff --git a/GUI/Model/Sim/InstrumentsSet.cpp b/GUI/Model/Sim/InstrumentsSet.cpp
index 079c8781536..ade6b8a1100 100644
--- a/GUI/Model/Sim/InstrumentsSet.cpp
+++ b/GUI/Model/Sim/InstrumentsSet.cpp
@@ -33,9 +33,7 @@ void InstrumentsSet::writeTo(QXmlStreamWriter* w) const
 
     // instruments
     for (const auto* t : *this) {
-        w->writeStartElement(Tag::Instrument);
-        t->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::Instrument, *t);
     }
     XML::writeTaggedValue(w, Tag::CurrentIndex, currentIndex());
 }
diff --git a/GUI/Model/Tune/FitParameterItem.cpp b/GUI/Model/Tune/FitParameterItem.cpp
index 4eb47b868a6..4aa0be2a150 100644
--- a/GUI/Model/Tune/FitParameterItem.cpp
+++ b/GUI/Model/Tune/FitParameterItem.cpp
@@ -45,9 +45,7 @@ FitTypeItem::FitTypeItem(const ComboProperty& type, QObject* parent)
 void FitTypeItem::writeTo(QXmlStreamWriter* w) const
 {
     XML::writeAttribute(w, XML::Attrib::version, uint(1));
-    w->writeStartElement(Tag::Type);
-    m_type.writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::Type, m_type);
 }
 
 void FitTypeItem::readFrom(QXmlStreamReader* r)
@@ -334,18 +332,10 @@ void FitParameterItem::writeTo(QXmlStreamWriter* w) const
 {
     XML::writeAttribute(w, XML::Attrib::version, uint(1));
     XML::writeTaggedValue(w, Tag::DisplayName, m_display_name);
-    w->writeStartElement(Tag::TypeItem);
-    m_type_item->writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::StartValue);
-    m_start_value_item->writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::MinValue);
-    m_min_item->writeTo(w);
-    w->writeEndElement();
-    w->writeStartElement(Tag::MaxValue);
-    m_max_item->writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::TypeItem, *m_type_item);
+    XML::writeTaggedElement(w, Tag::StartValue, *m_start_value_item);
+    XML::writeTaggedElement(w, Tag::MinValue, *m_min_item);
+    XML::writeTaggedElement(w, Tag::MaxValue, *m_max_item);
 
     // parameter links
     for (const auto* fitLink : linkItems()) {
diff --git a/GUI/Model/Tune/FitParameterLinkItem.cpp b/GUI/Model/Tune/FitParameterLinkItem.cpp
index 6616539b37b..d2e1094b91c 100644
--- a/GUI/Model/Tune/FitParameterLinkItem.cpp
+++ b/GUI/Model/Tune/FitParameterLinkItem.cpp
@@ -68,9 +68,7 @@ void FitParameterLinkItem::writeTo(QXmlStreamWriter* w) const
 {
     XML::writeAttribute(w, XML::Attrib::version, uint(1));
     XML::writeTaggedValue(w, Tag::Title, m_title);
-    w->writeStartElement(Tag::LinkItem);
-    m_link_item->writeTo(w);
-    w->writeEndElement();
+    XML::writeTaggedElement(w, Tag::LinkItem, *m_link_item);
 }
 
 void FitParameterLinkItem::readFrom(QXmlStreamReader* r)
diff --git a/GUI/Model/Tune/FitSuiteItem.cpp b/GUI/Model/Tune/FitSuiteItem.cpp
index f4709738aaf..26976a6a026 100644
--- a/GUI/Model/Tune/FitSuiteItem.cpp
+++ b/GUI/Model/Tune/FitSuiteItem.cpp
@@ -68,16 +68,12 @@ void FitSuiteItem::writeTo(QXmlStreamWriter* w) const
 
     // minimizer container
     if (m_minimizer_container) {
-        w->writeStartElement(Tag::MinimizerContainer);
-        m_minimizer_container->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::MinimizerContainer, *m_minimizer_container);
     }
 
     // fit parameter container
     if (m_fit_container) {
-        w->writeStartElement(Tag::FitParameterContainer);
-        m_fit_container->writeTo(w);
-        w->writeEndElement();
+        XML::writeTaggedElement(w, Tag::FitParameterContainer, *m_fit_container);
     }
 }
 
diff --git a/GUI/Model/Util/UtilXML.h b/GUI/Model/Util/UtilXML.h
index 621cbce2f81..f3ccb5db98e 100644
--- a/GUI/Model/Util/UtilXML.h
+++ b/GUI/Model/Util/UtilXML.h
@@ -61,6 +61,12 @@ template <typename T> void writeTaggedValue(QXmlStreamWriter* w, const QString&
     w->writeEndElement();
 };
 
+template <typename T> void writeTaggedElement(QXmlStreamWriter* w, const QString& tag, T& element)
+{
+    w->writeStartElement(tag);
+    element.writeTo(w);
+    w->writeEndElement();
+}
 
 bool readBool(QXmlStreamReader* reader, const QString& attributeName);
 int readInt(QXmlStreamReader* reader, const QString& attributeName);
-- 
GitLab