Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkDataStorageListModel.h"
00019
00020
00021
00022 #include "mitkStringProperty.h"
00023
00024
00025
00026 #include "itkCommand.h"
00027
00028 QmitkDataStorageListModel::QmitkDataStorageListModel(mitk::DataStorage::Pointer dataStorage
00029 , mitk::NodePredicateBase* pred, QObject* parent)
00030 : QAbstractListModel(parent), m_NodePredicate(0), m_DataStorage(0), m_BlockEvents(false)
00031 {
00032 this->SetPredicate(pred);
00033 this->SetDataStorage(dataStorage);
00034 }
00035
00036 QmitkDataStorageListModel::~QmitkDataStorageListModel()
00037 {
00038
00039 this->SetDataStorage(0);
00040
00041 if (m_NodePredicate) delete m_NodePredicate;
00042 }
00043
00044 void QmitkDataStorageListModel::SetDataStorage(mitk::DataStorage::Pointer dataStorage)
00045 {
00046 if( m_DataStorage != dataStorage)
00047 {
00048
00049 if(m_DataStorage != 0)
00050 {
00051 this->m_DataStorage->AddNodeEvent.RemoveListener( mitk::MessageDelegate1<QmitkDataStorageListModel
00052 , const mitk::DataNode*>( this, &QmitkDataStorageListModel::NodeAdded ) );
00053
00054 this->m_DataStorage->RemoveNodeEvent.RemoveListener( mitk::MessageDelegate1<QmitkDataStorageListModel
00055 , const mitk::DataNode*>( this, &QmitkDataStorageListModel::NodeRemoved ) );
00056
00057
00058 m_DataStorage->RemoveObserver(m_DataStorageDeleteObserverTag);
00059
00060 m_DataStorageDeleteObserverTag = 0;
00061 }
00062
00063 m_DataStorage = dataStorage;
00064
00065
00066 if(m_DataStorage != 0)
00067 {
00068
00069 this->m_DataStorage->AddNodeEvent.AddListener( mitk::MessageDelegate1<QmitkDataStorageListModel
00070 , const mitk::DataNode*>( this, &QmitkDataStorageListModel::NodeAdded ) );
00071
00072 this->m_DataStorage->RemoveNodeEvent.AddListener( mitk::MessageDelegate1<QmitkDataStorageListModel
00073 , const mitk::DataNode*>( this, &QmitkDataStorageListModel::NodeRemoved ) );
00074
00075
00076 itk::MemberCommand<QmitkDataStorageListModel>::Pointer deleteCommand =
00077 itk::MemberCommand<QmitkDataStorageListModel>::New();
00078 deleteCommand->SetCallbackFunction(this, &QmitkDataStorageListModel::OnDelete);
00079
00080 m_DataStorageDeleteObserverTag = m_DataStorage->AddObserver(itk::DeleteEvent(), deleteCommand);
00081 }
00082
00083
00084 reset();
00085 }
00086 }
00087
00088 Qt::ItemFlags QmitkDataStorageListModel::flags(const QModelIndex&) const
00089 {
00090 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
00091 }
00092
00093 QVariant QmitkDataStorageListModel::data(const QModelIndex& index, int role) const
00094 {
00095 if(index.isValid())
00096 {
00097 switch ( role )
00098 {
00099 case Qt::DisplayRole:
00100 {
00101 const mitk::DataNode* node = m_DataNodes.at(index.row());
00102 std::string name = node->GetName();
00103 return QVariant(QString::fromStdString(name));
00104 }
00105 break;
00106
00107 }
00108 }
00109
00110 return QVariant();
00111 }
00112
00113 QVariant QmitkDataStorageListModel::headerData(int , Qt::Orientation , int ) const
00114 {
00115 return QVariant("Nodes");
00116 }
00117
00118 int QmitkDataStorageListModel::rowCount(const QModelIndex& ) const
00119 {
00120 return m_DataNodes.size();
00121 }
00122
00123 std::vector<mitk::DataNode*> QmitkDataStorageListModel::GetDataNodes() const
00124 {
00125 return m_DataNodes;
00126 }
00127
00128 mitk::DataStorage::Pointer QmitkDataStorageListModel::GetDataStorage() const
00129 {
00130 return m_DataStorage;
00131 }
00132
00133
00134 void QmitkDataStorageListModel::SetPredicate(mitk::NodePredicateBase* pred)
00135 {
00136 m_NodePredicate = pred;
00137 reset();
00138 QAbstractListModel::reset();
00139 }
00140
00141 mitk::NodePredicateBase* QmitkDataStorageListModel::GetPredicate() const
00142 {
00143 return m_NodePredicate;
00144 }
00145
00146 void QmitkDataStorageListModel::reset()
00147 {
00148 if(m_DataStorage != 0)
00149 {
00150 mitk::DataStorage::SetOfObjects::ConstPointer setOfObjects;
00151
00152 if (m_NodePredicate)
00153 setOfObjects = m_DataStorage->GetSubset(m_NodePredicate);
00154 else
00155 setOfObjects = m_DataStorage->GetAll();
00156
00157
00158 unsigned int i = 0;
00159 for(std::vector<mitk::DataNode*>::iterator it=m_DataNodes.begin()
00160 ; it!=m_DataNodes.end()
00161 ; ++it, ++i)
00162 {
00163 (*it)->RemoveObserver(m_DataNodesModifiedObserversTags[i]);
00164 }
00165
00166
00167 m_DataNodesModifiedObserversTags.clear();
00168 m_DataNodes.clear();
00169 itk::MemberCommand<QmitkDataStorageListModel>::Pointer modifiedCommand;
00170
00171 for (mitk::DataStorage::SetOfObjects::ConstIterator nodeIt = setOfObjects->Begin()
00172 ; nodeIt != setOfObjects->End(); ++nodeIt, ++i)
00173 {
00174
00175 modifiedCommand = itk::MemberCommand<QmitkDataStorageListModel>::New();
00176 modifiedCommand->SetCallbackFunction(this, &QmitkDataStorageListModel::OnModified);
00177 m_DataNodesModifiedObserversTags.push_back( m_DataStorage->AddObserver(itk::ModifiedEvent(), modifiedCommand) );
00178 m_DataNodes.push_back( nodeIt.Value().GetPointer());
00179
00180 }
00181
00182 }
00183
00184 }
00185
00186 void QmitkDataStorageListModel::NodeAdded( const mitk::DataNode* node )
00187 {
00188
00189 if(!m_BlockEvents)
00190 {
00191 m_BlockEvents = true;
00192
00193
00194 bool addNode = true;
00195 if(m_NodePredicate && !m_NodePredicate->CheckNode(node))
00196 addNode = false;
00197
00198 if(addNode)
00199 {
00200 beginInsertRows(QModelIndex(), m_DataNodes.size(), m_DataNodes.size());
00201
00202 m_DataNodes.push_back(const_cast<mitk::DataNode*>(node));
00203 endInsertRows();
00204 }
00205
00206 m_BlockEvents = false;
00207 }
00208 }
00209
00210 void QmitkDataStorageListModel::NodeRemoved( const mitk::DataNode* node )
00211 {
00212
00213 if(!m_BlockEvents)
00214 {
00215 m_BlockEvents = true;
00216
00217 int row = -1;
00218
00219
00220 for (std::vector<mitk::DataNode*>::const_iterator nodeIt = m_DataNodes.begin()
00221 ; nodeIt != m_DataNodes.end(); nodeIt++)
00222 {
00223 row++;
00224 if( (*nodeIt) == node )
00225 {
00226
00227 beginRemoveRows(QModelIndex(), row, row);
00228 m_DataNodes.erase(std::find(m_DataNodes.begin(), m_DataNodes.end(), (*nodeIt)));
00229 endRemoveRows();
00230 break;
00231 }
00232 }
00233
00234 m_BlockEvents = false;
00235 }
00236 }
00237
00238 void QmitkDataStorageListModel::OnModified( const itk::Object *caller, const itk::EventObject & )
00239 {
00240 if(m_BlockEvents) return;
00241
00242 const mitk::DataNode* modifiedNode = dynamic_cast<const mitk::DataNode*>(caller);
00243 if(modifiedNode)
00244 {
00245 int row = std::distance(std::find(m_DataNodes.begin(), m_DataNodes.end(), modifiedNode), m_DataNodes.end());
00246 QModelIndex indexOfChangedProperty = index(row, 1);
00247
00248 emit dataChanged(indexOfChangedProperty, indexOfChangedProperty);
00249 }
00250 }
00251
00252 void QmitkDataStorageListModel::OnDelete( const itk::Object *caller, const itk::EventObject & )
00253 {
00254 if(m_BlockEvents) return;
00255
00256 const mitk::DataStorage* dataStorage = dynamic_cast<const mitk::DataStorage*>(caller);
00257 if(dataStorage)
00258 {
00259
00260 this->SetDataStorage(0);
00261 }
00262 }
00263
00264 mitk::DataNode::Pointer QmitkDataStorageListModel::getNode( const QModelIndex &index ) const
00265 {
00266 mitk::DataNode::Pointer node;
00267
00268 if(index.isValid())
00269 {
00270 node = m_DataNodes.at(index.row());
00271 }
00272
00273 return node;
00274 }