Index: CoreUI/Qmitk/QmitkRenderWindowMenu.cpp =================================================================== --- CoreUI/Qmitk/QmitkRenderWindowMenu.cpp (revision 20895) +++ CoreUI/Qmitk/QmitkRenderWindowMenu.cpp (working copy) @@ -47,7 +47,8 @@ m_Layout(0), m_LayoutDesign(0), m_OldLayoutDesign(0), -m_FullScreenMode(false) +m_FullScreenMode(false), +m_CrosshairMenu(NULL) { //Create Menu Widget this->CreateMenuWidget(); @@ -80,68 +81,12 @@ QSize size( 13, 13 ); - static QMenu* crosshairModesMenu = NULL; - if ( !crosshairModesMenu ) - { - crosshairModesMenu = new QMenu(NULL); // is shared by all menubars TODO should be deleted somehow - - m_ShowHideCrosshairVisibilityAction = new QAction(crosshairModesMenu); - m_ShowHideCrosshairVisibilityAction->setText("Show crosshair"); - m_ShowHideCrosshairVisibilityAction->setCheckable(true); - m_ShowHideCrosshairVisibilityAction->setChecked(true); // TODO observe current status - connect( m_ShowHideCrosshairVisibilityAction, SIGNAL(toggled(bool)), this, SIGNAL(ShowCrosshair(bool))); - crosshairModesMenu->addAction( m_ShowHideCrosshairVisibilityAction ); - - QAction* resetViewAction = new QAction(crosshairModesMenu); - resetViewAction->setText("Reset view"); - connect( resetViewAction, SIGNAL(triggered()), this, SIGNAL(ResetView())); - crosshairModesMenu->addAction( resetViewAction ); - - QAction* rotationGroupSeparator = new QAction(crosshairModesMenu); - rotationGroupSeparator->setSeparator(true); - rotationGroupSeparator->setText("Rotation mode"); - crosshairModesMenu->addAction( rotationGroupSeparator ); - - QActionGroup* rotationModeActionGroup = new QActionGroup(crosshairModesMenu); - rotationModeActionGroup->setExclusive(true); - connect( rotationModeActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(OnCrosshairRotationModeSelected(QAction*)) ); - - QAction* noCrosshairRotation = new QAction(crosshairModesMenu); - noCrosshairRotation->setActionGroup(rotationModeActionGroup); - noCrosshairRotation->setText("No crosshair rotation"); - noCrosshairRotation->setCheckable(true); - noCrosshairRotation->setChecked(true); // TODO observe current status - noCrosshairRotation->setData( QmitkStdMultiWidget::PLANE_MODE_SLICING ); - crosshairModesMenu->addAction( noCrosshairRotation ); - - QAction* singleCrosshairRotation = new QAction(crosshairModesMenu); - singleCrosshairRotation->setActionGroup(rotationModeActionGroup); - singleCrosshairRotation->setText("Crosshair rotation"); - singleCrosshairRotation->setCheckable(true); - singleCrosshairRotation->setData( QmitkStdMultiWidget::PLANE_MODE_ROTATION ); - crosshairModesMenu->addAction( singleCrosshairRotation ); - - QAction* coupledCrosshairRotation = new QAction(crosshairModesMenu); - coupledCrosshairRotation->setActionGroup(rotationModeActionGroup); - coupledCrosshairRotation->setText("Coupled crosshair rotation"); - coupledCrosshairRotation->setCheckable(true); - coupledCrosshairRotation->setData( QmitkStdMultiWidget::PLANE_MODE_ROTATION ); - crosshairModesMenu->addAction( coupledCrosshairRotation ); - - QAction* swivelMode = new QAction(crosshairModesMenu); - swivelMode->setActionGroup(rotationModeActionGroup); - swivelMode->setText("Swivel mode"); - swivelMode->setCheckable(true); - swivelMode->setData( QmitkStdMultiWidget::PLANE_MODE_SWIVEL ); - crosshairModesMenu->addAction( swivelMode ); - } - // button for changing rotation mode m_CrosshairModeButton = new QPushButton(); m_CrosshairModeButton->setMaximumSize(15, 15); m_CrosshairModeButton->setIconSize(size); m_CrosshairModeButton->setFlat( true ); - m_CrosshairModeButton->setMenu( crosshairModesMenu ); + m_CrosshairModeButton->setMenu( this->GetCrossHairMenu() ); m_CrosshairModeButton->setIcon( QIcon( iconCrosshairMode_xpm ) ); layout->addWidget( m_CrosshairModeButton ); @@ -166,7 +111,87 @@ connect( m_SettingsButton, SIGNAL( clicked(bool) ), this, SLOT(OnSettingsButton(bool)) ); } +QMenu* QmitkRenderWindowMenu::CreateCrosshairMenu() +{ + QMenu* crosshairModesMenu = new QMenu(this); + + m_ShowHideCrosshairVisibilityAction = new QAction(crosshairModesMenu); + m_ShowHideCrosshairVisibilityAction->setText("Show crosshair"); + m_ShowHideCrosshairVisibilityAction->setCheckable(true); + m_ShowHideCrosshairVisibilityAction->setChecked(true); // TODO observe current status + crosshairModesMenu->addAction( m_ShowHideCrosshairVisibilityAction ); + QAction* resetViewAction = new QAction(crosshairModesMenu); + resetViewAction->setText("Reset view"); + crosshairModesMenu->addAction( resetViewAction ); + + QAction* rotationGroupSeparator = new QAction(crosshairModesMenu); + rotationGroupSeparator->setSeparator(true); + rotationGroupSeparator->setText("Rotation mode"); + crosshairModesMenu->addAction( rotationGroupSeparator ); + + QActionGroup* rotationModeActionGroup = new QActionGroup(crosshairModesMenu); + rotationModeActionGroup->setExclusive(true); + + QAction* noCrosshairRotation = new QAction(crosshairModesMenu); + noCrosshairRotation->setActionGroup(rotationModeActionGroup); + noCrosshairRotation->setText("No crosshair rotation"); + noCrosshairRotation->setCheckable(true); + noCrosshairRotation->setChecked(true); // TODO observe current status + noCrosshairRotation->setData( QmitkStdMultiWidget::PLANE_MODE_SLICING ); + crosshairModesMenu->addAction( noCrosshairRotation ); + + QAction* singleCrosshairRotation = new QAction(crosshairModesMenu); + singleCrosshairRotation->setActionGroup(rotationModeActionGroup); + singleCrosshairRotation->setText("Crosshair rotation"); + singleCrosshairRotation->setCheckable(true); + singleCrosshairRotation->setData( QmitkStdMultiWidget::PLANE_MODE_ROTATION ); + crosshairModesMenu->addAction( singleCrosshairRotation ); + + QAction* coupledCrosshairRotation = new QAction(crosshairModesMenu); + coupledCrosshairRotation->setActionGroup(rotationModeActionGroup); + coupledCrosshairRotation->setText("Coupled crosshair rotation"); + coupledCrosshairRotation->setCheckable(true); + coupledCrosshairRotation->setData( QmitkStdMultiWidget::PLANE_MODE_ROTATION ); + crosshairModesMenu->addAction( coupledCrosshairRotation ); + + QAction* swivelMode = new QAction(crosshairModesMenu); + swivelMode->setActionGroup(rotationModeActionGroup); + swivelMode->setText("Swivel mode"); + swivelMode->setCheckable(true); + swivelMode->setData( QmitkStdMultiWidget::PLANE_MODE_SWIVEL ); + crosshairModesMenu->addAction( swivelMode ); + + connect( m_ShowHideCrosshairVisibilityAction, SIGNAL(toggled(bool)), this, SIGNAL(ShowCrosshair(bool))); + connect( resetViewAction, SIGNAL(triggered()), this, SIGNAL(ResetView())); + connect( rotationModeActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(OnCrosshairRotationModeSelected(QAction*)) ); + + return crosshairModesMenu; +} + +QMenu* QmitkRenderWindowMenu::GetCrossHairMenu() +{ + if (!m_CrosshairMenu) + { + m_CrosshairMenu = this->CreateCrosshairMenu(); + } + + return m_CrosshairMenu; +} + +void QmitkRenderWindowMenu::SetCrossHairMenu(QMenu* menu) +{ + if (m_CrosshairMenu != menu) + { + m_CrosshairMenu = menu; + + if (m_CrosshairModeButton) + { + m_CrosshairModeButton->setMenu( GetCrossHairMenu() ); + } + } +} + void QmitkRenderWindowMenu::CreateSettingsWidget() { m_Settings = new QMenu(this); Index: CoreUI/Qmitk/QmitkRenderWindow.cpp =================================================================== --- CoreUI/Qmitk/QmitkRenderWindow.cpp (revision 20895) +++ CoreUI/Qmitk/QmitkRenderWindow.cpp (working copy) @@ -35,7 +35,7 @@ #include "QmitkRenderWindowMenu.h" QmitkRenderWindow::QmitkRenderWindow(QWidget *parent, QString name, mitk::VtkPropRenderer* renderer) -: QVTKWidget(parent), m_Renderer(renderer), m_ResendQtEvents(true), m_MenuWidgetActivated(false) +: QVTKWidget(parent), m_Renderer(renderer), m_ResendQtEvents(true), m_MenuWidgetActivated(false), m_MenuWidget(NULL) { if(m_Renderer.IsNull()) { @@ -322,3 +322,20 @@ if( m_MenuWidget ) m_MenuWidget->ChangeFullScreenMode( state ); } + +QMenu* QmitkRenderWindow::GetCrossHairMenu() +{ + if (m_MenuWidget) + { + return m_MenuWidget->GetCrossHairMenu(); + } +} + +void QmitkRenderWindow::SetCrossHairMenu(QMenu* menu) +{ + if (m_MenuWidget) + { + m_MenuWidget->SetCrossHairMenu( menu ); + } +} + Index: CoreUI/Qmitk/QmitkRenderWindowMenu.h =================================================================== --- CoreUI/Qmitk/QmitkRenderWindowMenu.h (revision 20895) +++ CoreUI/Qmitk/QmitkRenderWindowMenu.h (working copy) @@ -196,8 +196,13 @@ }; + QMenu* GetCrossHairMenu(); + void SetCrossHairMenu(QMenu* menu); + protected: + QMenu* CreateCrosshairMenu(); + QPushButton* m_CrosshairModeButton; QAction* m_ShowHideCrosshairVisibilityAction; @@ -247,6 +252,8 @@ /*! QMenu containg all layout direction and layout design settings.*/ QMenu* m_Settings; + + QMenu* m_CrosshairMenu; /*! Index of layout direction. 0: transversal; 1: saggital; 2: coronal; 3: threeD */ unsigned int m_Layout; Index: CoreUI/Qmitk/QmitkStdMultiWidget.h =================================================================== --- CoreUI/Qmitk/QmitkStdMultiWidget.h (revision 20895) +++ CoreUI/Qmitk/QmitkStdMultiWidget.h (working copy) @@ -49,6 +49,7 @@ public: QmitkStdMultiWidget(QWidget* parent = 0, Qt::WindowFlags f = 0); + virtual ~QmitkStdMultiWidget(); mitk::SliceNavigationController* GetTimeNavigationController(); Index: CoreUI/Qmitk/QmitkStdMultiWidget.cpp =================================================================== --- CoreUI/Qmitk/QmitkStdMultiWidget.cpp (revision 20895) +++ CoreUI/Qmitk/QmitkStdMultiWidget.cpp (working copy) @@ -127,18 +127,21 @@ mitkWidget2->setMaximumSize(2000,2000); mitkWidget2->setEnabled( TRUE ); mitkWidget2->SetLayoutIndex( SAGITTAL ); + mitkWidget2->SetCrossHairMenu( mitkWidget1->GetCrossHairMenu() ); mitkWidgetLayout2->addWidget(mitkWidget2); //Create RenderWindows 3 mitkWidget3 = new QmitkRenderWindow(mitkWidget3Container, "stdmulti.widget3"); mitkWidget3->setMaximumSize(2000,2000); mitkWidget3->SetLayoutIndex( CORONAL ); + mitkWidget3->SetCrossHairMenu( mitkWidget1->GetCrossHairMenu() ); mitkWidgetLayout3->addWidget(mitkWidget3); //Create RenderWindows 4 mitkWidget4 = new QmitkRenderWindow(mitkWidget4Container, "stdmulti.widget4"); mitkWidget4->setMaximumSize(2000,2000); mitkWidget4->SetLayoutIndex( THREE_D ); + mitkWidget4->SetCrossHairMenu( mitkWidget1->GetCrossHairMenu() ); mitkWidgetLayout4->addWidget(mitkWidget4); //create SignalSlot Connection @@ -405,6 +408,12 @@ mitkWidget4->GetRenderWindow() ); m_RectangleRendering4->Enable(1.0,1.0,0.0); } + +QmitkStdMultiWidget::~QmitkStdMultiWidget() +{ + DisablePositionTracking(); + DisableNavigationControllerEventListening(); +} void QmitkStdMultiWidget::RemovePlanesFromDataStorage() { @@ -1545,7 +1554,6 @@ gi->AddListener( m_TimeNavigationController ); } - void QmitkStdMultiWidget::DisableNavigationControllerEventListening() { // Do not let NavigationControllers listen to GlobalInteraction Index: CoreUI/Qmitk/QmitkRenderWindow.h =================================================================== --- CoreUI/Qmitk/QmitkRenderWindow.h (revision 20895) +++ CoreUI/Qmitk/QmitkRenderWindow.h (working copy) @@ -52,6 +52,9 @@ virtual mitk::BaseController * GetController(); virtual mitk::VtkPropRenderer* GetRenderer(); + QMenu* GetCrossHairMenu(); + void SetCrossHairMenu(QMenu* menu); + /** * \brief Whether Qt events should be passed to parent (default: true) *