BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
PropertyRepeater.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Views/IntensityDataWidgets/PropertyRepeater.cpp
6 //! @brief Implements class PropertyRepeater
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 
17 
18 PropertyRepeater::PropertyRepeater(QObject* parent, bool repeat_child_properties)
19  : QObject(parent), m_block_repeater(false), m_repeat_child_properties(repeat_child_properties)
20 {
21 }
22 
24 {
25  for (auto item : m_dataItems)
26  item->mapper()->unsubscribe(this);
27 }
28 
30 {
31  if (!sessionItem || m_dataItems.contains(sessionItem))
32  return;
33 
34  sessionItem->mapper()->setOnItemDestroy(
35  [this](SessionItem* item) { m_dataItems.removeAll(item); }, this);
36 
37  sessionItem->mapper()->setOnPropertyChange(
38  [this](SessionItem* item, const QString& name) { onPropertyChanged(item, name); }, this);
39 
41  sessionItem->mapper()->setOnChildPropertyChange(
42  [this](SessionItem* item, const QString& name) {
44  },
45  this);
46  }
47  m_dataItems.push_back(sessionItem);
48 }
49 
51 {
52  for (auto item : m_dataItems)
53  item->mapper()->unsubscribe(this);
54 
55  m_dataItems.clear();
56 }
57 
58 void PropertyRepeater::setActive(bool isActive)
59 {
60  m_block_repeater = !isActive;
61 }
62 
63 void PropertyRepeater::onPropertyChanged(SessionItem* item, const QString& propertyName)
64 {
65  if (m_block_repeater)
66  return;
67 
68  m_block_repeater = true;
69 
70  QVariant value = item->getItemValue(propertyName);
71  for (auto target : targetItems(item)) {
72  target->setItemValue(propertyName, value);
73  }
74  m_block_repeater = false;
75 }
76 
77 void PropertyRepeater::setOnChildPropertyChange(SessionItem* item, const QString& propertyName)
78 {
79  if (m_block_repeater)
80  return;
81 
82  m_block_repeater = true;
83 
84  SessionItem* sourceItem = item->parent();
85  QString tag = sourceItem->tagFromItem(item);
86  QVariant value = item->getItemValue(propertyName);
87  for (auto target : targetItems(sourceItem)) {
88  target->getItem(tag)->setItemValue(propertyName, value);
89  }
90  m_block_repeater = false;
91 }
92 
93 //! Returns list of target items to update their properties.
94 
95 QVector<SessionItem*> PropertyRepeater::targetItems(SessionItem* sourceItem)
96 {
97  QVector<SessionItem*> result = m_dataItems;
98  result.removeAll(sourceItem);
99  return result;
100 }
Defines class IntensityDataItem.
Defines class PropertyRepeater.
void setOnItemDestroy(std::function< void(SessionItem *)> f, const void *caller=0)
Definition: ModelMapper.cpp:87
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 setOnPropertyChange(std::function< void(QString)> f, const void *caller=0)
Definition: ModelMapper.cpp:35
void setActive(bool isActive)
QVector< SessionItem * > m_dataItems
void setOnChildPropertyChange(SessionItem *item, const QString &propertyName)
QVector< SessionItem * > targetItems(SessionItem *sourceItem)
Returns list of target items to update their properties.
void onPropertyChanged(SessionItem *item, const QString &propertyName)
PropertyRepeater(QObject *parent=nullptr, bool repeat_child_properties=false)
void addItem(SessionItem *sessionItem)
QVariant getItemValue(const QString &tag) const
Directly access value of item under given tag.
ModelMapper * mapper()
Returns the current model mapper of this item. Creates new one if necessary.
SessionItem * parent() const
Returns parent of this item.
Definition: SessionItem.cpp:73
QString tagFromItem(const SessionItem *item) const
Returns the tag name of given item when existing.
QString const & name(EShape k)
Definition: particles.cpp:21