00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkPointListView.h"
00019
00020 #include "QmitkPointListModel.h"
00021 #include "QmitkStdMultiWidget.h"
00022 #include "QmitkEditPointDialog.h"
00023
00024 #include "mitkRenderingManager.h"
00025
00026 #include <QKeyEvent>
00027 #include <QPalette>
00028 #include <QTimer>
00029 #include <QMenu>
00030 #include <QMessageBox>
00031
00032 QmitkPointListView::QmitkPointListView( QWidget* parent )
00033 :QListView( parent ),
00034 m_PointListModel( new QmitkPointListModel() ),
00035 m_SelfCall( false ),
00036 m_showFading(false),
00037 m_MultiWidget( NULL)
00038 {
00039 QListView::setAlternatingRowColors( true );
00040
00041
00042
00043 QListView::setSelectionBehavior( QAbstractItemView::SelectRows );
00044 QListView::setSelectionMode( QAbstractItemView::SingleSelection );
00045 QListView::setModel( m_PointListModel );
00046 QString tooltip = QString("Use the F2/F3 keys to move a point up/down, the Del key to remove a point\nand the mouse wheel to change the timestep.\n\nTimeStep:\t%1").arg(0);
00047 QListView::setToolTip(tooltip);
00048
00049 this->setContextMenuPolicy(Qt::CustomContextMenu);
00050
00051 m_TimeStepFaderLabel = new QLabel(this);
00052 QFont font("Arial", 17);
00053 m_TimeStepFaderLabel->setFont(font);
00054
00055
00056 this->setMinimumHeight(40);
00057
00058
00059 this->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
00060
00061
00062
00063 connect( m_PointListModel, SIGNAL(SignalUpdateSelection()), this, SLOT(OnPointSetSelectionChanged()) );
00064
00065 connect( this, SIGNAL(doubleClicked ( const QModelIndex & )),
00066 this, SLOT(OnPointDoubleClicked( const QModelIndex & )) );
00067
00068 connect( QListView::selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
00069 this, SLOT(OnListViewSelectionChanged(const QItemSelection& , const QItemSelection&)) );
00070
00071 connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(ctxMenu(const QPoint &)));
00072
00073 }
00074
00075 QmitkPointListView::~QmitkPointListView()
00076 {
00077 delete m_PointListModel;
00078 }
00079
00080 void QmitkPointListView::SetPointSetNode( mitk::DataNode* pointSetNode )
00081 {
00082 m_PointListModel->SetPointSetNode( pointSetNode);
00083 }
00084
00085 const mitk::PointSet* QmitkPointListView::GetPointSet() const
00086 {
00087 return m_PointListModel->GetPointSet();
00088 }
00089
00090 void QmitkPointListView::SetMultiWidget( QmitkStdMultiWidget* multiWidget )
00091 {
00092 m_MultiWidget = multiWidget;
00093
00094
00095 }
00096
00097 QmitkStdMultiWidget* QmitkPointListView::GetMultiWidget() const
00098 {
00099 return m_MultiWidget;
00100 }
00101
00102 void QmitkPointListView::OnPointDoubleClicked(const QModelIndex & index)
00103 {
00104 mitk::PointSet::PointType p;
00105 mitk::PointSet::PointIdentifier id;
00106 m_PointListModel->GetPointForModelIndex(index, p, id);
00107 QmitkEditPointDialog _EditPointDialog(this);
00108 _EditPointDialog.SetPoint(m_PointListModel->GetPointSet(), id, m_PointListModel->GetTimeStep());
00109 _EditPointDialog.exec();
00110 }
00111
00112 void QmitkPointListView::OnPointSetSelectionChanged()
00113 {
00114 const mitk::PointSet* pointSet = m_PointListModel->GetPointSet();
00115 if (pointSet == NULL)
00116 return;
00117
00118
00119 m_SelfCall = true;
00120 int timeStep = m_PointListModel->GetTimeStep();
00121
00122 if ( pointSet->GetNumberOfSelected( timeStep ) > 1 )
00123 {
00124 MITK_ERROR << "Point set has multiple selected points. This view is not designed for more than one selected point.";
00125 }
00126
00127 int selectedIndex = pointSet->SearchSelectedPoint( timeStep );
00128
00129 if (selectedIndex == -1)
00130 {
00131 m_SelfCall = false;
00132 return;
00133 }
00134
00135 QModelIndex index;
00136
00137 bool modelIndexOkay = m_PointListModel->GetModelIndexForPointID(selectedIndex, index);
00138
00139 if (modelIndexOkay == true)
00140 QListView::selectionModel()->select( index , QItemSelectionModel::ClearAndSelect );
00141
00142 emit SignalPointSelectionChanged();
00143
00144 m_SelfCall = false;
00145 }
00146
00147
00148 void QmitkPointListView::OnListViewSelectionChanged(const QItemSelection& selected, const QItemSelection& )
00149 {
00150 if (m_SelfCall)
00151 return;
00152
00153 mitk::PointSet* pointSet = const_cast<mitk::PointSet*>( m_PointListModel->GetPointSet() );
00154
00155 if (pointSet == NULL)
00156 return;
00157
00158
00159 m_SelfCall = true;
00160
00161
00162 QModelIndexList selectedIndexes = selected.indexes();
00163
00164 for (mitk::PointSet::PointsContainer::Iterator it = pointSet->GetPointSet(m_PointListModel->GetTimeStep())->GetPoints()->Begin();
00165 it != pointSet->GetPointSet(m_PointListModel->GetTimeStep())->GetPoints()->End(); ++it)
00166 {
00167 QModelIndex index;
00168 if (m_PointListModel->GetModelIndexForPointID(it->Index(), index))
00169 {
00170 if (selectedIndexes.indexOf(index) != -1)
00171 {
00172 pointSet->SetSelectInfo(it->Index(), true, m_PointListModel->GetTimeStep());
00173 if ( m_MultiWidget != NULL)
00174 {
00175 m_MultiWidget->MoveCrossToPosition(pointSet->GetPoint(it->Index(), m_PointListModel->GetTimeStep()));
00176 }
00177 }
00178 else
00179 {
00180 pointSet->SetSelectInfo(it->Index(), false, m_PointListModel->GetTimeStep());
00181 }
00182 }
00183 }
00184
00185 m_SelfCall = false;
00186
00187 emit SignalPointSelectionChanged();
00188
00189 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00190 }
00191
00192
00193 void QmitkPointListView::keyPressEvent( QKeyEvent * e )
00194 {
00195 if (m_PointListModel == NULL)
00196 return;
00197
00198 int key = e->key();
00199
00200 switch (key)
00201 {
00202 case Qt::Key_F2:
00203 m_PointListModel->MoveSelectedPointUp();
00204 break;
00205 case Qt::Key_F3:
00206 m_PointListModel->MoveSelectedPointDown();
00207 break;
00208 case Qt::Key_Delete:
00209 m_PointListModel->RemoveSelectedPoint();
00210 break;
00211 default:
00212 break;
00213 }
00214 }
00215
00216 void QmitkPointListView::wheelEvent(QWheelEvent *event)
00217 {
00218
00219
00220 if (!m_PointListModel || !m_PointListModel->GetPointSet() || (int)(m_PointListModel->GetPointSet()->GetTimeSteps()) == 1 )
00221 return;
00222
00223
00224 int whe = event->delta();
00225 mitk::PointSet::Pointer ps = dynamic_cast<mitk::PointSet*>(m_PointListModel->GetPointSet());
00226 unsigned int numberOfTS = ps->GetTimeSteps();
00227
00228 if(numberOfTS == 1)
00229 return;
00230 int currentTS = this->m_PointListModel->GetTimeStep();
00231 if(whe > 0)
00232 {
00233 if((currentTS >= (int)(m_PointListModel->GetPointSet()->GetTimeSteps())))
00234 return;
00235
00236 this->m_PointListModel->SetTimeStep(++currentTS);
00237 }
00238 else
00239 {
00240
00241 if((currentTS <= 0))
00242 return;
00243 this->m_PointListModel->SetTimeStep(--currentTS);
00244
00245 }
00246
00247
00248 QString tooltip = QString("Use the F2/F3 keys to move a point up/down, the Del key to remove a point\nand the mouse wheel to change the timestep.\n\nTimeStep:\t%1").arg(currentTS);
00249 this->setToolTip(tooltip);
00250
00251 fadeTimeStepIn();
00252 }
00253
00254 void QmitkPointListView::fadeTimeStepIn()
00255 {
00256
00257 QWidget *m_TimeStepFader = new QWidget(this);
00258 QHBoxLayout *layout = new QHBoxLayout(m_TimeStepFader);
00259
00260 int x = (int)(this->geometry().x()+this->width()*0.6);
00261 int y = (int)(this->geometry().y()+this->height()*0.8);
00262 m_TimeStepFader->move(x,y);
00263 m_TimeStepFader->resize(60, 55);
00264 m_TimeStepFader->setLayout(layout);
00265 m_TimeStepFader->setAttribute(Qt::WA_DeleteOnClose);
00266
00267
00268
00269
00270 layout->addWidget(m_TimeStepFaderLabel);
00271 m_TimeStepFaderLabel->setAlignment(Qt::AlignCenter);
00272 m_TimeStepFaderLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised);
00273 m_TimeStepFaderLabel->setLineWidth(2);
00274 m_TimeStepFaderLabel->setText(QString("%1").arg(this->m_PointListModel->GetTimeStep()));
00275
00276
00277 QPalette pal = m_TimeStepFaderLabel->palette();
00278 QColor semiTransparentColor(139, 192, 223, 50);
00279 QColor labelTransparentColor(0,0,0,200);
00280 pal.setColor(m_TimeStepFaderLabel->backgroundRole(), semiTransparentColor);
00281 pal.setColor(m_TimeStepFaderLabel->foregroundRole(), labelTransparentColor);
00282 m_TimeStepFaderLabel->setAutoFillBackground(true);
00283 m_TimeStepFaderLabel->setPalette(pal);
00284
00285
00286 m_TimeStepFader->show();
00287
00288
00289 m_TimeStepFaderLabel->setVisible(true);
00290 QTimer::singleShot(2000, this, SLOT(fadeTimeStepOut()));
00291
00292 }
00293
00294
00295
00296 void QmitkPointListView::fadeTimeStepOut()
00297 {
00298
00299 m_TimeStepFaderLabel->hide();
00300
00301 }
00302
00303 void QmitkPointListView::ctxMenu(const QPoint &pos)
00304 {
00305 QMenu *menu = new QMenu;
00306
00307
00308
00309
00310
00311 QAction *showFading = new QAction(this);
00312 showFading->setCheckable(false);
00313 showFading->setEnabled(false);
00314 showFading->setText("Fade TimeStep");
00315 connect(showFading, SIGNAL(triggered(bool)), this, SLOT(SetFading(bool)));
00316 menu->addAction(showFading);
00317
00318
00319 QAction *clearList = new QAction(this);
00320 clearList->setText("Clear List");
00321 connect(clearList, SIGNAL(triggered()), this, SLOT(ClearPointList()));
00322 menu->addAction(clearList);
00323
00324
00325 QAction *clearTS = new QAction(this);
00326 clearTS->setText("Clear current time step");
00327 connect(clearTS, SIGNAL(triggered()), this, SLOT(ClearPointListTS()));
00328 menu->addAction(clearTS);
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339 menu->exec(this->mapToGlobal(pos));
00340
00341 }
00342
00343 void QmitkPointListView::SetFading(bool onOff)
00344 {
00345 m_showFading = onOff;
00346 }
00347
00348 void QmitkPointListView::ClearPointList()
00349 {
00350 if(!m_PointListModel->GetPointSet())
00351 return;
00352 mitk::PointSet::Pointer curPS = m_PointListModel->GetPointSet();
00353 if ( curPS->GetSize() == 0)
00354 return;
00355
00356
00357 switch( QMessageBox::question( this, tr("Clear Points"),
00358 tr("Remove all points from the displayed list?"),
00359 QMessageBox::Yes | QMessageBox::No, QMessageBox::No))
00360 {
00361 case QMessageBox::Yes:
00362 {
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372 mitk::PointSet::PointsIterator it;
00373 mitk::PointSet::PointsContainer *curPsPoints;
00374 while( !curPS->IsEmpty(0))
00375 {
00376 curPsPoints = curPS->GetPointSet()->GetPoints();
00377 it = curPsPoints->Begin();
00378 curPS->SetSelectInfo(it->Index(),true);
00379 m_PointListModel->RemoveSelectedPoint();
00380 }
00381 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00382 break;
00383 }
00384 case QMessageBox::No:
00385 default:
00386 break;
00387 }
00388
00389 }
00390
00391 void QmitkPointListView::ClearPointListTS()
00392 {
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417 }