Own includes. More...
#include <QmitkDataStorageTableModel.h>


Classes | |
| struct | DataNodeCompareFunction |
| A struct that inherits from std::binary_function. You can use it in std::sort algorithm for sorting the node list elements. More... | |
Public Member Functions | |
| QmitkDataStorageTableModel (mitk::DataStorage::Pointer _DataStorage, mitk::NodePredicateBase *_Predicate=0, QObject *parent=0) | |
| virtual | ~QmitkDataStorageTableModel () |
| const mitk::DataStorage::Pointer | GetDataStorage () const |
| mitk::NodePredicateBase::Pointer | GetPredicate () const |
| mitk::DataNode::Pointer | GetNode (const QModelIndex &index) const |
| virtual QVariant | headerData (int section, Qt::Orientation orientation, int role) const |
| virtual Qt::ItemFlags | flags (const QModelIndex &index) const |
| virtual int | rowCount (const QModelIndex &parent) const |
| virtual int | columnCount (const QModelIndex &parent) const |
| virtual QVariant | data (const QModelIndex &index, int role) const |
| void | SetDataStorage (mitk::DataStorage::Pointer _DataStorage) |
| void | SetPredicate (mitk::NodePredicateBase *_Predicate) |
| virtual void | AddNode (const mitk::DataNode *node) |
| virtual void | RemoveNode (const mitk::DataNode *node) |
| virtual std::vector < mitk::DataNode * > | GetNodeSet () const |
| virtual void | PropertyModified (const itk::Object *caller, const itk::EventObject &event) |
| Called when a single property was changed. The function searches through the list of nodes in this model for the changed property. If the property was found a dataChanged signal is emitted forcing all observing views to request the data again. | |
| bool | setData (const QModelIndex &index, const QVariant &value, int role) |
| void | sort (int column, Qt::SortOrder order=Qt::AscendingOrder) |
| Reimplemented sort function from QAbstractTableModel to enable sorting on the table. | |
Protected Member Functions | |
| virtual void | Reset () |
Protected Attributes | |
| mitk::WeakPointer < mitk::DataStorage > | m_DataStorage |
| mitk::NodePredicateBase::Pointer | m_Predicate |
| std::vector< mitk::DataNode * > | m_NodeSet |
| std::map< mitk::BaseProperty *, unsigned long > | m_NamePropertyModifiedObserverTags |
| Maps a property to an observer tag. | |
| std::map< mitk::BaseProperty *, unsigned long > | m_VisiblePropertyModifiedObserverTags |
| Maps a property to an observer tag. | |
| bool | m_BlockEvents |
| bool | m_SortDescending |
| The property is true when the property list is sorted in descending order. | |
Own includes.
Toolkit includes. Forward declarations.
A table model for a set of DataNodes defined by a predicate. make columns interchangeable, select which properties to show as columns
Definition at line 38 of file QmitkDataStorageTableModel.h.
| QmitkDataStorageTableModel::QmitkDataStorageTableModel | ( | mitk::DataStorage::Pointer | _DataStorage, |
| mitk::NodePredicateBase * | _Predicate = 0, |
||
| QObject * | parent = 0 |
||
| ) |
Constructs a new QmitkDataStorageTableModel and sets a predicate that defines this list.
Definition at line 33 of file QmitkDataStorageTableModel.cpp.
References SetDataStorage(), and SetPredicate().
: QAbstractTableModel(parent) , m_DataStorage(0) , m_Predicate(0) , m_BlockEvents(false) , m_SortDescending(false) { this->SetPredicate(_Predicate); this->SetDataStorage(_DataStorage); }
| QmitkDataStorageTableModel::~QmitkDataStorageTableModel | ( | ) | [virtual] |
Standard dtor. Delete predicate, disconnect from DataStorage.
Definition at line 46 of file QmitkDataStorageTableModel.cpp.
References SetDataStorage().
{
// set data storage 0 to remove event listeners
this->SetDataStorage(0);
}
| void QmitkDataStorageTableModel::AddNode | ( | const mitk::DataNode * | node ) | [virtual] |
Adds a node to this model. There are two constraints for nodes in this model: 1. If a predicate is set (not null) the node will be checked against it. 2. The node has to have a data object (no one wants to see empty nodes). Also adds event listeners to the node.
Definition at line 238 of file QmitkDataStorageTableModel.cpp.
References mitk::DataNode::GetData(), mitk::DataNode::GetProperty(), m_BlockEvents, m_NamePropertyModifiedObserverTags, m_NodeSet, m_Predicate, m_VisiblePropertyModifiedObserverTags, and PropertyModified().
Referenced by Reset(), and SetDataStorage().
{
// garantuee no recursions when a new node event is thrown
if(!m_BlockEvents)
{
// if we have a predicate, check node against predicate first
if(m_Predicate.IsNotNull() && !m_Predicate->CheckNode(node))
return;
// dont add nodes without data (formerly known as helper objects)
if(node->GetData() == 0)
return;
// create listener commands to listen to changes in the name or the visibility of the node
itk::MemberCommand<QmitkDataStorageTableModel>::Pointer propertyModifiedCommand
= itk::MemberCommand<QmitkDataStorageTableModel>::New();
propertyModifiedCommand->SetCallbackFunction(this, &QmitkDataStorageTableModel::PropertyModified);
mitk::BaseProperty* tempProperty = 0;
// add listener for properties
tempProperty = node->GetProperty("visible");
if(tempProperty)
m_VisiblePropertyModifiedObserverTags[tempProperty]
= tempProperty->AddObserver(itk::ModifiedEvent(), propertyModifiedCommand);
tempProperty = node->GetProperty("name");
if(tempProperty)
m_NamePropertyModifiedObserverTags[tempProperty]
= tempProperty->AddObserver(itk::ModifiedEvent(), propertyModifiedCommand);
// emit beginInsertRows event
beginInsertRows(QModelIndex(), m_NodeSet.size(), m_NodeSet.size());
// add node
m_NodeSet.push_back(const_cast<mitk::DataNode*>(node));
// emit endInsertRows event
endInsertRows();
}
}
| int QmitkDataStorageTableModel::columnCount | ( | const QModelIndex & | parent ) | const [virtual] |
Overridden from QAbstractTableModel. Returns the number of features (columns) to display.
Reimplemented in QmitkPlanarFiguresTableModel.
Definition at line 126 of file QmitkDataStorageTableModel.cpp.
{
// show name, type and visible columnn
int columns = 3;
return columns;
}
| QVariant QmitkDataStorageTableModel::data | ( | const QModelIndex & | index, |
| int | role | ||
| ) | const [virtual] |
Overridden from QAbstractTableModel. Returns the data at index for given role.
Reimplemented in QmitkPlanarFiguresTableModel.
Definition at line 133 of file QmitkDataStorageTableModel.cpp.
References QmitkNodeDescriptor::GetClassName(), QmitkNodeDescriptorManager::GetDescriptor(), QmitkNodeDescriptor::GetIcon(), QmitkNodeDescriptorManager::GetInstance(), m_NodeSet, and QmitkDataNodeRole.
{
QVariant data;
if (index.isValid() && !m_NodeSet.empty())
{
mitk::DataNode::Pointer node = m_NodeSet.at(index.row());
std::string nodeName = node->GetName();
if(nodeName.empty())
nodeName = "unnamed";
// get name
if(index.column() == 0)
{
// get name of node (may also be edited)
if (role == Qt::DisplayRole || role == Qt::EditRole)
{
data = nodeName.c_str();
}
else if (role == QmitkDataNodeRole)
{
data = QVariant::fromValue(node);
}
}
else if (index.column() == 1)
{
QmitkNodeDescriptor* nodeDescriptor
= QmitkNodeDescriptorManager::GetInstance()->GetDescriptor(node);
// get type property of mitk::BaseData
if (role == Qt::DisplayRole)
{
data = nodeDescriptor->GetClassName();
}
// show some nice icons for datatype
else if(role == Qt::DecorationRole)
{
data = nodeDescriptor->GetIcon();
}
}
else if (index.column() == 2)
{
// get visible property of mitk::BaseData
bool visibility = false;
if(node->GetVisibility(visibility, 0) && role == Qt::CheckStateRole)
{
data = (visibility ? Qt::Checked : Qt::Unchecked);
} // node->GetVisibility(visibility, 0) && role == Qt::CheckStateRole
} // index.column() == 2
} // index.isValid() && !m_NodeSet.empty()
return data;
}
| Qt::ItemFlags QmitkDataStorageTableModel::flags | ( | const QModelIndex & | index ) | const [virtual] |
Overridden from QAbstractTableModel. Returns what can be done with an item.
Reimplemented in QmitkPlanarFiguresTableModel.
Definition at line 104 of file QmitkDataStorageTableModel.cpp.
{
Qt::ItemFlags flags = QAbstractItemModel::flags(index);
// name & visibility is editable
if (index.column() == 0)
{
flags |= Qt::ItemIsEditable;
}
else if (index.column() == 2)
{
flags |= Qt::ItemIsUserCheckable;
}
return flags;
}
| const mitk::DataStorage::Pointer QmitkDataStorageTableModel::GetDataStorage | ( | ) | const |
Get the DataStorage.
Definition at line 53 of file QmitkDataStorageTableModel.cpp.
References mitk::WeakPointer< TObjectType >::GetPointer(), and m_DataStorage.
{
return m_DataStorage.GetPointer();
}
| mitk::DataNode::Pointer QmitkDataStorageTableModel::GetNode | ( | const QModelIndex & | index ) | const |
Get node at a specific model index. Another way to implement this, is by introducing a new role like "DateTreeNode" and capture that in the data function.
Definition at line 63 of file QmitkDataStorageTableModel.cpp.
References m_NodeSet.
{
mitk::DataNode::Pointer node;
if(index.isValid())
{
node = m_NodeSet.at(index.row());
}
return node;
}
| std::vector< mitk::DataNode * > QmitkDataStorageTableModel::GetNodeSet | ( | ) | const [virtual] |
Returns a copy of the node-vector that is shown by this model
Definition at line 476 of file QmitkDataStorageTableModel.cpp.
References m_NodeSet.
{
return m_NodeSet;
}
| mitk::NodePredicateBase::Pointer QmitkDataStorageTableModel::GetPredicate | ( | ) | const |
Get the predicate.
Definition at line 58 of file QmitkDataStorageTableModel.cpp.
References m_Predicate.
{
return m_Predicate;
}
| QVariant QmitkDataStorageTableModel::headerData | ( | int | section, |
| Qt::Orientation | orientation, | ||
| int | role | ||
| ) | const [virtual] |
Overridden from QAbstractTableModel. Returns the header data at section for given orientation and role.
Reimplemented in QmitkPlanarFiguresTableModel.
Definition at line 76 of file QmitkDataStorageTableModel.cpp.
{
QVariant headerData;
// show only horizontal header
if ( role == Qt::DisplayRole )
{
if( orientation == Qt::Horizontal )
{
// first column: "Name"
if(section == 0)
headerData = "Name";
else if(section == 1)
headerData = "Data Type";
else if(section == 2)
headerData = "Visibility";
}
else if( orientation == Qt::Vertical )
{
// show numbers for rows
headerData = section+1;
}
}
return headerData;
}
| void QmitkDataStorageTableModel::PropertyModified | ( | const itk::Object * | caller, |
| const itk::EventObject & | event | ||
| ) | [virtual] |
Called when a single property was changed. The function searches through the list of nodes in this model for the changed property. If the property was found a dataChanged signal is emitted forcing all observing views to request the data again.
Definition at line 320 of file QmitkDataStorageTableModel.cpp.
References QuadProgPP::distance(), m_BlockEvents, and m_NodeSet.
Referenced by AddNode().
{
if(!m_BlockEvents)
{
// get modified property
const mitk::BaseProperty* modifiedProperty = dynamic_cast<const mitk::BaseProperty*>(caller);
if(modifiedProperty)
{
// find node that holds the modified property
int row = -1;
int column = -1;
std::vector<mitk::DataNode*>::iterator it;
mitk::BaseProperty* visibilityProperty = 0;
mitk::BaseProperty* nameProperty = 0;
// search for property that changed and emit datachanged on the corresponding ModelIndex
for(it=m_NodeSet.begin(); it!=m_NodeSet.end(); it++)
{
// check for the visible property or the name property
visibilityProperty = (*it)->GetProperty("visible");
if(modifiedProperty == visibilityProperty)
{
column = 2;
break;
}
nameProperty = (*it)->GetProperty("name");
if(modifiedProperty == nameProperty)
{
column = 0;
break;
}
}
// if we have the property we have a valid iterator
if( it != m_NodeSet.end() )
row = std::distance(m_NodeSet.begin(), it);
// now emit the dataChanged signal
QModelIndex indexOfChangedProperty = index(row, column);
emit dataChanged(indexOfChangedProperty, indexOfChangedProperty);
}
}
}
| void QmitkDataStorageTableModel::RemoveNode | ( | const mitk::DataNode * | node ) | [virtual] |
Removes a node from this model. Also removes any event listener from the node.
Definition at line 280 of file QmitkDataStorageTableModel.cpp.
References QuadProgPP::distance(), m_BlockEvents, m_NamePropertyModifiedObserverTags, m_NodeSet, and m_VisiblePropertyModifiedObserverTags.
Referenced by Reset(), and SetDataStorage().
{
// garantuee no recursions when a new node event is thrown
if(!m_BlockEvents)
{
// find corresponding node
std::vector<mitk::DataNode*>::iterator nodeIt
= std::find(m_NodeSet.begin(), m_NodeSet.end(), node);
if(nodeIt != m_NodeSet.end())
{
// now: remove listeners for name property ...
mitk::BaseProperty* tempProperty = 0;
tempProperty = (*nodeIt)->GetProperty("visible");
if(tempProperty)
tempProperty->RemoveObserver(m_VisiblePropertyModifiedObserverTags[tempProperty]);
m_VisiblePropertyModifiedObserverTags.erase(tempProperty);
// ... and visibility property
tempProperty = (*nodeIt)->GetProperty("name");
if(tempProperty)
tempProperty->RemoveObserver(m_NamePropertyModifiedObserverTags[tempProperty]);
m_NamePropertyModifiedObserverTags.erase(tempProperty);
// get an index from iterator
int row = std::distance(m_NodeSet.begin(), nodeIt);
// emit beginRemoveRows event (QModelIndex is empty because we dont have a tree model)
this->beginRemoveRows(QModelIndex(), row, row);
// remove node
m_NodeSet.erase(nodeIt);
// emit endRemoveRows event
endRemoveRows();
}
}
}
| void QmitkDataStorageTableModel::Reset | ( | ) | [protected, virtual] |
Called when DataStorage or Predicate changed. Resets whole model and reads all nodes in again.
Definition at line 401 of file QmitkDataStorageTableModel.cpp.
References AddNode(), mitk::WeakPointer< TObjectType >::IsNotNull(), m_DataStorage, m_NamePropertyModifiedObserverTags, m_NodeSet, m_Predicate, m_VisiblePropertyModifiedObserverTags, and RemoveNode().
Referenced by SetDataStorage(), and SetPredicate().
{
mitk::DataStorage::SetOfObjects::ConstPointer _NodeSet;
// remove all nodes now (dont use iterators because removing elements
// would invalidate the iterator)
// start at the last element: first in, last out
unsigned int i = m_NodeSet.size();
while(!m_NodeSet.empty())
{
--i;
this->RemoveNode(m_NodeSet.at(i));
}
// normally now everything should be empty->just to be sure
// erase all arrays again
m_NamePropertyModifiedObserverTags.clear();
m_VisiblePropertyModifiedObserverTags.clear();
m_NodeSet.clear();
// the whole reset depends on the fact if a data storage is set or not
if(m_DataStorage.IsNotNull())
{
if(m_Predicate.IsNotNull())
// get subset
_NodeSet = m_DataStorage->GetSubset(m_Predicate);
// if predicate is NULL, select all nodes
else
{
_NodeSet = m_DataStorage->GetAll();
// remove ghost root node
}
// finally add all nodes to the model
for(mitk::DataStorage::SetOfObjects::const_iterator it=_NodeSet->begin(); it!=_NodeSet->end()
; it++)
{
// save node
this->AddNode(*it);
}
}
}
| int QmitkDataStorageTableModel::rowCount | ( | const QModelIndex & | parent ) | const [virtual] |
Overridden from QAbstractTableModel. Returns the node count.
Definition at line 121 of file QmitkDataStorageTableModel.cpp.
References m_NodeSet.
{
return m_NodeSet.size();
}
| bool QmitkDataStorageTableModel::setData | ( | const QModelIndex & | index, |
| const QVariant & | value, | ||
| int | role | ||
| ) |
Overridden from QAbstractTableModel. Sets data at index for given role.
Definition at line 367 of file QmitkDataStorageTableModel.cpp.
References mitk::RenderingManager::GetInstance(), m_BlockEvents, and m_NodeSet.
{
bool noErr = false;
if (index.isValid() && (role == Qt::EditRole || role == Qt::CheckStateRole))
{
// any change events produced here should not be caught in this class
// --> set m_BlockEvents to true
m_BlockEvents = true;
mitk::DataNode::Pointer node = m_NodeSet.at(index.row());
if(index.column() == 0)
{
node->SetStringProperty("name", value.toString().toStdString().c_str());
}
else if(index.column() == 2)
{
node->SetBoolProperty("visible", (value.toInt() == Qt::Checked ? true : false));
mitk::RenderingManager::GetInstance()->RequestUpdateAll();
}
// inform listeners about changes
emit dataChanged(index, index);
m_BlockEvents = false;
noErr = true;
}
return noErr;
}
| void QmitkDataStorageTableModel::SetDataStorage | ( | mitk::DataStorage::Pointer | _DataStorage ) |
Sets the DataStorage.
Definition at line 203 of file QmitkDataStorageTableModel.cpp.
References AddNode(), mitk::WeakPointer< TObjectType >::GetPointer(), m_DataStorage, RemoveNode(), and Reset().
Referenced by QmitkDataStorageTableModel(), and ~QmitkDataStorageTableModel().
{
// only proceed if we have a new datastorage
if(m_DataStorage.GetPointer() != _DataStorage.GetPointer())
{
// if a data storage was set before remove old event listeners
if(m_DataStorage != 0)
{
this->m_DataStorage->AddNodeEvent.RemoveListener( mitk::MessageDelegate1<QmitkDataStorageTableModel
, const mitk::DataNode*>( this, &QmitkDataStorageTableModel::AddNode ) );
this->m_DataStorage->RemoveNodeEvent.RemoveListener( mitk::MessageDelegate1<QmitkDataStorageTableModel
, const mitk::DataNode*>( this, &QmitkDataStorageTableModel::RemoveNode ) );
}
// set new data storage
m_DataStorage = _DataStorage.GetPointer();
// if new storage is not 0 subscribe for events
if(m_DataStorage != 0)
{
// subscribe for node added/removed events
this->m_DataStorage->AddNodeEvent.AddListener( mitk::MessageDelegate1<QmitkDataStorageTableModel
, const mitk::DataNode*>( this, &QmitkDataStorageTableModel::AddNode ) );
this->m_DataStorage->RemoveNodeEvent.AddListener( mitk::MessageDelegate1<QmitkDataStorageTableModel
, const mitk::DataNode*>( this, &QmitkDataStorageTableModel::RemoveNode ) );
}
// Reset model (even if datastorage is 0->will be checked in Reset())
this->Reset();
}
}
| void QmitkDataStorageTableModel::SetPredicate | ( | mitk::NodePredicateBase * | _Predicate ) |
Sets the predicate. QmitkDataStorageTableModel is owner of the predicate!
Definition at line 193 of file QmitkDataStorageTableModel.cpp.
References m_Predicate, and Reset().
Referenced by QmitkDataStorageTableModel().
{
// ensure that a new predicate is set in order to avoid unnecessary changed events
if(m_Predicate != _Predicate)
{
m_Predicate = _Predicate;
this->Reset();
}
}
| void QmitkDataStorageTableModel::sort | ( | int | column, |
| Qt::SortOrder | order = Qt::AscendingOrder |
||
| ) |
Reimplemented sort function from QAbstractTableModel to enable sorting on the table.
Definition at line 445 of file QmitkDataStorageTableModel.cpp.
References QmitkDataStorageTableModel::DataNodeCompareFunction::CompareByClassName, QmitkDataStorageTableModel::DataNodeCompareFunction::CompareByName, QmitkDataStorageTableModel::DataNodeCompareFunction::CompareByVisibility, QmitkDataStorageTableModel::DataNodeCompareFunction::Greater, QmitkDataStorageTableModel::DataNodeCompareFunction::Less, and m_NodeSet.
{
bool sortDescending = (order == Qt::DescendingOrder) ? true: false;
// do not sort twice !!! (dont know why, but qt calls this func twice. STUPID!)
/*
if(sortDescending != m_SortDescending)
{*/
//m_SortDescending = sortDescending;
DataNodeCompareFunction::CompareCriteria _CompareCriteria
= DataNodeCompareFunction::CompareByName;
DataNodeCompareFunction::CompareOperator _CompareOperator
= sortDescending ? DataNodeCompareFunction::Greater: DataNodeCompareFunction::Less;
if(column == 1)
_CompareCriteria = DataNodeCompareFunction::CompareByClassName;
else if(column == 2)
_CompareCriteria = DataNodeCompareFunction::CompareByVisibility;
DataNodeCompareFunction compareFunc(_CompareCriteria, _CompareOperator);
std::sort(m_NodeSet.begin(), m_NodeSet.end(), compareFunc);
QAbstractTableModel::reset();
//}
}
bool QmitkDataStorageTableModel::m_BlockEvents [protected] |
Saves if this model is currently working on events to prevent endless event loops.
Definition at line 218 of file QmitkDataStorageTableModel.h.
Referenced by AddNode(), PropertyModified(), RemoveNode(), and setData().
Pointer to the DataStorage from which the nodes are selected (remember: in BlueBerry there might be more than one DataStorage). Store it in a weak pointer. This is a GUI class which should not hold a strong reference to any non-GUI Object.
Definition at line 197 of file QmitkDataStorageTableModel.h.
Referenced by GetDataStorage(), Reset(), and SetDataStorage().
std::map<mitk::BaseProperty*, unsigned long> QmitkDataStorageTableModel::m_NamePropertyModifiedObserverTags [protected] |
Maps a property to an observer tag.
Definition at line 210 of file QmitkDataStorageTableModel.h.
Referenced by AddNode(), RemoveNode(), and Reset().
std::vector<mitk::DataNode*> QmitkDataStorageTableModel::m_NodeSet [protected] |
Holds all selected Nodes.
Definition at line 206 of file QmitkDataStorageTableModel.h.
Referenced by AddNode(), QmitkPlanarFiguresTableModel::data(), data(), GetNode(), GetNodeSet(), PropertyModified(), RemoveNode(), Reset(), rowCount(), setData(), and sort().
Holds the predicate that defines this SubSet of Nodes. If m_Predicate is NULL all Nodes will be selected.
Definition at line 202 of file QmitkDataStorageTableModel.h.
Referenced by AddNode(), GetPredicate(), Reset(), and SetPredicate().
bool QmitkDataStorageTableModel::m_SortDescending [protected] |
The property is true when the property list is sorted in descending order.
Definition at line 222 of file QmitkDataStorageTableModel.h.
std::map<mitk::BaseProperty*, unsigned long> QmitkDataStorageTableModel::m_VisiblePropertyModifiedObserverTags [protected] |
Maps a property to an observer tag.
Definition at line 214 of file QmitkDataStorageTableModel.h.
Referenced by AddNode(), RemoveNode(), and Reset().
1.7.2