diff --git a/Modules/QmitkExt/QmitkCorrespondingPointSetsModel.cpp b/Modules/QmitkExt/QmitkCorrespondingPointSetsModel.cpp index 775d8ba3be..dcb44c6151 100644 --- a/Modules/QmitkExt/QmitkCorrespondingPointSetsModel.cpp +++ b/Modules/QmitkExt/QmitkCorrespondingPointSetsModel.cpp @@ -1,741 +1,741 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date$ Version: $Revision$ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #include "QmitkCorrespondingPointSetsModel.h" #include #include "mitkInteractionConst.h" #include "mitkPointOperation.h" #include "mitkRenderingManager.h" #include #include #include #include #include #include #include QmitkCorrespondingPointSetsModel::QmitkCorrespondingPointSetsModel( int t, QObject* parent ) :QAbstractTableModel(parent), m_PointSetNode(NULL), m_ReferencePointSetNode(NULL), m_TimeStepper(NULL), m_Interactor(NULL), m_MultiWidget( NULL ), m_PointSetModifiedObserverTag(0), m_ReferencePointSetModifiedObserverTag(0), m_SelectedPointSetIndex(-1) { ; } Qt::ItemFlags QmitkCorrespondingPointSetsModel::flags(const QModelIndex& index) const { if (index.isValid()) return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsSelectable | Qt::ItemIsEnabled; else return Qt::ItemIsDropEnabled | Qt::ItemIsSelectable | Qt::ItemIsEnabled; } Qt::DropActions QmitkCorrespondingPointSetsModel::supportedDropActions() const { return Qt::CopyAction | Qt::MoveAction; } bool QmitkCorrespondingPointSetsModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { if (action == Qt::IgnoreAction) return true; int targetRow; if (row != -1) targetRow = row; else if (parent.isValid()) targetRow = parent.row(); else targetRow = rowCount(QModelIndex()); this->MoveSelectedPoint(mitk::PointSet::PointIdentifier(targetRow)); return true; } QmitkCorrespondingPointSetsModel::~QmitkCorrespondingPointSetsModel() { ; } void QmitkCorrespondingPointSetsModel::RemoveObservers(){ if (m_PointSetNode) { mitk::PointSet::Pointer oldPointSet = dynamic_cast(m_PointSetNode->GetData()); if (oldPointSet.IsNotNull()) { oldPointSet->RemoveObserver(m_PointSetModifiedObserverTag); } } if (m_ReferencePointSetNode) { mitk::PointSet::Pointer oldPointSet = dynamic_cast(m_ReferencePointSetNode->GetData()); if (oldPointSet.IsNotNull()) { oldPointSet->RemoveObserver(m_ReferencePointSetModifiedObserverTag); } } } void QmitkCorrespondingPointSetsModel::AddObservers() { mitk::PointSet::Pointer pointSet = this->CheckForPointSetInNode(m_PointSetNode); if ( pointSet.IsNotNull()) { // add new observer for modified if necessary itk::ReceptorMemberCommand::Pointer modCommand = itk::ReceptorMemberCommand::New(); modCommand->SetCallbackFunction( this, &QmitkCorrespondingPointSetsModel::OnPointSetChanged ); m_PointSetModifiedObserverTag = pointSet->AddObserver( itk::ModifiedEvent(), modCommand ); } else { m_PointSetModifiedObserverTag = 0; } - + pointSet = this->CheckForPointSetInNode(m_ReferencePointSetNode); if ( pointSet.IsNotNull()) { // add new observer for modified if necessary itk::ReceptorMemberCommand::Pointer modCommand = itk::ReceptorMemberCommand::New(); modCommand->SetCallbackFunction( this, &QmitkCorrespondingPointSetsModel::OnPointSetChanged ); m_ReferencePointSetModifiedObserverTag = pointSet->AddObserver( itk::ModifiedEvent(), modCommand ); } else { m_ReferencePointSetModifiedObserverTag = 0; - } + } } void QmitkCorrespondingPointSetsModel::OnPointSetChanged( const itk::EventObject & /*e*/ ) { QAbstractTableModel::reset(); } void QmitkCorrespondingPointSetsModel::SetPointSetNodes( std::vector nodes ) { this->RemoveObservers(); if ( nodes.size() > 1 ) { m_PointSetNode = nodes.front(); m_ReferencePointSetNode = nodes.back(); } else if ( nodes.size() == 1 ) { m_PointSetNode = nodes.front(); m_ReferencePointSetNode = NULL; } else { m_PointSetNode = NULL; m_ReferencePointSetNode = NULL; } this->AddObservers(); QAbstractTableModel::reset(); } void QmitkCorrespondingPointSetsModel::SetTimeStep(int t) { if (!m_TimeStepper) return; m_TimeStepper->SetPos(t); QAbstractTableModel::reset(); } int QmitkCorrespondingPointSetsModel::GetTimeStep() const { if (!m_TimeStepper) return 0; return m_TimeStepper->GetPos(); } int QmitkCorrespondingPointSetsModel::rowCount( const QModelIndex& /*parent*/ ) const { if (!m_TimeStepper) return 0; mitk::PointSet::Pointer pointSet = this->CheckForPointSetInNode(m_PointSetNode); mitk::PointSet::Pointer referencePointSet = this->CheckForPointSetInNode(m_ReferencePointSetNode); int sizePS = 0; int sizeRPS = 0; if ( pointSet.IsNotNull() ) { sizePS = pointSet->GetSize(m_TimeStepper->GetPos()); } if ( referencePointSet.IsNotNull() ) { sizeRPS = referencePointSet->GetSize(m_TimeStepper->GetPos()); } if ( sizePS > sizeRPS ) return sizePS; return sizeRPS; } int QmitkCorrespondingPointSetsModel::columnCount( const QModelIndex& /*parent*/ ) const { return 2; } QVariant QmitkCorrespondingPointSetsModel::data(const QModelIndex& index, int role) const { mitk::PointSet::Pointer pointSet = NULL; if ( index.column() == 0 ) pointSet = this->CheckForPointSetInNode(m_PointSetNode); else if ( index.column() == 1 ) pointSet = this->CheckForPointSetInNode(m_ReferencePointSetNode); if ( pointSet.IsNull() ) { return QVariant(); } if ( !index.isValid() ) { return QVariant(); } if ( index.row() >= pointSet->GetSize(m_TimeStepper->GetPos()) ) { 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 = ""; bool firstProp = true; if (this->QTPropIdsEnabled()) { s.append(QString("%0").arg( id, 3)); firstProp = false; } if (this->QTPropCoordinatesEnabled()) { if(!firstProp) s.append(QString(": ")); s.append(QString("(%0, %1, %2)") .arg( p[0], 0, 'f', 2 ) .arg( p[1], 0, 'f', 2 ) .arg( p[2], 0, 'f', 2 )); } return QVariant(s); } else { return QVariant(); } } QVariant QmitkCorrespondingPointSetsModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) { return QVariant(); } if (orientation == Qt::Horizontal) { if (section == 0) { if ( m_PointSetNode ) return QString::fromStdString(this->m_PointSetNode->GetName()); } else if (section == 1) { if ( m_ReferencePointSetNode ) return QString::fromStdString(this->m_ReferencePointSetNode->GetName()); } return QString(); } return QString("%1").arg(section); } -bool QmitkCorrespondingPointSetsModel::GetPointForModelIndex( const QModelIndex &index, mitk::PointSet::PointType& p, +bool QmitkCorrespondingPointSetsModel::GetPointForModelIndex( const QModelIndex &index, mitk::PointSet::PointType& p, mitk::PointSet::PointIdentifier& id) const { if (!m_TimeStepper) return false; mitk::PointSet::Pointer pointSet = NULL; if ( index.column() == 0 ) pointSet = this->CheckForPointSetInNode(m_PointSetNode); else if ( index.column() == 1 ) pointSet = this->CheckForPointSetInNode(m_ReferencePointSetNode); if (pointSet.IsNull() || !pointSet->GetPointSet(m_TimeStepper->GetPos())) return false; if ((index.row() < 0) || (index.row() >= (int)pointSet->GetPointSet(m_TimeStepper->GetPos())->GetPoints()->Size())) return false; // get the nth. element, if it exists. - // we can not use the index directly, because PointSet uses a map container, + // 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_TimeStepper->GetPos())->GetPoints()->Begin(); for (int i = 0; i < index.row(); ++i) { ++it; if (it == pointSet->GetPointSet(m_TimeStepper->GetPos())->GetPoints()->End()) return false; } - if (it != pointSet->GetPointSet(m_TimeStepper->GetPos())->GetPoints()->End()) // not at the end, + if (it != pointSet->GetPointSet(m_TimeStepper->GetPos())->GetPoints()->End()) // not at the end, { p = it->Value(); id = it->Index(); return true; } return false; } -bool QmitkCorrespondingPointSetsModel::GetPointForModelIndex( int row, int column, mitk::PointSet::PointType& p, +bool QmitkCorrespondingPointSetsModel::GetPointForModelIndex( int row, int column, mitk::PointSet::PointType& p, mitk::PointSet::PointIdentifier& id) const { if (!m_TimeStepper) return false; mitk::PointSet::Pointer pointSet = NULL; if (column == 0 ) pointSet = this->CheckForPointSetInNode(m_PointSetNode); else if ( column == 1 ) pointSet = this->CheckForPointSetInNode(m_ReferencePointSetNode); if (pointSet.IsNull() || !pointSet->GetPointSet(m_TimeStepper->GetPos())) return false; if ((row < 0) || (row >= (int)pointSet->GetPointSet(m_TimeStepper->GetPos())->GetPoints()->Size())) return false; // get the nth. element, if it exists. - // we can not use the index directly, because PointSet uses a map container, + // 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_TimeStepper->GetPos())->GetPoints()->Begin(); for (int i = 0; i < row; ++i) { ++it; if (it == pointSet->GetPointSet(m_TimeStepper->GetPos())->GetPoints()->End()) return false; } - if (it != pointSet->GetPointSet(m_TimeStepper->GetPos())->GetPoints()->End()) // not at the end, + if (it != pointSet->GetPointSet(m_TimeStepper->GetPos())->GetPoints()->End()) // not at the end, { p = it->Value(); id = it->Index(); return true; } return false; } bool QmitkCorrespondingPointSetsModel::GetModelIndexForPointID(mitk::PointSet::PointIdentifier id, QModelIndex& index, int column) const { if (!m_TimeStepper) return false; mitk::PointSet::Pointer pointSet = NULL; if (column == 0) pointSet = this->CheckForPointSetInNode(m_PointSetNode); else if (column == 1) pointSet = this->CheckForPointSetInNode(m_ReferencePointSetNode); if (!pointSet.IsNull() || !pointSet->GetPointSet(m_TimeStepper->GetPos())) { mitk::PointSet::PointsContainer::Pointer points = pointSet->GetPointSet(m_TimeStepper->GetPos())->GetPoints(); if (!points->IndexExists(id)) 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, column); return true; } idx++; } } return false; // nothing found } bool QmitkCorrespondingPointSetsModel::GetModelIndexForSelectedPoint(QModelIndex& index) const { if (!m_TimeStepper) return false; - mitk::DataNode* dataNode = NULL; + mitk::DataNode* dataNode = NULL; if (this->m_SelectedPointSetIndex == 0) dataNode = this->m_PointSetNode; else if (this->m_SelectedPointSetIndex == 1) dataNode = this->m_ReferencePointSetNode; mitk::PointSet::Pointer pointSet = this->CheckForPointSetInNode(dataNode); if (pointSet.IsNull()) return false; - mitk::PointSet::PointIdentifier selectedID; + mitk::PointSet::PointIdentifier selectedID; selectedID = pointSet->SearchSelectedPoint(m_TimeStepper->GetPos()); return this->GetModelIndexForPointID(selectedID, index, this->m_SelectedPointSetIndex); } void QmitkCorrespondingPointSetsModel::MoveSelectedPointUp() { if (!m_TimeStepper) return; - mitk::DataNode* dataNode = NULL; + mitk::DataNode* dataNode = NULL; if (this->m_SelectedPointSetIndex == 0) dataNode = this->m_PointSetNode; else if (this->m_SelectedPointSetIndex == 1) dataNode = this->m_ReferencePointSetNode; mitk::PointSet::Pointer pointSet = this->CheckForPointSetInNode(dataNode); if (pointSet.IsNull()) return; - mitk::PointSet::PointIdentifier selectedID; + mitk::PointSet::PointIdentifier selectedID; selectedID = pointSet->SearchSelectedPoint(m_TimeStepper->GetPos()); if (selectedID==-1) return; mitk::PointSet::PointType point = pointSet->GetPoint(selectedID, m_TimeStepper->GetPos()); mitk::ScalarType tsInMS = pointSet->GetTimeSlicedGeometry()->TimeStepToMS(m_TimeStepper->GetPos()); mitk::PointOperation* doOp = new mitk::PointOperation(mitk::OpMOVEPOINTUP,tsInMS, pointSet->GetPoint(selectedID, m_TimeStepper->GetPos()), selectedID, true); pointSet->ExecuteOperation(doOp); QAbstractTableModel::reset(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); emit SignalPointSetChanged(); } void QmitkCorrespondingPointSetsModel::MoveSelectedPointDown() { - QModelIndex; + //QModelIndex; if (!m_TimeStepper) return; - mitk::DataNode* dataNode = NULL; + mitk::DataNode* dataNode = NULL; if (this->m_SelectedPointSetIndex == 0) dataNode = this->m_PointSetNode; else if (this->m_SelectedPointSetIndex == 1) dataNode = this->m_ReferencePointSetNode; mitk::PointSet::Pointer pointSet = this->CheckForPointSetInNode(dataNode); if (pointSet.IsNull()) return; - mitk::PointSet::PointIdentifier selectedID; + mitk::PointSet::PointIdentifier selectedID; selectedID = pointSet->SearchSelectedPoint(m_TimeStepper->GetPos()); if (selectedID==-1) return; mitk::ScalarType tsInMS = pointSet->GetTimeSlicedGeometry()->TimeStepToMS(m_TimeStepper->GetPos()); mitk::PointOperation* doOp = new mitk::PointOperation(mitk::OpMOVEPOINTDOWN, tsInMS, pointSet->GetPoint(selectedID, m_TimeStepper->GetPos()), selectedID, true); pointSet->ExecuteOperation(doOp); QAbstractTableModel::reset(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); emit SignalPointSetChanged(); } mitk::PointSet::PointIdentifier QmitkCorrespondingPointSetsModel::SearchSelectedPoint() { if (!m_TimeStepper) return -1; - mitk::DataNode* dataNode = NULL; + mitk::DataNode* dataNode = NULL; if (this->m_SelectedPointSetIndex == 0) dataNode = this->m_PointSetNode; else if (this->m_SelectedPointSetIndex == 1) dataNode = this->m_ReferencePointSetNode; mitk::PointSet::Pointer pointSet = this->CheckForPointSetInNode(dataNode); if (pointSet.IsNull()) return -1; return pointSet->SearchSelectedPoint(m_TimeStepper->GetPos()); } void QmitkCorrespondingPointSetsModel::RemoveSelectedPoint() { if (!m_TimeStepper) return; - mitk::DataNode* dataNode = NULL; + mitk::DataNode* dataNode = NULL; if (this->m_SelectedPointSetIndex == 0){ dataNode = this->m_PointSetNode; } else if (this->m_SelectedPointSetIndex == 1){ dataNode = this->m_ReferencePointSetNode; } if (dataNode == NULL) return; //send a DEL event to pointsetinteractor const mitk::Event* delEvent = new mitk::Event(this->m_MultiWidget->GetRenderWindow1()->GetRenderer(), mitk::Type_KeyPress, mitk::BS_NoButton, mitk::BS_NoButton, mitk::Key_Delete); mitk::StateEvent* delStateEvent = new mitk::StateEvent(mitk::EIDDELETE, delEvent); m_Interactor->HandleEvent(delStateEvent); delete delEvent; delete delStateEvent; QAbstractTableModel::reset(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); emit SignalPointSetChanged(); } void QmitkCorrespondingPointSetsModel::MoveSelectedPoint(mitk::PointSet::PointIdentifier targetID) { if (!m_TimeStepper) return; - mitk::DataNode* dataNode = NULL; + mitk::DataNode* dataNode = NULL; if (this->m_SelectedPointSetIndex == 0) dataNode = this->m_PointSetNode; else if (this->m_SelectedPointSetIndex == 1) dataNode = this->m_ReferencePointSetNode; if (dataNode == NULL) return; mitk::PointSet::Pointer pointSet = this->CheckForPointSetInNode(dataNode); if (pointSet.IsNull()) return; mitk::PointSet::PointIdentifier selectedID; selectedID = pointSet->SearchSelectedPoint(m_TimeStepper->GetPos()); - + if (targetID >= pointSet->GetSize()) targetID = pointSet->GetSize()-1; - + mitk::PointSet::PointsContainer::Iterator it = pointSet->GetPointSet(m_TimeStepper->GetPos())->GetPoints()->Begin(); for (int i=0; iIndex(); if (selectedID<0 || targetID<0) return; int direction = mitk::OpNOTHING; if (selectedID>targetID) direction = mitk::OpMOVEPOINTUP; else if (selectedIDGetTimeSlicedGeometry()->TimeStepToMS(m_TimeStepper->GetPos()); mitk::PointOperation* doOp = new mitk::PointOperation(direction, tsInMS, pointSet->GetPoint(selectedID, m_TimeStepper->GetPos()), selectedID, true); pointSet->ExecuteOperation(doOp); selectedID = pointSet->SearchSelectedPoint(m_TimeStepper->GetPos()); } QAbstractTableModel::reset(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); emit SignalPointSetChanged(); } mitk::PointSet* QmitkCorrespondingPointSetsModel::CheckForPointSetInNode(mitk::DataNode* node) const { if (node != NULL) { mitk::PointSet::Pointer pointSet = dynamic_cast(node->GetData()); if (pointSet.IsNotNull()) return pointSet; } return NULL; } bool QmitkCorrespondingPointSetsModel::QTPropCoordinatesEnabled() const { return this->QTPropShowCoordinates; } void QmitkCorrespondingPointSetsModel::QTPropSetCoordinatesEnabled(bool showCoordinates) { this->QTPropShowCoordinates = showCoordinates; } bool QmitkCorrespondingPointSetsModel::QTPropIdsEnabled() const { return this->QTPropShowIds; } void QmitkCorrespondingPointSetsModel::QTPropSetIdsEnabled(bool showIds) { this->QTPropShowIds = showIds; } std::vector QmitkCorrespondingPointSetsModel::GetPointSetNodes(){ std::vector pointSetNodes; if ( this->m_PointSetNode ) pointSetNodes.push_back(this->m_PointSetNode); if ( this->m_ReferencePointSetNode ) pointSetNodes.push_back(this->m_ReferencePointSetNode); return pointSetNodes; } - + void QmitkCorrespondingPointSetsModel::SetSelectedPointSetIndex(int index) { if (index<-1 || index>1) return; this->m_SelectedPointSetIndex = index; } void QmitkCorrespondingPointSetsModel::ClearSelectedPointSet() { - mitk::DataNode* dataNode = NULL; + mitk::DataNode* dataNode = NULL; if (this->m_SelectedPointSetIndex == 0) dataNode = this->m_PointSetNode; else if (this->m_SelectedPointSetIndex == 1) dataNode = this->m_ReferencePointSetNode; if (dataNode == NULL) return; mitk::PointSet* pointSet = dynamic_cast(dataNode->GetData()); //pointSet->Clear(); mitk::PointSet::PointsContainer::Iterator it; if (this->m_TimeStepper->GetRangeMax()==-1) { - while( !pointSet->IsEmpty(0) ) - { + while( !pointSet->IsEmptyTimeStep(0) ) + { if (pointSet->GetPointSet(0)) { it = pointSet->GetPointSet(0)->GetPoints()->Begin(); pointSet->SetSelectInfo(it->Index(),true, 0); this->RemoveSelectedPoint(); } else { break; } } } else { int oldTimeStep = this->m_TimeStepper->GetPos(); for (int i=0; im_TimeStepper->GetRangeMax(); i++) { this->m_TimeStepper->SetPos(i); - while( !pointSet->IsEmpty(i) ) - { + while( !pointSet->IsEmptyTimeStep(i) ) + { if (pointSet->GetPointSet(i)) { it = pointSet->GetPointSet(i)->GetPoints()->Begin(); pointSet->SetSelectInfo(it->Index(),true, i); this->RemoveSelectedPoint(); } } } this->m_TimeStepper->SetPos(oldTimeStep); } - + QAbstractTableModel::reset(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); emit SignalPointSetChanged(); } void QmitkCorrespondingPointSetsModel::ClearCurrentTimeStep() { if (!m_TimeStepper) return; - mitk::DataNode* dataNode = NULL; + mitk::DataNode* dataNode = NULL; if (this->m_SelectedPointSetIndex == 0) dataNode = this->m_PointSetNode; else if (this->m_SelectedPointSetIndex == 1) dataNode = this->m_ReferencePointSetNode; if (dataNode == NULL) return; mitk::PointSet* pointSet = dynamic_cast(dataNode->GetData()); mitk::PointSet::PointsContainer::Iterator it; - while( !pointSet->IsEmpty(m_TimeStepper->GetPos()) ) - { + while( !pointSet->IsEmptyTimeStep(m_TimeStepper->GetPos()) ) + { it = pointSet->GetPointSet(m_TimeStepper->GetPos())->GetPoints()->Begin(); pointSet->SetSelectInfo(it->Index(),true, m_TimeStepper->GetPos()); this->RemoveSelectedPoint(); } QAbstractTableModel::reset(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); emit SignalPointSetChanged(); } mitk::Stepper::Pointer QmitkCorrespondingPointSetsModel::GetStepper() { return this->m_TimeStepper; } void QmitkCorrespondingPointSetsModel::SetStepper(mitk::Stepper::Pointer stepper) { this->m_TimeStepper = stepper; } int QmitkCorrespondingPointSetsModel::GetSelectedPointSetIndex() { return this->m_SelectedPointSetIndex; } void QmitkCorrespondingPointSetsModel::UpdateSelection(mitk::DataNode* selectedNode) { this->RemoveInteractor(); if(!selectedNode) return; m_Interactor = dynamic_cast(selectedNode->GetInteractor()); if (m_Interactor.IsNull())//if not present, instanciate one m_Interactor = mitk::PointSetInteractor::New("pointsetinteractor", selectedNode); - + //add it to global interaction to activate it mitk::GlobalInteraction::GetInstance()->AddInteractor( m_Interactor ); } void QmitkCorrespondingPointSetsModel::RemoveInteractor() { if (m_Interactor){ mitk::GlobalInteraction::GetInstance()->RemoveInteractor( m_Interactor ); m_Interactor = NULL; } } QmitkStdMultiWidget* QmitkCorrespondingPointSetsModel::GetMultiWidget() { return this->m_MultiWidget; } void QmitkCorrespondingPointSetsModel::SetMultiWidget( QmitkStdMultiWidget* multiWidget ) { this->m_MultiWidget = multiWidget; this->m_TimeStepper = m_MultiWidget->GetTimeNavigationController()->GetTime(); -} \ No newline at end of file +} diff --git a/Modules/QmitkExt/QmitkCorrespondingPointSetsModel.h b/Modules/QmitkExt/QmitkCorrespondingPointSetsModel.h index fb8e988f25..ab177c78a8 100644 --- a/Modules/QmitkExt/QmitkCorrespondingPointSetsModel.h +++ b/Modules/QmitkExt/QmitkCorrespondingPointSetsModel.h @@ -1,175 +1,174 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date$ Version: $Revision$ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #ifndef QMITK_CORRESPONDINGPOINTSETS_MODEL_H_INCLUDED #define QMITK_CORRESPONDINGPOINTSETS_MODEL_H_INCLUDED -#include #include #include #include "QmitkExtExports.h" #include "mitkDataNode.h" #include "mitkPointSet.h" #include #include "QmitkStdMultiWidget.h" class QmitkExt_EXPORT QmitkCorrespondingPointSetsModel : public QAbstractTableModel { Q_OBJECT Q_PROPERTY(bool QTPropShowCoordinates READ QTPropCoordinatesEnabled WRITE QTPropSetCoordinatesEnabled) Q_PROPERTY(bool QTPropShowIds READ QTPropIdsEnabled WRITE QTPropSetIdsEnabled) public: QmitkCorrespondingPointSetsModel( int t = 0, QObject* parent = 0 ); ~QmitkCorrespondingPointSetsModel(); Qt::ItemFlags flags(const QModelIndex& index) const; void UpdateSelection(mitk::DataNode* selectedNode); void RemoveInteractor(); - + // returns PointIdentifier of selected point (-1 if no point is selected) mitk::PointSet::PointIdentifier SearchSelectedPoint(); /// interface of QAbstractTableModel int rowCount( const QModelIndex& parent = QModelIndex() ) const; /// interface of QAbstractTableModel int columnCount( const QModelIndex& parent = QModelIndex() ) const; /// interface of QAbstractTableModel QVariant data(const QModelIndex& index, int role) const; /// interface of QAbstractTableModel QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; /// which point set to work on void SetPointSetNodes( std::vector nodes ); /// which time step to display/model void SetTimeStep(int t); /// which time step to display/model int GetTimeStep() const; /** * \brief 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 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 + * 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 - * \param[in] QModelIndex &index the index for which a point is requested. + * \param[in] QModelIndex &index the index for which a point is requested. The row() part of the index is used to find a corresponding point * \param[out] mitk::Point3D& p If a valid point is found, it will be stored in the p parameter * \param[out] mitk::PointSet::PointIdentifier& id If a valid point is found, the corresponding ID will be stored in id * \return Returns true, if a valid point was found, false otherwise */ bool GetPointForModelIndex( const QModelIndex &index, mitk::PointSet::PointType& p, mitk::PointSet::PointIdentifier& id) const; bool GetPointForModelIndex( int row, int column, mitk::PointSet::PointType& p, mitk::PointSet::PointIdentifier& id) const; /**Documentation * \brief returns a QModelIndex for a given point ID * - * The mitk::PointSet uses a map to store points in an ID<-->Point relation. + * 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. * \param[in] mitk::PointSet::PointIdentifier id The point ID for which the QModelIndex will be created * \param[out] QModelIndex& index if a point with the ID id was found, index will contain a corresponding QModelIndex for that point * \return returns true, if a valid QModelIndex was created, false otherwise */ bool GetModelIndexForPointID(mitk::PointSet::PointIdentifier id, QModelIndex& index, int column) const; bool QTPropCoordinatesEnabled() const; void QTPropSetCoordinatesEnabled(bool qShowCoordinates); bool QTPropIdsEnabled() const; void QTPropSetIdsEnabled(bool qShowIds); std::vector GetPointSetNodes(); void SetSelectedPointSetIndex(int index); int GetSelectedPointSetIndex(); void ClearSelectedPointSet(); void MoveSelectedPointUp(); void MoveSelectedPointDown(); void RemoveSelectedPoint(); void ClearCurrentTimeStep(); void SetStepper(mitk::Stepper::Pointer stepper); mitk::Stepper::Pointer GetStepper(); Qt::DropActions supportedDropActions() const; bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); bool GetModelIndexForSelectedPoint(QModelIndex& index) const; void SetMultiWidget( QmitkStdMultiWidget* multiWidget ); ///< assign a QmitkStdMultiWidget for updating render window crosshair QmitkStdMultiWidget* GetMultiWidget(); ///< return the QmitkStdMultiWidget that is used for updating render window crosshair void OnPointSetChanged( const itk::EventObject & e ); private: public slots: signals: void SignalPointSetChanged(); protected: //initially checks if there is a PointSet as data in the DataNode. //returns PointSet if so and NULL if other data is set to node mitk::PointSet* CheckForPointSetInNode(mitk::DataNode* node) const; protected: - + bool QTPropShowIds; bool QTPropShowCoordinates; mitk::DataNode::Pointer m_PointSetNode; mitk::DataNode::Pointer m_ReferencePointSetNode; mitk::Stepper::Pointer m_TimeStepper; int m_SelectedPointSetIndex; mitk::PointSetInteractor::Pointer m_Interactor; QmitkStdMultiWidget* m_MultiWidget; unsigned long m_PointSetModifiedObserverTag; unsigned long m_ReferencePointSetModifiedObserverTag; void MoveSelectedPoint(mitk::PointSet::PointIdentifier targetID); void RemoveObservers(); void AddObservers(); }; #endif diff --git a/Modules/QmitkExt/QmitkCorrespondingPointSetsView.cpp b/Modules/QmitkExt/QmitkCorrespondingPointSetsView.cpp index 20ad6ff2ab..aa395c7f86 100644 --- a/Modules/QmitkExt/QmitkCorrespondingPointSetsView.cpp +++ b/Modules/QmitkExt/QmitkCorrespondingPointSetsView.cpp @@ -1,508 +1,507 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date$ Version: $Revision$ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #include "QmitkCorrespondingPointSetsView.h" #include "QmitkCorrespondingPointSetsModel.h" #include "QmitkStdMultiWidget.h" #include "QmitkEditPointDialog.h" #include "mitkRenderingManager.h" #include #include #include #include #include #include #include -#include #include #include #include QmitkCorrespondingPointSetsView::QmitkCorrespondingPointSetsView( QWidget* parent ) :QTableView( parent ), m_CorrespondingPointSetsModel( new QmitkCorrespondingPointSetsModel() ), m_SelfCall( false ), m_swapPointSets(false), m_addPointsMode(false), m_DataStorage( NULL ) { m_CorrespondingPointSetsModel->setProperty("QTPropShowCoordinates", true); m_CorrespondingPointSetsModel->setProperty("QTPropShowIds", true); this->setContextMenuPolicy(Qt::CustomContextMenu); this->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); this->setToolTip("Use right click to open context menu"); this->setDragEnabled(true); this->setAcceptDrops(true); this->setDropIndicatorShown(true); this->setDragDropMode(QAbstractItemView::InternalMove); QTableView::setAlternatingRowColors( false ); QTableView::setSelectionBehavior( QAbstractItemView::SelectItems ); QTableView::setSelectionMode( QAbstractItemView::SingleSelection ); QTableView::setModel( m_CorrespondingPointSetsModel ); QTableView::horizontalHeader()->resizeSection(0, (int)(this->width()/3.5)); QTableView::horizontalHeader()->setStretchLastSection(true); m_TimeStepFaderLabel = new QLabel(this); QFont font("Arial", 17); m_TimeStepFaderLabel->setFont(font); //connect connect( QTableView::selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(OnPointSelectionChanged(const QItemSelection& , const QItemSelection&)) ); connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(ctxMenu(const QPoint &))); - + connect(this->m_CorrespondingPointSetsModel, SIGNAL(SignalPointSetChanged()), this, SLOT(UpdateSelectionHighlighting())); } QmitkCorrespondingPointSetsView::~QmitkCorrespondingPointSetsView() { delete m_CorrespondingPointSetsModel; } void QmitkCorrespondingPointSetsView::SetPointSetNodes( std::vector nodes ) { if ( !this->m_swapPointSets || nodes.size()<2 ) m_CorrespondingPointSetsModel->SetPointSetNodes( nodes ); else { std::vector reverseNodes; reverseNodes.push_back(nodes.back()); reverseNodes.push_back(nodes.front()); m_CorrespondingPointSetsModel->SetPointSetNodes( reverseNodes ); } } void QmitkCorrespondingPointSetsView::SetMultiWidget( QmitkStdMultiWidget* multiWidget ) { this->m_CorrespondingPointSetsModel->SetMultiWidget(multiWidget); } QmitkStdMultiWidget* QmitkCorrespondingPointSetsView::GetMultiWidget() const { return this->m_CorrespondingPointSetsModel->GetMultiWidget(); } void QmitkCorrespondingPointSetsView::SetDataStorage(mitk::DataStorage::Pointer dataStorage) { m_DataStorage = dataStorage; } void QmitkCorrespondingPointSetsView::OnPointSelectionChanged(const QItemSelection& selected, const QItemSelection& /*deselected*/) { if(m_SelfCall) return; std::vector pointSetNodes = this->GetPointSetNodes(); QModelIndexList selectedIndexes = selected.indexes(); m_CorrespondingPointSetsModel->SetSelectedPointSetIndex(-1); if (selectedIndexes.size() > 0) { QModelIndex index = selectedIndexes.front(); mitk::DataNode* pointSetNode = NULL; mitk::PointSet* pointSet = NULL; if (index.column() == 0) { pointSetNode = pointSetNodes.front(); } else { pointSetNode = pointSetNodes.back(); } if (pointSetNode) { this->m_CorrespondingPointSetsModel->UpdateSelection(pointSetNode); pointSet = dynamic_cast(pointSetNode->GetData()); if( pointSet->GetPointSet(m_CorrespondingPointSetsModel->GetTimeStep())) for (mitk::PointSet::PointsContainer::Iterator it = pointSet->GetPointSet(m_CorrespondingPointSetsModel->GetTimeStep())->GetPoints()->Begin(); it != pointSet->GetPointSet(m_CorrespondingPointSetsModel->GetTimeStep())->GetPoints()->End(); ++it) { QModelIndex tempIndex; if (m_CorrespondingPointSetsModel->GetModelIndexForPointID(it->Index(), tempIndex, index.column())) { if (tempIndex == index) { pointSet->SetSelectInfo(it->Index(), true, m_CorrespondingPointSetsModel->GetTimeStep()); - + m_CorrespondingPointSetsModel->SetSelectedPointSetIndex(index.column()); if ( this->GetMultiWidget() != NULL) { this->GetMultiWidget()->MoveCrossToPosition(pointSet->GetPoint(it->Index(), m_CorrespondingPointSetsModel->GetTimeStep())); } } else { pointSet->SetSelectInfo(it->Index(), false, m_CorrespondingPointSetsModel->GetTimeStep()); } } } } } emit(SignalPointSelectionChanged()); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); this->UpdateSelectionHighlighting(); m_SelfCall = false; } void QmitkCorrespondingPointSetsView::keyPressEvent( QKeyEvent * e ) { int key = e->key(); switch (key) { case Qt::Key_F2: m_CorrespondingPointSetsModel->MoveSelectedPointUp(); break; case Qt::Key_F3: m_CorrespondingPointSetsModel->MoveSelectedPointDown(); break; case Qt::Key_Delete: m_CorrespondingPointSetsModel->RemoveSelectedPoint(); break; default: break; } } void QmitkCorrespondingPointSetsView::wheelEvent(QWheelEvent *event) { if (!this->m_CorrespondingPointSetsModel->GetStepper()) return; int whe = event->delta(); int pos = this->m_CorrespondingPointSetsModel->GetStepper()->GetPos(); int currentTS = this->m_CorrespondingPointSetsModel->GetTimeStep(); if(whe > 0) { this->m_CorrespondingPointSetsModel->SetTimeStep(++currentTS); this->m_CorrespondingPointSetsModel->GetStepper()->SetPos(++pos); } else if( pos > 0 ) { this->m_CorrespondingPointSetsModel->SetTimeStep(--currentTS); this->m_CorrespondingPointSetsModel->GetStepper()->SetPos(--pos); } fadeTimeStepIn(); emit SignalPointSelectionChanged(); } void QmitkCorrespondingPointSetsView::fadeTimeStepIn() { if (!this->m_CorrespondingPointSetsModel->GetStepper()) return; QWidget *m_TimeStepFader = new QWidget(this); QHBoxLayout *layout = new QHBoxLayout(m_TimeStepFader); int x = (int)(this->geometry().x()+this->width()*0.75); int y = (int)(this->geometry().y()+this->height()*0.75); m_TimeStepFader->move(x,y); m_TimeStepFader->resize(60, 55); m_TimeStepFader->setLayout(layout); m_TimeStepFader->setAttribute(Qt::WA_DeleteOnClose); layout->addWidget(m_TimeStepFaderLabel); m_TimeStepFaderLabel->setAlignment(Qt::AlignCenter); m_TimeStepFaderLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); m_TimeStepFaderLabel->setLineWidth(2); m_TimeStepFaderLabel->setText(QString("%1").arg(this->m_CorrespondingPointSetsModel->GetStepper()->GetPos())); //give the widget opacity and some colour QPalette pal = m_TimeStepFaderLabel->palette(); QColor semiTransparentColor(139, 192, 223, 50); QColor labelTransparentColor(0,0,0,200); pal.setColor(m_TimeStepFaderLabel->backgroundRole(), semiTransparentColor); pal.setColor(m_TimeStepFaderLabel->foregroundRole(), labelTransparentColor); m_TimeStepFaderLabel->setAutoFillBackground(true); m_TimeStepFaderLabel->setPalette(pal); //show the widget m_TimeStepFader->show(); //and start the timer m_TimeStepFaderLabel->setVisible(true); QTimer::singleShot(2000, this, SLOT(fadeTimeStepOut())); } void QmitkCorrespondingPointSetsView::fadeTimeStepOut() { m_TimeStepFaderLabel->hide(); } void QmitkCorrespondingPointSetsView::ctxMenu(const QPoint &pos) { QMenu *menu = new QMenu; int x = pos.x(); int y = pos.y(); int row = QTableView::rowAt(y); int col = QTableView::columnAt(x); int numNodes = this->GetPointSetNodes().size(); //add delete point action mitk::PointSet::PointsContainer::ElementIdentifier id; mitk::PointSet::PointType p; bool pointSelected = m_CorrespondingPointSetsModel->GetPointForModelIndex(row, col, p, id); - + QAction *movePointUp = new QAction(this); movePointUp->setText("Move point up"); connect(movePointUp, SIGNAL(triggered()), this, SLOT(MoveSelectedPointUp())); if(!pointSelected) movePointUp->setEnabled(false); menu->addAction(movePointUp); QAction *movePointDown = new QAction(this); movePointDown->setText("Move point down"); connect(movePointDown, SIGNAL(triggered()), this, SLOT(MoveSelectedPointDown())); if(!pointSelected) movePointDown->setEnabled(false); menu->addAction(movePointDown); QAction *delPoint = new QAction(this); delPoint->setText("Delete point"); connect(delPoint, SIGNAL(triggered()), this, SLOT(RemoveSelectedPoint())); if(!pointSelected) delPoint->setEnabled(false); menu->addAction(delPoint); QAction *separator = new QAction(this); separator->setSeparator(true); menu->addSeparator(); QAction *clearTS = new QAction(this); clearTS->setText("Clear time step"); connect(clearTS, SIGNAL(triggered()), this, SLOT(ClearCurrentTimeStep())); if(numNodes==0 || col!=0 && col!=1) clearTS->setEnabled(false); menu->addAction(clearTS); QAction *clearList = new QAction(this); clearList->setText("Clear point set"); connect(clearList, SIGNAL(triggered()), this, SLOT(ClearSelectedPointSet())); if(numNodes==0 || col!=0 && col!=1) clearList->setEnabled(false); menu->addAction(clearList); - + menu->addSeparator(); QAction *swapSets = new QAction(this); swapSets->setText("Swap point sets"); connect(swapSets, SIGNAL(triggered(bool)), this, SLOT(SwapPointSets(bool))); swapSets->setCheckable(true); swapSets->setChecked(m_swapPointSets); if (numNodes<2) swapSets->setEnabled(false); menu->addAction(swapSets); QAction *addPoints = new QAction(this); addPoints->setText("Check to add new points"); connect(addPoints, SIGNAL(triggered(bool)), this, SLOT(AddPointsMode(bool))); addPoints->setCheckable(true); addPoints->setChecked(m_addPointsMode); if (numNodes==0) addPoints->setEnabled(false); menu->addAction(addPoints); QAction *addPointSet = new QAction(this); addPointSet->setText("Create new point set"); connect(addPointSet, SIGNAL(triggered()), this, SLOT(AddPointSet())); if (!m_DataStorage) addPointSet->setEnabled(false); menu->addAction(addPointSet); menu->exec(this->mapToGlobal(pos)); } std::vector QmitkCorrespondingPointSetsView::GetPointSetNodes(){ return this->m_CorrespondingPointSetsModel->GetPointSetNodes(); } std::vector QmitkCorrespondingPointSetsView::GetPointSets(){ std::vector pointSetNodes = GetPointSetNodes(); std::vector pointSets; std::vector::iterator it; for ( it = pointSetNodes.begin(); it < pointSetNodes.end(); it++ ) { mitk::PointSet* pointSet = NULL; pointSet = dynamic_cast ( dynamic_cast(*it)->GetData() ); if ( pointSet != NULL ) pointSets.push_back(pointSet); } return pointSets; } void QmitkCorrespondingPointSetsView::RemoveSelectedPoint() { this->m_CorrespondingPointSetsModel->RemoveSelectedPoint(); emit(SignalPointSelectionChanged()); } void QmitkCorrespondingPointSetsView::MoveSelectedPointDown() { this->m_CorrespondingPointSetsModel->MoveSelectedPointDown(); } void QmitkCorrespondingPointSetsView::MoveSelectedPointUp() { this->m_CorrespondingPointSetsModel->MoveSelectedPointUp(); } void QmitkCorrespondingPointSetsView::ClearSelectedPointSet() { switch( QMessageBox::question( this, tr("Clear point set"), tr("Remove all points from the right clicked list?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) { case QMessageBox::Yes: { this->m_CorrespondingPointSetsModel->ClearSelectedPointSet(); break; } case QMessageBox::No: break; default: break; } emit(SignalPointSelectionChanged()); } void QmitkCorrespondingPointSetsView::ClearCurrentTimeStep() { switch( QMessageBox::question( this, tr("Clear time step"), tr("Remove points from current time step of the right clicked list?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) { case QMessageBox::Yes: { this->m_CorrespondingPointSetsModel->ClearCurrentTimeStep(); break; } case QMessageBox::No: break; default: break; } emit(SignalPointSelectionChanged()); } void QmitkCorrespondingPointSetsView::SwapPointSets(bool checked) { m_swapPointSets = checked; if ( !checked ) { std::vector nodes = this->GetPointSetNodes(); std::vector reverseNodes; reverseNodes.push_back(nodes.back()); reverseNodes.push_back(nodes.front()); this->SetPointSetNodes( reverseNodes ); } else this->SetPointSetNodes(this->GetPointSetNodes()); m_CorrespondingPointSetsModel->SetSelectedPointSetIndex((m_CorrespondingPointSetsModel->GetSelectedPointSetIndex()+1)%2); this->UpdateSelectionHighlighting(); } void QmitkCorrespondingPointSetsView::AddPointsMode(bool checked) { m_addPointsMode = checked; std::vector pointSetNodes = this->GetPointSetNodes(); std::vector::iterator it; bool selected = false; if (checked) { for ( it = pointSetNodes.begin(); it < pointSetNodes.end(); it++ ) { mitk::DataNode* dataNode = dynamic_cast(*it); dataNode->GetPropertyValue("selected", selected); if (selected) { this->UpdateSelection(dataNode); break; } } } else { this->m_CorrespondingPointSetsModel->RemoveInteractor(); } m_addPointsMode = selected; emit SignalAddPointsModeChanged(selected); } void QmitkCorrespondingPointSetsView::UpdateSelection(mitk::DataNode* selectedNode) { this->m_CorrespondingPointSetsModel->UpdateSelection(selectedNode); } void QmitkCorrespondingPointSetsView::AddPointSet() { //Ask for the name of the point set bool ok = false; QString name = QInputDialog::getText( QApplication::activeWindow() , "Add point set...", "Enter name for the new point set", QLineEdit::Normal, "PointSet", &ok ); if ( ! ok || name.isEmpty() ) return; // //Create a new empty pointset // mitk::PointSet::Pointer pointSet = mitk::PointSet::New(); // // Create a new data tree node // mitk::DataNode::Pointer pointSetNode = mitk::DataNode::New(); // // fill the data tree node with the appropriate information // pointSetNode->SetData( pointSet ); pointSetNode->SetProperty( "name", mitk::StringProperty::New( name.toStdString() ) ); pointSetNode->SetProperty( "opacity", mitk::FloatProperty::New( 1 ) ); pointSetNode->SetColor( 1.0, 1.0, 0.0 ); // // add the node to the ds // this->m_DataStorage->Add(pointSetNode); } bool QmitkCorrespondingPointSetsView::IsPointSelected() { if ( this->m_CorrespondingPointSetsModel->GetSelectedPointSetIndex()>=0 ) return true; return false; } QmitkCorrespondingPointSetsModel* QmitkCorrespondingPointSetsView::GetModel() { return this->m_CorrespondingPointSetsModel; } void QmitkCorrespondingPointSetsView::UpdateSelectionHighlighting() { this->m_SelfCall = true; QModelIndex index; bool modelIndexOkay = this->m_CorrespondingPointSetsModel->GetModelIndexForSelectedPoint(index); if(!modelIndexOkay){ this->m_SelfCall = false; return; } QTableView::selectionModel()->select( index , QItemSelectionModel::ClearAndSelect ); this->setFocus(); this->m_SelfCall = false; -} \ No newline at end of file +} diff --git a/Modules/QmitkExt/QmitkCorrespondingPointSetsWidget.h b/Modules/QmitkExt/QmitkCorrespondingPointSetsWidget.h index 657e7d81f7..a4bededa07 100644 --- a/Modules/QmitkExt/QmitkCorrespondingPointSetsWidget.h +++ b/Modules/QmitkExt/QmitkCorrespondingPointSetsWidget.h @@ -1,118 +1,117 @@ #ifndef QmitkCorrespondingPointSetsWidget_H #define QmitkCorrespondingPointSetsWidget_H #include #include #include "QmitkExtExports.h" #include #include #include #include - - +#include #include /*! * \brief Widget for regular operations on two point sets * * Displays two sets of point coordinates, buttons and a context menu to enable modifications to the point sets * * \li creation of new point sets * \li adding/removing points * \li move points * \li clear all points from a set * \li clear all points in one time step of one set * * The user/application module of this widget needs to - * assign two visible point sets to the widget - * (via SetPointSetNodes(std::vector nodes)), - * preferrably by passing all visible data nodes contained - * in the data storage to the widget every time + * assign two visible point sets to the widget + * (via SetPointSetNodes(std::vector nodes)), + * preferrably by passing all visible data nodes contained + * in the data storage to the widget every time * DataStorageChanged() is called. * * The user/application module of this widget needs to - * assign one selected point set to the widget - * (via UpdateSelection(mitk::DataNode* selectedNode)), - * preferrably by passing the selected data node contained - * in the data storage to the widget every time + * assign one selected point set to the widget + * (via UpdateSelection(mitk::DataNode* selectedNode)), + * preferrably by passing the selected data node contained + * in the data storage to the widget every time * OnSelectionChanged() is called. * * The user/application module of this widget needs to - * assign a QmitkStdMultiWidget and a mitk::DataStorage + * assign a QmitkStdMultiWidget and a mitk::DataStorage * to the widget (via SetMultiWidget and SetDataStorage). */ class QmitkExt_EXPORT QmitkCorrespondingPointSetsWidget : public QWidget { Q_OBJECT Q_PROPERTY(bool QTPropShowButtonBar READ QTPropButtonBarEnabled WRITE QTPropSetButtonBarEnabled) public: QmitkCorrespondingPointSetsWidget(QWidget *parent = 0); ~QmitkCorrespondingPointSetsWidget(); /// calls SetPointSetNodes of the according QmitkCorrespondingPointSetsView void SetPointSetNodes(std::vector nodes); /// returns the point set nodes contained in the table model /// calls GetPointSetNodes of the according QmitkCorrespondingPointSetsView std::vector GetPointSetNodes(); /// calls SetMultiWidget of the according QmitkCorrespondingPointSetsView void SetMultiWidget(QmitkStdMultiWidget* multiWidget); /// calls SetDataStorage of the according QmitkCorrespondingPointSetsView void SetDataStorage(mitk::DataStorage::Pointer dataStorage); /// calls UpdateSelection of the according QmitkCorrespondingPointSetsView void UpdateSelection(mitk::DataNode* selectedNode); /// returns the qt property which indicates an activated/deactivated button bar below the table bool QTPropButtonBarEnabled() const; /// sets the qt property which activates/deactivates the button bar below the table void QTPropSetButtonBarEnabled(bool showBB); signals: protected slots: /// enables/disables buttons if a/no point is selected void OnPointSelectionChanged(); - + /// add new point set to data manager void AddPointSet(); /// enable if new points should be a added void AddPointsMode(bool checked); - + void RemoveSelectedPoint(); void MoveSelectedPointDown(); - + void MoveSelectedPointUp(); /// toggles m_AddPointsBtn checked state void OnAddPointsModeChanged(bool enabled); /// swap the two table columns columns void SwapPointSets(bool checked); protected: void SetupUi(); bool QTPropShowButtonBar; QmitkCorrespondingPointSetsView* m_CorrespondingPointSetsView; QToolButton* m_CreatePointSetBtn; QToolButton* m_MovePointUpBtn; QToolButton* m_MovePointDownBtn; QToolButton* m_RemovePointBtn; QToolButton* m_AddPointsBtn; QToolButton* m_SwapSetsBtn; }; #endif diff --git a/Modules/QmitkExt/files.cmake b/Modules/QmitkExt/files.cmake index a2a8dae4c0..3f117178b0 100644 --- a/Modules/QmitkExt/files.cmake +++ b/Modules/QmitkExt/files.cmake @@ -1,253 +1,253 @@ SET(CPP_FILES QmitkApplicationBase/QmitkCommonFunctionality.cpp #QmitkModels/QmitkDataStorageListModel.cpp #QmitkModels/QmitkPropertiesTableModel.cpp #QmitkModels/QmitkDataStorageTreeModel.cpp #QmitkModels/QmitkDataStorageTableModel.cpp #QmitkModels/QmitkPropertyDelegate.cpp #QmitkModels/QmitkPointListModel.cpp #QmitkAlgorithmFunctionalityComponent.cpp #QmitkBaseAlgorithmComponent.cpp QmitkAboutDialog/QmitkAboutDialog.cpp #QmitkFunctionalityComponents/QmitkSurfaceCreatorComponent.cpp #QmitkFunctionalityComponents/QmitkPixelGreyValueManipulatorComponent.cpp #QmitkFunctionalityComponents/QmitkConnectivityFilterComponent.cpp #QmitkFunctionalityComponents/QmitkImageCropperComponent.cpp #QmitkFunctionalityComponents/QmitkSeedPointSetComponent.cpp #QmitkFunctionalityComponents/QmitkSurfaceTransformerComponent.cpp QmitkPropertyObservers/QmitkBasePropertyView.cpp QmitkPropertyObservers/QmitkBoolPropertyWidget.cpp QmitkPropertyObservers/QmitkColorPropertyEditor.cpp QmitkPropertyObservers/QmitkColorPropertyView.cpp QmitkPropertyObservers/QmitkEnumerationPropertyWidget.cpp QmitkPropertyObservers/QmitkNumberPropertyEditor.cpp QmitkPropertyObservers/QmitkNumberPropertyView.cpp QmitkPropertyObservers/QmitkPropertyViewFactory.cpp QmitkPropertyObservers/QmitkStringPropertyEditor.cpp QmitkPropertyObservers/QmitkStringPropertyOnDemandEdit.cpp QmitkPropertyObservers/QmitkStringPropertyView.cpp QmitkPropertyObservers/QmitkNumberPropertySlider.cpp QmitkPropertyObservers/QmitkUGCombinedRepresentationPropertyWidget.cpp qclickablelabel.cpp #QmitkAbortEventFilter.cpp # QmitkApplicationCursor.cpp QmitkCallbackFromGUIThread.cpp QmitkEditPointDialog.cpp QmitkExtRegisterClasses.cpp QmitkFileChooser.cpp # QmitkRenderingManager.cpp # QmitkRenderingManagerFactory.cpp # QmitkRenderWindow.cpp # QmitkEventAdapter.cpp QmitkFloatingPointSpanSlider.cpp QmitkColorTransferFunctionCanvas.cpp QmitkSlicesInterpolator.cpp QmitkStandardViews.cpp QmitkStepperAdapter.cpp # QmitkLineEditLevelWindowWidget.cpp # mitkSliderLevelWindowWidget.cpp # QmitkLevelWindowWidget.cpp # QmitkPointListWidget.cpp # QmitkPointListView.cpp QmitkPiecewiseFunctionCanvas.cpp QmitkSliderNavigatorWidget.cpp QmitkTransferFunctionCanvas.cpp QmitkCrossWidget.cpp #QmitkLevelWindowRangeChangeDialog.cpp #QmitkLevelWindowPresetDefinitionDialog.cpp # QmitkLevelWindowWidgetContextMenu.cpp QmitkSliceWidget.cpp # QmitkStdMultiWidget.cpp QmitkTransferFunctionWidget.cpp QmitkTransferFunctionGeneratorWidget.cpp QmitkSelectableGLWidget.cpp QmitkToolReferenceDataSelectionBox.cpp QmitkToolWorkingDataSelectionBox.cpp QmitkToolGUIArea.cpp QmitkToolSelectionBox.cpp # QmitkPropertyListPopup.cpp QmitkToolGUI.cpp QmitkNewSegmentationDialog.cpp QmitkPaintbrushToolGUI.cpp QmitkDrawPaintbrushToolGUI.cpp QmitkErasePaintbrushToolGUI.cpp QmitkBinaryThresholdToolGUI.cpp QmitkCalculateGrayValueStatisticsToolGUI.cpp QmitkCopyToClipBoardDialog.cpp # QmitkMaterialEditor.cpp # QmitkMaterialShowcase.cpp # QmitkPropertiesTableEditor.cpp QmitkPrimitiveMovieNavigatorWidget.cpp # QmitkDataStorageComboBox.cpp QmitkHistogram.cpp QmitkHistogramWidget.cpp QmitkPlotWidget.cpp QmitkPlotDialog.cpp QmitkPointListModel.cpp QmitkPointListView.cpp QmitkPointListWidget.cpp QmitkPointListViewWidget.cpp - #QmitkCorrespondingPointSetsView.cpp - #QmitkCorrespondingPointSetsModel.cpp - #QmitkCorrespondingPointSetsWidget.cpp + QmitkCorrespondingPointSetsView.cpp + QmitkCorrespondingPointSetsModel.cpp + QmitkCorrespondingPointSetsWidget.cpp QmitkVideoBackground.cpp QmitkHotkeyLineEdit.cpp QmitkErodeToolGUI.cpp QmitkDilateToolGUI.cpp QmitkMorphologicToolGUI.cpp QmitkOpeningToolGUI.cpp QmitkClosingToolGUI.cpp QmitkBinaryThresholdULToolGUI.cpp QmitkPixelManipulationToolGUI.cpp QmitkRegionGrow3DToolGUI.cpp QmitkToolRoiDataSelectionBox.cpp QmitkBoundingObjectWidget.cpp ) IF ( NOT ${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}.${VTK_BUILD_VERSION} VERSION_LESS 5.4.0 ) SET(CPP_FILES ${CPP_FILES} QmitkVtkHistogramWidget.cpp QmitkVtkLineProfileWidget.cpp ) ENDIF() IF (NOT APPLE) SET(CPP_FILES ${CPP_FILES} QmitkBaseComponent.cpp QmitkBaseFunctionalityComponent.cpp QmitkFunctionalityComponentContainer.cpp QmitkFunctionalityComponents/QmitkThresholdComponent.cpp - + ) ENDIF() QT4_ADD_RESOURCES(CPP_FILES resources/QmitkResources.qrc) SET(MOC_H_FILES QmitkPropertyObservers/QmitkBasePropertyView.h QmitkPropertyObservers/QmitkBoolPropertyWidget.h QmitkPropertyObservers/QmitkColorPropertyEditor.h QmitkPropertyObservers/QmitkColorPropertyView.h QmitkPropertyObservers/QmitkEnumerationPropertyWidget.h QmitkPropertyObservers/QmitkNumberPropertyEditor.h QmitkPropertyObservers/QmitkNumberPropertyView.h QmitkPropertyObservers/QmitkStringPropertyEditor.h QmitkPropertyObservers/QmitkStringPropertyOnDemandEdit.h QmitkPropertyObservers/QmitkStringPropertyView.h QmitkPropertyObservers/QmitkNumberPropertySlider.h QmitkPropertyObservers/QmitkUGCombinedRepresentationPropertyWidget.h # QmitkFunctionalityComponents/QmitkSurfaceCreatorComponent.h #QmitkFunctionalityComponents/QmitkPixelGreyValueManipulatorComponent.h # QmitkFunctionalityComponents/QmitkConnectivityFilterComponent.h # QmitkFunctionalityComponents/QmitkImageCropperComponent.h # QmitkFunctionalityComponents/QmitkSeedPointSetComponent.h # QmitkFunctionalityComponents/QmitkSurfaceTransformerComponent.h qclickablelabel.h QmitkCallbackFromGUIThread.h QmitkEditPointDialog.h #QmitkAlgorithmFunctionalityComponent.h #QmitkBaseAlgorithmComponent.h QmitkStandardViews.h QmitkStepperAdapter.h QmitkSliderNavigatorWidget.h QmitkSliceWidget.h QmitkSlicesInterpolator.h QmitkColorTransferFunctionCanvas.h QmitkPiecewiseFunctionCanvas.h QmitkTransferFunctionCanvas.h QmitkFloatingPointSpanSlider.h QmitkCrossWidget.h QmitkTransferFunctionWidget.h QmitkTransferFunctionGeneratorWidget.h QmitkToolGUIArea.h QmitkToolGUI.h QmitkToolReferenceDataSelectionBox.h QmitkToolWorkingDataSelectionBox.h QmitkToolSelectionBox.h # QmitkPropertyListPopup.h #QmitkSelectableGLWidget.h QmitkNewSegmentationDialog.h QmitkPaintbrushToolGUI.h QmitkDrawPaintbrushToolGUI.h QmitkErasePaintbrushToolGUI.h QmitkBinaryThresholdToolGUI.h QmitkCalculateGrayValueStatisticsToolGUI.h QmitkCopyToClipBoardDialog.h QmitkPrimitiveMovieNavigatorWidget.h QmitkPointListModel.h QmitkPointListView.h QmitkPointListWidget.h QmitkPointListViewWidget.h - #QmitkCorrespondingPointSetsView.h - #QmitkCorrespondingPointSetsModel.h - #QmitkCorrespondingPointSetsWidget.h + QmitkCorrespondingPointSetsView.h + QmitkCorrespondingPointSetsModel.h + QmitkCorrespondingPointSetsWidget.h QmitkHistogramWidget.h QmitkVideoBackground.h QmitkFileChooser.h QmitkHotkeyLineEdit.h QmitkAboutDialog/QmitkAboutDialog.h QmitkErodeToolGUI.h QmitkDilateToolGUI.h QmitkMorphologicToolGUI.h QmitkOpeningToolGUI.h QmitkClosingToolGUI.h QmitkBinaryThresholdULToolGUI.h QmitkPixelManipulationToolGUI.h QmitkRegionGrow3DToolGUI.h QmitkToolRoiDataSelectionBox.h QmitkBoundingObjectWidget.h ) IF ( NOT ${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}.${VTK_BUILD_VERSION} VERSION_LESS 5.4.0 ) SET(MOC_H_FILES ${MOC_H_FILES} QmitkVtkHistogramWidget.h QmitkVtkLineProfileWidget.h ) ENDIF() IF (NOT APPLE) SET(MOC_H_FILES ${MOC_H_FILES} QmitkBaseComponent.h QmitkBaseFunctionalityComponent.h QmitkFunctionalityComponentContainer.h QmitkFunctionalityComponents/QmitkThresholdComponent.h ) ENDIF() SET(UI_FILES QmitkSliderNavigator.ui # QmitkLevelWindowRangeChange.ui # QmitkLevelWindowPresetDefinition.ui # QmitkLevelWindowWidget.ui QmitkSliceWidget.ui QmitkTransferFunctionWidget.ui QmitkTransferFunctionGeneratorWidget.ui QmitkSelectableGLWidget.ui QmitkPrimitiveMovieNavigatorWidget.ui QmitkFunctionalityComponentContainerControls.ui QmitkFunctionalityComponents/QmitkThresholdComponentControls.ui QmitkAboutDialog/QmitkAboutDialogGUI.ui ) SET(QRC_FILES QmitkExt.qrc )