#include <QmitkDataStorageListModel.h>

Public Member Functions | |
| QmitkDataStorageListModel (mitk::DataStorage::Pointer dataStorage=0, mitk::NodePredicateBase *pred=0, QObject *parent=0) | |
| ~QmitkDataStorageListModel () | |
| void | SetDataStorage (mitk::DataStorage::Pointer dataStorage) |
| mitk::DataStorage::Pointer | GetDataStorage () const |
| void | SetPredicate (mitk::NodePredicateBase *pred) |
| mitk::NodePredicateBase * | GetPredicate () const |
| std::vector< mitk::DataNode * > | GetDataNodes () const |
| mitk::DataNode::Pointer | getNode (const QModelIndex &index) const |
| Qt::ItemFlags | flags (const QModelIndex &index) const |
| QVariant | data (const QModelIndex &index, int role=Qt::DisplayRole) const |
| QVariant | headerData (int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const |
| int | rowCount (const QModelIndex &parent=QModelIndex()) const |
| virtual void | NodeAdded (const mitk::DataNode *node) |
| virtual void | NodeRemoved (const mitk::DataNode *node) |
| virtual void | OnModified (const itk::Object *caller, const itk::EventObject &event) |
| Called when a itk::Object that is hold as a member variable was modified in order to react to it. | |
| virtual void | OnDelete (const itk::Object *caller, const itk::EventObject &event) |
| Called when a itk::Object that is hold as a member variable is about to be deleted in order to react to it. | |
Protected Member Functions | |
| void | reset () |
| Resets the whole model. Get all nodes matching the predicate from the data storage. | |
Protected Attributes | |
| mitk::NodePredicateBase::Pointer | m_NodePredicate |
| mitk::DataStorage * | m_DataStorage |
| unsigned long | m_DataStorageDeleteObserverTag |
| Holds the tag of the datastorage-delete observer. | |
| std::vector< mitk::DataNode * > | m_DataNodes |
| std::vector< unsigned long > | m_DataNodesModifiedObserversTags |
| Holds the tags of the node-modified observers. | |
| bool | m_BlockEvents |
Definition at line 35 of file QmitkDataStorageListModel.h.
| QmitkDataStorageListModel::QmitkDataStorageListModel | ( | mitk::DataStorage::Pointer | dataStorage = 0, |
| mitk::NodePredicateBase * | pred = 0, |
||
| QObject * | parent = 0 |
||
| ) |
The NodePredicate is owned by the model
Definition at line 28 of file QmitkDataStorageListModel.cpp.
References SetDataStorage(), and SetPredicate().
: QAbstractListModel(parent), m_NodePredicate(0), m_DataStorage(0), m_BlockEvents(false) { this->SetPredicate(pred); this->SetDataStorage(dataStorage); }
| QmitkDataStorageListModel::~QmitkDataStorageListModel | ( | ) |
Definition at line 36 of file QmitkDataStorageListModel.cpp.
References m_NodePredicate, and SetDataStorage().
{
// set data storage to 0 so that event listener get removed
this->SetDataStorage(0);
if (m_NodePredicate) delete m_NodePredicate;
}
| QVariant QmitkDataStorageListModel::data | ( | const QModelIndex & | index, |
| int | role = Qt::DisplayRole |
||
| ) | const |
Definition at line 93 of file QmitkDataStorageListModel.cpp.
References mitk::DataNode::GetName(), and m_DataNodes.
{
if(index.isValid())
{
switch ( role )
{
case Qt::DisplayRole:
{
const mitk::DataNode* node = m_DataNodes.at(index.row());
std::string name = node->GetName();
return QVariant(QString::fromStdString(name));
}
break;
}
} // index.isValid()
return QVariant();
}
| Qt::ItemFlags QmitkDataStorageListModel::flags | ( | const QModelIndex & | index ) | const |
Definition at line 88 of file QmitkDataStorageListModel.cpp.
{
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
| std::vector< mitk::DataNode * > QmitkDataStorageListModel::GetDataNodes | ( | ) | const |
Definition at line 123 of file QmitkDataStorageListModel.cpp.
References m_DataNodes.
{
return m_DataNodes;
}
| mitk::DataStorage::Pointer QmitkDataStorageListModel::GetDataStorage | ( | ) | const |
Definition at line 128 of file QmitkDataStorageListModel.cpp.
References m_DataStorage.
{
return m_DataStorage;
}
| mitk::DataNode::Pointer QmitkDataStorageListModel::getNode | ( | const QModelIndex & | index ) | const |
Definition at line 264 of file QmitkDataStorageListModel.cpp.
References m_DataNodes.
{
mitk::DataNode::Pointer node;
if(index.isValid())
{
node = m_DataNodes.at(index.row());
}
return node;
}| mitk::NodePredicateBase * QmitkDataStorageListModel::GetPredicate | ( | ) | const |
Definition at line 141 of file QmitkDataStorageListModel.cpp.
References m_NodePredicate.
{
return m_NodePredicate;
}
| QVariant QmitkDataStorageListModel::headerData | ( | int | section, |
| Qt::Orientation | orientation, | ||
| int | role = Qt::DisplayRole |
||
| ) | const |
Definition at line 113 of file QmitkDataStorageListModel.cpp.
{
return QVariant("Nodes");
}
| void QmitkDataStorageListModel::NodeAdded | ( | const mitk::DataNode * | node ) | [virtual] |
Called when a DataStorage Add Event was thrown. May be reimplemented by deriving classes.
Definition at line 186 of file QmitkDataStorageListModel.cpp.
References m_BlockEvents, m_DataNodes, and m_NodePredicate.
Referenced by SetDataStorage().
{
// garantuee no recursions when a new node event is thrown
if(!m_BlockEvents)
{
m_BlockEvents = true;
// check if node should be added to the model
bool addNode = true;
if(m_NodePredicate && !m_NodePredicate->CheckNode(node))
addNode = false;
if(addNode)
{
beginInsertRows(QModelIndex(), m_DataNodes.size(), m_DataNodes.size());
//reset();
m_DataNodes.push_back(const_cast<mitk::DataNode*>(node));
endInsertRows();
}
m_BlockEvents = false;
}
}
| void QmitkDataStorageListModel::NodeRemoved | ( | const mitk::DataNode * | node ) | [virtual] |
Called when a DataStorage Remove Event was thrown. May be reimplemented by deriving classes.
Definition at line 210 of file QmitkDataStorageListModel.cpp.
References m_BlockEvents, and m_DataNodes.
Referenced by SetDataStorage().
{
// garantuee no recursions when a new node event is thrown
if(!m_BlockEvents)
{
m_BlockEvents = true;
int row = -1;
//bool removeNode = false;
// check if node is contained in current list, if yes: reset model
for (std::vector<mitk::DataNode*>::const_iterator nodeIt = m_DataNodes.begin()
; nodeIt != m_DataNodes.end(); nodeIt++) // for each node
{
row++;
if( (*nodeIt) == node )
{
// node found, remove it
beginRemoveRows(QModelIndex(), row, row);
m_DataNodes.erase(std::find(m_DataNodes.begin(), m_DataNodes.end(), (*nodeIt)));
endRemoveRows();
break;
}
}
m_BlockEvents = false;
}
}
| void QmitkDataStorageListModel::OnDelete | ( | const itk::Object * | caller, |
| const itk::EventObject & | event | ||
| ) | [virtual] |
Called when a itk::Object that is hold as a member variable is about to be deleted in order to react to it.
Definition at line 252 of file QmitkDataStorageListModel.cpp.
References m_BlockEvents, and SetDataStorage().
Referenced by SetDataStorage().
{
if(m_BlockEvents) return;
const mitk::DataStorage* dataStorage = dynamic_cast<const mitk::DataStorage*>(caller);
if(dataStorage)
{
// set datastorage to 0 -> empty model
this->SetDataStorage(0);
}
}
| void QmitkDataStorageListModel::OnModified | ( | const itk::Object * | caller, |
| const itk::EventObject & | event | ||
| ) | [virtual] |
Called when a itk::Object that is hold as a member variable was modified in order to react to it.
Definition at line 238 of file QmitkDataStorageListModel.cpp.
References QuadProgPP::distance(), m_BlockEvents, and m_DataNodes.
Referenced by reset().
{
if(m_BlockEvents) return;
const mitk::DataNode* modifiedNode = dynamic_cast<const mitk::DataNode*>(caller);
if(modifiedNode)
{
int row = std::distance(std::find(m_DataNodes.begin(), m_DataNodes.end(), modifiedNode), m_DataNodes.end());
QModelIndex indexOfChangedProperty = index(row, 1);
emit dataChanged(indexOfChangedProperty, indexOfChangedProperty);
}
}
| void QmitkDataStorageListModel::reset | ( | ) | [protected] |
Resets the whole model. Get all nodes matching the predicate from the data storage.
Definition at line 146 of file QmitkDataStorageListModel.cpp.
References mitk::DataStorage::GetAll(), mitk::DataStorage::GetSubset(), m_DataNodes, m_DataNodesModifiedObserversTags, m_DataStorage, m_NodePredicate, and OnModified().
Referenced by SetDataStorage(), and SetPredicate().
{
if(m_DataStorage != 0)
{
mitk::DataStorage::SetOfObjects::ConstPointer setOfObjects;
if (m_NodePredicate)
setOfObjects = m_DataStorage->GetSubset(m_NodePredicate);
else
setOfObjects = m_DataStorage->GetAll();
// remove all observes
unsigned int i = 0;
for(std::vector<mitk::DataNode*>::iterator it=m_DataNodes.begin()
; it!=m_DataNodes.end()
; ++it, ++i)
{
(*it)->RemoveObserver(m_DataNodesModifiedObserversTags[i]);
}
// clear vector with nodes
m_DataNodesModifiedObserversTags.clear();
m_DataNodes.clear();
itk::MemberCommand<QmitkDataStorageListModel>::Pointer modifiedCommand;
// copy all selected nodes the vector
for (mitk::DataStorage::SetOfObjects::ConstIterator nodeIt = setOfObjects->Begin()
; nodeIt != setOfObjects->End(); ++nodeIt, ++i) // for each node
{
// add modified observer
modifiedCommand = itk::MemberCommand<QmitkDataStorageListModel>::New();
modifiedCommand->SetCallbackFunction(this, &QmitkDataStorageListModel::OnModified);
m_DataNodesModifiedObserversTags.push_back( m_DataStorage->AddObserver(itk::ModifiedEvent(), modifiedCommand) );
m_DataNodes.push_back( nodeIt.Value().GetPointer());
} // for
} // m_DataStorage != 0
} // reset()
| int QmitkDataStorageListModel::rowCount | ( | const QModelIndex & | parent = QModelIndex() ) |
const |
Definition at line 118 of file QmitkDataStorageListModel.cpp.
References m_DataNodes.
{
return m_DataNodes.size();
}
| void QmitkDataStorageListModel::SetDataStorage | ( | mitk::DataStorage::Pointer | dataStorage ) |
Definition at line 44 of file QmitkDataStorageListModel.cpp.
References mitk::DataStorage::AddNodeEvent, m_DataStorage, m_DataStorageDeleteObserverTag, NodeAdded(), NodeRemoved(), OnDelete(), mitk::DataStorage::RemoveNodeEvent, and reset().
Referenced by OnDelete(), QmitkDataStorageListModel(), and ~QmitkDataStorageListModel().
{
if( m_DataStorage != dataStorage)
{
// remove old listeners
if(m_DataStorage != 0)
{
this->m_DataStorage->AddNodeEvent.RemoveListener( mitk::MessageDelegate1<QmitkDataStorageListModel
, const mitk::DataNode*>( this, &QmitkDataStorageListModel::NodeAdded ) );
this->m_DataStorage->RemoveNodeEvent.RemoveListener( mitk::MessageDelegate1<QmitkDataStorageListModel
, const mitk::DataNode*>( this, &QmitkDataStorageListModel::NodeRemoved ) );
// remove delete observer
m_DataStorage->RemoveObserver(m_DataStorageDeleteObserverTag);
// this is good coding style ! reset variables whenever they are not used anymore.
m_DataStorageDeleteObserverTag = 0;
}
m_DataStorage = dataStorage;
// remove event listeners
if(m_DataStorage != 0)
{
// subscribe for node added/removed events
this->m_DataStorage->AddNodeEvent.AddListener( mitk::MessageDelegate1<QmitkDataStorageListModel
, const mitk::DataNode*>( this, &QmitkDataStorageListModel::NodeAdded ) );
this->m_DataStorage->RemoveNodeEvent.AddListener( mitk::MessageDelegate1<QmitkDataStorageListModel
, const mitk::DataNode*>( this, &QmitkDataStorageListModel::NodeRemoved ) );
// add itk delete listener on datastorage
itk::MemberCommand<QmitkDataStorageListModel>::Pointer deleteCommand =
itk::MemberCommand<QmitkDataStorageListModel>::New();
deleteCommand->SetCallbackFunction(this, &QmitkDataStorageListModel::OnDelete);
// add observer
m_DataStorageDeleteObserverTag = m_DataStorage->AddObserver(itk::DeleteEvent(), deleteCommand);
}
// reset model
reset();
}
}
| void QmitkDataStorageListModel::SetPredicate | ( | mitk::NodePredicateBase * | pred ) |
Definition at line 134 of file QmitkDataStorageListModel.cpp.
References m_NodePredicate, and reset().
Referenced by QmitkDataStorageListModel().
{
m_NodePredicate = pred;
reset();
QAbstractListModel::reset();
}
bool QmitkDataStorageListModel::m_BlockEvents [protected] |
Saves if this model is currently working on events to prevent endless event loops.
Definition at line 122 of file QmitkDataStorageListModel.h.
Referenced by NodeAdded(), NodeRemoved(), OnDelete(), and OnModified().
std::vector<mitk::DataNode*> QmitkDataStorageListModel::m_DataNodes [protected] |
Holds all selected Nodes. Dont hold smart pointer as we are in a GUI class.
Definition at line 112 of file QmitkDataStorageListModel.h.
Referenced by data(), GetDataNodes(), getNode(), NodeAdded(), NodeRemoved(), OnModified(), reset(), and rowCount().
std::vector<unsigned long> QmitkDataStorageListModel::m_DataNodesModifiedObserversTags [protected] |
Holds the tags of the node-modified observers.
Definition at line 117 of file QmitkDataStorageListModel.h.
Referenced by reset().
Pointer to the DataStorage from which the nodes are selected (remember: in BlueBerry there might be more than one DataStorage).
Definition at line 102 of file QmitkDataStorageListModel.h.
Referenced by GetDataStorage(), reset(), and SetDataStorage().
unsigned long QmitkDataStorageListModel::m_DataStorageDeleteObserverTag [protected] |
Holds the tag of the datastorage-delete observer.
Definition at line 107 of file QmitkDataStorageListModel.h.
Referenced by SetDataStorage().
Holds the predicate that defines this SubSet of Nodes. If m_Predicate is NULL all Nodes will be selected. *Attention: this class owns the predicate and deletes it*
Definition at line 96 of file QmitkDataStorageListModel.h.
Referenced by GetPredicate(), NodeAdded(), reset(), SetPredicate(), and ~QmitkDataStorageListModel().
1.7.2