BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
jsonitemconverter.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // qt-mvvm: Model-view-view-model framework for large GUI applications
4 //
5 //! @file mvvm/model/mvvm/serialization/jsonitemconverter.cpp
6 //! @brief Implements class CLASS?
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2020
11 //! @authors Gennady Pospelov et al, Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
18 #include "mvvm/model/sessionitem.h"
25 #include <QJsonArray>
26 #include <QJsonObject>
27 
28 using namespace ModelView;
29 
30 namespace {
31 
32 //! Creates converter for SessionItemData/JSON.
33 
34 std::unique_ptr<JsonItemDataConverterInterface> createDataConverter(const ConverterMode& mode)
35 {
37  : JsonItemDataConverter::createCopyConverter();
38 }
39 
40 } // namespace
41 
44  std::unique_ptr<JsonItemDataConverterInterface> m_itemdata_converter;
45  std::unique_ptr<JsonItemTagsConverter> m_itemtags_converter;
47 
49  : m_self(parent), m_context(context)
50  {
51  //! Callback to convert SessionItem to JSON object.
52  auto create_json = [this](const SessionItem& item) { return m_self->to_json(&item); };
53 
54  //! Callback to create SessionItem from JSON object.
55  auto create_item = [this](const QJsonObject& json) { return m_self->from_json(json); };
56 
57  //! Callback to update SessionItem from JSON object.
58  auto update_item = [this](const QJsonObject& json, SessionItem* item) {
59  populate_item(json, *item);
60  };
61 
62  ConverterCallbacks callbacks{create_json, create_item, update_item};
63 
64  m_itemdata_converter = createDataConverter(m_context.m_mode);
65  m_itemtags_converter = std::make_unique<JsonItemTagsConverter>(callbacks);
66  }
67 
69 
70  void populate_item_data(const QJsonArray& json, SessionItemData& item_data)
71  {
72  m_itemdata_converter->from_json(json, item_data);
73  }
74 
75  void populate_item_tags(const QJsonObject& json, SessionItemTags& item_tags)
76  {
77  m_itemtags_converter->from_json(json, item_tags);
78  }
79 
80  void populate_item(const QJsonObject& json, SessionItem& item)
81  {
82  auto modelType = json[JsonItemFormatAssistant::modelKey].toString().toStdString();
83 
84  if (modelType != item.modelType())
85  throw std::runtime_error("Item model mismatch");
86 
88  item.setDataAndTags(std::make_unique<SessionItemData>(),
89  std::make_unique<SessionItemTags>());
90  }
91 
94 
95  for (auto child : item.children())
96  child->setParent(&item);
97 
100  }
101 
102  QJsonObject item_to_json(const SessionItem& item) const
103  {
104  QJsonObject result;
105  result[JsonItemFormatAssistant::modelKey] = QString::fromStdString(item.modelType());
107  m_itemdata_converter->to_json(*item.itemData());
109  m_itemtags_converter->to_json(*item.itemTags());
110 
111  return result;
112  }
113 };
114 
116  : p_impl(std::make_unique<JsonItemConverterImpl>(this, context))
117 {
118 }
119 
121 
122 QJsonObject JsonItemConverter::to_json(const SessionItem* item) const
123 {
124  return item ? p_impl->item_to_json(*item) : QJsonObject();
125 }
126 
127 std::unique_ptr<SessionItem> JsonItemConverter::from_json(const QJsonObject& json) const
128 {
129  static JsonItemFormatAssistant assistant;
130 
131  if (!assistant.isSessionItem(json))
132  throw std::runtime_error("JsonItemConverterV2::from_json() -> Error. Given json object "
133  "can't represent a SessionItem.");
134 
135  auto modelType = json[JsonItemFormatAssistant::modelKey].toString().toStdString();
136  auto result = p_impl->factory()->createItem(modelType);
137 
138  p_impl->populate_item(json, *result);
139 
140  return result;
141 }
Interface class for all factories capable of producing SessionItem's.
Converter between SessionItem and JSON object.
std::unique_ptr< SessionItem > from_json(const QJsonObject &json) const override
Creates item from JSON.
JsonItemConverter(const ConverterContext &context)
QJsonObject to_json(const SessionItem *item) const override
Converts item to JSON.
std::unique_ptr< JsonItemConverterImpl > p_impl
Default converter of SessionItemData to/from json object.
static std::unique_ptr< JsonItemDataConverterInterface > createProjectConverter()
Creates JSON data converter intended for project saving.
Utility class to determine, whether given JSON object can represent various parts of SessionModel.
bool isSessionItem(const QJsonObject &json) const
Returns true if given json object represents SessionItem.
Handles data roles for SessionItem.
Collection of SessionItem's containers according to their tags.
The main object representing an editable/displayable/serializable entity.
Definition: sessionitem.h:38
SessionItemTags * itemTags()
Returns pointer to internal collection of tag-registered items (non-const version).
void setDataAndTags(std::unique_ptr< SessionItemData > data, std::unique_ptr< SessionItemTags > tags)
bool setData(const T &value, int role=ItemDataRole::DATA, bool direct=false)
Sets data for a given role.
Definition: sessionitem.h:141
std::vector< SessionItem * > children() const
Returns vector of children formed from all chidlren from all tags.
SessionItemData * itemData()
Returns pointer to item's data container (non-const version).
model_type modelType() const
Returns item's model type.
Definition: sessionitem.cpp:80
static identifier_type generate()
Defines class CLASS?
Defines class CLASS?
Defines class CLASS?
Defines class CLASS?
Defines class CLASS?
Defines class CLASS?
const int IDENTIFIER
unique identifier
Definition: mvvm_types.h:29
materialitems.h Collection of materials to populate MaterialModel.
bool isRebuildItemDataAndTagFromJson(ConverterMode mode)
Returns true if item content should be reconstructed from JSON.
bool isRegenerateIdWhenBackFromJson(ConverterMode mode)
Returns true if given mode requires ID regeneration instead of using the one stored in JSON.
ConverterMode
Flags to define converter behavior on the way from SessionItem to JSON and back.
@ project
selective copying for saving/loading the project (tags and data created by item, updated from JSON)
Definition: filesystem.h:81
Defines class CLASS?
Defines class CLASS?
Defines class CLASS?
JsonItemConverterImpl(JsonItemConverter *parent, const ConverterContext &context)
std::unique_ptr< JsonItemDataConverterInterface > m_itemdata_converter
std::unique_ptr< JsonItemTagsConverter > m_itemtags_converter
QJsonObject item_to_json(const SessionItem &item) const
void populate_item_tags(const QJsonObject &json, SessionItemTags &item_tags)
void populate_item_data(const QJsonArray &json, SessionItemData &item_data)
void populate_item(const QJsonObject &json, SessionItem &item)
Provides necessary callbacks to convert SessionItem to JSON and back.
Collection of input paramters for SessionItemConverter.
const ItemFactoryInterface * m_factory
Defines class CLASS?