00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkDataStorageTableModel.h"
00019
00020
00021 #include "mitkNodePredicateBase.h"
00022 #include "mitkProperties.h"
00023 #include "mitkRenderingManager.h"
00024 #include "QmitkEnums.h"
00025 #include "QmitkCustomVariants.h"
00026 #include <QmitkNodeDescriptorManager.h>
00027
00028
00029 #include <itkCommand.h>
00030 #include <QIcon>
00031
00032
00033 QmitkDataStorageTableModel::QmitkDataStorageTableModel(mitk::DataStorage::Pointer _DataStorage
00034 , mitk::NodePredicateBase* _Predicate
00035 , QObject* parent )
00036 : QAbstractTableModel(parent)
00037 , m_DataStorage(0)
00038 , m_Predicate(0)
00039 , m_BlockEvents(false)
00040 , m_SortDescending(false)
00041 {
00042 this->SetPredicate(_Predicate);
00043 this->SetDataStorage(_DataStorage);
00044 }
00045
00046 QmitkDataStorageTableModel::~QmitkDataStorageTableModel()
00047 {
00048
00049 this->SetDataStorage(0);
00050 }
00051
00052
00053 const mitk::DataStorage::Pointer QmitkDataStorageTableModel::GetDataStorage() const
00054 {
00055 return m_DataStorage.GetPointer();
00056 }
00057
00058 mitk::NodePredicateBase::Pointer QmitkDataStorageTableModel::GetPredicate() const
00059 {
00060 return m_Predicate;
00061 }
00062
00063 mitk::DataNode::Pointer QmitkDataStorageTableModel::GetNode( const QModelIndex &index ) const
00064 {
00065 mitk::DataNode::Pointer node;
00066
00067 if(index.isValid())
00068 {
00069 node = m_NodeSet.at(index.row());
00070 }
00071
00072 return node;
00073 }
00074
00075
00076 QVariant QmitkDataStorageTableModel::headerData(int section, Qt::Orientation orientation,
00077 int role) const
00078 {
00079 QVariant headerData;
00080
00081
00082 if ( role == Qt::DisplayRole )
00083 {
00084 if( orientation == Qt::Horizontal )
00085 {
00086
00087 if(section == 0)
00088 headerData = "Name";
00089 else if(section == 1)
00090 headerData = "Data Type";
00091 else if(section == 2)
00092 headerData = "Visibility";
00093 }
00094 else if( orientation == Qt::Vertical )
00095 {
00096
00097 headerData = section+1;
00098 }
00099 }
00100
00101 return headerData;
00102 }
00103
00104 Qt::ItemFlags QmitkDataStorageTableModel::flags(const QModelIndex &index) const
00105 {
00106 Qt::ItemFlags flags = QAbstractItemModel::flags(index);
00107
00108
00109 if (index.column() == 0)
00110 {
00111 flags |= Qt::ItemIsEditable;
00112 }
00113 else if (index.column() == 2)
00114 {
00115 flags |= Qt::ItemIsUserCheckable;
00116 }
00117
00118 return flags;
00119 }
00120
00121 int QmitkDataStorageTableModel::rowCount(const QModelIndex &) const
00122 {
00123 return m_NodeSet.size();
00124 }
00125
00126 int QmitkDataStorageTableModel::columnCount(const QModelIndex &) const
00127 {
00128
00129 int columns = 3;
00130 return columns;
00131 }
00132
00133 QVariant QmitkDataStorageTableModel::data(const QModelIndex &index, int role) const
00134 {
00135 QVariant data;
00136
00137 if (index.isValid() && !m_NodeSet.empty())
00138 {
00139 mitk::DataNode::Pointer node = m_NodeSet.at(index.row());
00140
00141 std::string nodeName = node->GetName();
00142 if(nodeName.empty())
00143 nodeName = "unnamed";
00144
00145
00146 if(index.column() == 0)
00147 {
00148
00149 if (role == Qt::DisplayRole || role == Qt::EditRole)
00150 {
00151 data = nodeName.c_str();
00152 }
00153 else if (role == QmitkDataNodeRole)
00154 {
00155 data = QVariant::fromValue(node);
00156 }
00157 }
00158 else if (index.column() == 1)
00159 {
00160
00161 QmitkNodeDescriptor* nodeDescriptor
00162 = QmitkNodeDescriptorManager::GetInstance()->GetDescriptor(node);
00163
00164
00165 if (role == Qt::DisplayRole)
00166 {
00167
00168 data = nodeDescriptor->GetClassName();
00169 }
00170
00171 else if(role == Qt::DecorationRole)
00172 {
00173 data = nodeDescriptor->GetIcon();
00174 }
00175 }
00176 else if (index.column() == 2)
00177 {
00178
00179 bool visibility = false;
00180
00181 if(node->GetVisibility(visibility, 0) && role == Qt::CheckStateRole)
00182 {
00183 data = (visibility ? Qt::Checked : Qt::Unchecked);
00184 }
00185
00186 }
00187
00188 }
00189 return data;
00190 }
00191
00192
00193 void QmitkDataStorageTableModel::SetPredicate( mitk::NodePredicateBase* _Predicate )
00194 {
00195
00196 if(m_Predicate != _Predicate)
00197 {
00198 m_Predicate = _Predicate;
00199 this->Reset();
00200 }
00201 }
00202
00203 void QmitkDataStorageTableModel::SetDataStorage( mitk::DataStorage::Pointer _DataStorage )
00204 {
00205
00206 if(m_DataStorage.GetPointer() != _DataStorage.GetPointer())
00207 {
00208
00209 if(m_DataStorage != 0)
00210 {
00211 this->m_DataStorage->AddNodeEvent.RemoveListener( mitk::MessageDelegate1<QmitkDataStorageTableModel
00212 , const mitk::DataNode*>( this, &QmitkDataStorageTableModel::AddNode ) );
00213
00214 this->m_DataStorage->RemoveNodeEvent.RemoveListener( mitk::MessageDelegate1<QmitkDataStorageTableModel
00215 , const mitk::DataNode*>( this, &QmitkDataStorageTableModel::RemoveNode ) );
00216 }
00217
00218
00219 m_DataStorage = _DataStorage.GetPointer();
00220
00221
00222 if(m_DataStorage != 0)
00223 {
00224
00225 this->m_DataStorage->AddNodeEvent.AddListener( mitk::MessageDelegate1<QmitkDataStorageTableModel
00226 , const mitk::DataNode*>( this, &QmitkDataStorageTableModel::AddNode ) );
00227
00228 this->m_DataStorage->RemoveNodeEvent.AddListener( mitk::MessageDelegate1<QmitkDataStorageTableModel
00229 , const mitk::DataNode*>( this, &QmitkDataStorageTableModel::RemoveNode ) );
00230 }
00231
00232
00233 this->Reset();
00234 }
00235 }
00236
00237
00238 void QmitkDataStorageTableModel::AddNode( const mitk::DataNode* node )
00239 {
00240
00241 if(!m_BlockEvents)
00242 {
00243
00244 if(m_Predicate.IsNotNull() && !m_Predicate->CheckNode(node))
00245 return;
00246
00247
00248 if(node->GetData() == 0)
00249 return;
00250
00251
00252 itk::MemberCommand<QmitkDataStorageTableModel>::Pointer propertyModifiedCommand
00253 = itk::MemberCommand<QmitkDataStorageTableModel>::New();
00254 propertyModifiedCommand->SetCallbackFunction(this, &QmitkDataStorageTableModel::PropertyModified);
00255
00256 mitk::BaseProperty* tempProperty = 0;
00257
00258
00259 tempProperty = node->GetProperty("visible");
00260 if(tempProperty)
00261 m_VisiblePropertyModifiedObserverTags[tempProperty]
00262 = tempProperty->AddObserver(itk::ModifiedEvent(), propertyModifiedCommand);
00263
00264 tempProperty = node->GetProperty("name");
00265 if(tempProperty)
00266 m_NamePropertyModifiedObserverTags[tempProperty]
00267 = tempProperty->AddObserver(itk::ModifiedEvent(), propertyModifiedCommand);
00268
00269
00270 beginInsertRows(QModelIndex(), m_NodeSet.size(), m_NodeSet.size());
00271
00272
00273 m_NodeSet.push_back(const_cast<mitk::DataNode*>(node));
00274
00275
00276 endInsertRows();
00277 }
00278 }
00279
00280 void QmitkDataStorageTableModel::RemoveNode( const mitk::DataNode* node )
00281 {
00282
00283 if(!m_BlockEvents)
00284 {
00285
00286 std::vector<mitk::DataNode*>::iterator nodeIt
00287 = std::find(m_NodeSet.begin(), m_NodeSet.end(), node);
00288
00289 if(nodeIt != m_NodeSet.end())
00290 {
00291
00292 mitk::BaseProperty* tempProperty = 0;
00293
00294 tempProperty = (*nodeIt)->GetProperty("visible");
00295 if(tempProperty)
00296 tempProperty->RemoveObserver(m_VisiblePropertyModifiedObserverTags[tempProperty]);
00297 m_VisiblePropertyModifiedObserverTags.erase(tempProperty);
00298
00299
00300 tempProperty = (*nodeIt)->GetProperty("name");
00301 if(tempProperty)
00302 tempProperty->RemoveObserver(m_NamePropertyModifiedObserverTags[tempProperty]);
00303 m_NamePropertyModifiedObserverTags.erase(tempProperty);
00304
00305
00306 int row = std::distance(m_NodeSet.begin(), nodeIt);
00307
00308
00309 this->beginRemoveRows(QModelIndex(), row, row);
00310
00311
00312 m_NodeSet.erase(nodeIt);
00313
00314
00315 endRemoveRows();
00316 }
00317 }
00318 }
00319
00320 void QmitkDataStorageTableModel::PropertyModified( const itk::Object *caller, const itk::EventObject & )
00321 {
00322 if(!m_BlockEvents)
00323 {
00324
00325 const mitk::BaseProperty* modifiedProperty = dynamic_cast<const mitk::BaseProperty*>(caller);
00326
00327 if(modifiedProperty)
00328 {
00329
00330 int row = -1;
00331 int column = -1;
00332
00333 std::vector<mitk::DataNode*>::iterator it;
00334 mitk::BaseProperty* visibilityProperty = 0;
00335 mitk::BaseProperty* nameProperty = 0;
00336
00337
00338 for(it=m_NodeSet.begin(); it!=m_NodeSet.end(); it++)
00339 {
00340
00341 visibilityProperty = (*it)->GetProperty("visible");
00342 if(modifiedProperty == visibilityProperty)
00343 {
00344 column = 2;
00345 break;
00346 }
00347
00348 nameProperty = (*it)->GetProperty("name");
00349 if(modifiedProperty == nameProperty)
00350 {
00351 column = 0;
00352 break;
00353 }
00354 }
00355
00356
00357 if( it != m_NodeSet.end() )
00358 row = std::distance(m_NodeSet.begin(), it);
00359
00360
00361 QModelIndex indexOfChangedProperty = index(row, column);
00362 emit dataChanged(indexOfChangedProperty, indexOfChangedProperty);
00363 }
00364 }
00365 }
00366
00367 bool QmitkDataStorageTableModel::setData(const QModelIndex &index, const QVariant &value,
00368 int role)
00369 {
00370 bool noErr = false;
00371
00372 if (index.isValid() && (role == Qt::EditRole || role == Qt::CheckStateRole))
00373 {
00374
00375
00376 m_BlockEvents = true;
00377
00378 mitk::DataNode::Pointer node = m_NodeSet.at(index.row());
00379
00380 if(index.column() == 0)
00381 {
00382 node->SetStringProperty("name", value.toString().toStdString().c_str());
00383 }
00384 else if(index.column() == 2)
00385 {
00386 node->SetBoolProperty("visible", (value.toInt() == Qt::Checked ? true : false));
00387 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00388 }
00389
00390
00391 emit dataChanged(index, index);
00392
00393 m_BlockEvents = false;
00394 noErr = true;
00395 }
00396
00397 return noErr;
00398 }
00399
00400
00401 void QmitkDataStorageTableModel::Reset()
00402 {
00403 mitk::DataStorage::SetOfObjects::ConstPointer _NodeSet;
00404
00405
00406
00407
00408 unsigned int i = m_NodeSet.size();
00409 while(!m_NodeSet.empty())
00410 {
00411 --i;
00412 this->RemoveNode(m_NodeSet.at(i));
00413 }
00414
00415
00416
00417 m_NamePropertyModifiedObserverTags.clear();
00418 m_VisiblePropertyModifiedObserverTags.clear();
00419 m_NodeSet.clear();
00420
00421
00422 if(m_DataStorage.IsNotNull())
00423 {
00424 if(m_Predicate.IsNotNull())
00425
00426 _NodeSet = m_DataStorage->GetSubset(m_Predicate);
00427
00428 else
00429 {
00430 _NodeSet = m_DataStorage->GetAll();
00431
00432 }
00433
00434
00435 for(mitk::DataStorage::SetOfObjects::const_iterator it=_NodeSet->begin(); it!=_NodeSet->end()
00436 ; it++)
00437 {
00438
00439 this->AddNode(*it);
00440 }
00441
00442 }
00443 }
00444
00445 void QmitkDataStorageTableModel::sort( int column, Qt::SortOrder order )
00446 {
00447 bool sortDescending = (order == Qt::DescendingOrder) ? true: false;
00448
00449
00450
00451
00452
00453
00454
00455
00456 DataNodeCompareFunction::CompareCriteria _CompareCriteria
00457 = DataNodeCompareFunction::CompareByName;
00458
00459 DataNodeCompareFunction::CompareOperator _CompareOperator
00460 = sortDescending ? DataNodeCompareFunction::Greater: DataNodeCompareFunction::Less;
00461
00462 if(column == 1)
00463 _CompareCriteria = DataNodeCompareFunction::CompareByClassName;
00464
00465 else if(column == 2)
00466 _CompareCriteria = DataNodeCompareFunction::CompareByVisibility;
00467
00468
00469 DataNodeCompareFunction compareFunc(_CompareCriteria, _CompareOperator);
00470 std::sort(m_NodeSet.begin(), m_NodeSet.end(), compareFunc);
00471
00472 QAbstractTableModel::reset();
00473
00474 }
00475
00476 std::vector<mitk::DataNode*> QmitkDataStorageTableModel::GetNodeSet() const
00477 {
00478 return m_NodeSet;
00479 }
00480
00481 QmitkDataStorageTableModel::DataNodeCompareFunction::DataNodeCompareFunction( CompareCriteria _CompareCriteria
00482 , CompareOperator _CompareOperator )
00483 : m_CompareCriteria(_CompareCriteria)
00484 , m_CompareOperator(_CompareOperator)
00485 {
00486 }
00487
00488 bool QmitkDataStorageTableModel::DataNodeCompareFunction::operator()
00489 ( const mitk::DataNode::Pointer& _Left
00490 , const mitk::DataNode::Pointer& _Right ) const
00491 {
00492 switch(m_CompareCriteria)
00493 {
00494 case CompareByClassName:
00495 if(m_CompareOperator == Less)
00496 return (_Left->GetData()->GetNameOfClass() < _Right->GetData()->GetNameOfClass() );
00497 else
00498 return (_Left->GetData()->GetNameOfClass() > _Right->GetData()->GetNameOfClass() );
00499 break;
00500
00501 case CompareByVisibility:
00502 {
00503
00504 bool _LeftVisibility = false;
00505 bool _RightVisibility = false;
00506 _Left->GetVisibility(_LeftVisibility, 0);
00507 _Right->GetVisibility(_RightVisibility, 0);
00508
00509 if(m_CompareOperator == Less)
00510 return (_LeftVisibility < _RightVisibility);
00511 else
00512 return (_LeftVisibility > _RightVisibility);
00513 }
00514 break;
00515
00516
00517 default:
00518 if(m_CompareOperator == Less)
00519 return (_Left->GetName() < _Right->GetName());
00520 else
00521 return (_Left->GetName() > _Right->GetName());
00522 break;
00523 }
00524 }
00525