00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkPointListViewWidget.h"
00019
00020 #include "QmitkPointListModel.h"
00021 #include "QmitkStdMultiWidget.h"
00022 #include "QmitkEditPointDialog.h"
00023
00024 #include "mitkInteractionConst.h"
00025 #include "mitkPointOperation.h"
00026 #include "mitkRenderingManager.h"
00027
00028 #include <QKeyEvent>
00029
00030 QmitkPointListViewWidget::QmitkPointListViewWidget( QWidget* parent )
00031 :QListWidget( parent ),
00032 m_TimeStep( 0 ),
00033 m_SelfCall( false ),
00034 m_MultiWidget( NULL)
00035 {
00036 QListWidget::setAlternatingRowColors( true );
00037
00038
00039 QListWidget::setSelectionBehavior( QAbstractItemView::SelectRows );
00040 QListWidget::setSelectionMode( QAbstractItemView::SingleSelection );
00041
00042 connect( this, SIGNAL(itemDoubleClicked ( QListWidgetItem * )),
00043 this, SLOT(OnItemDoubleClicked( QListWidgetItem *)) );
00044
00045 connect( this, SIGNAL( currentRowChanged( int ) ),
00046 this, SLOT( OnCurrentRowChanged( int ) ) );
00047
00048 }
00049
00050 QmitkPointListViewWidget::~QmitkPointListViewWidget()
00051 {
00052 this->SetPointSet(0);
00053 }
00054
00055 void QmitkPointListViewWidget::SetPointSet( mitk::PointSet* pointSet )
00056 {
00057 if(m_PointSet.IsNotNull())
00058 {
00059 m_PointSet.ObjectModified.RemoveListener
00060 (mitk::MessageDelegate1<QmitkPointListViewWidget
00061 , const itk::Object*>( this, &QmitkPointListViewWidget::OnPointSetChanged ));
00062 m_PointSet.ObjectDelete.RemoveListener
00063 (mitk::MessageDelegate1<QmitkPointListViewWidget
00064 , const itk::Object*>( this, &QmitkPointListViewWidget::OnPointSetDeleted ));
00065 }
00066
00067 m_PointSet = pointSet;
00068
00069 if(m_PointSet.IsNotNull())
00070 {
00071 m_PointSet.ObjectModified.AddListener
00072 (mitk::MessageDelegate1<QmitkPointListViewWidget
00073 , const itk::Object*>( this, &QmitkPointListViewWidget::OnPointSetChanged ));
00074 m_PointSet.ObjectDelete.AddListener
00075 (mitk::MessageDelegate1<QmitkPointListViewWidget
00076 , const itk::Object*>( this, &QmitkPointListViewWidget::OnPointSetDeleted ));
00077 }
00078
00079 this->Update();
00080 }
00081
00082 const mitk::PointSet* QmitkPointListViewWidget::GetPointSet() const
00083 {
00084 return m_PointSet;
00085 }
00086
00087 void QmitkPointListViewWidget::SetTimeStep(int t)
00088 {
00089 m_TimeStep = t;
00090 this->Update();
00091 }
00092
00093 int QmitkPointListViewWidget::GetTimeStep() const
00094 {
00095 return m_TimeStep;
00096 }
00097
00098 void QmitkPointListViewWidget::SetMultiWidget( QmitkStdMultiWidget* multiWidget )
00099 {
00100 m_MultiWidget = multiWidget;
00101 }
00102
00103
00104 QmitkStdMultiWidget* QmitkPointListViewWidget::GetMultiWidget() const
00105 {
00106 return m_MultiWidget;
00107 }
00108
00109 void QmitkPointListViewWidget::OnPointSetChanged( const itk::Object* )
00110 {
00111 if(!m_SelfCall)
00112 this->Update();
00113 }
00114
00115 void QmitkPointListViewWidget::OnPointSetDeleted( const itk::Object* )
00116 {
00117 this->SetPointSet(0);
00118 this->Update();
00119 }
00120
00121 void QmitkPointListViewWidget::OnItemDoubleClicked(QListWidgetItem * item)
00122 {
00123 QmitkEditPointDialog _EditPointDialog(this);
00124 _EditPointDialog.SetPoint(m_PointSet, this->row(item), m_TimeStep);
00125 _EditPointDialog.exec();
00126 }
00127
00128 void QmitkPointListViewWidget::OnCurrentRowChanged( int )
00129 {
00130 this->Update(true);
00131 }
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203 void QmitkPointListViewWidget::keyPressEvent( QKeyEvent * e )
00204 {
00205 if (m_PointSet.IsNull())
00206 return;
00207
00208 int key = e->key();
00209 switch (key)
00210 {
00211 case Qt::Key_F2:
00212 this->MoveSelectedPointUp();
00213 break;
00214 case Qt::Key_F3:
00215 this->MoveSelectedPointDown();
00216 break;
00217 case Qt::Key_Delete:
00218 this->RemoveSelectedPoint();
00219 break;
00220 default:
00221 break;
00222 }
00223 }
00224
00225 void QmitkPointListViewWidget::MoveSelectedPointUp()
00226 {
00227 if (m_PointSet == NULL)
00228 return;
00229
00230 mitk::PointSet::PointIdentifier selectedID;
00231 selectedID = m_PointSet->SearchSelectedPoint(m_TimeStep);
00232 mitk::PointOperation* doOp = new mitk::PointOperation(mitk::OpMOVEPOINTUP, m_PointSet->GetPoint(selectedID, m_TimeStep), selectedID, true);
00233 m_PointSet->ExecuteOperation(doOp);
00234 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00235 }
00236
00237
00238 void QmitkPointListViewWidget::MoveSelectedPointDown()
00239 {
00240 if (m_PointSet == NULL)
00241 return;
00242
00243 mitk::PointSet::PointIdentifier selectedID;
00244 selectedID = m_PointSet->SearchSelectedPoint(m_TimeStep);
00245 mitk::PointOperation* doOp = new mitk::PointOperation(mitk::OpMOVEPOINTDOWN, m_PointSet->GetPoint(selectedID, m_TimeStep), selectedID, true);
00246 m_PointSet->ExecuteOperation(doOp);
00247 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00248 }
00249
00250
00251 void QmitkPointListViewWidget::RemoveSelectedPoint()
00252 {
00253 if (m_PointSet == NULL)
00254 return;
00255
00256 mitk::PointSet::PointIdentifier selectedID;
00257 selectedID = m_PointSet->SearchSelectedPoint(m_TimeStep);
00258 mitk::PointOperation* doOp = new mitk::PointOperation(mitk::OpREMOVE, m_PointSet->GetPoint(selectedID, m_TimeStep), selectedID, true);
00259 m_PointSet->ExecuteOperation(doOp);
00260 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00261 }
00262
00263 void QmitkPointListViewWidget::Update(bool currentRowChanged)
00264 {
00265 if(m_SelfCall)
00266 return;
00267
00268 if(m_PointSet.IsNull())
00269 {
00270 this->clear();
00271 return;
00272 }
00273
00274 m_SelfCall = true;
00275 QString text;
00276 int i = 0;
00277
00278 mitk::PointSet::DataType::Pointer pointset = m_PointSet->GetPointSet(m_TimeStep);
00279 for (mitk::PointSet::PointsContainer::Iterator it = pointset->GetPoints()->Begin(); it != pointset->GetPoints()->End(); ++it)
00280 {
00281
00282 text = QString("%0: (%1, %2, %3)")
00283 .arg( i, 3)
00284 .arg( it.Value().GetElement(0), 0, 'f', 3 )
00285 .arg( it.Value().GetElement(1), 0, 'f', 3 )
00286 .arg( it.Value().GetElement(2), 0, 'f', 3 );
00287
00288 if(i==this->count())
00289 this->addItem(text);
00290 else
00291 this->item(i)->setText(text);
00292
00293 if(currentRowChanged)
00294 {
00295 if(i == this->currentRow())
00296 m_PointSet->SetSelectInfo(this->currentRow(), true, m_TimeStep);
00297 else
00298 m_PointSet->SetSelectInfo(it->Index(), false, m_TimeStep);
00299 }
00300 ++i;
00301 }
00302
00303
00304 while (m_PointSet->GetPointSet(m_TimeStep)->GetPoints()->Size() < (unsigned int)this->count() )
00305 {
00306 QListWidgetItem * item = this->takeItem(this->count()-1);
00307 delete item;
00308 }
00309
00310
00311 if(!currentRowChanged)
00312 {
00313 if ( m_PointSet->GetNumberOfSelected( m_TimeStep ) > 1 )
00314 {
00316 std::cerr << "Point set has multiple selected points. This view is not designed for more than one selected point." << std::endl;
00317 }
00318
00319 int selectedIndex = m_PointSet->SearchSelectedPoint( m_TimeStep );
00320 if (selectedIndex != -1)
00321 {
00322 this->setCurrentRow ( selectedIndex );
00323 }
00324 }
00325 m_SelfCall = false;
00326 }