BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
SessionItem.h
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Models/SessionItem.h
6 //! @brief Defines class SessionItem
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
15 #ifndef BORNAGAIN_GUI_COREGUI_MODELS_SESSIONITEM_H
16 #define BORNAGAIN_GUI_COREGUI_MODELS_SESSIONITEM_H
17 
18 #include "Base/Utils/Assert.h"
19 #include "Fit/Param/RealLimits.h"
21 #include "Wrap/WinDllMacros.h"
22 #include <QStringList>
23 #include <memory>
24 
25 Q_DECLARE_METATYPE(RealLimits)
26 
27 class SessionItemData;
28 class SessionItemTags;
29 class IPathTranslator;
30 class QXmlStreamWriter;
31 class QXmlStreamReader;
32 
33 class BA_CORE_API_ SessionItem {
34  friend class SessionModel;
35 
36 public:
37  static const QString P_NAME;
38 
39  explicit SessionItem(const QString& modelType = "");
40  virtual ~SessionItem();
41  SessionModel* model() const;
42  SessionItem* parent() const;
43  template <typename T> bool is() const;
44 
45  // these functions work without tags and operate on all children
46  QModelIndex index() const;
47  bool hasChildren() const;
48  int numberOfChildren() const;
49  QVector<SessionItem*> children() const;
50  SessionItem* childAt(int row) const;
51  int rowOfChild(SessionItem* child) const;
52  SessionItem* getChildOfType(const QString& type) const;
53  QVector<SessionItem*> getChildrenOfType(const QString& model_type) const;
54  SessionItem* takeRow(int row);
55 
56  // manage and check tags
57  bool registerTag(const QString& name, int min = 0, int max = -1, QStringList modelTypes = {});
58  bool isTag(const QString& name) const;
59  SessionItemTags* sessionItemTags();
60  QString tagFromItem(const SessionItem* item) const;
61  bool acceptsAsDefaultItem(const QString& item_name) const;
62  QVector<QString> acceptableDefaultItemTypes() const;
63 
64  // access tagged items
65  SessionItem* getItem(const QString& tag = "", int row = 0) const;
66  template <typename T> T* item(const QString& tag) const;
67  QVector<SessionItem*> getItems(const QString& tag = "") const;
68  bool insertItem(int row, SessionItem* item, const QString& tag = "");
69  SessionItem* takeItem(int row, const QString& tag);
70 
71  // convenience functions for properties
72  SessionItem* addProperty(const QString& name, const QVariant& variant);
73 
74  // #migration: templated addProperty will eventually replace addGroupProperty
75  template <typename T> T* addProperty(const QString& name);
76 
77  QVariant getItemValue(const QString& tag) const;
78  void setItemValue(const QString& tag, const QVariant& variant);
79 
80  // convenience functions for groups
81  SessionItem* addGroupProperty(const QString& groupTag, const QString& groupType);
82  SessionItem* setGroupProperty(const QString& groupTag, const QString& modelType) const;
83  SessionItem* getGroupItem(const QString& groupName) const;
84  template <typename T> T& groupItem(const QString& groupName) const;
85 
86  // access data stored in roles
87  QVariant roleProperty(int role) const;
88  bool setRoleProperty(int role, const QVariant& value);
89  QVector<int> getRoles() const;
90  void emitDataChanged(int role = Qt::DisplayRole);
91 
92  // custom data types
93  QString modelType() const;
94 
95  QVariant value() const;
96  bool setValue(QVariant value);
97 
98  QString defaultTag() const;
99  void setDefaultTag(const QString& tag);
100 
101  QString displayName() const;
102  void setDisplayName(const QString& display_name);
103 
104  QString itemName() const;
105  void setItemName(const QString& name);
106 
107  void setVisible(bool enabled);
108  void setEnabled(bool enabled);
109  void setEditable(bool enabled);
110  bool isVisible() const;
111  bool isEnabled() const;
112  bool isEditable() const;
113 
114  RealLimits limits() const;
115  SessionItem& setLimits(const RealLimits& value);
116 
117  int decimals() const;
118  SessionItem& setDecimals(int n);
119 
120  QString toolTip() const;
121  SessionItem& setToolTip(const QString& tooltip);
122 
123  QString editorType() const;
124  SessionItem& setEditorType(const QString& editorType);
125 
126  ModelMapper* mapper();
127 
128  virtual QStringList translateList(const QStringList& list) const;
129  void addTranslator(const IPathTranslator& translator);
130 
131  virtual QByteArray serializeBinaryData() const;
132  virtual void deserializeBinaryData(const QByteArray& data);
133 
134 private:
135  void childDeleted(SessionItem* child);
136  void setParentAndModel(SessionItem* parent, SessionModel* model);
137  void setModel(SessionModel* model);
138  int flags() const;
139  void changeFlags(bool enabled, int flag);
140  int getCopyNumberOfChild(const SessionItem* item) const;
141 
144  QVector<SessionItem*> m_children;
145  std::unique_ptr<SessionItemData> m_properties;
146  std::unique_ptr<SessionItemTags> m_tags;
147  std::unique_ptr<ModelMapper> m_mapper;
148  QVector<IPathTranslator*> m_translators;
149 };
150 
151 template <typename T> T* SessionItem::item(const QString& tag) const
152 {
153  T* t = dynamic_cast<T*>(getItem(tag));
154  ASSERT(t);
155  return t;
156 }
157 
158 template <typename T> T* SessionItem::addProperty(const QString& tagname)
159 {
160  auto property = new T;
161  property->setDisplayName(tagname);
162  registerTag(tagname, 1, 1, QStringList() << property->modelType());
163  bool success = insertItem(0, property, tagname);
164  ASSERT(success);
165  return property;
166 }
167 
168 template <typename T> T& SessionItem::groupItem(const QString& groupName) const
169 {
170  T* t = dynamic_cast<T*>(getGroupItem(groupName));
171  ASSERT(t);
172  return *t;
173 }
174 
175 template <typename T> bool SessionItem::is() const
176 {
177  return dynamic_cast<const T*>(this) != nullptr;
178 }
179 
180 #endif // BORNAGAIN_GUI_COREGUI_MODELS_SESSIONITEM_H
Defines the macro ASSERT.
#define ASSERT(condition)
Definition: Assert.h:31
Defines class ModelMapper.
Defines class RealLimits.
Limits for a real fit parameter.
Definition: RealLimits.h:24
Handles all data roles for SessionItem.
Holds all tag info for SessionItem.
T & groupItem(const QString &groupName) const
Definition: SessionItem.h:168
bool is() const
Definition: SessionItem.h:175
SessionItem * addProperty(const QString &name, const QVariant &variant)
Add new property item and register new tag.
bool insertItem(int row, SessionItem *item, const QString &tag="")
Insert item into given tag into given row.
SessionItem * getGroupItem(const QString &groupName) const
Access subitem of group item.
bool registerTag(const QString &name, int min=0, int max=-1, QStringList modelTypes={})
Add new tag to this item with given name, min, max and types.
std::unique_ptr< SessionItemData > m_properties
Definition: SessionItem.h:145
static const QString P_NAME
Definition: SessionItem.h:37
QVector< SessionItem * > m_children
Definition: SessionItem.h:144
void setDisplayName(const QString &display_name)
Set display name.
SessionModel * m_model
Definition: SessionItem.h:143
QVector< IPathTranslator * > m_translators
Definition: SessionItem.h:148
T * item(const QString &tag) const
Definition: SessionItem.h:151
std::unique_ptr< SessionItemTags > m_tags
Definition: SessionItem.h:146
SessionItem * m_parent
Definition: SessionItem.h:142
std::unique_ptr< ModelMapper > m_mapper
Definition: SessionItem.h:147
SessionItem * getItem(const QString &tag="", int row=0) const
Returns item in given row of given tag.
virtual QModelIndex parent(const QModelIndex &child) const
virtual Qt::ItemFlags flags(const QModelIndex &index) const
T * insertItem(SessionItem *parent=nullptr, int row=-1, QString tag="")
Definition: SessionModel.h:125
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const
friend class SessionItem
Definition: SessionModel.h:25
virtual QVariant data(const QModelIndex &index, int role) const
QVector< QString > acceptableDefaultItemTypes(const QModelIndex &parent) const
std::string model_type
Definition: types.h:23
QString const & name(EShape k)
Definition: particles.cpp:21