BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
ModelView::JsonItemDataConverter Class Reference

Default converter of SessionItemData to/from json object. More...

Inheritance diagram for ModelView::JsonItemDataConverter:
[legend]
Collaboration diagram for ModelView::JsonItemDataConverter:
[legend]

Public Types

using accept_strategy_t = std::function< bool(int)>
 

Public Member Functions

 JsonItemDataConverter (accept_strategy_t to_json_accept={}, accept_strategy_t from_json_accept={})
 
 ~JsonItemDataConverter () override
 
void from_json (const QJsonArray &object, SessionItemData &data) override
 Updates existing data with JSON content. More...
 
QJsonArray to_json (const SessionItemData &data) override
 Converts SessionItemData to JSON;. More...
 

Static Public Member Functions

static std::unique_ptr< JsonItemDataConverterInterfacecreateCopyConverter ()
 Creates JSON data converter intended for simple data copying. Nothing is filtered out. More...
 
static std::unique_ptr< JsonItemDataConverterInterfacecreateProjectConverter ()
 Creates JSON data converter intended for project saving. More...
 

Private Member Functions

bool isRoleFromJson (int role) const
 Returns true if given role should be parsed from json object. More...
 
bool isRoleToJson (int role) const
 Returns true if given role should be saved in json object. More...
 

Private Attributes

accept_strategy_t m_from_json_accept
 callback to find whether to read role from json More...
 
accept_strategy_t m_to_json_accept
 callback to find whether to write role to json More...
 
std::unique_ptr< JsonVariantConverterInterfacem_variant_converter
 

Detailed Description

Default converter of SessionItemData to/from json object.

Definition at line 31 of file jsonitemdataconverter.h.

Member Typedef Documentation

◆ accept_strategy_t

using ModelView::JsonItemDataConverter::accept_strategy_t = std::function<bool(int)>

Definition at line 33 of file jsonitemdataconverter.h.

Constructor & Destructor Documentation

◆ JsonItemDataConverter()

JsonItemDataConverter::JsonItemDataConverter ( accept_strategy_t  to_json_accept = {},
accept_strategy_t  from_json_accept = {} 
)

Definition at line 35 of file jsonitemdataconverter.cpp.

37  : m_to_json_accept(to_json_accept)
38  , m_from_json_accept(from_json_accept)
39  , m_variant_converter(std::make_unique<JsonVariantConverter>())
40 {
41 }
std::unique_ptr< JsonVariantConverterInterface > m_variant_converter
accept_strategy_t m_from_json_accept
callback to find whether to read role from json
accept_strategy_t m_to_json_accept
callback to find whether to write role to json

◆ ~JsonItemDataConverter()

JsonItemDataConverter::~JsonItemDataConverter ( )
overridedefault

Member Function Documentation

◆ createCopyConverter()

std::unique_ptr< JsonItemDataConverterInterface > JsonItemDataConverter::createCopyConverter ( )
static

Creates JSON data converter intended for simple data copying. Nothing is filtered out.

Definition at line 93 of file jsonitemdataconverter.cpp.

94 {
95  return std::make_unique<JsonItemDataConverter>();
96 }

Referenced by TEST_F().

◆ createProjectConverter()

std::unique_ptr< JsonItemDataConverterInterface > JsonItemDataConverter::createProjectConverter ( )
static

Creates JSON data converter intended for project saving.

Only IDENTIFIER and DATA gous to/from JSON.

Definition at line 101 of file jsonitemdataconverter.cpp.

102 {
103  auto accept_roles = [](auto role) {
104  return role == ItemDataRole::IDENTIFIER || role == ItemDataRole::DATA;
105  };
106  return std::make_unique<JsonItemDataConverter>(accept_roles, accept_roles);
107 }
const int DATA
main data role
Definition: mvvm_types.h:30
const int IDENTIFIER
unique identifier
Definition: mvvm_types.h:29

References ModelView::ItemDataRole::DATA, and ModelView::ItemDataRole::IDENTIFIER.

Referenced by TEST_F().

◆ from_json()

void JsonItemDataConverter::from_json ( const QJsonArray &  object,
SessionItemData data 
)
overridevirtual

Updates existing data with JSON content.

Implements ModelView::JsonItemDataConverterInterface.

Definition at line 63 of file jsonitemdataconverter.cpp.

64 {
65  static JsonItemFormatAssistant assistant;
66  auto persistent_data = std::make_unique<SessionItemData>();
67 
68  for (const auto& x : object) {
69  if (!assistant.isSessionItemData(x.toObject()))
70  throw std::runtime_error("JsonItemData::get_data() -> Invalid json object.");
71  auto role = keyValue(x, JsonItemFormatAssistant::roleKey).toInt();
72  auto variant = m_variant_converter->get_variant(
73  keyValue(x, JsonItemFormatAssistant::variantKey).toObject());
74  if (isRoleFromJson(role))
75  persistent_data->setData(variant, role);
76  }
77 
78  auto runtime_roles = data.roles();
79  auto persistent_roles = persistent_data->roles();
80 
81  std::set<int> roles(runtime_roles.begin(), runtime_roles.end());
82  roles.insert(persistent_roles.begin(), persistent_roles.end());
83 
84  for (auto role : roles) {
85  // all roles existing in `persistent` will be taken from there
86  if (persistent_data->hasData(role))
87  data.setData(persistent_data->data(role), role);
88  }
89 }
bool isRoleFromJson(int role) const
Returns true if given role should be parsed from json object.
Utility class to determine, whether given JSON object can represent various parts of SessionModel.
bool isSessionItemData(const QJsonObject &json) const
std::vector< int > roles() const
bool setData(const Variant &value, int role)
Sets the data for given role.

References isRoleFromJson(), ModelView::JsonItemFormatAssistant::isSessionItemData(), m_variant_converter, ModelView::JsonItemFormatAssistant::roleKey, ModelView::SessionItemData::roles(), ModelView::SessionItemData::setData(), and ModelView::JsonItemFormatAssistant::variantKey.

Referenced by TEST_F().

Here is the call graph for this function:

◆ isRoleFromJson()

bool JsonItemDataConverter::isRoleFromJson ( int  role) const
private

Returns true if given role should be parsed from json object.

Definition at line 118 of file jsonitemdataconverter.cpp.

119 {
120  return m_from_json_accept ? m_from_json_accept(role) : true;
121 }

References m_from_json_accept.

Referenced by from_json().

◆ isRoleToJson()

bool JsonItemDataConverter::isRoleToJson ( int  role) const
private

Returns true if given role should be saved in json object.

Definition at line 111 of file jsonitemdataconverter.cpp.

112 {
113  return m_to_json_accept ? m_to_json_accept(role) : true;
114 }

References m_to_json_accept.

Referenced by to_json().

◆ to_json()

QJsonArray JsonItemDataConverter::to_json ( const SessionItemData )
overridevirtual

Converts SessionItemData to JSON;.

Implements ModelView::JsonItemDataConverterInterface.

Definition at line 45 of file jsonitemdataconverter.cpp.

46 {
47  QJsonArray result;
48 
49  for (const auto& x : data) {
50  QJsonObject object;
51  if (isRoleToJson(x.m_role)) {
52  object[JsonItemFormatAssistant::roleKey] = x.m_role;
53  object[JsonItemFormatAssistant::variantKey] = m_variant_converter->get_json(x.m_data);
54  result.append(object);
55  }
56  }
57 
58  return result;
59 }
bool isRoleToJson(int role) const
Returns true if given role should be saved in json object.

References isRoleToJson(), m_variant_converter, ModelView::JsonItemFormatAssistant::roleKey, and ModelView::JsonItemFormatAssistant::variantKey.

Referenced by TEST_F().

Here is the call graph for this function:

Member Data Documentation

◆ m_from_json_accept

accept_strategy_t ModelView::JsonItemDataConverter::m_from_json_accept
private

callback to find whether to read role from json

Definition at line 53 of file jsonitemdataconverter.h.

Referenced by isRoleFromJson().

◆ m_to_json_accept

accept_strategy_t ModelView::JsonItemDataConverter::m_to_json_accept
private

callback to find whether to write role to json

Definition at line 52 of file jsonitemdataconverter.h.

Referenced by isRoleToJson().

◆ m_variant_converter

std::unique_ptr<JsonVariantConverterInterface> ModelView::JsonItemDataConverter::m_variant_converter
private

Definition at line 54 of file jsonitemdataconverter.h.

Referenced by from_json(), and to_json().


The documentation for this class was generated from the following files: