BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
itemutils.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // qt-mvvm: Model-view-view-model framework for large GUI applications
4 //
5 //! @file mvvm/model/mvvm/model/itemutils.cpp
6 //! @brief Implements class CLASS?
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2020
11 //! @authors Gennady Pospelov et al, Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
15 #include "mvvm/model/itemutils.h"
16 #include "mvvm/model/sessionitem.h"
20 #include <iterator>
21 
22 using namespace ModelView;
23 
24 void Utils::iterate(SessionItem* item, const std::function<void(SessionItem*)>& fun)
25 {
26  if (item)
27  fun(item);
28  else
29  return;
30 
31  for (auto child : item->children())
32  iterate(child, fun);
33 }
34 
35 void Utils::iterate_if(const SessionItem* item, const std::function<bool(const SessionItem*)>& fun)
36 {
37  bool proceed_with_children(true);
38 
39  if (item)
40  proceed_with_children = fun(item);
41 
42  if (!item || !proceed_with_children)
43  return;
44 
45  for (auto child : item->children())
46  iterate_if(child, fun);
47 }
48 
50 {
51  int result(-1);
52 
53  if (!item)
54  return result;
55 
56  int count(0);
57  auto model_type = item->modelType();
58  if (auto parent = item->parent()) {
59  for (auto child : parent->children()) {
60  if (child == item)
61  result = count;
62  if (child->modelType() == model_type)
63  ++count;
64  }
65  }
66 
67  return count > 1 ? result : -1;
68 }
69 
70 SessionItem* Utils::ChildAt(const SessionItem* parent, int index)
71 {
72  if (!parent)
73  return nullptr;
74 
75  auto container = parent->children();
76  return index >= 0 && static_cast<size_t>(index) < container.size()
77  ? container[static_cast<size_t>(index)]
78  : nullptr;
79 }
80 
81 int Utils::IndexOfChild(const SessionItem* parent, const SessionItem* child)
82 {
83  return Utils::IndexOfItem(parent->children(), child);
84 }
85 
86 bool Utils::HasTag(const SessionItem& item, const std::string& tag)
87 {
88  return item.itemTags()->isTag(tag);
89 }
90 
91 bool Utils::IsSinglePropertyTag(const SessionItem& item, const std::string& tag)
92 {
93  return item.itemTags()->isSinglePropertyTag(tag);
94 }
95 
96 std::vector<std::string> Utils::RegisteredTags(const SessionItem& item)
97 {
98  std::vector<std::string> result;
99  for (const auto container : *item.itemTags())
100  result.push_back(container->name());
101  return result;
102 }
103 
104 std::vector<std::string> Utils::RegisteredUniversalTags(const SessionItem& item)
105 {
106  std::vector<std::string> result;
107  for (const auto& tag : RegisteredTags(item))
108  if (!IsSinglePropertyTag(item, tag))
109  result.push_back(tag);
110  return result;
111 }
112 
113 std::vector<SessionItem*> Utils::TopLevelItems(const SessionItem& item)
114 {
115  std::vector<SessionItem*> result;
116  for (auto child : item.children())
117  if (!IsSinglePropertyTag(item, item.tagRowOfItem(child).tag))
118  result.push_back(child);
119  return result;
120 }
121 
122 std::vector<SessionItem*> Utils::SinglePropertyItems(const SessionItem& item)
123 {
124  std::vector<SessionItem*> result;
125  for (auto child : item.children())
126  if (IsSinglePropertyTag(item, item.tagRowOfItem(child).tag))
127  result.push_back(child);
128  return result;
129 }
130 
132 {
133  auto parent = item ? item->parent() : nullptr;
134  if (!parent)
135  return nullptr;
136  auto tagrow = item->tagRow();
137  return parent->getItem(tagrow.tag, tagrow.row + 1);
138 }
139 
141 {
142  auto parent = item ? item->parent() : nullptr;
143  if (!parent)
144  return nullptr;
145  auto tagrow = parent->tagRowOfItem(item);
146  return parent->getItem(tagrow.tag, tagrow.row - 1);
147 }
148 
150 {
151  auto next = FindNextSibling(item);
152  auto closest = next ? next : FindPreviousSibling(item);
153  return closest ? closest : item->parent();
154 }
155 
156 bool Utils::IsItemAncestor(const SessionItem* item, const SessionItem* candidate)
157 {
158  if (!item || !candidate)
159  return false;
160  const SessionItem* parent = item->parent();
161  while (parent) {
162  if (parent == candidate)
163  return true;
164  else
165  parent = parent->parent();
166  }
167  return false;
168 }
169 
170 std::vector<SessionItem*> Utils::UniqueItems(const std::vector<SessionItem*>& items)
171 {
172  auto filtered = Utils::UniqueWithOrder(items);
173  std::vector<SessionItem*> result;
174  std::copy_if(filtered.begin(), filtered.end(), std::back_inserter(result),
175  [](auto x) { return x != nullptr; });
176  return result;
177 }
bool isSinglePropertyTag(const std::string &tag) const
Returns true if given tag corresponds to registered single property tag.
bool isTag(const std::string &name) const
Returns true if container with such name exists.
The main object representing an editable/displayable/serializable entity.
Definition: sessionitem.h:38
SessionItemTags * itemTags()
Returns pointer to internal collection of tag-registered items (non-const version).
TagRow tagRowOfItem(const SessionItem *item) const
Returns pair of tag and row corresponding to given item.
SessionItem * parent() const
Returns parent item. Will return nullptr if item doesn't have a parent.
std::vector< SessionItem * > children() const
Returns vector of children formed from all chidlren from all tags.
TagRow tagRow() const
Returns TagRow of this item under which it is accessible through its parent.
model_type modelType() const
Returns item's model type.
Definition: sessionitem.cpp:80
std::string tag
Definition: tagrow.h:27
Defines class CLASS?
Defines class CLASS?
void iterate_if(const QModelIndex &index, const QAbstractItemModel *model, const std::function< bool(const QModelIndex &)> &fun)
Iterates through all model indices and calls user function.
Definition: ModelUtils.cpp:47
void iterate(const QModelIndex &index, const QAbstractItemModel *model, const std::function< void(const QModelIndex &)> &fun)
Iterates through all model indices and calls user function.
Definition: ModelUtils.cpp:33
MVVM_MODEL_EXPORT int CopyNumber(const SessionItem *item)
Returns copy number of given item in it's parent hierarchy.
Definition: itemutils.cpp:49
C UniqueWithOrder(const C &container)
Returns copy of container with all duplicated elements filtered our. The order is preserved.
MVVM_MODEL_EXPORT SessionItem * FindNextSibling(SessionItem *item)
Returns next sibling with same tag.
Definition: itemutils.cpp:131
MVVM_MODEL_EXPORT SessionItem * FindNextItemToSelect(SessionItem *item)
Finds next item to select Method is used in the context of next item selection after given item was d...
Definition: itemutils.cpp:149
MVVM_MODEL_EXPORT std::vector< SessionItem * > SinglePropertyItems(const SessionItem &item)
Returns vector of children representing property items.
Definition: itemutils.cpp:122
int IndexOfItem(It begin, It end, const T &item)
Returns index corresponding to the first occurance of the item in the container.
MVVM_MODEL_EXPORT void iterate(SessionItem *item, const std::function< void(SessionItem *)> &fun)
Iterates through item and all its children.
Definition: itemutils.cpp:24
MVVM_MODEL_EXPORT int IndexOfChild(const SessionItem *parent, const SessionItem *child)
Returns index in children array corresponding to given child.
Definition: itemutils.cpp:81
MVVM_MODEL_EXPORT std::vector< SessionItem * > UniqueItems(const std::vector< SessionItem * > &items)
Returns vector with duplicates and 'nullptr' filtered out.
Definition: itemutils.cpp:170
MVVM_MODEL_EXPORT void iterate_if(const SessionItem *item, const std::function< bool(const SessionItem *)> &fun)
Iterates through all model indices and calls user function.
Definition: itemutils.cpp:35
MVVM_MODEL_EXPORT std::vector< SessionItem * > TopLevelItems(const SessionItem &item)
Returns vector of children representing top level items.
Definition: itemutils.cpp:113
MVVM_MODEL_EXPORT std::vector< std::string > RegisteredUniversalTags(const SessionItem &item)
Returns vector of strings containing all registered universal tags of the given item.
Definition: itemutils.cpp:104
MVVM_MODEL_EXPORT bool HasTag(const SessionItem &item, const std::string &tag)
Returns true if given item has registered tag.
Definition: itemutils.cpp:86
MVVM_MODEL_EXPORT std::vector< std::string > RegisteredTags(const SessionItem &item)
Returns vector of strings containing all registered tags of the given item.
Definition: itemutils.cpp:96
MVVM_MODEL_EXPORT SessionItem * ChildAt(const SessionItem *parent, int index)
Returns child at given index of parent.
Definition: itemutils.cpp:70
MVVM_MODEL_EXPORT bool IsItemAncestor(const SessionItem *item, const SessionItem *candidate)
Returns true if 'candidate' is one of ancestor of given item.
Definition: itemutils.cpp:156
MVVM_MODEL_EXPORT SessionItem * FindPreviousSibling(SessionItem *item)
Returns previous sibling with same tag.
Definition: itemutils.cpp:140
MVVM_MODEL_EXPORT bool IsSinglePropertyTag(const SessionItem &item, const std::string &tag)
Returns true if given item has registered tag, and it belongs to single property.
Definition: itemutils.cpp:91
materialitems.h Collection of materials to populate MaterialModel.
std::string model_type
Definition: types.h:23
Defines class CLASS?
Defines class CLASS?
Defines class CLASS?