BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
ModelMapper.h
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Models/ModelMapper.h
6 //! @brief Defines class ModelMapper
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_MODELMAPPER_H
16 #define BORNAGAIN_GUI_COREGUI_MODELS_MODELMAPPER_H
17 
18 #include <QModelIndex>
19 #include <functional>
20 
21 class SessionModel;
22 class SessionItem;
23 
24 class ModelMapper : public QObject {
25  Q_OBJECT
26 
27 public:
28  ModelMapper(QObject* parent = 0);
29 
30  void setItem(SessionItem* item);
31 
32  void setOnValueChange(std::function<void(void)> f, const void* caller = 0);
33 
34  void setOnPropertyChange(std::function<void(QString)> f, const void* caller = 0);
35  void setOnPropertyChange(std::function<void(SessionItem*, QString)> f, const void* caller = 0);
36 
37  void setOnChildPropertyChange(std::function<void(SessionItem*, QString)> f,
38  const void* caller = 0);
39 
40  void setOnParentChange(std::function<void(SessionItem*)> f, const void* caller = 0);
41 
42  void setOnChildrenChange(std::function<void(SessionItem*)> f, const void* caller = 0);
43 
44  void setOnSiblingsChange(std::function<void(void)> f, const void* caller = 0);
45 
46  void setOnAnyChildChange(std::function<void(SessionItem*)> f, const void* caller = 0);
47 
48  void setActive(bool state) { m_active = state; }
49 
50  void setOnItemDestroy(std::function<void(SessionItem*)> f, const void* caller = 0);
51 
52  void setOnAboutToRemoveChild(std::function<void(SessionItem*)> f, const void* caller = 0);
53 
54  void unsubscribe(const void* caller);
55 
56  void callOnItemDestroy();
57 
58 public slots:
59  void onDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight,
60  const QVector<int>& roles = {});
61 
62  void onRowsInserted(const QModelIndex& parent, int first, int last);
63 
64  void onBeginRemoveRows(const QModelIndex& parent, int first, int last);
65 
66  void onRowRemoved(const QModelIndex& parent, int first, int last);
67 
68 private:
69  //! removes all callbacks related to given caller
70  template <class U> void clean_container(U& v, const void* caller);
71 
72  void setModel(SessionModel* model);
73  int nestlingDepth(SessionItem* item, int level = 0);
74 
75  void callOnValueChange();
76  void callOnPropertyChange(const QString& name);
77  void callOnChildPropertyChange(SessionItem* item, const QString& name);
78  void callOnParentChange(SessionItem* new_parent);
80  void callOnSiblingsChange();
83 
84  void clearMapper();
85 
86  bool m_active;
89 
90  using call_t = std::pair<std::function<void(void)>, const void*>;
91  using call_str_t = std::pair<std::function<void(QString)>, const void*>;
92  using call_item_t = std::pair<std::function<void(SessionItem*)>, const void*>;
93  using call_item_str_t = std::pair<std::function<void(SessionItem*, QString)>, const void*>;
94 
95  std::vector<call_t> m_onValueChange;
96  std::vector<call_item_str_t> m_onPropertyChange;
97  std::vector<call_item_str_t> m_onChildPropertyChange;
98  std::vector<call_item_t> m_onParentChange;
99  std::vector<call_item_t> m_onChildrenChange;
100  std::vector<call_t> m_onSiblingsChange;
101  std::vector<call_item_t> m_onAnyChildChange;
102  std::vector<call_item_t> m_onItemDestroy;
103  std::vector<call_item_t> m_onAboutToRemoveChild;
104  QModelIndex m_aboutToDelete;
105 };
106 
107 template <class U> inline void ModelMapper::clean_container(U& v, const void* caller)
108 {
109  v.erase(std::remove_if(
110  v.begin(), v.end(),
111  [caller](typename U::value_type const& x) -> bool { return (x.second == caller); }),
112  v.end());
113 }
114 
115 #endif // BORNAGAIN_GUI_COREGUI_MODELS_MODELMAPPER_H
void unsubscribe(const void *caller)
Cancells all subscribtion of given caller.
Definition: ModelMapper.cpp:98
void setOnItemDestroy(std::function< void(SessionItem *)> f, const void *caller=0)
Definition: ModelMapper.cpp:87
std::vector< call_item_t > m_onAnyChildChange
Definition: ModelMapper.h:101
void setOnAnyChildChange(std::function< void(SessionItem *)> f, const void *caller=0)
Calls back on any change in children (number of children or their properties), reports childItem.
Definition: ModelMapper.cpp:82
void onBeginRemoveRows(const QModelIndex &parent, int first, int last)
void callOnPropertyChange(const QString &name)
void onRowRemoved(const QModelIndex &parent, int first, int last)
void setOnValueChange(std::function< void(void)> f, const void *caller=0)
Definition: ModelMapper.cpp:30
void clearMapper()
std::vector< call_item_t > m_onParentChange
Definition: ModelMapper.h:98
void callOnChildPropertyChange(SessionItem *item, const QString &name)
std::pair< std::function< void(SessionItem *, QString)>, const void * > call_item_str_t
Definition: ModelMapper.h:93
void callOnItemDestroy()
Notifies subscribers if an item owning given mapper is about to be destroyed.
void setOnChildPropertyChange(std::function< void(SessionItem *, QString)> f, const void *caller=0)
Calls back on child property change, report childItem and property name.
Definition: ModelMapper.cpp:49
void setActive(bool state)
Definition: ModelMapper.h:48
void callOnValueChange()
void clean_container(U &v, const void *caller)
removes all callbacks related to given caller
Definition: ModelMapper.h:107
void callOnAnyChildChange(SessionItem *item)
std::pair< std::function< void(SessionItem *)>, const void * > call_item_t
Definition: ModelMapper.h:92
void callOnChildrenChange(SessionItem *item)
void setOnAboutToRemoveChild(std::function< void(SessionItem *)> f, const void *caller=0)
Definition: ModelMapper.cpp:92
void setOnPropertyChange(std::function< void(QString)> f, const void *caller=0)
Definition: ModelMapper.cpp:35
void onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector< int > &roles={})
std::vector< call_item_t > m_onChildrenChange
Definition: ModelMapper.h:99
std::vector< call_t > m_onValueChange
Definition: ModelMapper.h:95
QModelIndex m_aboutToDelete
Definition: ModelMapper.h:104
void setItem(SessionItem *item)
Definition: ModelMapper.cpp:22
void setOnChildrenChange(std::function< void(SessionItem *)> f, const void *caller=0)
Calls back when number of children has changed, reports newChild.
Definition: ModelMapper.cpp:68
std::vector< call_t > m_onSiblingsChange
Definition: ModelMapper.h:100
void setModel(SessionModel *model)
std::pair< std::function< void(QString)>, const void * > call_str_t
Definition: ModelMapper.h:91
SessionModel * m_model
Definition: ModelMapper.h:87
std::pair< std::function< void(void)>, const void * > call_t
Definition: ModelMapper.h:90
bool m_active
Definition: ModelMapper.h:86
std::vector< call_item_str_t > m_onPropertyChange
Definition: ModelMapper.h:96
SessionItem * m_item
Definition: ModelMapper.h:88
void callOnSiblingsChange()
int nestlingDepth(SessionItem *item, int level=0)
std::vector< call_item_str_t > m_onChildPropertyChange
Definition: ModelMapper.h:97
void callOnAboutToRemoveChild(SessionItem *item)
void setOnSiblingsChange(std::function< void(void)> f, const void *caller=0)
Definition: ModelMapper.cpp:73
std::vector< call_item_t > m_onItemDestroy
Definition: ModelMapper.h:102
void setOnParentChange(std::function< void(SessionItem *)> f, const void *caller=0)
Calls back when parent has changed, reports newParent.
Definition: ModelMapper.cpp:60
ModelMapper(QObject *parent=0)
Definition: ModelMapper.cpp:17
void callOnParentChange(SessionItem *new_parent)
void onRowsInserted(const QModelIndex &parent, int first, int last)
std::vector< call_item_t > m_onAboutToRemoveChild
Definition: ModelMapper.h:103
QString const & name(EShape k)
Definition: particles.cpp:21