Public Slots | Signals | Public Member Functions | Protected Member Functions | Protected Attributes

QmitkPointListModel Class Reference

#include <QmitkPointListModel.h>

Collaboration diagram for QmitkPointListModel:
Collaboration graph
[legend]

List of all members.

Public Slots

void MoveSelectedPointUp ()
void MoveSelectedPointDown ()
void RemoveSelectedPoint ()

Signals

void SignalUpdateSelection ()

Public Member Functions

 QmitkPointListModel (mitk::DataNode *=NULL, int t=0, QObject *parent=0)
 ~QmitkPointListModel ()
Qt::ItemFlags flags (const QModelIndex &) const
int rowCount (const QModelIndex &parent=QModelIndex()) const
 interface of QAbstractListModel
QVariant data (const QModelIndex &index, int role) const
 interface of QAbstractListModel
QVariant headerData (int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
 interface of QAbstractListModel
void SetPointSetNode (mitk::DataNode *pointSetNode)
 which point set to work on
mitk::PointSetGetPointSet () const
 which point set to work on
mitk::DataNodeGetPointSetNode () const
void SetTimeStep (int t)
 which time step to display/model
int GetTimeStep () const
 which time step to display/model
void OnPointSetChanged (const itk::EventObject &e)
 itk observer for point set "modified" events
void OnPointSetDeleted (const itk::EventObject &e)
 itk observer for point set "delete" events
bool GetPointForModelIndex (const QModelIndex &index, mitk::PointSet::PointType &p, mitk::PointSet::PointIdentifier &id) const
 get point and point ID that correspond to a given QModelIndex
bool GetModelIndexForPointID (mitk::PointSet::PointIdentifier id, QModelIndex &index) const
 returns a QModelIndex for a given point ID

Protected Member Functions

void ObserveNewPointSet (mitk::DataNode *pointSetNode)
 internally observe different point set
mitk::PointSetCheckForPointSetInNode (mitk::DataNode *node) const

Protected Attributes

mitk::DataNodem_PointSetNode
unsigned int m_PointSetModifiedObserverTag
unsigned int m_PointSetDeletedObserverTag
int m_TimeStep

Detailed Description

Definition at line 27 of file QmitkPointListModel.h.


Constructor & Destructor Documentation

QmitkPointListModel::QmitkPointListModel ( mitk::DataNode pointSetNode = NULL,
int  t = 0,
QObject *  parent = 0 
)

Definition at line 29 of file QmitkPointListModel.cpp.

References ObserveNewPointSet().

:QAbstractListModel(parent),
m_PointSetNode(NULL),
m_PointSetModifiedObserverTag(0),
m_PointSetDeletedObserverTag(0),
m_TimeStep(t)
{
  ObserveNewPointSet( pointSetNode );
}
QmitkPointListModel::~QmitkPointListModel (  )

Definition at line 45 of file QmitkPointListModel.cpp.

References ObserveNewPointSet().

{
  this->ObserveNewPointSet( NULL );
}

Member Function Documentation

mitk::PointSet * QmitkPointListModel::CheckForPointSetInNode ( mitk::DataNode node ) const [protected]

Definition at line 326 of file QmitkPointListModel.cpp.

References mitk::DataNode::GetData().

Referenced by data(), GetModelIndexForPointID(), GetPointForModelIndex(), GetPointSet(), MoveSelectedPointDown(), MoveSelectedPointUp(), ObserveNewPointSet(), OnPointSetDeleted(), RemoveSelectedPoint(), and rowCount().

{
  if (node != NULL)
  {
    mitk::PointSet::Pointer pointSet = dynamic_cast<mitk::PointSet*>(node->GetData());
    if (pointSet.IsNotNull())
      return pointSet;
  }
  return NULL;
}
QVariant QmitkPointListModel::data ( const QModelIndex &  index,
int  role 
) const

interface of QAbstractListModel

Definition at line 146 of file QmitkPointListModel.cpp.

References CheckForPointSetInNode(), GetPointForModelIndex(), m_PointSetNode, and m_TimeStep.

{
  mitk::PointSet::Pointer pointSet = this->CheckForPointSetInNode(m_PointSetNode);
  
  if ( pointSet.IsNull() )
  {
    return QVariant();
  }

  if ( !index.isValid() )
  {
    return QVariant();
  }

  if ( index.row() >= pointSet->GetSize(m_TimeStep) )
  {
    return QVariant();
  }

  if (role == Qt::DisplayRole)
  {
    mitk::PointSet::PointsContainer::ElementIdentifier id;
    mitk::PointSet::PointType p;
    bool pointFound = this->GetPointForModelIndex(index, p, id);
    if (pointFound == false)
      return QVariant();

    QString s = QString("%0: (%1, %2, %3)")
      .arg( id, 3)
      .arg( p[0], 0, 'f', 3 )
      .arg( p[1], 0, 'f', 3 )
      .arg( p[2], 0, 'f', 3 );
    return QVariant(s);
  }
  else
  {
    return QVariant();
  }
}
Qt::ItemFlags QmitkPointListModel::flags ( const QModelIndex &   ) const

Definition at line 39 of file QmitkPointListModel.cpp.

{
  // no editing so far, return default (enabled, selectable)
  return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
}
bool QmitkPointListModel::GetModelIndexForPointID ( mitk::PointSet::PointIdentifier  id,
QModelIndex &  index 
) const

returns a QModelIndex for a given point ID

Documentation The mitk::PointSet uses a map to store points in an ID<-->Point relation. The IDs are not neccesarily continuously numbered, therefore, we can not directly use the point ID as a QModelIndex. This method returns a QModelIndex for a given point ID in the outgoing parameter index.

Parameters:
[in]mitk::PointSet::PointIdentifierid The point ID for which the QModelIndex will be created
[out]QModelIndex&index if a point with the ID id was found, index will contain a corresponding QModelIndex for that point
Returns:
returns true, if a valid QModelIndex was created, false otherwise

Definition at line 237 of file QmitkPointListModel.cpp.

References CheckForPointSetInNode(), m_PointSetNode, and m_TimeStep.

Referenced by QmitkPointListView::OnListViewSelectionChanged(), and QmitkPointListView::OnPointSetSelectionChanged().

{
  mitk::PointSet::Pointer pointSet = this->CheckForPointSetInNode(m_PointSetNode);
  if (pointSet.IsNull())
    return false;

  mitk::PointSet::PointsContainer::Pointer points = pointSet->GetPointSet(m_TimeStep)->GetPoints();

  if (points->IndexExists(id) == false)
    return false;

  unsigned int idx = 0;
  for (mitk::PointSet::PointsContainer::Iterator it = points->Begin(); it != points->End(); ++it)
  {
    if (it->Index() == id) // we found the correct element
    {
      index = this->index(idx);
      return true;
    }
    
    idx++;
  }

  return false; // nothing found
}
bool QmitkPointListModel::GetPointForModelIndex ( const QModelIndex &  index,
mitk::PointSet::PointType p,
mitk::PointSet::PointIdentifier id 
) const

get point and point ID that correspond to a given QModelIndex

The mitk::PointSet uses a map to store points in an ID<-->Point relation. The IDs are not neccesarily continuously numbered, therefore, we can not directly use the QModelIndex as point ID. This method returns the point and the corresponding point id for a given QModelIndex. The point and the point ID are returned in the outgoing parameters p and id. If a valid point and ID were found, the method returns true, otherwise it returns false

Parameters:
[in]QModelIndex&index the index for which a point is requested. The row() part of the index is used to find a corresponding point
[out]mitk::Point3D&p If a valid point is found, it will be stored in the p parameter
[out]mitk::PointSet::PointIdentifier&id If a valid point is found, the corresponding ID will be stored in id
Returns:
Returns true, if a valid point was found, false otherwise

Definition at line 203 of file QmitkPointListModel.cpp.

References CheckForPointSetInNode(), int(), m_PointSetNode, and m_TimeStep.

Referenced by data(), and QmitkPointListView::OnPointDoubleClicked().

{
  mitk::PointSet::Pointer pointSet = this->CheckForPointSetInNode(m_PointSetNode);
  if (pointSet.IsNull())
    return false;

  if ((index.row() < 0) || (index.row() >= (int)pointSet->GetPointSet(m_TimeStep)->GetPoints()->Size()))
    return false;

  // get the nth. element, if it exists.
  // we can not use the index directly, because PointSet uses a map container, 
  // where the index is not necessarily the same as the key.
  // Therefore we have to count the elements
  mitk::PointSet::PointsContainer::Iterator it = pointSet->GetPointSet(m_TimeStep)->GetPoints()->Begin();
  for (int i = 0; i < index.row(); ++i)
  {
    ++it;
  
    if (it == pointSet->GetPointSet(m_TimeStep)->GetPoints()->End())
      return false;

  }

  if (it != pointSet->GetPointSet(m_TimeStep)->GetPoints()->End()) // not at the end, 
  {
    p = it->Value();
    id = it->Index();
    return true;
  }

  return false;
}
mitk::PointSet * QmitkPointListModel::GetPointSet (  ) const
mitk::DataNode* QmitkPointListModel::GetPointSetNode (  ) const
int QmitkPointListModel::GetTimeStep (  ) const
QVariant QmitkPointListModel::headerData ( int  section,
Qt::Orientation  orientation,
int  role = Qt::DisplayRole 
) const

interface of QAbstractListModel

Definition at line 186 of file QmitkPointListModel.cpp.

{
  if (role != Qt::DisplayRole)
  {
    return QVariant();
  }

  if (orientation == Qt::Horizontal)
  {
    return QString("Coordinates").arg(section);
  }
  else
  {
    return QString("Row %1").arg(section);
  }
}
void QmitkPointListModel::MoveSelectedPointDown (  ) [slot]

Definition at line 278 of file QmitkPointListModel.cpp.

References CheckForPointSetInNode(), mitk::RenderingManager::GetInstance(), m_PointSetNode, m_TimeStep, and mitk::OpMOVEPOINTDOWN.

Referenced by QmitkPointListView::keyPressEvent(), and QmitkPointListWidget::MoveSelectedPointDown().

{
  mitk::PointSet::Pointer pointSet = this->CheckForPointSetInNode(m_PointSetNode);
  if (pointSet.IsNull())
    return;

  mitk::PointSet::PointIdentifier selectedID; 
  selectedID = pointSet->SearchSelectedPoint(m_TimeStep);
  mitk::ScalarType tsInMS = pointSet->GetTimeSlicedGeometry()->TimeStepToMS(m_TimeStep);
  mitk::PointOperation* doOp = new mitk::PointOperation(mitk::OpMOVEPOINTDOWN, tsInMS, pointSet->GetPoint(selectedID, m_TimeStep), selectedID, true);
  pointSet->ExecuteOperation(doOp);
  mitk::RenderingManager::GetInstance()->RequestUpdateAll(); // Workaround for update problem in Pointset/Mapper
}
void QmitkPointListModel::MoveSelectedPointUp (  ) [slot]

Definition at line 263 of file QmitkPointListModel.cpp.

References CheckForPointSetInNode(), mitk::RenderingManager::GetInstance(), m_PointSetNode, m_TimeStep, and mitk::OpMOVEPOINTUP.

Referenced by QmitkPointListView::keyPressEvent(), and QmitkPointListWidget::MoveSelectedPointUp().

{
  mitk::PointSet::Pointer pointSet = this->CheckForPointSetInNode(m_PointSetNode);
  if (pointSet.IsNull())
    return;
  
  mitk::PointSet::PointIdentifier selectedID;   
  selectedID = pointSet->SearchSelectedPoint(m_TimeStep);
  mitk::PointSet::PointType point = pointSet->GetPoint(selectedID, m_TimeStep);
  mitk::ScalarType tsInMS = pointSet->GetTimeSlicedGeometry()->TimeStepToMS(m_TimeStep);
  mitk::PointOperation* doOp = new mitk::PointOperation(mitk::OpMOVEPOINTUP,tsInMS, pointSet->GetPoint(selectedID, m_TimeStep), selectedID, true);
  pointSet->ExecuteOperation(doOp);
  mitk::RenderingManager::GetInstance()->RequestUpdateAll(); // Workaround for update problem in Pointset/Mapper
}
void QmitkPointListModel::ObserveNewPointSet ( mitk::DataNode pointSetNode ) [protected]

internally observe different point set

Definition at line 74 of file QmitkPointListModel.cpp.

References CheckForPointSetInNode(), mitk::DataNode::GetData(), m_PointSetDeletedObserverTag, m_PointSetModifiedObserverTag, m_PointSetNode, OnPointSetChanged(), and OnPointSetDeleted().

Referenced by QmitkPointListModel(), SetPointSetNode(), and ~QmitkPointListModel().

{
  
  //remove old observers
  if (m_PointSetNode != NULL)
  {
    mitk::PointSet::Pointer oldPointSet = dynamic_cast<mitk::PointSet*>(m_PointSetNode->GetData());
    if (oldPointSet.IsNotNull())
    {
      oldPointSet->RemoveObserver(m_PointSetModifiedObserverTag);
      oldPointSet->RemoveObserver(m_PointSetDeletedObserverTag);
    }
  }

  //get the new pointset
  mitk::PointSet::Pointer pointSet = this->CheckForPointSetInNode(pointSetNode);

  m_PointSetNode = pointSetNode;

  if ( pointSet.IsNotNull())
  {
    // add new observer for modified if necessary
    itk::ReceptorMemberCommand<QmitkPointListModel>::Pointer modCommand = itk::ReceptorMemberCommand<QmitkPointListModel>::New();
    modCommand->SetCallbackFunction( this, &QmitkPointListModel::OnPointSetChanged );
    m_PointSetModifiedObserverTag = pointSet->AddObserver( itk::ModifiedEvent(), modCommand );

    // add new observer for detele if necessary
    itk::ReceptorMemberCommand<QmitkPointListModel>::Pointer delCommand = itk::ReceptorMemberCommand<QmitkPointListModel>::New();
    delCommand->SetCallbackFunction( this, &QmitkPointListModel::OnPointSetDeleted );
    m_PointSetDeletedObserverTag = pointSet->AddObserver( itk::DeleteEvent(), delCommand );
  }
  else
  {
    m_PointSetModifiedObserverTag = 0;
    m_PointSetDeletedObserverTag = 0;
  }
}
void QmitkPointListModel::OnPointSetChanged ( const itk::EventObject &  e )

itk observer for point set "modified" events

Definition at line 112 of file QmitkPointListModel.cpp.

References SignalUpdateSelection().

Referenced by ObserveNewPointSet().

{
  QAbstractListModel::reset();
  emit SignalUpdateSelection();
}
void QmitkPointListModel::OnPointSetDeleted ( const itk::EventObject &  e )

itk observer for point set "delete" events

Definition at line 118 of file QmitkPointListModel.cpp.

References CheckForPointSetInNode(), m_PointSetDeletedObserverTag, m_PointSetModifiedObserverTag, and m_PointSetNode.

Referenced by ObserveNewPointSet().

{
//  m_PointSetNode = NULL;
  mitk::PointSet::Pointer ps = CheckForPointSetInNode(m_PointSetNode);
  if (ps)
  {
    ps->RemoveObserver(m_PointSetModifiedObserverTag);
    ps->RemoveObserver(m_PointSetDeletedObserverTag);
  }

  m_PointSetModifiedObserverTag = 0;
  m_PointSetDeletedObserverTag = 0;
  QAbstractListModel::reset();
}
void QmitkPointListModel::RemoveSelectedPoint (  ) [slot]

Definition at line 293 of file QmitkPointListModel.cpp.

References mitk::BS_NoButton, CheckForPointSetInNode(), mitk::EIDDELETE, mitk::RenderingManager::GetInstance(), mitk::DataNode::GetInteractor(), mitk::Key_Delete, m_PointSetNode, MITK_WARN, mitk::PointSetInteractor::New(), mitk::DataNode::SetInteractor(), and mitk::Type_KeyPress.

Referenced by QmitkPointListView::ClearPointList(), QmitkPointListView::keyPressEvent(), and QmitkPointListWidget::RemoveSelectedPoint().

{
  mitk::PointSet::Pointer pointSet = this->CheckForPointSetInNode(m_PointSetNode);
  if (pointSet.IsNull())
    return;

  //get corresponding interactor to PointSet
  mitk::PointSetInteractor::Pointer interactor = dynamic_cast<mitk::PointSetInteractor*>(m_PointSetNode->GetInteractor());  
  if (interactor.IsNull())
  {
    if (m_PointSetNode->GetInteractor()==NULL && m_PointSetNode != NULL) //no Interactor set to node
    {
      interactor = mitk::PointSetInteractor::New("pointsetinteractor",m_PointSetNode);
      m_PointSetNode->SetInteractor(interactor);
    }
    else
    {
      MITK_WARN<<"Unexpected interactor found!\n";
      return;
    }
  }


  //send a DEL event to pointsetinteractor
  const mitk::Event* delEvent = new mitk::Event(NULL, mitk::Type_KeyPress, mitk::BS_NoButton, mitk::BS_NoButton, mitk::Key_Delete);
  mitk::StateEvent* delStateEvent = new mitk::StateEvent(mitk::EIDDELETE, delEvent);
  interactor->HandleEvent(delStateEvent);
  delete delEvent;
  delete delStateEvent;

  mitk::RenderingManager::GetInstance()->RequestUpdateAll(); // Workaround for update problem in PointSet/Mapper
}
int QmitkPointListModel::rowCount ( const QModelIndex &  parent = QModelIndex() ) const

interface of QAbstractListModel

Definition at line 133 of file QmitkPointListModel.cpp.

References CheckForPointSetInNode(), m_PointSetNode, and m_TimeStep.

{
  mitk::PointSet::Pointer pointSet = this->CheckForPointSetInNode(m_PointSetNode);
  if ( pointSet.IsNotNull() )
  {
    return pointSet->GetSize(m_TimeStep);
  }
  else
  {
    return 0;
  }
}
void QmitkPointListModel::SetPointSetNode ( mitk::DataNode pointSetNode )

which point set to work on

Definition at line 50 of file QmitkPointListModel.cpp.

References ObserveNewPointSet(), and SignalUpdateSelection().

Referenced by QmitkPointListView::SetPointSetNode().

{
  this->ObserveNewPointSet( pointSetNode );
  QAbstractListModel::reset();
  emit SignalUpdateSelection();
}
void QmitkPointListModel::SetTimeStep ( int  t )

which time step to display/model

Definition at line 62 of file QmitkPointListModel.cpp.

References m_TimeStep, SignalUpdateSelection(), and QuadProgPP::t().

Referenced by QmitkPointListView::wheelEvent().

{
  m_TimeStep = t;
  QAbstractListModel::reset();
  emit SignalUpdateSelection();
}
void QmitkPointListModel::SignalUpdateSelection (  ) [signal]

emitted, when views should update their selection status (because mouse interactions in render windows can change the selection status of points)

Referenced by OnPointSetChanged(), SetPointSetNode(), and SetTimeStep().


Member Data Documentation

Definition at line 129 of file QmitkPointListModel.h.

Referenced by ObserveNewPointSet(), and OnPointSetDeleted().

Definition at line 128 of file QmitkPointListModel.h.

Referenced by ObserveNewPointSet(), and OnPointSetDeleted().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines