BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
SessionModel.h
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Models/SessionModel.h
6 //! @brief Defines class SessionModel
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_SESSIONMODEL_H
16 #define BORNAGAIN_GUI_COREGUI_MODELS_SESSIONMODEL_H
17 
21 #include <QStringList>
22 
23 class SessionModel : public QAbstractItemModel {
24  Q_OBJECT
25  friend class SessionItem;
26 
27 public:
28  explicit SessionModel(QString model_tag, QObject* parent = 0);
29  virtual ~SessionModel();
30  void createRootItem();
31 
32  // Begin overriden methods from QAbstractItemModel
33  virtual Qt::ItemFlags flags(const QModelIndex& index) const;
34  virtual QVariant data(const QModelIndex& index, int role) const;
35  virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
36  virtual int rowCount(const QModelIndex& parent) const;
37  virtual int columnCount(const QModelIndex& parent) const;
38  virtual QModelIndex index(int row, int column, const QModelIndex& parent) const;
39  virtual QModelIndex parent(const QModelIndex& child) const;
40 
41  virtual bool setHeaderData(int, Qt::Orientation, const QVariant&, int = Qt::EditRole);
42  virtual bool setData(const QModelIndex& index, const QVariant& value, int role);
43  virtual bool removeRows(int row, int count, const QModelIndex& parent);
44 
45  virtual Qt::DropActions supportedDragActions() const;
46  virtual Qt::DropActions supportedDropActions() const;
47  virtual QStringList mimeTypes() const;
48  virtual QMimeData* mimeData(const QModelIndexList& indexes) const;
49  virtual bool canDropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column,
50  const QModelIndex& parent) const;
51  virtual bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column,
52  const QModelIndex& parent);
53  // End overridden methods from QAbstractItemModel
54 
55  QModelIndex indexOfItem(SessionItem* item) const;
56  SessionItem* insertNewItem(QString model_type, SessionItem* parent_item = nullptr, int row = -1,
57  QString tag = "");
58 
59  // #migration Method is deprecated, index usage is discouraged.
60  SessionItem* insertNewItem(QString model_type, const QModelIndex& parent_item, int row = -1,
61  QString tag = "");
62 
63  template <typename T>
64  T* insertItem(SessionItem* parent = nullptr, int row = -1, QString tag = "");
65 
66  // #migration Method is deprecated, index usage is discouraged.
67  template <typename T> T* insertItem(const QModelIndex& parent, int row = -1, QString tag = "");
68 
70 
71  QString getModelTag() const;
72  QString getModelName() const;
73 
74  QVector<QString> acceptableDefaultItemTypes(const QModelIndex& parent) const;
75 
76  virtual void clear();
77  void load(const QString& filename = "");
78  void save(const QString& filename = "");
79 
80  // Sets mimedata pointer of item being dragged
81  void setDraggedItemType(const QString& type);
82 
83  // Returns root item if index is not valid
84  SessionItem* itemForIndex(const QModelIndex& index) const;
85 
86  virtual void readFrom(QXmlStreamReader* reader, MessageService* messageService = 0);
87  virtual void writeTo(QXmlStreamWriter* writer, SessionItem* parent = 0);
88 
89  SessionItem* moveItem(SessionItem* item, SessionItem* new_parent = 0, int row = -1,
90  const QString& tag = "");
91 
92  template <typename T>
93  T* copyItem(const T* item_to_copy, SessionItem* new_parent = 0, const QString& tag = "");
94 
96 
97  //! Returns first item in list of topItems
98  template <typename T = SessionItem> T* topItem() const;
99  template <typename T = SessionItem> QVector<T*> topItems() const;
100  template <typename T = SessionItem>
101  QVector<T*> topItems(std::function<bool(const T&)> accept) const;
102 
103  virtual void initFrom(SessionModel* model, SessionItem* parent);
104  SessionItem* rootItem() const;
105 
106  virtual QVector<SessionItem*> nonXMLItems() const;
107 
108 signals:
109  void modelLoaded();
110 
111 protected:
112  void setRootItem(SessionItem* root) { m_root_item = root; }
113 
114 private:
115  SessionItem* copy(const SessionItem* item_to_copy, SessionItem* new_parent = 0,
116  const QString& tag = "");
117 
118 private:
121  QString m_name; //!< model name
122  QString m_model_tag; //!< model tag (SampleModel, InstrumentModel)
123 };
124 
125 template <typename T> T* SessionModel::insertItem(SessionItem* parent, int row, QString tag)
126 {
127  return static_cast<T*>(insertNewItem(T().modelType(), parent, row, tag));
128 }
129 
130 template <typename T> T* SessionModel::insertItem(const QModelIndex& parent, int row, QString tag)
131 {
132  return insertItem<T>(itemForIndex(parent), row, tag);
133 }
134 
135 template <typename T>
136 T* SessionModel::copyItem(const T* item_to_copy, SessionItem* new_parent, const QString& tag)
137 {
138  return static_cast<T*>(copy(item_to_copy, new_parent, tag));
139 }
140 
141 template <typename T> T* SessionModel::topItem() const
142 {
143  auto items = topItems<T>();
144  return items.isEmpty() ? nullptr : items.front();
145 }
146 
147 template <typename T> QVector<T*> SessionModel::topItems() const
148 {
149  QVector<T*> result;
150 
151  QModelIndex parentIndex;
152  for (int i_row = 0; i_row < rowCount(parentIndex); ++i_row) {
153  QModelIndex itemIndex = index(i_row, 0, parentIndex);
154  if (auto item = dynamic_cast<T*>(itemForIndex(itemIndex)))
155  result.push_back(item);
156  }
157 
158  return result;
159 }
160 
161 template <typename T> QVector<T*> SessionModel::topItems(std::function<bool(const T&)> accept) const
162 {
163  QVector<T*> result;
164 
165  QModelIndex parentIndex;
166  for (int i_row = 0; i_row < rowCount(parentIndex); ++i_row) {
167  QModelIndex itemIndex = index(i_row, 0, parentIndex);
168  if (auto item = dynamic_cast<T*>(itemForIndex(itemIndex)))
169  if (accept(*item))
170  result.push_back(item);
171  }
172 
173  return result;
174 }
175 
176 inline bool SessionModel::setHeaderData(int, Qt::Orientation, const QVariant&, int)
177 {
178  return false;
179 }
180 
181 inline Qt::DropActions SessionModel::supportedDragActions() const
182 {
183  return Qt::MoveAction;
184 }
185 
186 inline Qt::DropActions SessionModel::supportedDropActions() const
187 {
188  return Qt::MoveAction;
189 }
190 
191 inline QString SessionModel::getModelTag() const
192 {
193  return m_model_tag;
194 }
195 
196 inline QString SessionModel::getModelName() const
197 {
198  return m_name;
199 }
200 
201 inline void SessionModel::setDraggedItemType(const QString& type)
202 {
203  m_dragged_item_type = type;
204 }
205 
206 #endif // BORNAGAIN_GUI_COREGUI_MODELS_SESSIONMODEL_H
Defines class SessionFlags.
Defines class SessionItem.
Defines reader and writer classes for SessionModel.
The service to collect messages from different senders.
QVariant value() const
Get value.
SessionItem * parent() const
Returns parent of this item.
Definition: SessionItem.cpp:73
SessionModel * model() const
Returns model of this item.
Definition: SessionItem.cpp:66
T * item(const QString &tag) const
Definition: SessionItem.h:151
QString modelType() const
Get model type.
QString getModelName() const
Definition: SessionModel.h:196
virtual QModelIndex parent(const QModelIndex &child) const
T * topItem() const
Returns first item in list of topItems.
Definition: SessionModel.h:141
virtual void clear()
T * copyItem(const T *item_to_copy, SessionItem *new_parent=0, const QString &tag="")
Definition: SessionModel.h:136
void modelLoaded()
SessionItem * copy(const SessionItem *item_to_copy, SessionItem *new_parent=0, const QString &tag="")
Copy given item to the new_parent at given row.
QString m_name
model name
Definition: SessionModel.h:121
virtual void writeTo(QXmlStreamWriter *writer, SessionItem *parent=0)
virtual Qt::ItemFlags flags(const QModelIndex &index) const
SessionItem * itemForIndex(const QModelIndex &index) const
void setDraggedItemType(const QString &type)
Definition: SessionModel.h:201
T * insertItem(SessionItem *parent=nullptr, int row=-1, QString tag="")
Definition: SessionModel.h:125
virtual ~SessionModel()
virtual bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const
virtual QVector< SessionItem * > nonXMLItems() const
QString m_dragged_item_type
Definition: SessionModel.h:120
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
QVector< T * > topItems() const
Definition: SessionModel.h:147
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const
QString getModelTag() const
Definition: SessionModel.h:191
virtual bool setData(const QModelIndex &index, const QVariant &value, int role)
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const
void createRootItem()
virtual int columnCount(const QModelIndex &parent) const
virtual int rowCount(const QModelIndex &parent) const
virtual bool setHeaderData(int, Qt::Orientation, const QVariant &, int=Qt::EditRole)
Definition: SessionModel.h:176
virtual bool removeRows(int row, int count, const QModelIndex &parent)
void load(const QString &filename="")
SessionModel(QString model_tag, QObject *parent=0)
void removeItem(SessionItem *item)
SessionItem * insertNewItem(QString model_type, SessionItem *parent_item=nullptr, int row=-1, QString tag="")
virtual QStringList mimeTypes() const
void save(const QString &filename="")
virtual void initFrom(SessionModel *model, SessionItem *parent)
SessionItem * moveItem(SessionItem *item, SessionItem *new_parent=0, int row=-1, const QString &tag="")
Move given parameterized item to the new_parent at given row.
QString m_model_tag
model tag (SampleModel, InstrumentModel)
Definition: SessionModel.h:122
SessionItem * rootItem() const
virtual QVariant data(const QModelIndex &index, int role) const
QVector< QString > acceptableDefaultItemTypes(const QModelIndex &parent) const
virtual QMimeData * mimeData(const QModelIndexList &indexes) const
virtual void readFrom(QXmlStreamReader *reader, MessageService *messageService=0)
virtual Qt::DropActions supportedDragActions() const
Definition: SessionModel.h:181
void setRootItem(SessionItem *root)
Definition: SessionModel.h:112
SessionItem * m_root_item
Definition: SessionModel.h:119
QModelIndex indexOfItem(SessionItem *item) const
virtual SessionModel * createCopy(SessionItem *parent=0)
virtual Qt::DropActions supportedDropActions() const
Definition: SessionModel.h:186
std::string filename(const std::string &path)
Returns path without directory part ("Foo/Bar/Doz.int.gz" -> "Doz.int.gz")
std::string model_type
Definition: types.h:23