00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <QmitkSliderLevelWindowWidget.h>
00019
00020 #include <QCursor>
00021 #include <QPainter>
00022 #include <QToolTip>
00023 #include <QMouseEvent>
00024
00025 #include <itkCommand.h>
00026 #include <QmitkLevelWindowWidgetContextMenu.h>
00027 #include <mitkRenderingManager.h>
00028
00032 QmitkSliderLevelWindowWidget::QmitkSliderLevelWindowWidget( QWidget * parent, Qt::WindowFlags f )
00033 : QWidget( parent, f )
00034 {
00035 m_Manager = mitk::LevelWindowManager::New();
00036
00037 itk::ReceptorMemberCommand<QmitkSliderLevelWindowWidget>::Pointer command = itk::ReceptorMemberCommand<QmitkSliderLevelWindowWidget>::New();
00038 command->SetCallbackFunction(this, &QmitkSliderLevelWindowWidget::OnPropertyModified);
00039 m_ObserverTag = m_Manager->AddObserver(itk::ModifiedEvent(), command);
00040 m_IsObserverTagSet = true;
00041
00042 setMouseTracking(true);
00043 m_Resize = false;
00044 m_Bottom = false;
00045 m_CtrlPressed = false;
00046 m_MouseDown = false;
00047
00048 m_Font.setPointSize( 6 );
00049
00050 m_MoveHeight = height() - 25;
00051 m_ScaleVisible = true;
00052 m_Contextmenu = new QmitkLevelWindowWidgetContextMenu(this);
00053
00054
00055
00056 this->hide();
00057 update();
00058
00059 }
00060
00061 QmitkSliderLevelWindowWidget::~QmitkSliderLevelWindowWidget()
00062 {
00063 if ( m_IsObserverTagSet)
00064 {
00065 m_Manager->RemoveObserver(m_ObserverTag);
00066 m_IsObserverTagSet = false;
00067 }
00068 }
00069
00070 void QmitkSliderLevelWindowWidget::setLevelWindowManager(mitk::LevelWindowManager* levelWindowManager)
00071 {
00072 if ( m_IsObserverTagSet)
00073 {
00074 m_Manager->RemoveObserver(m_ObserverTag);
00075 m_IsObserverTagSet = false;
00076 }
00077 m_Manager = levelWindowManager;
00078 if ( m_Manager.IsNotNull() )
00079 {
00080 itk::ReceptorMemberCommand<QmitkSliderLevelWindowWidget>::Pointer command = itk::ReceptorMemberCommand<QmitkSliderLevelWindowWidget>::New();
00081 command->SetCallbackFunction(this, &QmitkSliderLevelWindowWidget::OnPropertyModified);
00082 m_ObserverTag = m_Manager->AddObserver(itk::ModifiedEvent(), command);
00083 m_IsObserverTagSet = true;
00084 }
00085 }
00086
00087 void QmitkSliderLevelWindowWidget::OnPropertyModified(const itk::EventObject& )
00088 {
00089 try
00090 {
00091 m_LevelWindow = m_Manager->GetLevelWindow();
00092 this->show();
00093 update();
00094 }
00095 catch(...)
00096 {
00097 try
00098 {
00099 this->hide();
00100 }
00101 catch(...)
00102 {
00103 }
00104 }
00105 }
00106
00107 void QmitkSliderLevelWindowWidget::paintEvent( QPaintEvent* itkNotUsed(e) )
00108 {
00109 QPixmap pm(width(), height());
00110
00111 pm.fill(this, 0, 0);
00112 QPainter painter(&pm);
00113
00114 painter.setFont( m_Font );
00115
00116 painter.setPen(this->palette().color(this->foregroundRole()));
00117
00118 QColor c(93,144,169);
00119 QColor cl = c.light();
00120 QColor cd = c.dark();
00121
00122 painter.setBrush(c);
00123 painter.drawRect(m_Rect);
00124
00125 float mr = m_LevelWindow.GetRange();
00126
00127 if ( mr < 1 )
00128 mr = 1;
00129
00130 float fact = (float) m_MoveHeight / mr;
00131
00132
00133 if (m_ScaleVisible)
00134 {
00135 int minRange = (int)m_LevelWindow.GetRangeMin();
00136 int maxRange = (int)m_LevelWindow.GetRangeMax();
00137 int yValue = m_MoveHeight + (int)(minRange*fact);
00138 QString s = " 0";
00139 if (minRange <= 0 && maxRange >= 0)
00140 {
00141 painter.drawLine( 5, yValue , 15, yValue);
00142 painter.drawText( 21, yValue + 3, s );
00143 }
00144
00145 int count = 1;
00146 int k = 5;
00147 bool enoughSpace = false;
00148 bool enoughSpace2 = false;
00149
00150 for(int i = m_MoveHeight + (int)(minRange*fact); i < m_MoveHeight;)
00151 {
00152 if (-count*20 < minRange)
00153 break;
00154 yValue = m_MoveHeight + (int)((minRange + count*20)*fact);
00155 s = QString::number(-count*20);
00156 if (count % k && ((20*fact) > 2.5))
00157 {
00158 painter.drawLine( 8, yValue, 12, yValue);
00159 enoughSpace = true;
00160 }
00161 else if (!(count % k))
00162 {
00163 if ((k*20*fact) > 7)
00164 {
00165 painter.drawLine( 5, yValue, 15, yValue);
00166 painter.drawText( 21, yValue + 3, s );
00167 enoughSpace2 = true;
00168 }
00169 else
00170 {
00171 k += 5;
00172 }
00173 }
00174 if (enoughSpace)
00175 {
00176 i=yValue;
00177 count++;
00178 }
00179 else if (enoughSpace2)
00180 {
00181 i=yValue;
00182 count += k;
00183 }
00184 else
00185 {
00186 i=yValue;
00187 count = k;
00188 }
00189 }
00190 count = 1;
00191 k = 5;
00192 enoughSpace = false;
00193 enoughSpace2 = false;
00194
00195 for(int i = m_MoveHeight + (int)(minRange*fact); i >= 0;)
00196 {
00197 if (count*20 > maxRange)
00198 break;
00199 yValue = m_MoveHeight + (int)((minRange - count*20)*fact);
00200 s = QString::number(count*20);
00201 if(count % k && ((20*fact) > 2.5))
00202 {
00203 if (!(minRange > 0 && (count*20) < minRange))
00204 painter.drawLine( 8, yValue, 12, yValue);
00205 enoughSpace = true;
00206 }
00207 else if (!(count % k))
00208 {
00209 if ((k*20*fact) > 7)
00210 {
00211 if (!(minRange > 0 && (count*20) < minRange))
00212 {
00213 painter.drawLine( 5, yValue, 15, yValue);
00214 painter.drawText( 21, yValue + 3, s );
00215 }
00216 enoughSpace2 = true;
00217 }
00218 else
00219 {
00220 k += 5;
00221 }
00222 }
00223 if (enoughSpace)
00224 {
00225 i=yValue;
00226 count++;
00227 }
00228 else if (enoughSpace2)
00229 {
00230 i=yValue;
00231 count += k;
00232 }
00233 else
00234 {
00235 i=yValue;
00236 count = k;
00237 }
00238 }
00239 }
00240
00241 painter.setPen (cl);
00242 painter.drawLine(m_Rect.topLeft(),m_Rect.topRight());
00243 painter.drawLine(m_Rect.topLeft(),m_Rect.bottomLeft());
00244
00245 painter.setPen (cd);
00246 painter.drawLine(m_Rect.topRight(),m_Rect.bottomRight());
00247 painter.drawLine(m_Rect.bottomRight(),m_Rect.bottomLeft());
00248 painter.end();
00249
00250 QPainter p (this);
00251 p.drawPixmap(0, 0, pm);
00252 }
00253
00257 void QmitkSliderLevelWindowWidget::mouseMoveEvent( QMouseEvent* mouseEvent )
00258 {
00259 if(!mouseEvent)
00260 return;
00261 if ( m_LevelWindow.IsFixed() )
00262 return;
00263 if (!m_MouseDown)
00264 {
00265 if ( mouseEvent->pos().y() >= 0
00266 && mouseEvent->pos().y() <= (m_Rect.topLeft().y() + 3) )
00267 {
00268 setCursor(Qt::SizeVerCursor);
00269 m_UpperBound.setRect(m_Rect.topLeft().x(), m_Rect.topLeft().y() - 3, 17, 7);
00270 QToolTip::showText(mouseEvent->globalPos(), "Ctrl + left click to change only upper bound", this, m_UpperBound);
00271 m_Resize = true;
00272 }
00273 else if ( mouseEvent->pos().y() >= (m_Rect.bottomLeft().y() - 3) )
00274 {
00275 setCursor(Qt::SizeVerCursor);
00276 m_LowerBound.setRect(m_Rect.bottomLeft().x(), m_Rect.bottomLeft().y() - 3, 17, 7);
00277 QToolTip::showText(mouseEvent->globalPos(), "Ctrl + left click to change only lower bound", this, m_LowerBound);
00278 m_Resize = true;
00279 m_Bottom = true;
00280 }
00281 else
00282 {
00283 setCursor(Qt::ArrowCursor);
00284 m_Resize = false;
00285 m_Bottom = false;
00286 }
00287 }
00288
00289 else {
00290
00291 float fact = (float) m_MoveHeight / m_LevelWindow.GetRange();
00292
00293 if ( m_Leftbutton )
00294 {
00295 if (m_Resize && !m_CtrlPressed)
00296 {
00297 double diff = (mouseEvent->pos().y()) / fact;
00298 diff -= (m_StartPos.y()) / fact;
00299 m_StartPos = mouseEvent->pos();
00300
00301 if (diff == 0) return;
00302 float value;
00303 if (m_Bottom)
00304 value = m_LevelWindow.GetWindow() + ( ( 2 * diff ) );
00305 else
00306 value = m_LevelWindow.GetWindow() - ( ( 2 * diff ) );
00307
00308 if ( value < 1 )
00309 value = 1;
00310
00311 m_LevelWindow.SetLevelWindow( m_LevelWindow.GetLevel(), value );
00312 }
00313 else if(m_Resize && m_CtrlPressed)
00314 {
00315 if (!m_Bottom)
00316 {
00317 double diff = (mouseEvent->pos().y()) / fact;
00318 diff -= (m_StartPos.y()) / fact;
00319 m_StartPos = mouseEvent->pos();
00320
00321 if (diff == 0) return;
00322 float value;
00323
00324 value = m_LevelWindow.GetWindow() - ( ( diff ) );
00325
00326 if ( value < 1 )
00327 value = 1;
00328 float oldWindow;
00329 float oldLevel;
00330 float newLevel;
00331 oldWindow = m_LevelWindow.GetWindow();
00332 oldLevel = m_LevelWindow.GetLevel();
00333 newLevel = oldLevel + (value - oldWindow)/2;
00334 if (!((newLevel + value/2) > m_LevelWindow.GetRangeMax()))
00335 m_LevelWindow.SetLevelWindow( newLevel, value );
00336 }
00337 else
00338 {
00339 double diff = (mouseEvent->pos().y()) / fact;
00340 diff -= (m_StartPos.y()) / fact;
00341 m_StartPos = mouseEvent->pos();
00342
00343 if (diff == 0) return;
00344 float value;
00345
00346 value = m_LevelWindow.GetWindow() + ( ( diff ) );
00347
00348 if ( value < 1 )
00349 value = 1;
00350 float oldWindow;
00351 float oldLevel;
00352 float newLevel;
00353 oldWindow = m_LevelWindow.GetWindow();
00354 oldLevel = m_LevelWindow.GetLevel();
00355 newLevel = oldLevel - (value - oldWindow)/2;
00356 if (!((newLevel - value/2) < m_LevelWindow.GetRangeMin()))
00357 m_LevelWindow.SetLevelWindow( newLevel, value );
00358 }
00359 }
00360 else
00361 {
00362 float maxv = m_LevelWindow.GetRangeMax();
00363 float minv = m_LevelWindow.GetRangeMin();
00364 float wh = m_LevelWindow.GetWindow() / 2;
00365
00366 float level = (m_MoveHeight - mouseEvent->pos().y()) / fact + minv;
00367
00368 double diff = (mouseEvent->pos().x()) / fact;
00369 diff -= (m_StartPos.x()) / fact;
00370 m_StartPos = mouseEvent->pos();
00371
00372 float window;
00373 if (m_Bottom)
00374 window = m_LevelWindow.GetWindow() + ( ( 2 * diff ) );
00375 else
00376 window = m_LevelWindow.GetWindow() - ( ( 2 * diff ) );
00377
00378 if ( window < 1 )
00379 window = 1;
00380
00381 if ( level - wh < minv )
00382 m_LevelWindow.SetLevelWindow( m_LevelWindow.GetRangeMin() + wh, m_LevelWindow.GetWindow() );
00383
00384 else if ( level + wh > maxv )
00385 m_LevelWindow.SetLevelWindow( m_LevelWindow.GetRangeMax() - wh, m_LevelWindow.GetWindow() );
00386
00387 else
00388 m_LevelWindow.SetLevelWindow( level, window );
00389 }
00390 m_Manager->SetLevelWindow(m_LevelWindow);
00391 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00392 }
00393 }
00394 }
00395 void QmitkSliderLevelWindowWidget::enterEvent ( QEvent * )
00396 {
00397
00398
00399
00400
00401
00402 QPoint p = QCursor::pos();
00403 p = this->mapFromGlobal(p);
00404 QMouseEvent ev(QEvent::MouseMove, p, Qt::NoButton, Qt::NoButton , Qt::NoModifier );
00405 this->mouseMoveEvent( &ev );
00406 }
00407
00411 void QmitkSliderLevelWindowWidget::mousePressEvent( QMouseEvent* mouseEvent ) {
00412 if ( m_LevelWindow.IsFixed() )
00413 return;
00414 m_MouseDown = true;
00415 m_StartPos = mouseEvent->pos();
00416
00417 if ( mouseEvent->button() == Qt::LeftButton )
00418 {
00419 if (mouseEvent->modifiers() == Qt::ControlModifier || mouseEvent->modifiers() == Qt::ShiftModifier)
00420 {
00421 m_CtrlPressed = true;
00422 }
00423 else
00424 {
00425 m_CtrlPressed = false;
00426 }
00427 m_Leftbutton = true;
00428 }
00429 else
00430 m_Leftbutton = false;
00431
00432 mouseMoveEvent( mouseEvent );
00433 }
00434
00438 void QmitkSliderLevelWindowWidget::resizeEvent ( QResizeEvent * event ) {
00439 m_MoveHeight = event->size().height() - 25;
00440 update();
00441 }
00442
00446 void QmitkSliderLevelWindowWidget::mouseReleaseEvent( QMouseEvent* )
00447 {
00448 if ( m_LevelWindow.IsFixed() )
00449 return;
00450 m_MouseDown = false;
00451 }
00452
00456 void QmitkSliderLevelWindowWidget::update() {
00457 int rectWidth;
00458 if(m_ScaleVisible)
00459 {
00460 rectWidth = 17;
00461 setMinimumSize ( QSize( 50, 50 ) );
00462 setMaximumSize ( QSize( 50, 2000 ) );
00463 setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ) );
00464 }
00465 else
00466 {
00467 rectWidth = 26;
00468 setMinimumSize ( QSize( 40, 50 ) );
00469 setMaximumSize ( QSize( 50, 2000 ) );
00470 setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ) );
00471 }
00472 float mr = m_LevelWindow.GetRange();
00473
00474 if ( mr < 1 )
00475 mr = 1;
00476
00477 float fact = (float) m_MoveHeight / mr;
00478
00479 float rectHeight = m_LevelWindow.GetWindow() * fact;
00480
00481 if ( rectHeight < 15 )
00482 rectHeight = 15;
00483
00484 if ( m_LevelWindow.GetLowerWindowBound() < 0 )
00485 m_Rect.setRect( 2, (int) (m_MoveHeight - (m_LevelWindow.GetUpperWindowBound() - m_LevelWindow.GetRangeMin()) * fact) , rectWidth, (int) rectHeight );
00486 else
00487 m_Rect.setRect( 2, (int) (m_MoveHeight - (m_LevelWindow.GetUpperWindowBound() - m_LevelWindow.GetRangeMin()) * fact), rectWidth, (int) rectHeight );
00488
00489 QWidget::repaint();
00490 }
00491
00492 void QmitkSliderLevelWindowWidget::contextMenuEvent( QContextMenuEvent * )
00493 {
00494 m_Contextmenu->setLevelWindowManager(m_Manager.GetPointer());
00495 QMenu *contextMenu = new QMenu( this );
00496 Q_CHECK_PTR( contextMenu );
00497 if (m_ScaleVisible)
00498 contextMenu->addAction(tr("Hide Scale"), this, SLOT(hideScale()));
00499 else
00500 contextMenu->addAction(tr("Show Scale"), this, SLOT(showScale()));
00501 contextMenu->addSeparator();
00502 m_Contextmenu->getContextMenu(contextMenu);
00503 }
00504
00505 void QmitkSliderLevelWindowWidget::hideScale()
00506 {
00507 m_ScaleVisible = false;
00508 update();
00509 }
00510
00511 void QmitkSliderLevelWindowWidget::showScale()
00512 {
00513 m_ScaleVisible = true;
00514 update();
00515 }
00516
00517 void QmitkSliderLevelWindowWidget::setDataStorage(mitk::DataStorage* ds)
00518 {
00519 m_Manager->SetDataStorage(ds);
00520 }
00521
00522 mitk::LevelWindowManager* QmitkSliderLevelWindowWidget::GetManager()
00523 {
00524 return m_Manager.GetPointer();
00525 }