21 #include "itkCommand.h" 26 : QAbstractListModel(parent), m_NodePredicate(nullptr),
m_DataStorage(nullptr), m_BlockEvents(false)
40 if (m_DataStorage == dataStorage)
46 if (m_DataStorage !=
nullptr)
56 m_DataStorage->RemoveObserver(m_DataStorageDeleteObserverTag);
57 m_DataStorageDeleteObserverTag = 0;
60 m_DataStorage = dataStorage;
62 if (m_DataStorage !=
nullptr)
73 itk::MemberCommand<QmitkDataStorageListModel>::Pointer deleteCommand =
74 itk::MemberCommand<QmitkDataStorageListModel>::New();
76 m_DataStorageDeleteObserverTag = m_DataStorage->AddObserver(itk::DeleteEvent(), deleteCommand);
85 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
90 if (role == Qt::DisplayRole && index.isValid())
92 const mitk::DataNode *node = std::get<NODE>(m_NodesAndObserverTags.at(index.row()));
93 return QVariant(QString::fromStdString(node->
GetName()));
103 return QVariant(tr(
"Nodes"));
108 return m_NodesAndObserverTags.size();
113 auto size = m_NodesAndObserverTags.size();
114 std::vector<mitk::DataNode *> result(size);
115 for (std::size_t i = 0; i < size; ++i)
117 result[i] = std::get<NODE>(m_NodesAndObserverTags[i]);
124 return m_DataStorage;
129 m_NodePredicate = pred;
133 QAbstractListModel::beginResetModel();
135 QAbstractListModel::endResetModel();
140 return m_NodePredicate;
145 mitk::DataStorage::SetOfObjects::ConstPointer modelNodes;
147 if (m_DataStorage !=
nullptr)
149 if (m_NodePredicate !=
nullptr)
151 modelNodes = m_DataStorage->
GetSubset(m_NodePredicate);
155 modelNodes = m_DataStorage->
GetAll();
162 if (modelNodes !=
nullptr)
164 for (
auto &node : *modelNodes)
173 if (m_DataStorage !=
nullptr)
175 itk::MemberCommand<QmitkDataStorageListModel>::Pointer nodeModifiedCommand;
177 nodeModifiedCommand = itk::MemberCommand<QmitkDataStorageListModel>::New();
179 unsigned long nodeObserverTag = node->AddObserver(itk::ModifiedEvent(), nodeModifiedCommand);
181 itk::MemberCommand<QmitkDataStorageListModel>::Pointer dataModifiedCommand;
182 unsigned long dataObserverTag = 0;
184 if (node->
GetData() !=
nullptr)
186 dataModifiedCommand = itk::MemberCommand<QmitkDataStorageListModel>::New();
188 dataObserverTag = node->
GetData()->AddObserver(itk::ModifiedEvent(), dataModifiedCommand);
191 m_NodesAndObserverTags.push_back(std::make_tuple(node, nodeObserverTag, dataObserverTag));
197 for (
auto &iter : m_NodesAndObserverTags)
199 auto node = std::get<NODE>(iter);
202 node->RemoveObserver(std::get<NODE_OBSERVER>(iter));
203 if (node->GetData() !=
nullptr)
205 node->GetData()->RemoveObserver(std::get<DATA_OBSERVER>(iter));
209 m_NodesAndObserverTags.clear();
214 for (
auto iter = m_NodesAndObserverTags.begin(); iter != m_NodesAndObserverTags.end(); ++iter)
216 if (std::get<NODE>(*iter) == node)
218 node->RemoveObserver(std::get<NODE_OBSERVER>(*iter));
219 if (node->
GetData() !=
nullptr)
221 node->
GetData()->RemoveObserver(std::get<DATA_OBSERVER>(*iter));
223 m_NodesAndObserverTags.erase(iter);
234 m_BlockEvents =
true;
238 if (m_NodePredicate && !m_NodePredicate->CheckNode(node))
243 int newIndex = m_NodesAndObserverTags.size();
244 beginInsertRows(QModelIndex(), newIndex, newIndex);
249 m_BlockEvents =
false;
258 m_BlockEvents =
true;
261 for (
auto iter = m_NodesAndObserverTags.begin(); iter != m_NodesAndObserverTags.end(); ++iter, ++row)
263 if (std::get<NODE>(*iter) == node)
266 beginRemoveRows(QModelIndex(), row, row);
274 m_BlockEvents =
false;
285 QModelIndex changedIndex =
getIndex(modifiedNode);
286 if (changedIndex.isValid())
288 emit dataChanged(changedIndex, changedIndex);
310 return std::get<NODE>(m_NodesAndObserverTags.at(index.row()));
321 for (
auto iter = m_NodesAndObserverTags.begin(); iter != m_NodesAndObserverTags.end(); ++iter, ++row)
323 if (std::get<NODE>(*iter) == node)
328 return QModelIndex();
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
Implements QAbstractListModel.
~QmitkDataStorageListModel() override
void reset()
Resets the whole model. Get all nodes matching the predicate from the data storage.
Data management class that handles 'was created by' relations.
int rowCount(const QModelIndex &parent=QModelIndex()) const override
Implements QAbstractListModel.
virtual void OnDataStorageDeleted(const itk::Object *caller, const itk::EventObject &event)
mitk::DataStorage * GetDataStorage() const
Get the represented data storage.
void SetPredicate(mitk::NodePredicateBase *pred)
Change the filter predicate.
mitk::DataNode::Pointer getNode(const QModelIndex &index) const
Return the node for given model index.
void SetDataStorage(mitk::DataStorage::Pointer dataStorage)
Change the data storage to represent.
virtual void OnDataNodeModified(const itk::Object *caller, const itk::EventObject &event)
void AddNodeToInternalList(mitk::DataNode *node)
Internal helper: adds given node to end of list.
QModelIndex getIndex(const mitk::DataNode *node) const
Return the model index of the given node.
virtual SetOfObjects::ConstPointer GetAll() const =0
returns a set of all data objects that are stored in the data storage
BaseData * GetData() const
Get the data object (instance of BaseData, e.g., an Image) managed by this DataNode.
mitk::DataStorage::Pointer m_DataStorage
Qt::ItemFlags flags(const QModelIndex &index) const override
Implements QAbstractListModel.
std::vector< mitk::DataNode * > GetDataNodes() const
Get all current data nodes.
QmitkDataStorageListModel(mitk::DataStorage *dataStorage=nullptr, mitk::NodePredicateBase::Pointer pred=nullptr, QObject *parent=nullptr)
void RemoveNodeFromInternalList(mitk::DataNode *node)
Internal helper: remove given node.
SetOfObjects::ConstPointer GetSubset(const NodePredicateBase *condition) const
returns a set of data objects that meet the given condition(s)
virtual void OnDataStorageNodeAdded(const mitk::DataNode *node)
void AddListener(const AbstractDelegate &delegate) const
DataStorageEvent AddNodeEvent
AddEvent is emitted whenever a new node has been added to the DataStorage.
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
Implements QAbstractListModel.
DataStorageEvent RemoveNodeEvent
RemoveEvent is emitted directly before a node is removed from the DataStorage.
mitk::NodePredicateBase * GetPredicate() const
Get the filter predicate in use.
void RemoveListener(const AbstractDelegate &delegate) const
virtual void OnDataStorageNodeRemoved(const mitk::DataNode *node)
Interface for evaluation conditions used in the DataStorage class GetSubset() method.
void ClearInternalNodeList()
Internal helper: Clear complete model list.
Class for nodes of the DataTree.
virtual void OnDataModified(const itk::Object *caller, const itk::EventObject &event)
bool GetName(std::string &nodeName, const mitk::BaseRenderer *renderer=nullptr, const char *propertyKey="name") const
Convenience access method for accessing the name of an object (instance of StringProperty with proper...