Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkOverlayController.h"
00019
00020 #include "QmitkRenderWindow.h"
00021 #include "QmitkOverlay.h"
00022
00023 #include <QHBoxLayout>
00024 #include <QVBoxLayout>
00025
00026 #include <algorithm>
00027
00028
00029 QmitkOverlayController::QmitkOverlayController( QmitkRenderWindow* rw, mitk::PropertyList* pl )
00030 : QObject(), m_RenderWindow( rw ), m_PropertyList( pl )
00031 {
00032 if ( m_RenderWindow == NULL )
00033 {
00034 MITK_ERROR << "invalid QmitkRenderWindow";
00035 return;
00036 }
00037
00038 connect( rw, SIGNAL( Moved() ), this, SLOT( AdjustOverlayPosition() ) );
00039
00040 this->InitializeOverlayLayout();
00041 this->AdjustOverlayPosition();
00042 this->SetOverlayVisibility( true );
00043
00044 if ( m_PropertyList.IsNull() )
00045 m_PropertyList = mitk::PropertyList::New();
00046
00047 }
00048
00049 QmitkOverlayController::~QmitkOverlayController()
00050 {
00051 }
00052
00053 void QmitkOverlayController::InitializeOverlayLayout()
00054 {
00055
00056 this->InitializeWidget( QmitkOverlay::top_Left );
00057 this->InitializeWidget( QmitkOverlay::top_Center );
00058 this->InitializeWidget( QmitkOverlay::top_Right );
00059 this->InitializeWidget( QmitkOverlay::middle_Left );
00060 this->InitializeWidget( QmitkOverlay::middle_Right );
00061 this->InitializeWidget( QmitkOverlay::bottom_Left );
00062 this->InitializeWidget( QmitkOverlay::bottom_Center );
00063 this->InitializeWidget( QmitkOverlay::bottom_Right );
00064
00065 }
00066
00067 void QmitkOverlayController::InitializeWidget( QmitkOverlay::DisplayPosition pos )
00068 {
00069
00070 m_PositionedOverlays[ pos ] = new QWidget( m_RenderWindow, Qt::Tool | Qt::FramelessWindowHint );
00071
00072
00073
00074
00075 #if !defined(_WIN32) || defined(_WIN64)
00076 m_PositionedOverlays[ pos ]->setAttribute( Qt::WA_TranslucentBackground, true );
00077 #else
00078 m_PositionedOverlays[ pos ]->setStyleSheet( "QWidget { background: black }" );
00079 m_PositionedOverlays[ pos ]->setAttribute( Qt::WA_TranslucentBackground, false );
00080 #endif
00081
00082
00083 m_PositionedOverlays[ pos ]->setAttribute( Qt::WA_X11NetWmWindowTypeUtility, true );
00084
00085
00086
00087 m_PositionedOverlays[ pos ]->setAttribute( Qt::WA_MacAlwaysShowToolWindow, true );
00088
00089 m_PositionedOverlays[ pos ]->setAttribute( Qt::WA_MacShowFocusRect, false );
00090
00091
00092 m_PositionedOverlays[ pos ]->setFocusPolicy( Qt::NoFocus );
00093
00094
00095 QPalette p = QPalette();
00096 p.setColor( QPalette::Window, Qt::transparent );
00097 m_PositionedOverlays[ pos ]->setPalette( p );
00098
00099
00100 switch ( pos )
00101 {
00102 case QmitkOverlay::top_Left :
00103 {
00104
00105 QVBoxLayout* layout = new QVBoxLayout( m_PositionedOverlays[ pos ] );
00106 layout->setDirection( QBoxLayout::TopToBottom );
00107 layout->setAlignment( Qt::AlignLeft );
00108 m_PositionedOverlays[ pos ]->layout()->setSpacing( 0 );
00109 break;
00110 }
00111 case QmitkOverlay::top_Center :
00112 {
00113
00114 QVBoxLayout* layout = new QVBoxLayout( m_PositionedOverlays[ pos ] );
00115 layout->setDirection( QBoxLayout::TopToBottom );
00116 layout->setAlignment( Qt::AlignCenter );
00117 layout->setAlignment( Qt::AlignLeft );
00118 m_PositionedOverlays[ pos ]->layout()->setSpacing( 0 );
00119 break;
00120 }
00121 case QmitkOverlay::top_Right :
00122 {
00123
00124 QVBoxLayout* layout = new QVBoxLayout( m_PositionedOverlays[ pos ] );
00125 layout->setDirection( QBoxLayout::TopToBottom );
00126 layout->setAlignment( Qt::AlignRight );
00127 m_PositionedOverlays[ pos ]->layout()->setSpacing( 0 );
00128 break;
00129 }
00130 case QmitkOverlay::middle_Left :
00131 {
00132
00133 QHBoxLayout* layout = new QHBoxLayout( m_PositionedOverlays[ pos ] );
00134 layout->setDirection( QBoxLayout::LeftToRight );
00135 layout->setAlignment( Qt::AlignLeft );
00136 layout->setSpacing( 3 );
00137 break;
00138
00139 }
00140 case QmitkOverlay::middle_Right :
00141 {
00142
00143 QHBoxLayout* layout = new QHBoxLayout( m_PositionedOverlays[ pos ] );
00144 layout->setDirection( QBoxLayout::RightToLeft );
00145 layout->setAlignment( Qt::AlignRight );
00146 layout->setSpacing( 3 );
00147 break;
00148 }
00149 case QmitkOverlay::bottom_Left :
00150 {
00151
00152 QVBoxLayout* layout = new QVBoxLayout( m_PositionedOverlays[ pos ] );
00153 layout->setDirection( QBoxLayout::BottomToTop );
00154 layout->setAlignment( Qt::AlignLeft );
00155 m_PositionedOverlays[ pos ]->layout()->setSpacing( 0 );
00156 break;
00157 }
00158 case QmitkOverlay::bottom_Center :
00159 {
00160 QVBoxLayout* layout = new QVBoxLayout( m_PositionedOverlays[ pos ] );
00161 layout->setDirection( QBoxLayout::BottomToTop );
00162 layout->setAlignment( Qt::AlignCenter );
00163 m_PositionedOverlays[ pos ]->layout()->setSpacing( 0 );
00164 break;
00165 }
00166 case QmitkOverlay::bottom_Right :
00167 {
00168 QVBoxLayout* layout = new QVBoxLayout( m_PositionedOverlays[ pos ] );
00169 layout->setDirection( QBoxLayout::BottomToTop );
00170 layout->setAlignment( Qt::AlignRight );
00171 m_PositionedOverlays[ pos ]->layout()->setSpacing( 0 );
00172 break;
00173 }
00174 }
00175 }
00176
00177 void QmitkOverlayController::AdjustOverlayPosition()
00178 {
00179
00180 if ( m_PositionedOverlays[ QmitkOverlay::top_Left ]->isVisible() )
00181 {
00182 QPoint pos = m_RenderWindow->mapToGlobal( QPoint(0,0) );
00183 m_PositionedOverlays[ QmitkOverlay::top_Left ]->move( pos.x(), pos.y() );
00184 }
00185
00186
00187 if ( m_PositionedOverlays[ QmitkOverlay::top_Center ]->isVisible() )
00188 {
00189 QWidget* widget = m_PositionedOverlays[ QmitkOverlay::top_Center ];
00190 QPoint pos = m_RenderWindow->mapToGlobal( QPoint( m_RenderWindow->size().width()/2, 0 ) ) ;
00191 widget->move( pos.x() - widget->size().width()/2, pos.y() );
00192 }
00193
00194
00195 if ( m_PositionedOverlays[ QmitkOverlay::top_Right ]->isVisible() )
00196 {
00197 QWidget* widget = m_PositionedOverlays[ QmitkOverlay::top_Right ];
00198 QPoint pos = m_RenderWindow->mapToGlobal( QPoint( m_RenderWindow->size().width(), 0 ) ) ;
00199 widget->move( pos.x() - widget->size().width(), pos.y() );
00200 }
00201
00202
00203 if ( m_PositionedOverlays[ QmitkOverlay::middle_Left ]->isVisible() )
00204 {
00205 QWidget* widget = m_PositionedOverlays[ QmitkOverlay::middle_Left ];
00206 QPoint pos = m_RenderWindow->mapToGlobal( QPoint( 0, m_RenderWindow->size().height()/2 ) ) ;
00207 widget->move( pos.x(), pos.y() - widget->size().height()/2 );
00208 }
00209
00210
00211 if ( m_PositionedOverlays[ QmitkOverlay::middle_Right ]->isVisible() )
00212 {
00213 QWidget* widget = m_PositionedOverlays[ QmitkOverlay::middle_Right ];
00214 QPoint pos = m_RenderWindow->mapToGlobal( QPoint( m_RenderWindow->size().width(), m_RenderWindow->size().height()/2 ) ) ;
00215 widget->move( pos.x() - widget->size().width(), pos.y() - widget->size().height()/2 );
00216 }
00217
00218
00219 if ( m_PositionedOverlays[ QmitkOverlay::bottom_Left ]->isVisible() )
00220 {
00221 QWidget* widget = m_PositionedOverlays[ QmitkOverlay::bottom_Left ];
00222 QPoint pos = m_RenderWindow->mapToGlobal( QPoint( 0, m_RenderWindow->size().height() ) ) ;
00223 widget->move( pos.x(), pos.y() - widget->size().height() );
00224 }
00225
00226
00227 if ( m_PositionedOverlays[ QmitkOverlay::bottom_Center ]->isVisible() )
00228 {
00229 QWidget* widget = m_PositionedOverlays[ QmitkOverlay::bottom_Center ];
00230 QPoint pos = m_RenderWindow->mapToGlobal( QPoint( m_RenderWindow->size().width()/2, m_RenderWindow->size().height() ) ) ;
00231 widget->move( pos.x() - widget->size().width()/2, pos.y() - widget->size().height() );
00232 }
00233
00234
00235 if ( m_PositionedOverlays[ QmitkOverlay::bottom_Right ]->isVisible() )
00236 {
00237 QWidget* widget = m_PositionedOverlays[ QmitkOverlay::bottom_Right ];
00238 QPoint pos = m_RenderWindow->mapToGlobal( QPoint( m_RenderWindow->size().width(), m_RenderWindow->size().height() ) ) ;
00239 widget->move( pos.x() - widget->size().width(), pos.y() - widget->size().height() );
00240 }
00241
00242 }
00243
00244
00245 void QmitkOverlayController::SetOverlayVisibility( bool visible )
00246 {
00247
00248 foreach( QmitkOverlay* overlay, m_AllOverlays )
00249 {
00250 if ( visible )
00251 {
00252 overlay->GetWidget()->show();
00253 }
00254 else
00255 {
00256 overlay->GetWidget()->hide();
00257 }
00258 }
00259 }
00260
00261
00262 void QmitkOverlayController::AddOverlay( QmitkOverlay* overlay )
00263 {
00264
00265 if ( m_RenderWindow == NULL )
00266 {
00267 MITK_ERROR << "invalid QmitkRenderWindow";
00268 return;
00269 }
00270
00271 if ( overlay != NULL )
00272 {
00273
00274 QmitkOverlay::DisplayPosition pos = overlay->GetPosition();
00275
00276
00277
00278 m_PropertyList->ConcatenatePropertyList( m_RenderWindow->GetRenderer()->GetRenderingManager()->GetPropertyList(), false );
00279
00280
00281 this->UpdateOverlayData( overlay );
00282
00283 overlay->GetWidget()->setParent( m_PositionedOverlays[ pos ] );
00284
00285
00286 m_AllOverlays.push_back( overlay );
00287 this->RestackOverlays( pos );
00288
00289
00290 m_PositionedOverlays[ pos ]->show();
00291
00292 this->AdjustOverlayPosition();
00293 }
00294 }
00295
00296 void QmitkOverlayController::UpdateOverlayData( QmitkOverlay* overlay )
00297 {
00298 overlay->GenerateData( m_PropertyList );
00299 }
00300
00301 void QmitkOverlayController::RemoveOverlay( QmitkOverlay* overlay )
00302 {
00303 if ( overlay != NULL )
00304 {
00305
00306 QmitkOverlay::DisplayPosition pos = overlay->GetPosition();
00307
00308 OverlayVector::iterator iter = std::find( m_AllOverlays.begin(), m_AllOverlays.end(), overlay );
00309
00310 if ( iter != m_AllOverlays.end() )
00311 {
00312 m_AllOverlays.erase( iter );
00313 overlay->GetWidget()->setParent( NULL );
00314 overlay->GetWidget()->hide();
00315
00316 if ( m_PositionedOverlays[ pos ]->layout()->isEmpty() )
00317 {
00318 m_PositionedOverlays[ pos ]->hide();
00319 }
00320 else
00321 {
00322 this->RestackOverlays( pos );
00323
00324 this->AdjustOverlayPosition();
00325 }
00326 }
00327 }
00328 }
00329
00330
00331
00332 void QmitkOverlayController::AlignOverlays()
00333 {
00334
00335
00336
00337
00338
00339
00340
00341 }
00342
00343 void QmitkOverlayController::RestackOverlays( QmitkOverlay::DisplayPosition pos )
00344 {
00345 OverlayVector::iterator overlayIter;
00346 QBoxLayout* layout = dynamic_cast<QBoxLayout*>( m_PositionedOverlays[ pos ]->layout() );
00347
00348 std::sort( m_AllOverlays.begin(), m_AllOverlays.end() );
00349
00350 for ( overlayIter=m_AllOverlays.begin(); overlayIter!=m_AllOverlays.end(); overlayIter++ )
00351 {
00352
00353 if ( (*overlayIter)->GetPosition() != pos )
00354 {
00355 continue;
00356 }
00357
00358
00359
00360
00361 unsigned int layer = (*overlayIter)->GetLayer();
00362 int stackLayer = 0;
00363 if ( !layout->isEmpty() )
00364 {
00365 stackLayer = layer;
00366 }
00367
00368 switch ( pos )
00369 {
00370
00371 case QmitkOverlay::top_Left : {}
00372 case QmitkOverlay::middle_Left : {}
00373 case QmitkOverlay::bottom_Left :
00374 {
00375 layout->insertWidget( stackLayer, (*overlayIter)->GetWidget(), 0, Qt::AlignLeft );
00376 break;
00377 }
00378
00379 case QmitkOverlay::top_Center : {}
00380 case QmitkOverlay::bottom_Center :
00381 {
00382 layout->insertWidget( stackLayer, (*overlayIter)->GetWidget(), 0, Qt::AlignCenter );
00383 break;
00384 }
00385
00386 case QmitkOverlay::top_Right : {}
00387 case QmitkOverlay::middle_Right : {}
00388 case QmitkOverlay::bottom_Right :
00389 {
00390 layout->insertWidget( stackLayer, (*overlayIter)->GetWidget(), 0, Qt::AlignRight );
00391 break;
00392 }
00393 }
00394 }
00395
00396 }
00397
00398 void QmitkOverlayController::UpdateAllOverlays()
00399 {
00400 foreach( QmitkOverlay* overlay, m_AllOverlays )
00401 {
00402 this->UpdateOverlayData( overlay );
00403 }
00404 }