00001 #include "QmitkPointListWidget.h"
00002 #include <mitkGlobalInteraction.h>
00003 #include <mitkPointSetReader.h>
00004 #include <mitkPointSetWriter.h>
00005
00006 #include <QHBoxLayout>
00007 #include <QFileDialog>
00008 #include <QMessageBox>
00009 #include <QDir>
00010
00011 #include "btnLoad.xpm"
00012 #include "btnSave.xpm"
00013 #include "btnClear.xpm"
00014 #include "btnSetPoints.xpm"
00015 #include "btnUp.xpm"
00016 #include "btnDown.xpm"
00017
00018
00019
00020 QmitkPointListWidget::QmitkPointListWidget(QWidget *parent, int orientation):
00021 QWidget(parent), m_PointListView(NULL), m_MultiWidget(NULL), m_PointSetNode(NULL), m_Orientation(0), m_MovePointUpBtn(NULL),
00022 m_MovePointDownBtn(NULL), m_RemovePointBtn(NULL), m_SavePointsBtn(NULL), m_LoadPointsBtn(NULL), m_ToggleAddPoint(NULL),
00023 m_Interactor(NULL), m_TimeStep(0), m_EditAllowed(true), m_NodeObserverTag(0)
00024 {
00025 m_PointListView = new QmitkPointListView();
00026
00027 if(orientation != 0)
00028 m_Orientation = orientation;
00029
00030 SetupUi();
00031 SetupConnections();
00032 ObserveNewNode(NULL);
00033
00034 }
00035
00036 QmitkPointListWidget::~QmitkPointListWidget()
00037 {
00038 if (m_Interactor)
00039 mitk::GlobalInteraction::GetInstance()->RemoveInteractor( m_Interactor );
00040 m_Interactor = NULL;
00041
00042 if(m_PointSetNode && m_NodeObserverTag)
00043 {
00044 m_PointSetNode->RemoveObserver(m_NodeObserverTag);
00045 m_NodeObserverTag = 0;
00046 }
00047
00048 m_MultiWidget = NULL;
00049 delete m_PointListView;
00050 }
00051
00052
00053 void QmitkPointListWidget::SetupConnections()
00054 {
00055
00056
00057 connect(this->m_LoadPointsBtn, SIGNAL(clicked()), this, SLOT(OnBtnLoadPoints()));
00058 connect(this->m_SavePointsBtn, SIGNAL(clicked()), this, SLOT(OnBtnSavePoints()));
00059 connect(this->m_MovePointUpBtn, SIGNAL(clicked()), this, SLOT(MoveSelectedPointUp()));
00060 connect(this->m_MovePointDownBtn, SIGNAL(clicked()), this, SLOT(MoveSelectedPointDown()));
00061 connect(this->m_RemovePointBtn, SIGNAL(clicked()), this, SLOT(RemoveSelectedPoint()));
00062 connect(this->m_ToggleAddPoint, SIGNAL(toggled(bool)), this, SLOT(OnBtnAddPoint(bool)));
00063 connect(this->m_PointListView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(OnListDoubleClick()));
00064 }
00065
00066 void QmitkPointListWidget::SetupUi()
00067 {
00068
00069
00070 m_ToggleAddPoint = new QPushButton();
00071 m_ToggleAddPoint->setMaximumSize(25,25);
00072 m_ToggleAddPoint->setCheckable(true);
00073 m_ToggleAddPoint->setToolTip("Toggle point editing (use SHIFT + Left Mouse Button to add Points)");
00074 QIcon iconAdd(btnSetPoints_xpm);
00075 m_ToggleAddPoint->setIcon(iconAdd);
00076
00077 m_RemovePointBtn = new QPushButton();
00078 m_RemovePointBtn->setMaximumSize(25, 25);
00079 const QIcon iconDel(btnClear_xpm);
00080 m_RemovePointBtn->setIcon(iconDel);
00081 m_RemovePointBtn->setToolTip("Erase one point from list (Hotkey: DEL)");
00082
00083
00084 m_MovePointUpBtn = new QPushButton();
00085 m_MovePointUpBtn->setMaximumSize(25, 25);
00086 const QIcon iconUp(btnUp_xpm);
00087 m_MovePointUpBtn->setIcon(iconUp);
00088 m_MovePointUpBtn->setToolTip("Swap selected point upwards (Hotkey: F2)");
00089
00090 m_MovePointDownBtn = new QPushButton();
00091 m_MovePointDownBtn->setMaximumSize(25, 25);
00092 const QIcon iconDown(btnDown_xpm);
00093 m_MovePointDownBtn->setIcon(iconDown);
00094 m_MovePointDownBtn->setToolTip("Swap selected point downwards (Hotkey: F3)");
00095
00096 m_SavePointsBtn = new QPushButton();
00097 m_SavePointsBtn->setMaximumSize(25, 25);
00098 QIcon iconSave(btnSave_xpm);
00099 m_SavePointsBtn->setIcon(iconSave);
00100 m_SavePointsBtn->setToolTip("Save points to file");
00101
00102 m_LoadPointsBtn = new QPushButton();
00103 m_LoadPointsBtn->setMaximumSize(25, 25);
00104 QIcon iconLoad(btnLoad_xpm);
00105 m_LoadPointsBtn->setIcon(iconLoad);
00106 m_LoadPointsBtn->setToolTip("Load list of points from file (REPLACES current content)");
00107
00108
00109 int i;
00110
00111 QBoxLayout* lay1;
00112 QBoxLayout* lay2;
00113
00114 switch (m_Orientation)
00115 {
00116 case 0:
00117 lay1 = new QVBoxLayout(this);
00118 lay2 = new QHBoxLayout();
00119 i = 0;
00120 break;
00121
00122 case 1:
00123 lay1 = new QHBoxLayout(this);
00124 lay2 = new QVBoxLayout();
00125 i=-1;
00126 break;
00127
00128 case 2:
00129 lay1 = new QHBoxLayout(this);
00130 lay2 = new QVBoxLayout();
00131 i=0;
00132 break;
00133
00134 default:
00135 lay1 = new QVBoxLayout(this);
00136 lay2 = new QHBoxLayout();
00137 i=-1;
00138 break;
00139
00140 }
00141
00142
00143
00144 this->setLayout(lay1);
00145 lay1->addLayout(lay2);
00146
00147 lay2->stretch(true);
00148 lay2->addWidget(m_ToggleAddPoint);
00149 lay2->addWidget(m_RemovePointBtn);
00150 lay2->addWidget(m_MovePointUpBtn);
00151 lay2->addWidget(m_MovePointDownBtn);
00152 lay2->addWidget(m_SavePointsBtn);
00153 lay2->addWidget(m_LoadPointsBtn);
00154
00155
00156
00157
00158 lay1->insertWidget(i,m_PointListView);
00159 this->setLayout(lay1);
00160 }
00161
00162 void QmitkPointListWidget::SetPointSet(mitk::PointSet* newPs)
00163 {
00164 if(newPs == NULL)
00165 return;
00166
00167 this->m_PointSetNode->SetData(newPs);
00168 dynamic_cast<QmitkPointListModel*>(this->m_PointListView->model())->SetPointSetNode(m_PointSetNode);
00169 ObserveNewNode(m_PointSetNode);
00170 }
00171
00172 void QmitkPointListWidget::SetPointSetNode(mitk::DataNode *newNode)
00173 {
00174
00175 ObserveNewNode(newNode);
00176 if (newNode != NULL)
00177 dynamic_cast<QmitkPointListModel*>(this->m_PointListView->model())->SetPointSetNode(newNode);
00178 else
00179 dynamic_cast<QmitkPointListModel*>(this->m_PointListView->model())->SetPointSetNode(NULL);
00180 }
00181
00182 void QmitkPointListWidget::OnBtnSavePoints()
00183 {
00184 if ((dynamic_cast<mitk::PointSet*>(m_PointSetNode->GetData())) == NULL)
00185 return;
00186 if ((dynamic_cast<mitk::PointSet*>(m_PointSetNode->GetData()))->GetSize() == 0)
00187 return;
00188
00189
00190 std::string name("");
00191
00192 QString fileNameProposal = QString("/PointSet.mps");
00193 QString aFilename = QFileDialog::getSaveFileName( NULL, "Save point set", QDir::currentPath() + fileNameProposal, "MITK Pointset (*.mps)" );
00194 if ( aFilename.isEmpty() )
00195 return;
00196
00197 try
00198 {
00199
00200 mitk::PointSetWriter::Pointer writer = mitk::PointSetWriter::New();
00201 writer->SetInput( dynamic_cast<mitk::PointSet*>(m_PointSetNode->GetData()) );
00202 writer->SetFileName( aFilename.toLatin1() );
00203 writer->Update();
00204 }
00205 catch(...)
00206 {
00207 QMessageBox::warning( this, "Save point set",
00208 QString("File writer reported problems writing %1\n\n"
00209 "PLEASE CHECK output file!").arg(aFilename) );
00210 }
00211 }
00212
00213 void QmitkPointListWidget::OnBtnLoadPoints()
00214 {
00215
00216 QString filename = QFileDialog::getOpenFileName( NULL, "Open MITK Pointset", "", "MITK Point Sets (*.mps)");
00217 if ( filename.isEmpty() ) return;
00218
00219
00220 try
00221 {
00222 mitk::PointSetReader::Pointer reader = mitk::PointSetReader::New();
00223 reader->SetFileName( filename.toLatin1() );
00224 reader->Update();
00225
00226 mitk::PointSet::Pointer pointSet = reader->GetOutput();
00227 if ( pointSet.IsNull() )
00228 {
00229 QMessageBox::warning( this, "Load point set", QString("File reader could not read %1").arg(filename) );
00230 return;
00231 }
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 this->SetPointSet(pointSet);
00242
00243
00244
00245
00246 }
00247 catch(...)
00248 {
00249 QMessageBox::warning( this, "Load point set", QString("File reader collapsed while reading %1").arg(filename) );
00250 }
00251 emit PointListChanged();
00252 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00253 }
00254
00255 mitk::PointSet* QmitkPointListWidget::GetPointSet()
00256 {
00257 return dynamic_cast<mitk::PointSet*>(m_PointSetNode->GetData());
00258 }
00259
00260 mitk::DataNode* QmitkPointListWidget::GetPointSetNode()
00261 {
00262 return m_PointSetNode;
00263 }
00264
00265 void QmitkPointListWidget::SetMultiWidget(QmitkStdMultiWidget *multiWidget)
00266 {
00267 this->m_MultiWidget = multiWidget;
00268 m_PointListView->SetMultiWidget(multiWidget);
00269 }
00270
00271 void QmitkPointListWidget::RemoveSelectedPoint()
00272 {
00273
00274 if (!m_PointSetNode) return;
00275 mitk::PointSet* pointSet = dynamic_cast<mitk::PointSet*>( m_PointSetNode->GetData() );
00276 if (!pointSet) return;
00277 if (pointSet->GetSize() == 0) return;
00278
00279 QmitkPointListModel* pointListModel = dynamic_cast<QmitkPointListModel*>( m_PointListView->model() );
00280 pointListModel->RemoveSelectedPoint();
00281 emit PointListChanged();
00282 }
00283
00284 void QmitkPointListWidget::MoveSelectedPointDown()
00285 {
00286
00287 if (!m_PointSetNode) return;
00288 mitk::PointSet* pointSet = dynamic_cast<mitk::PointSet*>( m_PointSetNode->GetData() );
00289 if (!pointSet) return;
00290 if (pointSet->GetSize() == 0) return;
00291
00292 QmitkPointListModel* pointListModel = dynamic_cast<QmitkPointListModel*>( m_PointListView->model() );
00293 pointListModel->MoveSelectedPointDown();
00294 emit PointListChanged();
00295 }
00296
00297 void QmitkPointListWidget::MoveSelectedPointUp()
00298 {
00299
00300 if (!m_PointSetNode) return;
00301 mitk::PointSet* pointSet = dynamic_cast<mitk::PointSet*>( m_PointSetNode->GetData() );
00302 if (!pointSet) return;
00303 if (pointSet->GetSize() == 0) return;
00304
00305 QmitkPointListModel* pointListModel = dynamic_cast<QmitkPointListModel*>( m_PointListView->model() );
00306 pointListModel->MoveSelectedPointUp();
00307 emit PointListChanged();
00308 }
00309
00310 void QmitkPointListWidget::OnBtnAddPoint(bool checked)
00311 {
00312 if (m_PointSetNode)
00313 {
00314 if (checked)
00315 {
00316 m_Interactor = dynamic_cast<mitk::PointSetInteractor*>(m_PointSetNode->GetInteractor());
00317
00318 if (m_Interactor.IsNull())
00319 m_Interactor = mitk::PointSetInteractor::New("pointsetinteractor", m_PointSetNode);
00320
00321
00322 mitk::GlobalInteraction::GetInstance()->AddInteractor( m_Interactor );
00323 }
00324 else if ( m_Interactor )
00325 {
00326 mitk::GlobalInteraction::GetInstance()->RemoveInteractor( m_Interactor );
00327 m_Interactor = NULL;
00328 }
00329 emit EditPointSets(checked);
00330 mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget4->GetRenderWindow())->RequestUpdate();
00331 }
00332 }
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342 void QmitkPointListWidget::OnListDoubleClick()
00343 {
00344 ;
00345 }
00346
00347 void QmitkPointListWidget::DeactivateInteractor(bool )
00348 {
00349 ;
00350 }
00351
00352 void QmitkPointListWidget::EnableEditButton( bool enabled )
00353 {
00354 m_EditAllowed = enabled;
00355 if (enabled == false)
00356 m_ToggleAddPoint->setEnabled(false);
00357 else
00358 m_ToggleAddPoint->setEnabled(true);
00359 OnBtnAddPoint(enabled);
00360 }
00361
00362
00363 void QmitkPointListWidget::ObserveNewNode( mitk::DataNode* node )
00364 {
00365
00366 if ( m_PointSetNode )
00367 {
00368 if (m_Interactor)
00369 {
00370 mitk::GlobalInteraction::GetInstance()->RemoveInteractor( m_Interactor );
00371 m_Interactor = NULL;
00372 m_ToggleAddPoint->setChecked( false );
00373 }
00374
00375 m_PointSetNode->RemoveObserver( m_NodeObserverTag );
00376 m_NodeObserverTag = 0;
00377 }
00378
00379 m_PointSetNode = node;
00380
00381
00382 if ( m_PointSetNode )
00383 {
00384 itk::ReceptorMemberCommand<QmitkPointListWidget>::Pointer command = itk::ReceptorMemberCommand<QmitkPointListWidget>::New();
00385 command->SetCallbackFunction( this, &QmitkPointListWidget::OnNodeDeleted );
00386 m_NodeObserverTag = m_PointSetNode->AddObserver( itk::DeleteEvent(), command );
00387 }
00388 else
00389 {
00390 m_NodeObserverTag = 0;
00391 }
00392
00393 if (m_EditAllowed == true)
00394 m_ToggleAddPoint->setEnabled( m_PointSetNode );
00395 else
00396 m_ToggleAddPoint->setEnabled( false );
00397
00398 m_RemovePointBtn->setEnabled( m_PointSetNode );
00399 m_LoadPointsBtn->setEnabled( m_PointSetNode );
00400 m_LoadPointsBtn->setEnabled( m_PointSetNode );
00401 }
00402
00403 void QmitkPointListWidget::OnNodeDeleted( const itk::EventObject & )
00404 {
00405 if(m_PointSetNode.IsNotNull() && ! m_NodeObserverTag)
00406 m_PointSetNode->RemoveObserver( m_NodeObserverTag );
00407 m_NodeObserverTag = 0;
00408 m_PointSetNode = NULL;
00409 m_PointListView->SetPointSetNode(NULL);
00410 m_ToggleAddPoint->setEnabled(false);
00411
00412 m_RemovePointBtn->setEnabled( m_PointSetNode );
00413 m_LoadPointsBtn->setEnabled( m_PointSetNode );
00414 m_LoadPointsBtn->setEnabled( m_PointSetNode );
00415 }