diff --git a/Modules/QtWidgets/include/QmitkStdMultiWidget.h b/Modules/QtWidgets/include/QmitkStdMultiWidget.h index a5c2a2cd7e..594d4af4b1 100644 --- a/Modules/QtWidgets/include/QmitkStdMultiWidget.h +++ b/Modules/QtWidgets/include/QmitkStdMultiWidget.h @@ -1,431 +1,229 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ -#ifndef QmitkStdMultiWidget_h -#define QmitkStdMultiWidget_h +#ifndef QMITKSTDMULTIWIDGET_H +#define QMITKSTDMULTIWIDGET_H +// qt widgets module #include "MitkQtWidgetsExports.h" - -#include -#include - -#include +#include "QmitkAbstractMultiWidget.h" #include #include #include -#include -#include - -#include - class QHBoxLayout; -class QVBoxLayout; -class QGridLayout; -class QSpacerItem; -class QmitkLevelWindowWidget; -class QmitkRenderWindow; -class vtkCornerAnnotation; -class vtkMitkRectangleProp; - -namespace mitk -{ - class RenderingManager; -} -/// \ingroup QmitkModule -class MITKQTWIDGETS_EXPORT QmitkStdMultiWidget : public QWidget +/** +* @brief The 'QmitkStdMultiWidget' is a 'QmitkAbstractMultiWidget' that is used to display multiple render windows at once. +* Render windows are predefined in a 2x2 design with 3 different 2D view planes and a 3D render window. +*/ +class MITKQTWIDGETS_EXPORT QmitkStdMultiWidget : public QmitkAbstractMultiWidget { Q_OBJECT public: - QmitkStdMultiWidget( - QWidget *parent = nullptr, - Qt::WindowFlags f = nullptr, - mitk::RenderingManager *renderingManager = nullptr, - mitk::BaseRenderer::RenderingMode::Type renderingMode = mitk::BaseRenderer::RenderingMode::Standard, - const QString &name = "stdmulti"); - ~QmitkStdMultiWidget() override; - - mitk::SliceNavigationController *GetTimeNavigationController(); - - void RequestUpdate(); - - void ForceImmediateUpdate(); - - mitk::MouseModeSwitcher *GetMouseModeSwitcher(); - QmitkRenderWindow *GetRenderWindow1() const; - - QmitkRenderWindow *GetRenderWindow2() const; - - QmitkRenderWindow *GetRenderWindow3() const; - - QmitkRenderWindow *GetRenderWindow4() const; - - const mitk::Point3D GetCrossPosition() const; - - void EnablePositionTracking(); - - void DisablePositionTracking(); + enum + { + PLANE_MODE_SLICING = 0, + PLANE_MODE_ROTATION, + PLANE_MODE_SWIVEL + }; - int GetLayout() const; + enum + { + AXIAL = 0, + SAGITTAL, + CORONAL, + THREE_D + }; - bool GetGradientBackgroundFlag() const; + QmitkStdMultiWidget(QWidget *parent = nullptr, + Qt::WindowFlags f = 0, + mitk::RenderingManager *renderingManager = nullptr, + mitk::BaseRenderer::RenderingMode::Type renderingMode = mitk::BaseRenderer::RenderingMode::Standard, + const QString &name = "stdmulti"); - /*! - \brief Access node of widget plane 1 - \return DataNode holding widget plane 1 - */ - mitk::DataNode::Pointer GetWidgetPlane1(); - /*! - \brief Access node of widget plane 2 - \return DataNode holding widget plane 2 - */ - mitk::DataNode::Pointer GetWidgetPlane2(); - /*! - \brief Access node of widget plane 3 - \return DataNode holding widget plane 3 - */ - mitk::DataNode::Pointer GetWidgetPlane3(); - /*! - \brief Convenience method to access node of widget planes - \param id number of widget plane to be returned - \return DataNode holding widget plane 3 - */ - mitk::DataNode::Pointer GetWidgetPlane(int id); + ~QmitkStdMultiWidget() override; - bool IsColoredRectanglesEnabled() const; + virtual void InitializeMultiWidget() override; - bool IsDepartmentLogoEnabled() const; + virtual void SetSelectedPosition(const mitk::Point3D& newPosition, const QString& widgetName) override; + virtual const mitk::Point3D GetSelectedPosition(const QString& widgetName) const override; - void InitializeWidget(); + virtual void SetCrosshairVisibility(bool) override { }; + virtual bool GetCrosshairVisibility() const override { return true; } - /// called when the StdMultiWidget is closed to remove the 3 widget planes and the helper node from the DataStorage - void RemovePlanesFromDataStorage(); + mitk::SliceNavigationController* GetTimeNavigationController(); void AddPlanesToDataStorage(); + void RemovePlanesFromDataStorage(); - void SetDataStorage(mitk::DataStorage *ds); /** \brief Listener to the CrosshairPositionEvent Ensures the CrosshairPositionEvent is handled only once and at the end of the Qt-Event loop */ void HandleCrosshairPositionEvent(); - /// activate Menu Widget. true: activated, false: deactivated void ActivateMenuWidget(bool state); bool IsMenuWidgetEnabled() const; - void SetCornerAnnotationVisibility(bool visibility); + /** + * @brief Convenience method to get a render window widget. + * @param Number of the widget (0-3) + * @return The render window widget + */ + QmitkRenderWindow* GetRenderWindow(unsigned int number) const; + QmitkRenderWindow* GetRenderWindow1() const; + QmitkRenderWindow* GetRenderWindow2() const; + QmitkRenderWindow* GetRenderWindow3() const; + QmitkRenderWindow* GetRenderWindow4() const; - bool IsCornerAnnotationVisible(void) const; + /** + * @brief Convenience method to get a widget plane. + * @param Number of the widget plane (1-3) + * @return The widget plane as data node + */ + mitk::DataNode::Pointer GetWidgetPlane(unsigned int number) const; + mitk::DataNode::Pointer GetWidgetPlane1() const; + mitk::DataNode::Pointer GetWidgetPlane2() const; + mitk::DataNode::Pointer GetWidgetPlane3() const; -protected: - void UpdateAllWidgets(); + /** + * @brief SetDecorationColor Set the color of the decoration of the 4 widgets. + * + * This is used to color the frame of the renderwindow and the corner annatation. + * For the first 3 widgets, this color is a property of the helper object nodes + * which contain the respective plane geometry. For widget 4, this is a member, + * since there is no data node for this widget. + */ + void SetDecorationColor(unsigned int widgetNumber, mitk::Color color); + /** + * @brief GetDecorationColorForWidget Get the color for annotation, crosshair and rectangle. + * @param widgetNumber Number of the renderwindow (0-3). + * @return Color in mitk format. + */ + mitk::Color GetDecorationColor(unsigned int widgetNumber); - void HideAllWidgetToolbars(); +public Q_SLOTS: -public slots: + // mouse events + virtual void wheelEvent(QWheelEvent* e) override; + virtual void moveEvent(QMoveEvent* e) override; /// Receives the signal from HandleCrosshairPositionEvent, executes the StatusBar update void HandleCrosshairPositionEventDelayed(); - void changeLayoutTo2DImagesUp(); - - void changeLayoutTo2DImagesLeft(); - - void changeLayoutToDefault(); - - void changeLayoutToBig3D(); - - void changeLayoutToWidget1(); - - void changeLayoutToWidget2(); - - void changeLayoutToWidget3(); - - void changeLayoutToRowWidget3And4(); - - void changeLayoutToColumnWidget3And4(); - - void changeLayoutToRowWidgetSmall3andBig4(); - - void changeLayoutToSmallUpperWidget2Big3and4(); - - void changeLayoutTo2x2Dand3DWidget(); - - void changeLayoutToLeft2Dand3DRight2D(); - - /** Changes the layout to one 2D window up and a 3D window down. - * The 2D window can be defined by its id (1-3). If MITK default - * settings were not changed, 1 is axial, 2 is sagittal and 3 is coronal. - */ - void changeLayoutTo2DUpAnd3DDown(unsigned int id2Dwindow = 2); - void Fit(); - void InitPositionTracking(); - void AddDisplayPlaneSubTree(); - void EnableStandardLevelWindow(); - - void DisableStandardLevelWindow(); - - bool InitializeStandardViews(const mitk::Geometry3D *geometry); - - void wheelEvent(QWheelEvent *e) override; - - void mousePressEvent(QMouseEvent *e) override; - - void moveEvent(QMoveEvent *e) override; - void EnsureDisplayContainsPoint(mitk::BaseRenderer *renderer, const mitk::Point3D &p); - void MoveCrossToPosition(const mitk::Point3D &newPosition); - - // void EnableNavigationControllerEventListening(); - - // void DisableNavigationControllerEventListening(); - - void EnableGradientBackground(); - - void DisableGradientBackground(); - - void EnableDepartmentLogo(); - - void DisableDepartmentLogo(); - - void EnableColoredRectangles(); - - void DisableColoredRectangles(); - void SetWidgetPlaneVisibility(const char *widgetName, bool visible, mitk::BaseRenderer *renderer = nullptr); void SetWidgetPlanesVisibility(bool visible, mitk::BaseRenderer *renderer = nullptr); void SetWidgetPlanesLocked(bool locked); void SetWidgetPlanesRotationLocked(bool locked); void SetWidgetPlanesRotationLinked(bool link); void SetWidgetPlaneMode(int mode); - void SetGradientBackgroundColors(const mitk::Color &upper, const mitk::Color &lower); - - void SetDepartmentLogo(const char *path); - - void SetWidgetPlaneModeToSlicing(bool activate); + //void SetWidgetPlaneModeToSlicing(bool activate); - void SetWidgetPlaneModeToRotation(bool activate); + //void SetWidgetPlaneModeToRotation(bool activate); - void SetWidgetPlaneModeToSwivel(bool activate); - - void OnLayoutDesignChanged(int layoutDesignIndex); + //void SetWidgetPlaneModeToSwivel(bool activate); void ResetCrosshair(); -signals: +Q_SIGNALS: void LeftMouseClicked(mitk::Point3D pointValue); void WheelMoved(QWheelEvent *); void WidgetPlanesRotationLinked(bool); void WidgetPlanesRotationEnabled(bool); void ViewsInitialized(); void WidgetPlaneModeSlicing(bool); void WidgetPlaneModeRotation(bool); void WidgetPlaneModeSwivel(bool); void WidgetPlaneModeChange(int); void WidgetNotifyNewCrossHairMode(int); void Moved(); -public: - /** Define RenderWindow (public)*/ - QmitkRenderWindow *mitkWidget1; - QmitkRenderWindow *mitkWidget2; - QmitkRenderWindow *mitkWidget3; - QmitkRenderWindow *mitkWidget4; - QmitkLevelWindowWidget *levelWindowWidget; - /********************************/ - - enum - { - PLANE_MODE_SLICING = 0, - PLANE_MODE_ROTATION, - PLANE_MODE_SWIVEL - }; - enum - { - LAYOUT_DEFAULT = 0, - LAYOUT_2D_IMAGES_UP, - LAYOUT_2D_IMAGES_LEFT, - LAYOUT_BIG_3D, - LAYOUT_WIDGET1, - LAYOUT_WIDGET2, - LAYOUT_WIDGET3, - LAYOUT_2X_2D_AND_3D_WIDGET, - LAYOUT_ROW_WIDGET_3_AND_4, - LAYOUT_COLUMN_WIDGET_3_AND_4, - LAYOUT_ROW_WIDGET_SMALL3_AND_BIG4, - LAYOUT_SMALL_UPPER_WIDGET2_BIG3_AND4, - LAYOUT_2D_AND_3D_LEFT_2D_RIGHT_WIDGET, - LAYOUT_2D_UP_AND_3D_DOWN - }; - - enum - { - AXIAL, - SAGITTAL, - CORONAL, - THREE_D - }; - - /** - * @brief SetCornerAnnotation Create a corner annotation for a widget. - * @param text The text of the annotation. - * @param color The color. - * @param widgetNumber The widget (0-3). - */ - void SetDecorationProperties(std::string text, mitk::Color color, int widgetNumber); - /** - * @brief GetRenderWindow convinience method to get a widget. - * @param number of the widget (0-3) - * @return The renderwindow widget. - */ - QmitkRenderWindow *GetRenderWindow(unsigned int number); - - /** - * @brief SetGradientBackgroundColorForRenderWindow background for a widget. - * - * If two different input colors are, a gradient background is generated. - * - * @param upper Upper color of the gradient background. - * @param lower Lower color of the gradient background. - * @param widgetNumber The widget (0-3). - */ - void SetGradientBackgroundColorForRenderWindow(const mitk::Color &upper, - const mitk::Color &lower, - unsigned int widgetNumber); - - /** - * @brief GetDecorationColorForWidget Get the color for annotation, crosshair and rectangle. - * @param widgetNumber Number of the renderwindow (0-3). - * @return Color in mitk format. - */ - mitk::Color GetDecorationColor(unsigned int widgetNumber); +private: - /** - * @brief SetDecorationColor Set the color of the decoration of the 4 widgets. - * - * This is used to color the frame of the renderwindow and the corner annatation. - * For the first 3 widgets, this color is a property of the helper object nodes - * which contain the respective plane geometry. For widget 4, this is a member, - * since there is no data node for this widget. - */ - void SetDecorationColor(unsigned int widgetNumber, mitk::Color color); + virtual void SetLayoutImpl() override; + virtual void SynchronizeImpl() override { } + virtual void SetInteractionSchemeImpl() override { } - /** - * @brief GetCornerAnnotationText Getter for corner annotation text. - * @param widgetNumber the widget number (0-3). - * @return The text in the corner annotation. - */ - std::string GetCornerAnnotationText(unsigned int widgetNumber); + void CreateRenderWindowWidgets(); + void InitializeLayout(); - /** - * @brief GetGradientColors Getter for gradientbackground colors. - * @param widgetNumber the widget number (0-3). - * @return A pair of colors. First: upper, second: lower. - */ - std::pair GetGradientColors(unsigned int widgetNumber); + void UpdateAllWidgets(); -protected: - QHBoxLayout *QmitkStdMultiWidgetLayout; + void HideAllWidgetToolbars(); - int m_Layout; - int m_PlaneMode; + QHBoxLayout* hBoxLayout; mitk::RenderingManager *m_RenderingManager; - - mitk::LogoAnnotation::Pointer m_LogoRendering; - - bool m_GradientBackgroundFlag; - - mitk::MouseModeSwitcher::Pointer m_MouseModeSwitcher; mitk::SliceNavigationController *m_TimeNavigationController; - mitk::DataStorage::Pointer m_DataStorage; - /** - * @brief m_PlaneNode1 the 3 helper objects which contain the plane geometry. - */ + * @brief The 3 helper objects which contain the plane geometry. + */ mitk::DataNode::Pointer m_PlaneNode1; mitk::DataNode::Pointer m_PlaneNode2; mitk::DataNode::Pointer m_PlaneNode3; + + int m_PlaneMode; + /** * @brief m_ParentNodeForGeometryPlanes This helper object is added to the datastorage * and contains the 3 planes for displaying the image geometry (crosshair and 3D planes). */ mitk::DataNode::Pointer m_ParentNodeForGeometryPlanes; /** * @brief m_DecorationColorWidget4 color for annotation and rectangle of widget 4. * * For other widgets1-3, the color is a property of the respective data node. * There is no node for widget 4, hence, we need an extra member. */ mitk::Color m_DecorationColorWidget4; - /** - * @brief m_GradientBackgroundColors Contains the colors of the gradient background. - * - */ - std::pair m_GradientBackgroundColors[4]; - - QSplitter *m_MainSplit; - QSplitter *m_LayoutSplit; - QSplitter *m_SubSplit1; - QSplitter *m_SubSplit2; + QSplitter* m_MainSplit; + QSplitter* m_LayoutSplit; + QSplitter* m_SubSplit1; + QSplitter* m_SubSplit2; - QWidget *mitkWidget1Container; - QWidget *mitkWidget2Container; - QWidget *mitkWidget3Container; - QWidget *mitkWidget4Container; - - vtkSmartPointer m_CornerAnnotations[4]; - vtkSmartPointer m_RectangleProps[4]; + QWidget* mitkWidget1Container; + QWidget* mitkWidget2Container; + QWidget* mitkWidget3Container; + QWidget* mitkWidget4Container; bool m_PendingCrosshairPositionEvent; bool m_CrosshairNavigationEnabled; - /** - * @brief CreateCornerAnnotation helper method to create a corner annotation. - * @param text of the annotation. - * @param color of the annotation. - * @return the complete CornerAnnotation. - */ - vtkSmartPointer CreateCornerAnnotation(std::string text, mitk::Color color); - /** - * @brief FillGradientBackgroundWithBlack Internal helper method to initialize the - * gradient background colors with black. - */ - void FillGradientBackgroundWithBlack(); }; -#endif /*QmitkStdMultiWidget_h*/ + +#endif // QMITKSTDMULTIWIDGET_H diff --git a/Modules/QtWidgets/src/QmitkStdMultiWidget.cpp b/Modules/QtWidgets/src/QmitkStdMultiWidget.cpp index f9e7793ee2..cdcdd34080 100644 --- a/Modules/QtWidgets/src/QmitkStdMultiWidget.cpp +++ b/Modules/QtWidgets/src/QmitkStdMultiWidget.cpp @@ -1,2034 +1,847 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #define SMW_INFO MITK_INFO("widget.stdmulti") #include "QmitkStdMultiWidget.h" +#include "QmitkRenderWindowWidget.h" -#include #include #include #include #include -#include #include #include "mitkImagePixelReadAccessor.h" #include "mitkPixelTypeMultiplex.h" -#include #include -#include #include #include #include #include #include #include #include #include #include #include #include #include #include -#include -#include -#include -#include #include QmitkStdMultiWidget::QmitkStdMultiWidget(QWidget *parent, - Qt::WindowFlags f, - mitk::RenderingManager *renderingManager, - mitk::BaseRenderer::RenderingMode::Type renderingMode, - const QString &name) - : QWidget(parent, f), - mitkWidget1(nullptr), - mitkWidget2(nullptr), - mitkWidget3(nullptr), - mitkWidget4(nullptr), - levelWindowWidget(nullptr), - QmitkStdMultiWidgetLayout(nullptr), - m_Layout(LAYOUT_DEFAULT), - m_PlaneMode(PLANE_MODE_SLICING), - m_RenderingManager(renderingManager), - m_GradientBackgroundFlag(true), - m_TimeNavigationController(nullptr), - m_MainSplit(nullptr), - m_LayoutSplit(nullptr), - m_SubSplit1(nullptr), - m_SubSplit2(nullptr), - mitkWidget1Container(nullptr), - mitkWidget2Container(nullptr), - mitkWidget3Container(nullptr), - mitkWidget4Container(nullptr), - m_PendingCrosshairPositionEvent(false), - m_CrosshairNavigationEnabled(false) -{ - /****************************************************** - * Use the global RenderingManager if none was specified - * ****************************************************/ + Qt::WindowFlags f/* = 0*/, + mitk::RenderingManager *renderingManager/* = nullptr*/, + mitk::BaseRenderer::RenderingMode::Type renderingMode/* = mitk::BaseRenderer::RenderingMode::Standard*/, + const QString &name/* = "stdmulti"*/) + : QmitkAbstractMultiWidget(parent, f, renderingManager, renderingMode, name) + , hBoxLayout(nullptr) + , m_RenderingManager(renderingManager) + , m_TimeNavigationController(nullptr) + , m_PlaneMode(PLANE_MODE_SLICING) + , m_MainSplit(nullptr) + , m_LayoutSplit(nullptr) + , m_SubSplit1(nullptr) + , m_SubSplit2(nullptr) + , m_PendingCrosshairPositionEvent(false) + , m_CrosshairNavigationEnabled(false) +{ + // use the global RenderingManager if none was specified if (m_RenderingManager == nullptr) { m_RenderingManager = mitk::RenderingManager::GetInstance(); } m_TimeNavigationController = m_RenderingManager->GetTimeNavigationController(); - /*******************************/ - // Create Widget manually - /*******************************/ - - // create Layouts - QmitkStdMultiWidgetLayout = new QHBoxLayout(this); - QmitkStdMultiWidgetLayout->setContentsMargins(0, 0, 0, 0); - - // Set Layout to widget - this->setLayout(QmitkStdMultiWidgetLayout); - - // create main splitter - m_MainSplit = new QSplitter(this); - QmitkStdMultiWidgetLayout->addWidget(m_MainSplit); + // create SignalSlot Connection + /* + connect(m_RenderWindow1, SIGNAL(SignalLayoutDesignChanged(int)), this, SLOT(OnLayoutDesignChanged(int))); + connect(m_RenderWindow1, SIGNAL(ResetView()), this, SLOT(ResetCrosshair())); + connect(m_RenderWindow1, SIGNAL(ChangeCrosshairRotationMode(int)), this, SLOT(SetWidgetPlaneMode(int))); + connect(this, SIGNAL(WidgetNotifyNewCrossHairMode(int)), m_RenderWindow1, SLOT(OnWidgetPlaneModeChanged(int))); - // create m_LayoutSplit and add to the mainSplit - m_LayoutSplit = new QSplitter(Qt::Vertical, m_MainSplit); - m_MainSplit->addWidget(m_LayoutSplit); + connect(m_RenderWindow2, SIGNAL(SignalLayoutDesignChanged(int)), this, SLOT(OnLayoutDesignChanged(int))); + connect(m_RenderWindow2, SIGNAL(ResetView()), this, SLOT(ResetCrosshair())); + connect(m_RenderWindow2, SIGNAL(ChangeCrosshairRotationMode(int)), this, SLOT(SetWidgetPlaneMode(int))); + connect(this, SIGNAL(WidgetNotifyNewCrossHairMode(int)), m_RenderWindow2, SLOT(OnWidgetPlaneModeChanged(int))); - // create m_SubSplit1 and m_SubSplit2 - m_SubSplit1 = new QSplitter(m_LayoutSplit); - m_SubSplit2 = new QSplitter(m_LayoutSplit); + connect(m_RenderWindow3, SIGNAL(SignalLayoutDesignChanged(int)), this, SLOT(OnLayoutDesignChanged(int))); + connect(m_RenderWindow3, SIGNAL(ResetView()), this, SLOT(ResetCrosshair())); + connect(m_RenderWindow3, SIGNAL(ChangeCrosshairRotationMode(int)), this, SLOT(SetWidgetPlaneMode(int))); + connect(this, SIGNAL(WidgetNotifyNewCrossHairMode(int)), m_RenderWindow3, SLOT(OnWidgetPlaneModeChanged(int))); - // creae Widget Container - mitkWidget1Container = new QWidget(m_SubSplit1); - mitkWidget2Container = new QWidget(m_SubSplit1); - mitkWidget3Container = new QWidget(m_SubSplit2); - mitkWidget4Container = new QWidget(m_SubSplit2); - - mitkWidget1Container->setContentsMargins(0, 0, 0, 0); - mitkWidget2Container->setContentsMargins(0, 0, 0, 0); - mitkWidget3Container->setContentsMargins(0, 0, 0, 0); - mitkWidget4Container->setContentsMargins(0, 0, 0, 0); - - // create Widget Layout - QHBoxLayout *mitkWidgetLayout1 = new QHBoxLayout(mitkWidget1Container); - QHBoxLayout *mitkWidgetLayout2 = new QHBoxLayout(mitkWidget2Container); - QHBoxLayout *mitkWidgetLayout3 = new QHBoxLayout(mitkWidget3Container); - QHBoxLayout *mitkWidgetLayout4 = new QHBoxLayout(mitkWidget4Container); - - m_CornerAnnotations[0] = vtkSmartPointer::New(); - m_CornerAnnotations[1] = vtkSmartPointer::New(); - m_CornerAnnotations[2] = vtkSmartPointer::New(); - m_CornerAnnotations[3] = vtkSmartPointer::New(); - - m_RectangleProps[0] = vtkSmartPointer::New(); - m_RectangleProps[1] = vtkSmartPointer::New(); - m_RectangleProps[2] = vtkSmartPointer::New(); - m_RectangleProps[3] = vtkSmartPointer::New(); - - mitkWidgetLayout1->setMargin(0); - mitkWidgetLayout2->setMargin(0); - mitkWidgetLayout3->setMargin(0); - mitkWidgetLayout4->setMargin(0); - - // set Layout to Widget Container - mitkWidget1Container->setLayout(mitkWidgetLayout1); - mitkWidget2Container->setLayout(mitkWidgetLayout2); - mitkWidget3Container->setLayout(mitkWidgetLayout3); - mitkWidget4Container->setLayout(mitkWidgetLayout4); - - // set SizePolicy - mitkWidget1Container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - mitkWidget2Container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - mitkWidget3Container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - mitkWidget4Container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - - // insert Widget Container into the splitters - m_SubSplit1->addWidget(mitkWidget1Container); - m_SubSplit1->addWidget(mitkWidget2Container); - - m_SubSplit2->addWidget(mitkWidget3Container); - m_SubSplit2->addWidget(mitkWidget4Container); - - // Create RenderWindows 1 - mitkWidget1 = new QmitkRenderWindow(mitkWidget1Container, name + ".widget1", nullptr, m_RenderingManager, renderingMode); - mitkWidget1->SetLayoutIndex(AXIAL); - mitkWidgetLayout1->addWidget(mitkWidget1); - - // Create RenderWindows 2 - mitkWidget2 = new QmitkRenderWindow(mitkWidget2Container, name + ".widget2", nullptr, m_RenderingManager, renderingMode); - mitkWidget2->setEnabled(true); - mitkWidget2->SetLayoutIndex(SAGITTAL); - mitkWidgetLayout2->addWidget(mitkWidget2); - - // Create RenderWindows 3 - mitkWidget3 = new QmitkRenderWindow(mitkWidget3Container, name + ".widget3", nullptr, m_RenderingManager, renderingMode); - mitkWidget3->SetLayoutIndex(CORONAL); - mitkWidgetLayout3->addWidget(mitkWidget3); - - // Create RenderWindows 4 - mitkWidget4 = new QmitkRenderWindow(mitkWidget4Container, name + ".widget4", nullptr, m_RenderingManager, renderingMode); - mitkWidget4->SetLayoutIndex(THREE_D); - mitkWidgetLayout4->addWidget(mitkWidget4); + connect(m_RenderWindow4, SIGNAL(SignalLayoutDesignChanged(int)), this, SLOT(OnLayoutDesignChanged(int))); + connect(m_RenderWindow4, SIGNAL(ResetView()), this, SLOT(ResetCrosshair())); + connect(m_RenderWindow4, SIGNAL(ChangeCrosshairRotationMode(int)), this, SLOT(SetWidgetPlaneMode(int))); + connect(this, SIGNAL(WidgetNotifyNewCrossHairMode(int)), m_RenderWindow4, SLOT(OnWidgetPlaneModeChanged(int))); + */ +} - // create SignalSlot Connection - connect(mitkWidget1, SIGNAL(SignalLayoutDesignChanged(int)), this, SLOT(OnLayoutDesignChanged(int))); - connect(mitkWidget1, SIGNAL(ResetView()), this, SLOT(ResetCrosshair())); - connect(mitkWidget1, SIGNAL(ChangeCrosshairRotationMode(int)), this, SLOT(SetWidgetPlaneMode(int))); - connect(this, SIGNAL(WidgetNotifyNewCrossHairMode(int)), mitkWidget1, SLOT(OnWidgetPlaneModeChanged(int))); - - connect(mitkWidget2, SIGNAL(SignalLayoutDesignChanged(int)), this, SLOT(OnLayoutDesignChanged(int))); - connect(mitkWidget2, SIGNAL(ResetView()), this, SLOT(ResetCrosshair())); - connect(mitkWidget2, SIGNAL(ChangeCrosshairRotationMode(int)), this, SLOT(SetWidgetPlaneMode(int))); - connect(this, SIGNAL(WidgetNotifyNewCrossHairMode(int)), mitkWidget2, SLOT(OnWidgetPlaneModeChanged(int))); - - connect(mitkWidget3, SIGNAL(SignalLayoutDesignChanged(int)), this, SLOT(OnLayoutDesignChanged(int))); - connect(mitkWidget3, SIGNAL(ResetView()), this, SLOT(ResetCrosshair())); - connect(mitkWidget3, SIGNAL(ChangeCrosshairRotationMode(int)), this, SLOT(SetWidgetPlaneMode(int))); - connect(this, SIGNAL(WidgetNotifyNewCrossHairMode(int)), mitkWidget3, SLOT(OnWidgetPlaneModeChanged(int))); - - connect(mitkWidget4, SIGNAL(SignalLayoutDesignChanged(int)), this, SLOT(OnLayoutDesignChanged(int))); - connect(mitkWidget4, SIGNAL(ResetView()), this, SLOT(ResetCrosshair())); - connect(mitkWidget4, SIGNAL(ChangeCrosshairRotationMode(int)), this, SLOT(SetWidgetPlaneMode(int))); - connect(this, SIGNAL(WidgetNotifyNewCrossHairMode(int)), mitkWidget4, SLOT(OnWidgetPlaneModeChanged(int))); - - // Create Level Window Widget - levelWindowWidget = new QmitkLevelWindowWidget(m_MainSplit); // this - levelWindowWidget->setObjectName(QString::fromUtf8("levelWindowWidget")); - QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); - sizePolicy.setHorizontalStretch(0); - sizePolicy.setVerticalStretch(0); - sizePolicy.setHeightForWidth(levelWindowWidget->sizePolicy().hasHeightForWidth()); - levelWindowWidget->setSizePolicy(sizePolicy); - levelWindowWidget->setMaximumWidth(50); - - // add LevelWindow Widget to mainSplitter - m_MainSplit->addWidget(levelWindowWidget); - - // show mainSplitt and add to Layout - m_MainSplit->show(); - - // resize Image. - this->resize(QSize(364, 477).expandedTo(minimumSizeHint())); - - // Initialize the widgets. - this->InitializeWidget(); - - // Activate Widget Menu - this->ActivateMenuWidget(true); +QmitkStdMultiWidget::~QmitkStdMultiWidget() +{ + m_TimeNavigationController->Disconnect(GetRenderWindow1()->GetSliceNavigationController()); + m_TimeNavigationController->Disconnect(GetRenderWindow2()->GetSliceNavigationController()); + m_TimeNavigationController->Disconnect(GetRenderWindow3()->GetSliceNavigationController()); + m_TimeNavigationController->Disconnect(GetRenderWindow4()->GetSliceNavigationController()); } -void QmitkStdMultiWidget::InitializeWidget() +void QmitkStdMultiWidget::InitializeMultiWidget() { - // Make all black and overwrite renderwindow 4 - this->FillGradientBackgroundWithBlack(); - // This is #191919 in hex - float tmp1[3] = {0.098f, 0.098f, 0.098f}; - // This is #7F7F7F in hex - float tmp2[3] = {0.498f, 0.498f, 0.498f}; - m_GradientBackgroundColors[3] = std::make_pair(mitk::Color(tmp1), mitk::Color(tmp2)); + SetLayout(2, 2); // Yellow is default color for widget4 m_DecorationColorWidget4[0] = 1.0f; m_DecorationColorWidget4[1] = 1.0f; m_DecorationColorWidget4[2] = 0.0f; // transfer colors in WorldGeometry-Nodes of the associated Renderer mitk::IntProperty::Pointer layer; // of widget 1 - m_PlaneNode1 = mitk::BaseRenderer::GetInstance(mitkWidget1->GetRenderWindow())->GetCurrentWorldPlaneGeometryNode(); + m_PlaneNode1 = + mitk::BaseRenderer::GetInstance(GetRenderWindow1()->GetRenderWindow())->GetCurrentWorldPlaneGeometryNode(); m_PlaneNode1->SetColor(GetDecorationColor(0)); layer = mitk::IntProperty::New(1000); m_PlaneNode1->SetProperty("layer", layer); - // ... of widget 2 - m_PlaneNode2 = mitk::BaseRenderer::GetInstance(mitkWidget2->GetRenderWindow())->GetCurrentWorldPlaneGeometryNode(); + // of widget 2 + m_PlaneNode2 = + mitk::BaseRenderer::GetInstance(GetRenderWindow2()->GetRenderWindow())->GetCurrentWorldPlaneGeometryNode(); m_PlaneNode2->SetColor(GetDecorationColor(1)); layer = mitk::IntProperty::New(1000); m_PlaneNode2->SetProperty("layer", layer); - // ... of widget 3 - m_PlaneNode3 = mitk::BaseRenderer::GetInstance(mitkWidget3->GetRenderWindow())->GetCurrentWorldPlaneGeometryNode(); + // of widget 3 + m_PlaneNode3 = + mitk::BaseRenderer::GetInstance(GetRenderWindow3()->GetRenderWindow())->GetCurrentWorldPlaneGeometryNode(); m_PlaneNode3->SetColor(GetDecorationColor(2)); layer = mitk::IntProperty::New(1000); m_PlaneNode3->SetProperty("layer", layer); - // The parent node + // the parent node m_ParentNodeForGeometryPlanes = - mitk::BaseRenderer::GetInstance(mitkWidget4->GetRenderWindow())->GetCurrentWorldPlaneGeometryNode(); + mitk::BaseRenderer::GetInstance(GetRenderWindow4()->GetRenderWindow())->GetCurrentWorldPlaneGeometryNode(); layer = mitk::IntProperty::New(1000); m_ParentNodeForGeometryPlanes->SetProperty("layer", layer); - mitk::BaseRenderer::GetInstance(mitkWidget4->GetRenderWindow())->SetMapperID(mitk::BaseRenderer::Standard3D); // Set plane mode (slicing/rotation behavior) to slicing (default) m_PlaneMode = PLANE_MODE_SLICING; - // Set default view directions for SNCs - mitkWidget1->GetSliceNavigationController()->SetDefaultViewDirection(mitk::SliceNavigationController::Axial); - mitkWidget2->GetSliceNavigationController()->SetDefaultViewDirection(mitk::SliceNavigationController::Sagittal); - mitkWidget3->GetSliceNavigationController()->SetDefaultViewDirection(mitk::SliceNavigationController::Frontal); - mitkWidget4->GetSliceNavigationController()->SetDefaultViewDirection(mitk::SliceNavigationController::Original); - - SetDecorationProperties("Axial", GetDecorationColor(0), 0); - SetDecorationProperties("Sagittal", GetDecorationColor(1), 1); - SetDecorationProperties("Coronal", GetDecorationColor(2), 2); - SetDecorationProperties("3D", GetDecorationColor(3), 3); + AddDisplayPlaneSubTree(); - // connect to the "time navigation controller": send time via sliceNavigationControllers - m_TimeNavigationController->ConnectGeometryTimeEvent(mitkWidget1->GetSliceNavigationController(), false); - m_TimeNavigationController->ConnectGeometryTimeEvent(mitkWidget2->GetSliceNavigationController(), false); - m_TimeNavigationController->ConnectGeometryTimeEvent(mitkWidget3->GetSliceNavigationController(), false); - m_TimeNavigationController->ConnectGeometryTimeEvent(mitkWidget4->GetSliceNavigationController(), false); - mitkWidget1->GetSliceNavigationController()->ConnectGeometrySendEvent( - mitk::BaseRenderer::GetInstance(mitkWidget4->GetRenderWindow())); - - // reverse connection between sliceNavigationControllers and m_TimeNavigationController - mitkWidget1->GetSliceNavigationController()->ConnectGeometryTimeEvent(m_TimeNavigationController, false); - mitkWidget2->GetSliceNavigationController()->ConnectGeometryTimeEvent(m_TimeNavigationController, false); - mitkWidget3->GetSliceNavigationController()->ConnectGeometryTimeEvent(m_TimeNavigationController, false); - // mitkWidget4->GetSliceNavigationController() - // ->ConnectGeometryTimeEvent(m_TimeNavigationController, false); - - m_MouseModeSwitcher = mitk::MouseModeSwitcher::New(); - - // setup the department logo rendering - m_LogoRendering = mitk::LogoAnnotation::New(); - mitk::BaseRenderer::Pointer renderer4 = mitk::BaseRenderer::GetInstance(mitkWidget4->GetRenderWindow()); - m_LogoRendering->SetOpacity(0.5); - mitk::Point2D offset; - offset.Fill(0.03); - m_LogoRendering->SetOffsetVector(offset); - m_LogoRendering->SetRelativeSize(0.25); - m_LogoRendering->SetCornerPosition(1); - SetDepartmentLogo(":/org.mitk.gui.qt.stdmultiwidgeteditor/defaultWatermark.png"); - mitk::ManualPlacementAnnotationRenderer::AddAnnotation(m_LogoRendering.GetPointer(), renderer4); + ActivateMenuWidget(true); } -void QmitkStdMultiWidget::FillGradientBackgroundWithBlack() +void QmitkStdMultiWidget::SetSelectedPosition(const mitk::Point3D& newPosition, const QString& /*widgetName*/) { - // We have 4 widgets and ... - for (unsigned int i = 0; i < 4; ++i) - { - float black[3] = { 0.0f, 0.0f, 0.0f }; - m_GradientBackgroundColors[i] = std::make_pair(mitk::Color(black), mitk::Color(black)); - } -} + GetRenderWindow1()->GetSliceNavigationController()->SelectSliceByPoint(newPosition); + GetRenderWindow2()->GetSliceNavigationController()->SelectSliceByPoint(newPosition); + GetRenderWindow3()->GetSliceNavigationController()->SelectSliceByPoint(newPosition); -std::pair QmitkStdMultiWidget::GetGradientColors(unsigned int widgetNumber) -{ - if (widgetNumber > 3) - { - MITK_ERROR << "Decoration color for unknown widget!"; - float black[3] = { 0.0f, 0.0f, 0.0f }; - return std::make_pair(mitk::Color(black), mitk::Color(black)); - } - return m_GradientBackgroundColors[widgetNumber]; + RequestUpdateAll(); } -mitk::Color QmitkStdMultiWidget::GetDecorationColor(unsigned int widgetNumber) +const mitk::Point3D QmitkStdMultiWidget::GetSelectedPosition(const QString& widgetName) const { - // The implementation looks a bit messy here, but it avoids - // synchronization of the color of the geometry nodes and an - // internal member here. - // Default colors were chosen for decent visibitliy. - // Feel free to change your preferences in the workbench. - float tmp[3] = {0.0f, 0.0f, 0.0f}; - switch (widgetNumber) + const mitk::PlaneGeometry* plane1 = GetRenderWindow1()->GetSliceNavigationController()->GetCurrentPlaneGeometry(); + const mitk::PlaneGeometry* plane2 = GetRenderWindow2()->GetSliceNavigationController()->GetCurrentPlaneGeometry(); + const mitk::PlaneGeometry* plane3 = GetRenderWindow3()->GetSliceNavigationController()->GetCurrentPlaneGeometry(); + + mitk::Line3D line; + if ((plane1 != nullptr) && (plane2 != nullptr) + && (plane1->IntersectionLine(plane2, line))) { - case 0: - { - if (m_PlaneNode1.IsNotNull()) - { - if (m_PlaneNode1->GetColor(tmp)) - { - return dynamic_cast(m_PlaneNode1->GetProperty("color"))->GetColor(); - } - } - float red[3] = {0.753f, 0.0f, 0.0f}; // This is #C00000 in hex - return mitk::Color(red); - } - case 1: - { - if (m_PlaneNode2.IsNotNull()) - { - if (m_PlaneNode2->GetColor(tmp)) - { - return dynamic_cast(m_PlaneNode2->GetProperty("color"))->GetColor(); - } - } - float green[3] = {0.0f, 0.69f, 0.0f}; // This is #00B000 in hex - return mitk::Color(green); - } - case 2: - { - if (m_PlaneNode3.IsNotNull()) - { - if (m_PlaneNode3->GetColor(tmp)) - { - return dynamic_cast(m_PlaneNode3->GetProperty("color"))->GetColor(); - } - } - float blue[3] = {0.0, 0.502f, 1.0f}; // This is #0080FF in hex - return mitk::Color(blue); - } - case 3: + mitk::Point3D point; + if ((plane3 != nullptr) && (plane3->IntersectionPoint(line, point))) { - return m_DecorationColorWidget4; + return point; } - default: - MITK_ERROR << "Decoration color for unknown widget!"; - float black[3] = {0.0f, 0.0f, 0.0f}; - return mitk::Color(black); } -} -std::string QmitkStdMultiWidget::GetCornerAnnotationText(unsigned int widgetNumber) -{ - if (widgetNumber > 3) - { - MITK_ERROR << "Decoration color for unknown widget!"; - return std::string(""); - } - return std::string(m_CornerAnnotations[widgetNumber]->GetText(0)); + return mitk::Point3D(); } -QmitkStdMultiWidget::~QmitkStdMultiWidget() +mitk::SliceNavigationController* QmitkStdMultiWidget::GetTimeNavigationController() { - DisablePositionTracking(); - // DisableNavigationControllerEventListening(); - - m_TimeNavigationController->Disconnect(mitkWidget1->GetSliceNavigationController()); - m_TimeNavigationController->Disconnect(mitkWidget2->GetSliceNavigationController()); - m_TimeNavigationController->Disconnect(mitkWidget3->GetSliceNavigationController()); - m_TimeNavigationController->Disconnect(mitkWidget4->GetSliceNavigationController()); + return m_TimeNavigationController; } -void QmitkStdMultiWidget::RemovePlanesFromDataStorage() +void QmitkStdMultiWidget::AddPlanesToDataStorage() { - if (m_PlaneNode1.IsNotNull() && m_PlaneNode2.IsNotNull() && m_PlaneNode3.IsNotNull() && - m_ParentNodeForGeometryPlanes.IsNotNull()) + auto dataStorage = GetDataStorage(); + if (nullptr == dataStorage) { - if (m_DataStorage.IsNotNull()) - { - m_DataStorage->Remove(m_PlaneNode1); - m_DataStorage->Remove(m_PlaneNode2); - m_DataStorage->Remove(m_PlaneNode3); - m_DataStorage->Remove(m_ParentNodeForGeometryPlanes); - } + return; } -} -void QmitkStdMultiWidget::AddPlanesToDataStorage() -{ - if (m_PlaneNode1.IsNotNull() && m_PlaneNode2.IsNotNull() && m_PlaneNode3.IsNotNull() && - m_ParentNodeForGeometryPlanes.IsNotNull()) + if (m_PlaneNode1.IsNotNull() && m_PlaneNode2.IsNotNull() + && m_PlaneNode3.IsNotNull() && m_ParentNodeForGeometryPlanes.IsNotNull()) { - if (m_DataStorage.IsNotNull()) - { - m_DataStorage->Add(m_ParentNodeForGeometryPlanes); - m_DataStorage->Add(m_PlaneNode1, m_ParentNodeForGeometryPlanes); - m_DataStorage->Add(m_PlaneNode2, m_ParentNodeForGeometryPlanes); - m_DataStorage->Add(m_PlaneNode3, m_ParentNodeForGeometryPlanes); - } + dataStorage->Add(m_ParentNodeForGeometryPlanes); + dataStorage->Add(m_PlaneNode1, m_ParentNodeForGeometryPlanes); + dataStorage->Add(m_PlaneNode2, m_ParentNodeForGeometryPlanes); + dataStorage->Add(m_PlaneNode3, m_ParentNodeForGeometryPlanes); } } -void QmitkStdMultiWidget::changeLayoutTo2DImagesUp() -{ - SMW_INFO << "changing layout to 2D images up... " << std::endl; - - // Hide all Menu Widgets - this->HideAllWidgetToolbars(); - - delete QmitkStdMultiWidgetLayout; - - // create Main Layout - QmitkStdMultiWidgetLayout = new QHBoxLayout(this); - - // Set Layout to widget - this->setLayout(QmitkStdMultiWidgetLayout); - - // create main splitter - m_MainSplit = new QSplitter(this); - QmitkStdMultiWidgetLayout->addWidget(m_MainSplit); - - // create m_LayoutSplit and add to the mainSplit - m_LayoutSplit = new QSplitter(Qt::Vertical, m_MainSplit); - m_MainSplit->addWidget(m_LayoutSplit); - - // add LevelWindow Widget to mainSplitter - m_MainSplit->addWidget(levelWindowWidget); - - // create m_SubSplit1 and m_SubSplit2 - m_SubSplit1 = new QSplitter(m_LayoutSplit); - m_SubSplit2 = new QSplitter(m_LayoutSplit); - - // insert Widget Container into splitter top - m_SubSplit1->addWidget(mitkWidget1Container); - m_SubSplit1->addWidget(mitkWidget2Container); - m_SubSplit1->addWidget(mitkWidget3Container); - - // set SplitterSize for splitter top - QList splitterSize; - splitterSize.push_back(1000); - splitterSize.push_back(1000); - splitterSize.push_back(1000); - m_SubSplit1->setSizes(splitterSize); - - // insert Widget Container into splitter bottom - m_SubSplit2->addWidget(mitkWidget4Container); - - // set SplitterSize for splitter m_LayoutSplit - splitterSize.clear(); - splitterSize.push_back(400); - splitterSize.push_back(1000); - m_LayoutSplit->setSizes(splitterSize); - - // show mainSplitt - m_MainSplit->show(); - - // show Widget if hidden - if (mitkWidget1->isHidden()) - mitkWidget1->show(); - if (mitkWidget2->isHidden()) - mitkWidget2->show(); - if (mitkWidget3->isHidden()) - mitkWidget3->show(); - if (mitkWidget4->isHidden()) - mitkWidget4->show(); - - // Change Layout Name - m_Layout = LAYOUT_2D_IMAGES_UP; - - // update Layout Design List - mitkWidget1->LayoutDesignListChanged(LAYOUT_2D_IMAGES_UP); - mitkWidget2->LayoutDesignListChanged(LAYOUT_2D_IMAGES_UP); - mitkWidget3->LayoutDesignListChanged(LAYOUT_2D_IMAGES_UP); - mitkWidget4->LayoutDesignListChanged(LAYOUT_2D_IMAGES_UP); - - // update Alle Widgets - this->UpdateAllWidgets(); -} - -void QmitkStdMultiWidget::changeLayoutTo2DImagesLeft() -{ - SMW_INFO << "changing layout to 2D images left... " << std::endl; - - // Hide all Menu Widgets - this->HideAllWidgetToolbars(); - - delete QmitkStdMultiWidgetLayout; - - // create Main Layout - QmitkStdMultiWidgetLayout = new QHBoxLayout(this); - - // create main splitter - m_MainSplit = new QSplitter(this); - QmitkStdMultiWidgetLayout->addWidget(m_MainSplit); - - // create m_LayoutSplit and add to the mainSplit - m_LayoutSplit = new QSplitter(m_MainSplit); - m_MainSplit->addWidget(m_LayoutSplit); - - // add LevelWindow Widget to mainSplitter - m_MainSplit->addWidget(levelWindowWidget); - - // create m_SubSplit1 and m_SubSplit2 - m_SubSplit1 = new QSplitter(Qt::Vertical, m_LayoutSplit); - m_SubSplit2 = new QSplitter(m_LayoutSplit); - - // insert Widget into the splitters - m_SubSplit1->addWidget(mitkWidget1Container); - m_SubSplit1->addWidget(mitkWidget2Container); - m_SubSplit1->addWidget(mitkWidget3Container); - - // set splitterSize of SubSplit1 - QList splitterSize; - splitterSize.push_back(1000); - splitterSize.push_back(1000); - splitterSize.push_back(1000); - m_SubSplit1->setSizes(splitterSize); - - m_SubSplit2->addWidget(mitkWidget4Container); - - // set splitterSize of Layout Split - splitterSize.clear(); - splitterSize.push_back(400); - splitterSize.push_back(1000); - m_LayoutSplit->setSizes(splitterSize); - - // show mainSplitt and add to Layout - m_MainSplit->show(); - - // show Widget if hidden - if (mitkWidget1->isHidden()) - mitkWidget1->show(); - if (mitkWidget2->isHidden()) - mitkWidget2->show(); - if (mitkWidget3->isHidden()) - mitkWidget3->show(); - if (mitkWidget4->isHidden()) - mitkWidget4->show(); - - // update Layout Name - m_Layout = LAYOUT_2D_IMAGES_LEFT; - - // update Layout Design List - mitkWidget1->LayoutDesignListChanged(LAYOUT_2D_IMAGES_LEFT); - mitkWidget2->LayoutDesignListChanged(LAYOUT_2D_IMAGES_LEFT); - mitkWidget3->LayoutDesignListChanged(LAYOUT_2D_IMAGES_LEFT); - mitkWidget4->LayoutDesignListChanged(LAYOUT_2D_IMAGES_LEFT); - - // update Alle Widgets - this->UpdateAllWidgets(); -} - -void QmitkStdMultiWidget::SetDecorationProperties(std::string text, mitk::Color color, int widgetNumber) +void QmitkStdMultiWidget::RemovePlanesFromDataStorage() { - if (widgetNumber > 3) + auto dataStorage = GetDataStorage(); + if (nullptr == dataStorage) { - MITK_ERROR << "Unknown render window for annotation."; return; } - vtkRenderer *renderer = this->GetRenderWindow(widgetNumber)->GetRenderer()->GetVtkRenderer(); - if (!renderer) - return; - vtkSmartPointer annotation = m_CornerAnnotations[widgetNumber]; - annotation->SetText(0, text.c_str()); - annotation->SetMaximumFontSize(12); - annotation->GetTextProperty()->SetColor(color[0], color[1], color[2]); - if (!renderer->HasViewProp(annotation)) - { - renderer->AddViewProp(annotation); - } - vtkSmartPointer frame = m_RectangleProps[widgetNumber]; - frame->SetColor(color[0], color[1], color[2]); - if (!renderer->HasViewProp(frame)) - { - renderer->AddViewProp(frame); - } -} -void QmitkStdMultiWidget::SetCornerAnnotationVisibility(bool visibility) -{ - for (int i = 0; i < 4; ++i) + if (m_PlaneNode1.IsNotNull() && m_PlaneNode2.IsNotNull() + && m_PlaneNode3.IsNotNull() && m_ParentNodeForGeometryPlanes.IsNotNull()) { - m_CornerAnnotations[i]->SetVisibility(visibility); + dataStorage->Remove(m_PlaneNode1); + dataStorage->Remove(m_PlaneNode2); + dataStorage->Remove(m_PlaneNode3); + dataStorage->Remove(m_ParentNodeForGeometryPlanes); } } -bool QmitkStdMultiWidget::IsCornerAnnotationVisible(void) const -{ - return m_CornerAnnotations[0]->GetVisibility() > 0; -} - -QmitkRenderWindow *QmitkStdMultiWidget::GetRenderWindow(unsigned int number) +void QmitkStdMultiWidget::HandleCrosshairPositionEvent() { - switch (number) + if (!m_PendingCrosshairPositionEvent) { - case 0: - return this->GetRenderWindow1(); - case 1: - return this->GetRenderWindow2(); - case 2: - return this->GetRenderWindow3(); - case 3: - return this->GetRenderWindow4(); - default: - MITK_ERROR << "Requested unknown render window"; - break; + m_PendingCrosshairPositionEvent = true; + QTimer::singleShot(0, this, SLOT(HandleCrosshairPositionEventDelayed())); } - return nullptr; } -void QmitkStdMultiWidget::changeLayoutToDefault() +void QmitkStdMultiWidget::ActivateMenuWidget(bool state) { - SMW_INFO << "changing layout to default... " << std::endl; - - // Hide all Menu Widgets - this->HideAllWidgetToolbars(); - - delete QmitkStdMultiWidgetLayout; - - // create Main Layout - QmitkStdMultiWidgetLayout = new QHBoxLayout(this); - - // create main splitter - m_MainSplit = new QSplitter(this); - QmitkStdMultiWidgetLayout->addWidget(m_MainSplit); - - // create m_LayoutSplit and add to the mainSplit - m_LayoutSplit = new QSplitter(Qt::Vertical, m_MainSplit); - m_MainSplit->addWidget(m_LayoutSplit); - - // add LevelWindow Widget to mainSplitter - m_MainSplit->addWidget(levelWindowWidget); - - // create m_SubSplit1 and m_SubSplit2 - m_SubSplit1 = new QSplitter(m_LayoutSplit); - m_SubSplit2 = new QSplitter(m_LayoutSplit); - - // insert Widget container into the splitters - m_SubSplit1->addWidget(mitkWidget1Container); - m_SubSplit1->addWidget(mitkWidget2Container); - - m_SubSplit2->addWidget(mitkWidget3Container); - m_SubSplit2->addWidget(mitkWidget4Container); - - // set splitter Size - QList splitterSize; - splitterSize.push_back(1000); - splitterSize.push_back(1000); - m_SubSplit1->setSizes(splitterSize); - m_SubSplit2->setSizes(splitterSize); - m_LayoutSplit->setSizes(splitterSize); - - // show mainSplitt and add to Layout - m_MainSplit->show(); - - // show Widget if hidden - if (mitkWidget1->isHidden()) - mitkWidget1->show(); - if (mitkWidget2->isHidden()) - mitkWidget2->show(); - if (mitkWidget3->isHidden()) - mitkWidget3->show(); - if (mitkWidget4->isHidden()) - mitkWidget4->show(); - - m_Layout = LAYOUT_DEFAULT; - - // update Layout Design List - mitkWidget1->LayoutDesignListChanged(LAYOUT_DEFAULT); - mitkWidget2->LayoutDesignListChanged(LAYOUT_DEFAULT); - mitkWidget3->LayoutDesignListChanged(LAYOUT_DEFAULT); - mitkWidget4->LayoutDesignListChanged(LAYOUT_DEFAULT); - - // update Alle Widgets - this->UpdateAllWidgets(); + GetRenderWindow1()->ActivateMenuWidget(state, this); + GetRenderWindow2()->ActivateMenuWidget(state, this); + GetRenderWindow3()->ActivateMenuWidget(state, this); + GetRenderWindow4()->ActivateMenuWidget(state, this); } -void QmitkStdMultiWidget::changeLayoutToBig3D() +bool QmitkStdMultiWidget::IsMenuWidgetEnabled() const { - SMW_INFO << "changing layout to big 3D ..." << std::endl; - - // Hide all Menu Widgets - this->HideAllWidgetToolbars(); - - delete QmitkStdMultiWidgetLayout; - - // create Main Layout - QmitkStdMultiWidgetLayout = new QHBoxLayout(this); - - // create main splitter - m_MainSplit = new QSplitter(this); - QmitkStdMultiWidgetLayout->addWidget(m_MainSplit); - - // add widget Splitter to main Splitter - m_MainSplit->addWidget(mitkWidget4Container); - - // add LevelWindow Widget to mainSplitter - m_MainSplit->addWidget(levelWindowWidget); - - // show mainSplitt and add to Layout - m_MainSplit->show(); - - // show/hide Widgets - mitkWidget1->hide(); - mitkWidget2->hide(); - mitkWidget3->hide(); - if (mitkWidget4->isHidden()) - mitkWidget4->show(); - - m_Layout = LAYOUT_BIG_3D; - - // update Layout Design List - mitkWidget1->LayoutDesignListChanged(LAYOUT_BIG_3D); - mitkWidget2->LayoutDesignListChanged(LAYOUT_BIG_3D); - mitkWidget3->LayoutDesignListChanged(LAYOUT_BIG_3D); - mitkWidget4->LayoutDesignListChanged(LAYOUT_BIG_3D); - - // update Alle Widgets - this->UpdateAllWidgets(); - mitk::RenderingManager::GetInstance()->SetRenderWindowFocus(mitkWidget4->GetVtkRenderWindow()); + return GetRenderWindow1()->GetActivateMenuWidgetFlag(); } -void QmitkStdMultiWidget::changeLayoutToWidget1() +QmitkRenderWindow* QmitkStdMultiWidget::GetRenderWindow(unsigned int number) const { - SMW_INFO << "changing layout to big Widget1 ..." << std::endl; - - // Hide all Menu Widgets - this->HideAllWidgetToolbars(); - - delete QmitkStdMultiWidgetLayout; - - // create Main Layout - QmitkStdMultiWidgetLayout = new QHBoxLayout(this); - - // create main splitter - m_MainSplit = new QSplitter(this); - QmitkStdMultiWidgetLayout->addWidget(m_MainSplit); - - // add widget Splitter to main Splitter - m_MainSplit->addWidget(mitkWidget1Container); - - // add LevelWindow Widget to mainSplitter - m_MainSplit->addWidget(levelWindowWidget); - - // show mainSplitt and add to Layout - m_MainSplit->show(); - - // show/hide Widgets - if (mitkWidget1->isHidden()) - mitkWidget1->show(); - mitkWidget2->hide(); - mitkWidget3->hide(); - mitkWidget4->hide(); - - m_Layout = LAYOUT_WIDGET1; - - // update Layout Design List - mitkWidget1->LayoutDesignListChanged(LAYOUT_WIDGET1); - mitkWidget2->LayoutDesignListChanged(LAYOUT_WIDGET1); - mitkWidget3->LayoutDesignListChanged(LAYOUT_WIDGET1); - mitkWidget4->LayoutDesignListChanged(LAYOUT_WIDGET1); - - // update Alle Widgets - this->UpdateAllWidgets(); + switch (number) + { + case 0: + return GetRenderWindow1(); + case 1: + return GetRenderWindow2(); + case 2: + return GetRenderWindow3(); + case 3: + return GetRenderWindow4(); + default: + MITK_ERROR << "Requested unknown render window"; + break; + } - mitk::RenderingManager::GetInstance()->SetRenderWindowFocus(mitkWidget1->GetVtkRenderWindow()); + return nullptr; } -void QmitkStdMultiWidget::changeLayoutToWidget2() +QmitkRenderWindow* QmitkStdMultiWidget::GetRenderWindow1() const { - SMW_INFO << "changing layout to big Widget2 ..." << std::endl; - - // Hide all Menu Widgets - this->HideAllWidgetToolbars(); - - delete QmitkStdMultiWidgetLayout; - - // create Main Layout - QmitkStdMultiWidgetLayout = new QHBoxLayout(this); - - // create main splitter - m_MainSplit = new QSplitter(this); - QmitkStdMultiWidgetLayout->addWidget(m_MainSplit); - - // add widget Splitter to main Splitter - m_MainSplit->addWidget(mitkWidget2Container); - - // add LevelWindow Widget to mainSplitter - m_MainSplit->addWidget(levelWindowWidget); - - // show mainSplitt and add to Layout - m_MainSplit->show(); - - // show/hide Widgets - mitkWidget1->hide(); - if (mitkWidget2->isHidden()) - mitkWidget2->show(); - mitkWidget3->hide(); - mitkWidget4->hide(); - - m_Layout = LAYOUT_WIDGET2; - - // update Layout Design List - mitkWidget1->LayoutDesignListChanged(LAYOUT_WIDGET2); - mitkWidget2->LayoutDesignListChanged(LAYOUT_WIDGET2); - mitkWidget3->LayoutDesignListChanged(LAYOUT_WIDGET2); - mitkWidget4->LayoutDesignListChanged(LAYOUT_WIDGET2); - - // update Alle Widgets - this->UpdateAllWidgets(); - mitk::RenderingManager::GetInstance()->SetRenderWindowFocus(mitkWidget2->GetVtkRenderWindow()); + return QmitkAbstractMultiWidget::GetRenderWindow(GetNameFromIndex(0, 0)); } -void QmitkStdMultiWidget::changeLayoutToWidget3() +QmitkRenderWindow* QmitkStdMultiWidget::GetRenderWindow2() const { - SMW_INFO << "changing layout to big Widget3 ..." << std::endl; - - // Hide all Menu Widgets - this->HideAllWidgetToolbars(); - - delete QmitkStdMultiWidgetLayout; - - // create Main Layout - QmitkStdMultiWidgetLayout = new QHBoxLayout(this); - - // create main splitter - m_MainSplit = new QSplitter(this); - QmitkStdMultiWidgetLayout->addWidget(m_MainSplit); - - // add widget Splitter to main Splitter - m_MainSplit->addWidget(mitkWidget3Container); - - // add LevelWindow Widget to mainSplitter - m_MainSplit->addWidget(levelWindowWidget); - - // show mainSplitt and add to Layout - m_MainSplit->show(); - - // show/hide Widgets - mitkWidget1->hide(); - mitkWidget2->hide(); - if (mitkWidget3->isHidden()) - mitkWidget3->show(); - mitkWidget4->hide(); - - m_Layout = LAYOUT_WIDGET3; - - // update Layout Design List - mitkWidget1->LayoutDesignListChanged(LAYOUT_WIDGET3); - mitkWidget2->LayoutDesignListChanged(LAYOUT_WIDGET3); - mitkWidget3->LayoutDesignListChanged(LAYOUT_WIDGET3); - mitkWidget4->LayoutDesignListChanged(LAYOUT_WIDGET3); - - // update Alle Widgets - this->UpdateAllWidgets(); - mitk::RenderingManager::GetInstance()->SetRenderWindowFocus(mitkWidget3->GetVtkRenderWindow()); + return QmitkAbstractMultiWidget::GetRenderWindow(GetNameFromIndex(0, 1)); } -void QmitkStdMultiWidget::changeLayoutToRowWidget3And4() +QmitkRenderWindow* QmitkStdMultiWidget::GetRenderWindow3() const { - SMW_INFO << "changing layout to Widget3 and 4 in a Row..." << std::endl; - - // Hide all Menu Widgets - this->HideAllWidgetToolbars(); - - delete QmitkStdMultiWidgetLayout; - - // create Main Layout - QmitkStdMultiWidgetLayout = new QHBoxLayout(this); - - // create main splitter - m_MainSplit = new QSplitter(this); - QmitkStdMultiWidgetLayout->addWidget(m_MainSplit); - - // create m_LayoutSplit and add to the mainSplit - m_LayoutSplit = new QSplitter(Qt::Vertical, m_MainSplit); - m_MainSplit->addWidget(m_LayoutSplit); - - // add LevelWindow Widget to mainSplitter - m_MainSplit->addWidget(levelWindowWidget); - - // add Widgets to splitter - m_LayoutSplit->addWidget(mitkWidget3Container); - m_LayoutSplit->addWidget(mitkWidget4Container); - - // set Splitter Size - QList splitterSize; - splitterSize.push_back(1000); - splitterSize.push_back(1000); - m_LayoutSplit->setSizes(splitterSize); - - // show mainSplitt and add to Layout - m_MainSplit->show(); - - // show/hide Widgets - mitkWidget1->hide(); - mitkWidget2->hide(); - if (mitkWidget3->isHidden()) - mitkWidget3->show(); - if (mitkWidget4->isHidden()) - mitkWidget4->show(); - - m_Layout = LAYOUT_ROW_WIDGET_3_AND_4; - - // update Layout Design List - mitkWidget1->LayoutDesignListChanged(LAYOUT_ROW_WIDGET_3_AND_4); - mitkWidget2->LayoutDesignListChanged(LAYOUT_ROW_WIDGET_3_AND_4); - mitkWidget3->LayoutDesignListChanged(LAYOUT_ROW_WIDGET_3_AND_4); - mitkWidget4->LayoutDesignListChanged(LAYOUT_ROW_WIDGET_3_AND_4); - - // update Alle Widgets - this->UpdateAllWidgets(); + return QmitkAbstractMultiWidget::GetRenderWindow(GetNameFromIndex(1, 0)); } -void QmitkStdMultiWidget::changeLayoutToColumnWidget3And4() +QmitkRenderWindow* QmitkStdMultiWidget::GetRenderWindow4() const { - SMW_INFO << "changing layout to Widget3 and 4 in one Column..." << std::endl; - - // Hide all Menu Widgets - this->HideAllWidgetToolbars(); - - delete QmitkStdMultiWidgetLayout; - - // create Main Layout - QmitkStdMultiWidgetLayout = new QHBoxLayout(this); - - // create main splitter - m_MainSplit = new QSplitter(this); - QmitkStdMultiWidgetLayout->addWidget(m_MainSplit); - - // create m_LayoutSplit and add to the mainSplit - m_LayoutSplit = new QSplitter(m_MainSplit); - m_MainSplit->addWidget(m_LayoutSplit); - - // add LevelWindow Widget to mainSplitter - m_MainSplit->addWidget(levelWindowWidget); - - // add Widgets to splitter - m_LayoutSplit->addWidget(mitkWidget3Container); - m_LayoutSplit->addWidget(mitkWidget4Container); - - // set SplitterSize - QList splitterSize; - splitterSize.push_back(1000); - splitterSize.push_back(1000); - m_LayoutSplit->setSizes(splitterSize); - - // show mainSplitt and add to Layout - m_MainSplit->show(); - - // show/hide Widgets - mitkWidget1->hide(); - mitkWidget2->hide(); - if (mitkWidget3->isHidden()) - mitkWidget3->show(); - if (mitkWidget4->isHidden()) - mitkWidget4->show(); - - m_Layout = LAYOUT_COLUMN_WIDGET_3_AND_4; - - // update Layout Design List - mitkWidget1->LayoutDesignListChanged(LAYOUT_COLUMN_WIDGET_3_AND_4); - mitkWidget2->LayoutDesignListChanged(LAYOUT_COLUMN_WIDGET_3_AND_4); - mitkWidget3->LayoutDesignListChanged(LAYOUT_COLUMN_WIDGET_3_AND_4); - mitkWidget4->LayoutDesignListChanged(LAYOUT_COLUMN_WIDGET_3_AND_4); - - // update Alle Widgets - this->UpdateAllWidgets(); + return QmitkAbstractMultiWidget::GetRenderWindow(GetNameFromIndex(1, 1)); } -void QmitkStdMultiWidget::changeLayoutToRowWidgetSmall3andBig4() +mitk::DataNode::Pointer QmitkStdMultiWidget::GetWidgetPlane1() const { - SMW_INFO << "changing layout to Widget3 and 4 in a Row..." << std::endl; - - this->changeLayoutToRowWidget3And4(); - - m_Layout = LAYOUT_ROW_WIDGET_SMALL3_AND_BIG4; -} - -void QmitkStdMultiWidget::changeLayoutToSmallUpperWidget2Big3and4() -{ - SMW_INFO << "changing layout to Widget3 and 4 in a Row..." << std::endl; - - // Hide all Menu Widgets - this->HideAllWidgetToolbars(); - - delete QmitkStdMultiWidgetLayout; - - // create Main Layout - QmitkStdMultiWidgetLayout = new QHBoxLayout(this); - - // create main splitter - m_MainSplit = new QSplitter(this); - QmitkStdMultiWidgetLayout->addWidget(m_MainSplit); - - // create m_LayoutSplit and add to the mainSplit - m_LayoutSplit = new QSplitter(Qt::Vertical, m_MainSplit); - m_MainSplit->addWidget(m_LayoutSplit); - - // add LevelWindow Widget to mainSplitter - m_MainSplit->addWidget(levelWindowWidget); - - // create m_SubSplit1 and m_SubSplit2 - m_SubSplit1 = new QSplitter(Qt::Vertical, m_LayoutSplit); - m_SubSplit2 = new QSplitter(m_LayoutSplit); - - // insert Widget into the splitters - m_SubSplit1->addWidget(mitkWidget2Container); - - m_SubSplit2->addWidget(mitkWidget3Container); - m_SubSplit2->addWidget(mitkWidget4Container); - - // set Splitter Size - QList splitterSize; - splitterSize.push_back(1000); - splitterSize.push_back(1000); - m_SubSplit2->setSizes(splitterSize); - splitterSize.clear(); - splitterSize.push_back(500); - splitterSize.push_back(1000); - m_LayoutSplit->setSizes(splitterSize); - - // show mainSplitt - m_MainSplit->show(); - - // show Widget if hidden - mitkWidget1->hide(); - if (mitkWidget2->isHidden()) - mitkWidget2->show(); - if (mitkWidget3->isHidden()) - mitkWidget3->show(); - if (mitkWidget4->isHidden()) - mitkWidget4->show(); - - m_Layout = LAYOUT_SMALL_UPPER_WIDGET2_BIG3_AND4; - - // update Layout Design List - mitkWidget1->LayoutDesignListChanged(LAYOUT_SMALL_UPPER_WIDGET2_BIG3_AND4); - mitkWidget2->LayoutDesignListChanged(LAYOUT_SMALL_UPPER_WIDGET2_BIG3_AND4); - mitkWidget3->LayoutDesignListChanged(LAYOUT_SMALL_UPPER_WIDGET2_BIG3_AND4); - mitkWidget4->LayoutDesignListChanged(LAYOUT_SMALL_UPPER_WIDGET2_BIG3_AND4); - - // update Alle Widgets - this->UpdateAllWidgets(); + return m_PlaneNode1; } -void QmitkStdMultiWidget::changeLayoutTo2x2Dand3DWidget() +mitk::DataNode::Pointer QmitkStdMultiWidget::GetWidgetPlane2() const { - SMW_INFO << "changing layout to 2 x 2D and 3D Widget" << std::endl; - - // Hide all Menu Widgets - this->HideAllWidgetToolbars(); - - delete QmitkStdMultiWidgetLayout; - - // create Main Layout - QmitkStdMultiWidgetLayout = new QHBoxLayout(this); - - // create main splitter - m_MainSplit = new QSplitter(this); - QmitkStdMultiWidgetLayout->addWidget(m_MainSplit); - - // create m_LayoutSplit and add to the mainSplit - m_LayoutSplit = new QSplitter(m_MainSplit); - m_MainSplit->addWidget(m_LayoutSplit); - - // add LevelWindow Widget to mainSplitter - m_MainSplit->addWidget(levelWindowWidget); - - // create m_SubSplit1 and m_SubSplit2 - m_SubSplit1 = new QSplitter(Qt::Vertical, m_LayoutSplit); - m_SubSplit2 = new QSplitter(m_LayoutSplit); - - // add Widgets to splitter - m_SubSplit1->addWidget(mitkWidget1Container); - m_SubSplit1->addWidget(mitkWidget2Container); - m_SubSplit2->addWidget(mitkWidget4Container); - - // set Splitter Size - QList splitterSize; - splitterSize.push_back(1000); - splitterSize.push_back(1000); - m_SubSplit1->setSizes(splitterSize); - m_LayoutSplit->setSizes(splitterSize); - - // show mainSplitt and add to Layout - m_MainSplit->show(); - - // show/hide Widgets - if (mitkWidget1->isHidden()) - mitkWidget1->show(); - if (mitkWidget2->isHidden()) - mitkWidget2->show(); - mitkWidget3->hide(); - if (mitkWidget4->isHidden()) - mitkWidget4->show(); - - m_Layout = LAYOUT_2X_2D_AND_3D_WIDGET; - - // update Layout Design List - mitkWidget1->LayoutDesignListChanged(LAYOUT_2X_2D_AND_3D_WIDGET); - mitkWidget2->LayoutDesignListChanged(LAYOUT_2X_2D_AND_3D_WIDGET); - mitkWidget3->LayoutDesignListChanged(LAYOUT_2X_2D_AND_3D_WIDGET); - mitkWidget4->LayoutDesignListChanged(LAYOUT_2X_2D_AND_3D_WIDGET); - - // update Alle Widgets - this->UpdateAllWidgets(); + return m_PlaneNode2; } -void QmitkStdMultiWidget::changeLayoutToLeft2Dand3DRight2D() +mitk::DataNode::Pointer QmitkStdMultiWidget::GetWidgetPlane3() const { - SMW_INFO << "changing layout to 2D and 3D left, 2D right Widget" << std::endl; - - // Hide all Menu Widgets - this->HideAllWidgetToolbars(); - - delete QmitkStdMultiWidgetLayout; - - // create Main Layout - QmitkStdMultiWidgetLayout = new QHBoxLayout(this); - - // create main splitter - m_MainSplit = new QSplitter(this); - QmitkStdMultiWidgetLayout->addWidget(m_MainSplit); - - // create m_LayoutSplit and add to the mainSplit - m_LayoutSplit = new QSplitter(m_MainSplit); - m_MainSplit->addWidget(m_LayoutSplit); - - // add LevelWindow Widget to mainSplitter - m_MainSplit->addWidget(levelWindowWidget); - - // create m_SubSplit1 and m_SubSplit2 - m_SubSplit1 = new QSplitter(Qt::Vertical, m_LayoutSplit); - m_SubSplit2 = new QSplitter(m_LayoutSplit); - - // add Widgets to splitter - m_SubSplit1->addWidget(mitkWidget1Container); - m_SubSplit1->addWidget(mitkWidget4Container); - m_SubSplit2->addWidget(mitkWidget2Container); - - // set Splitter Size - QList splitterSize; - splitterSize.push_back(1000); - splitterSize.push_back(1000); - m_SubSplit1->setSizes(splitterSize); - m_LayoutSplit->setSizes(splitterSize); - - // show mainSplitt and add to Layout - m_MainSplit->show(); - - // show/hide Widgets - if (mitkWidget1->isHidden()) - mitkWidget1->show(); - if (mitkWidget2->isHidden()) - mitkWidget2->show(); - mitkWidget3->hide(); - if (mitkWidget4->isHidden()) - mitkWidget4->show(); - - m_Layout = LAYOUT_2D_AND_3D_LEFT_2D_RIGHT_WIDGET; - - // update Layout Design List - mitkWidget1->LayoutDesignListChanged(LAYOUT_2D_AND_3D_LEFT_2D_RIGHT_WIDGET); - mitkWidget2->LayoutDesignListChanged(LAYOUT_2D_AND_3D_LEFT_2D_RIGHT_WIDGET); - mitkWidget3->LayoutDesignListChanged(LAYOUT_2D_AND_3D_LEFT_2D_RIGHT_WIDGET); - mitkWidget4->LayoutDesignListChanged(LAYOUT_2D_AND_3D_LEFT_2D_RIGHT_WIDGET); - - // update Alle Widgets - this->UpdateAllWidgets(); + return m_PlaneNode3; } -void QmitkStdMultiWidget::changeLayoutTo2DUpAnd3DDown(unsigned int id2Dwindow) +mitk::DataNode::Pointer QmitkStdMultiWidget::GetWidgetPlane(unsigned number) const { - SMW_INFO << "changing layout to 2D up and 3D down" << std::endl; - if (id2Dwindow < 1 || id2Dwindow > 3) - { - MITK_WARN << "Only 2D render window IDs 1,2 or 3 are valid. Got ID " << id2Dwindow << ". " << "Using default ID 2 instead."; - id2Dwindow = 2; - } - - // Hide all Menu Widgets - this->HideAllWidgetToolbars(); - - delete QmitkStdMultiWidgetLayout; - - // create Main Layout - QmitkStdMultiWidgetLayout = new QHBoxLayout(this); - - // Set Layout to widget - this->setLayout(QmitkStdMultiWidgetLayout); - - // create main splitter - m_MainSplit = new QSplitter(this); - QmitkStdMultiWidgetLayout->addWidget(m_MainSplit); - - // create m_LayoutSplit and add to the mainSplit - m_LayoutSplit = new QSplitter(Qt::Vertical, m_MainSplit); - m_MainSplit->addWidget(m_LayoutSplit); - - // add LevelWindow Widget to mainSplitter - m_MainSplit->addWidget(levelWindowWidget); - - // create m_SubSplit1 and m_SubSplit2 - m_SubSplit1 = new QSplitter(m_LayoutSplit); - m_SubSplit2 = new QSplitter(m_LayoutSplit); - - // insert Widget Container into splitter top - switch (id2Dwindow) + switch (number) { case 1: - m_SubSplit1->addWidget(mitkWidget1Container); - break; + return m_PlaneNode1; case 2: - m_SubSplit1->addWidget(mitkWidget2Container); - break; + return m_PlaneNode2; case 3: - m_SubSplit1->addWidget(mitkWidget3Container); + return m_PlaneNode3; + default: + MITK_ERROR << "Requested unknown render window"; break; } - // set SplitterSize for splitter top - QList splitterSize; - // insert Widget Container into splitter bottom - m_SubSplit2->addWidget(mitkWidget4Container); - // set SplitterSize for splitter m_LayoutSplit - splitterSize.clear(); - splitterSize.push_back(700); - splitterSize.push_back(700); - m_LayoutSplit->setSizes(splitterSize); - - // show mainSplitt - m_MainSplit->show(); - - // show/hide Widgets - switch (id2Dwindow) + return nullptr; +} + +void QmitkStdMultiWidget::SetDecorationColor(unsigned int widgetNumber, mitk::Color color) +{ + switch (widgetNumber) { + case 0: + if (m_PlaneNode1.IsNotNull()) + { + m_PlaneNode1->SetColor(color); + } + break; case 1: - if (mitkWidget1->isHidden()) - mitkWidget1->show(); - mitkWidget2->hide(); - mitkWidget3->hide(); + if (m_PlaneNode2.IsNotNull()) + { + m_PlaneNode2->SetColor(color); + } break; case 2: - if (mitkWidget2->isHidden()) - mitkWidget2->show(); - mitkWidget1->hide(); - mitkWidget3->hide(); + if (m_PlaneNode3.IsNotNull()) + { + m_PlaneNode3->SetColor(color); + } break; case 3: - if (mitkWidget3->isHidden()) - mitkWidget3->show(); - mitkWidget1->hide(); - mitkWidget2->hide(); + m_DecorationColorWidget4 = color; break; - } - - //always show 3D widget - if (mitkWidget4->isHidden()) - mitkWidget4->show(); - - m_Layout = LAYOUT_2D_UP_AND_3D_DOWN; - - // update Layout Design List - mitkWidget1->LayoutDesignListChanged(LAYOUT_2D_UP_AND_3D_DOWN); - mitkWidget2->LayoutDesignListChanged(LAYOUT_2D_UP_AND_3D_DOWN); - mitkWidget3->LayoutDesignListChanged(LAYOUT_2D_UP_AND_3D_DOWN); - mitkWidget4->LayoutDesignListChanged(LAYOUT_2D_UP_AND_3D_DOWN); - - // update all Widgets - this->UpdateAllWidgets(); -} - -void QmitkStdMultiWidget::SetDataStorage(mitk::DataStorage *ds) -{ - if (ds == m_DataStorage) - { - return; - } - - mitk::BaseRenderer::GetInstance(mitkWidget1->GetRenderWindow())->SetDataStorage(ds); - mitk::BaseRenderer::GetInstance(mitkWidget2->GetRenderWindow())->SetDataStorage(ds); - mitk::BaseRenderer::GetInstance(mitkWidget3->GetRenderWindow())->SetDataStorage(ds); - mitk::BaseRenderer::GetInstance(mitkWidget4->GetRenderWindow())->SetDataStorage(ds); - m_DataStorage = ds; -} - -void QmitkStdMultiWidget::Fit() -{ - vtkSmartPointer vtkrenderer; - vtkrenderer = mitk::BaseRenderer::GetInstance(mitkWidget1->GetRenderWindow())->GetVtkRenderer(); - if (vtkrenderer != nullptr) - vtkrenderer->ResetCamera(); - - vtkrenderer = mitk::BaseRenderer::GetInstance(mitkWidget2->GetRenderWindow())->GetVtkRenderer(); - if (vtkrenderer != nullptr) - vtkrenderer->ResetCamera(); - - vtkrenderer = mitk::BaseRenderer::GetInstance(mitkWidget3->GetRenderWindow())->GetVtkRenderer(); - if (vtkrenderer != nullptr) - vtkrenderer->ResetCamera(); - - vtkrenderer = mitk::BaseRenderer::GetInstance(mitkWidget4->GetRenderWindow())->GetVtkRenderer(); - if (vtkrenderer != nullptr) - vtkrenderer->ResetCamera(); - - mitk::BaseRenderer::GetInstance(mitkWidget1->GetRenderWindow())->GetCameraController()->Fit(); - mitk::BaseRenderer::GetInstance(mitkWidget2->GetRenderWindow())->GetCameraController()->Fit(); - mitk::BaseRenderer::GetInstance(mitkWidget3->GetRenderWindow())->GetCameraController()->Fit(); - mitk::BaseRenderer::GetInstance(mitkWidget4->GetRenderWindow())->GetCameraController()->Fit(); - - int w = vtkObject::GetGlobalWarningDisplay(); - vtkObject::GlobalWarningDisplayOff(); - - vtkObject::SetGlobalWarningDisplay(w); -} - -void QmitkStdMultiWidget::InitPositionTracking() -{ - // TODO POSITIONTRACKER -} - -void QmitkStdMultiWidget::AddDisplayPlaneSubTree() -{ - // add the displayed planes of the multiwidget to a node to which the subtree - // @a planesSubTree points ... - - mitk::PlaneGeometryDataMapper2D::Pointer mapper; - - // ... of widget 1 - mitk::BaseRenderer *renderer1 = mitk::BaseRenderer::GetInstance(mitkWidget1->GetRenderWindow()); - m_PlaneNode1 = renderer1->GetCurrentWorldPlaneGeometryNode(); - m_PlaneNode1->SetProperty("visible", mitk::BoolProperty::New(true)); - m_PlaneNode1->SetProperty("name", mitk::StringProperty::New(std::string(renderer1->GetName()) + ".plane")); - m_PlaneNode1->SetProperty("includeInBoundingBox", mitk::BoolProperty::New(false)); - m_PlaneNode1->SetProperty("helper object", mitk::BoolProperty::New(true)); - mapper = mitk::PlaneGeometryDataMapper2D::New(); - m_PlaneNode1->SetMapper(mitk::BaseRenderer::Standard2D, mapper); - - // ... of widget 2 - mitk::BaseRenderer *renderer2 = mitk::BaseRenderer::GetInstance(mitkWidget2->GetRenderWindow()); - m_PlaneNode2 = renderer2->GetCurrentWorldPlaneGeometryNode(); - m_PlaneNode2->SetProperty("visible", mitk::BoolProperty::New(true)); - m_PlaneNode2->SetProperty("name", mitk::StringProperty::New(std::string(renderer2->GetName()) + ".plane")); - m_PlaneNode2->SetProperty("includeInBoundingBox", mitk::BoolProperty::New(false)); - m_PlaneNode2->SetProperty("helper object", mitk::BoolProperty::New(true)); - mapper = mitk::PlaneGeometryDataMapper2D::New(); - m_PlaneNode2->SetMapper(mitk::BaseRenderer::Standard2D, mapper); - - // ... of widget 3 - mitk::BaseRenderer *renderer3 = mitk::BaseRenderer::GetInstance(mitkWidget3->GetRenderWindow()); - m_PlaneNode3 = renderer3->GetCurrentWorldPlaneGeometryNode(); - m_PlaneNode3->SetProperty("visible", mitk::BoolProperty::New(true)); - m_PlaneNode3->SetProperty("name", mitk::StringProperty::New(std::string(renderer3->GetName()) + ".plane")); - m_PlaneNode3->SetProperty("includeInBoundingBox", mitk::BoolProperty::New(false)); - m_PlaneNode3->SetProperty("helper object", mitk::BoolProperty::New(true)); - mapper = mitk::PlaneGeometryDataMapper2D::New(); - m_PlaneNode3->SetMapper(mitk::BaseRenderer::Standard2D, mapper); - - m_ParentNodeForGeometryPlanes = mitk::DataNode::New(); - m_ParentNodeForGeometryPlanes->SetProperty("name", mitk::StringProperty::New("Widgets")); - m_ParentNodeForGeometryPlanes->SetProperty("helper object", mitk::BoolProperty::New(true)); -} - -mitk::SliceNavigationController *QmitkStdMultiWidget::GetTimeNavigationController() -{ - return m_TimeNavigationController; -} - -void QmitkStdMultiWidget::EnableStandardLevelWindow() -{ - levelWindowWidget->disconnect(this); - levelWindowWidget->SetDataStorage(mitk::BaseRenderer::GetInstance(mitkWidget1->GetRenderWindow())->GetDataStorage()); - levelWindowWidget->show(); -} - -void QmitkStdMultiWidget::DisableStandardLevelWindow() -{ - levelWindowWidget->disconnect(this); - levelWindowWidget->hide(); -} - -// CAUTION: Legacy code for enabling Qt-signal-controlled view initialization. -// Use RenderingManager::InitializeViews() instead. -bool QmitkStdMultiWidget::InitializeStandardViews(const mitk::Geometry3D *geometry) -{ - return m_RenderingManager->InitializeViews(geometry); -} - -void QmitkStdMultiWidget::RequestUpdate() -{ - m_RenderingManager->RequestUpdate(mitkWidget1->GetRenderWindow()); - m_RenderingManager->RequestUpdate(mitkWidget2->GetRenderWindow()); - m_RenderingManager->RequestUpdate(mitkWidget3->GetRenderWindow()); - m_RenderingManager->RequestUpdate(mitkWidget4->GetRenderWindow()); -} - -void QmitkStdMultiWidget::ForceImmediateUpdate() -{ - m_RenderingManager->ForceImmediateUpdate(mitkWidget1->GetRenderWindow()); - m_RenderingManager->ForceImmediateUpdate(mitkWidget2->GetRenderWindow()); - m_RenderingManager->ForceImmediateUpdate(mitkWidget3->GetRenderWindow()); - m_RenderingManager->ForceImmediateUpdate(mitkWidget4->GetRenderWindow()); -} - -void QmitkStdMultiWidget::wheelEvent(QWheelEvent *e) -{ - emit WheelMoved(e); -} - -void QmitkStdMultiWidget::mousePressEvent(QMouseEvent *) -{ -} - -void QmitkStdMultiWidget::moveEvent(QMoveEvent *e) -{ - QWidget::moveEvent(e); - - // it is necessary to readjust the position of the Annotation as the StdMultiWidget has moved - // unfortunately it's not done by QmitkRenderWindow::moveEvent -> must be done here - emit Moved(); -} - -QmitkRenderWindow *QmitkStdMultiWidget::GetRenderWindow1() const -{ - return mitkWidget1; -} - -QmitkRenderWindow *QmitkStdMultiWidget::GetRenderWindow2() const -{ - return mitkWidget2; -} - -QmitkRenderWindow *QmitkStdMultiWidget::GetRenderWindow3() const -{ - return mitkWidget3; -} - -QmitkRenderWindow *QmitkStdMultiWidget::GetRenderWindow4() const -{ - return mitkWidget4; + default: + MITK_ERROR << "Decoration color for unknown widget!"; + break; + } } -const mitk::Point3D QmitkStdMultiWidget::GetCrossPosition() const +mitk::Color QmitkStdMultiWidget::GetDecorationColor(unsigned int widgetNumber) { - const mitk::PlaneGeometry *plane1 = mitkWidget1->GetSliceNavigationController()->GetCurrentPlaneGeometry(); - const mitk::PlaneGeometry *plane2 = mitkWidget2->GetSliceNavigationController()->GetCurrentPlaneGeometry(); - const mitk::PlaneGeometry *plane3 = mitkWidget3->GetSliceNavigationController()->GetCurrentPlaneGeometry(); - - mitk::Line3D line; - if ((plane1 != nullptr) && (plane2 != nullptr) && (plane1->IntersectionLine(plane2, line))) + // The implementation looks a bit messy here, but it avoids + // synchronization of the color of the geometry nodes and an + // internal member here. + // Default colors were chosen for decent visibility. + // Feel free to change your preferences in the workbench. + float tmp[3] = { 0.0f, 0.0f, 0.0f }; + switch (widgetNumber) { - mitk::Point3D point; - if ((plane3 != nullptr) && (plane3->IntersectionPoint(line, point))) + case 0: + { + if (m_PlaneNode1.IsNotNull()) { - return point; + if (m_PlaneNode1->GetColor(tmp)) + { + return dynamic_cast(m_PlaneNode1->GetProperty("color"))->GetColor(); + } } + float red[3] = { 0.753f, 0.0f, 0.0f }; // This is #C00000 in hex + return mitk::Color(red); + } + case 1: + { + if (m_PlaneNode2.IsNotNull()) + { + if (m_PlaneNode2->GetColor(tmp)) + { + return dynamic_cast(m_PlaneNode2->GetProperty("color"))->GetColor(); + } + } + float green[3] = { 0.0f, 0.69f, 0.0f }; // This is #00B000 in hex + return mitk::Color(green); + } + case 2: + { + if (m_PlaneNode3.IsNotNull()) + { + if (m_PlaneNode3->GetColor(tmp)) + { + return dynamic_cast(m_PlaneNode3->GetProperty("color"))->GetColor(); + } + } + float blue[3] = { 0.0, 0.502f, 1.0f }; // This is #0080FF in hex + return mitk::Color(blue); + } + case 3: + { + return m_DecorationColorWidget4; + } + default: + MITK_ERROR << "Decoration color for unknown widget!"; + float black[3] = { 0.0f, 0.0f, 0.0f }; + return mitk::Color(black); } - // TODO BUG POSITIONTRACKER; - mitk::Point3D p; - return p; - // return m_LastLeftClickPositionSupplier->GetCurrentPoint(); -} - -void QmitkStdMultiWidget::EnablePositionTracking() -{ -} - -void QmitkStdMultiWidget::DisablePositionTracking() -{ } -void QmitkStdMultiWidget::EnsureDisplayContainsPoint(mitk::BaseRenderer *renderer, const mitk::Point3D &p) +void QmitkStdMultiWidget::wheelEvent(QWheelEvent *e) { - mitk::Point2D pointOnDisplay; - renderer->WorldToDisplay(p, pointOnDisplay); - - if (pointOnDisplay[0] < renderer->GetVtkRenderer()->GetOrigin()[0] || - pointOnDisplay[1] < renderer->GetVtkRenderer()->GetOrigin()[1] || - pointOnDisplay[0] > renderer->GetVtkRenderer()->GetOrigin()[0] + renderer->GetViewportSize()[0] || - pointOnDisplay[1] > renderer->GetVtkRenderer()->GetOrigin()[1] + renderer->GetViewportSize()[1]) - { - mitk::Point2D pointOnPlane; - renderer->GetCurrentWorldPlaneGeometry()->Map(p, pointOnPlane); - renderer->GetCameraController()->MoveCameraToPoint(pointOnPlane); - } + emit WheelMoved(e); } -void QmitkStdMultiWidget::MoveCrossToPosition(const mitk::Point3D &newPosition) +void QmitkStdMultiWidget::moveEvent(QMoveEvent *e) { - mitkWidget1->GetSliceNavigationController()->SelectSliceByPoint(newPosition); - mitkWidget2->GetSliceNavigationController()->SelectSliceByPoint(newPosition); - mitkWidget3->GetSliceNavigationController()->SelectSliceByPoint(newPosition); + QWidget::moveEvent(e); - m_RenderingManager->RequestUpdateAll(); + // it is necessary to readjust the position of the Annotation as the StdMultiWidget has moved + // unfortunately it's not done by QmitkRenderWindow::moveEvent -> must be done here + emit Moved(); } -void QmitkStdMultiWidget::HandleCrosshairPositionEvent() +void QmitkStdMultiWidget::HandleCrosshairPositionEventDelayed() { - if (!m_PendingCrosshairPositionEvent) + auto dataStorage = GetDataStorage(); + if (nullptr == dataStorage) { - m_PendingCrosshairPositionEvent = true; - QTimer::singleShot(0, this, SLOT(HandleCrosshairPositionEventDelayed())); + return; } -} -void QmitkStdMultiWidget::HandleCrosshairPositionEventDelayed() -{ m_PendingCrosshairPositionEvent = false; // find image with highest layer mitk::TNodePredicateDataType::Pointer isImageData = mitk::TNodePredicateDataType::New(); - mitk::DataStorage::SetOfObjects::ConstPointer nodes = m_DataStorage->GetSubset(isImageData).GetPointer(); - mitk::Point3D crosshairPos = GetCrossPosition(); - mitk::BaseRenderer* baseRenderer = mitkWidget1->GetSliceNavigationController()->GetRenderer(); + mitk::DataStorage::SetOfObjects::ConstPointer nodes = dataStorage->GetSubset(isImageData).GetPointer(); + mitk::Point3D crosshairPos = GetSelectedPosition(""); + mitk::BaseRenderer* baseRenderer = GetRenderWindow1()->GetSliceNavigationController()->GetRenderer(); auto globalCurrentTimePoint = baseRenderer->GetTime(); mitk::DataNode::Pointer node = mitk::FindTopmostVisibleNode(nodes, crosshairPos, globalCurrentTimePoint, baseRenderer); mitk::DataNode::Pointer topSourceNode; mitk::Image::Pointer image; bool isBinary = false; int component = 0; if (node.IsNotNull()) { node->GetBoolProperty("binary", isBinary); if (isBinary) { - mitk::DataStorage::SetOfObjects::ConstPointer sourcenodes = m_DataStorage->GetSources(node, nullptr, true); + mitk::DataStorage::SetOfObjects::ConstPointer sourcenodes = dataStorage->GetSources(node, nullptr, true); if (!sourcenodes->empty()) { - topSourceNode = mitk::FindTopmostVisibleNode(sourcenodes, crosshairPos,globalCurrentTimePoint, baseRenderer); + topSourceNode = mitk::FindTopmostVisibleNode(sourcenodes, crosshairPos, globalCurrentTimePoint, baseRenderer); } if (topSourceNode.IsNotNull()) { image = dynamic_cast(topSourceNode->GetData()); topSourceNode->GetIntProperty("Image.Displayed Component", component); } else { image = dynamic_cast(node->GetData()); node->GetIntProperty("Image.Displayed Component", component); } } else { image = dynamic_cast(node->GetData()); node->GetIntProperty("Image.Displayed Component", component); } } std::string statusText; std::stringstream stream; itk::Index<3> p; unsigned int timestep = baseRenderer->GetTimeStep(); if (image.IsNotNull() && (image->GetTimeSteps() > timestep)) { image->GetGeometry()->WorldToIndex(crosshairPos, p); stream.precision(2); stream << "Position: <" << std::fixed << crosshairPos[0] << ", " << std::fixed << crosshairPos[1] << ", " - << std::fixed << crosshairPos[2] << "> mm"; + << std::fixed << crosshairPos[2] << "> mm"; stream << "; Index: <" << p[0] << ", " << p[1] << ", " << p[2] << "> "; mitk::ScalarType pixelValue; mitkPixelTypeMultiplex5(mitk::FastSinglePixelAccess, - image->GetChannelDescriptor().GetPixelType(), - image, - image->GetVolumeData(image->GetTimeGeometry()->TimePointToTimeStep(globalCurrentTimePoint)), - p, - pixelValue, - component); + image->GetChannelDescriptor().GetPixelType(), + image, + image->GetVolumeData(image->GetTimeGeometry()->TimePointToTimeStep(globalCurrentTimePoint)), + p, + pixelValue, + component); if (fabs(pixelValue) > 1000000 || fabs(pixelValue) < 0.01) { - stream << "; Time: " <DisplayGreyValueText(statusText.c_str()); } -int QmitkStdMultiWidget::GetLayout() const +void QmitkStdMultiWidget::Fit() { - return m_Layout; -} + vtkSmartPointer vtkrenderer; + vtkrenderer = mitk::BaseRenderer::GetInstance(GetRenderWindow1()->GetRenderWindow())->GetVtkRenderer(); + if (nullptr != vtkrenderer) + { + vtkrenderer->ResetCamera(); + } -bool QmitkStdMultiWidget::GetGradientBackgroundFlag() const -{ - return m_GradientBackgroundFlag; -} + vtkrenderer = mitk::BaseRenderer::GetInstance(GetRenderWindow2()->GetRenderWindow())->GetVtkRenderer(); + if (nullptr != vtkrenderer) + { + vtkrenderer->ResetCamera(); + } -void QmitkStdMultiWidget::EnableGradientBackground() -{ - // gradient background is by default only in widget 4, otherwise - // interferences between 2D rendering and VTK rendering may occur. - for (unsigned int i = 0; i < 4; ++i) + vtkrenderer = mitk::BaseRenderer::GetInstance(GetRenderWindow3()->GetRenderWindow())->GetVtkRenderer(); + if (nullptr != vtkrenderer) { - GetRenderWindow(i)->GetRenderer()->GetVtkRenderer()->GradientBackgroundOn(); + vtkrenderer->ResetCamera(); } - m_GradientBackgroundFlag = true; -} -void QmitkStdMultiWidget::DisableGradientBackground() -{ - for (unsigned int i = 0; i < 4; ++i) + vtkrenderer = mitk::BaseRenderer::GetInstance(GetRenderWindow4()->GetRenderWindow())->GetVtkRenderer(); + if (nullptr != vtkrenderer) { - GetRenderWindow(i)->GetRenderer()->GetVtkRenderer()->GradientBackgroundOff(); + vtkrenderer->ResetCamera(); } - m_GradientBackgroundFlag = false; -} -void QmitkStdMultiWidget::EnableDepartmentLogo() -{ - m_LogoRendering->SetVisibility(true); - RequestUpdate(); + mitk::BaseRenderer::GetInstance(GetRenderWindow1()->GetRenderWindow())->GetCameraController()->Fit(); + mitk::BaseRenderer::GetInstance(GetRenderWindow2()->GetRenderWindow())->GetCameraController()->Fit(); + mitk::BaseRenderer::GetInstance(GetRenderWindow3()->GetRenderWindow())->GetCameraController()->Fit(); + mitk::BaseRenderer::GetInstance(GetRenderWindow4()->GetRenderWindow())->GetCameraController()->Fit(); + + int w = vtkObject::GetGlobalWarningDisplay(); + vtkObject::GlobalWarningDisplayOff(); + + vtkObject::SetGlobalWarningDisplay(w); } -void QmitkStdMultiWidget::DisableDepartmentLogo() +void QmitkStdMultiWidget::AddDisplayPlaneSubTree() { - m_LogoRendering->SetVisibility(false); - RequestUpdate(); + // add the displayed planes of the multiwidget to a node to which the subtree + // @a planesSubTree points ... + + mitk::PlaneGeometryDataMapper2D::Pointer mapper; + + // ... of widget 1 + mitk::BaseRenderer* renderer1 = mitk::BaseRenderer::GetInstance(GetRenderWindow1()->GetRenderWindow()); + m_PlaneNode1 = renderer1->GetCurrentWorldPlaneGeometryNode(); + m_PlaneNode1->SetProperty("visible", mitk::BoolProperty::New(true)); + m_PlaneNode1->SetProperty("name", mitk::StringProperty::New(std::string(renderer1->GetName()) + ".plane")); + m_PlaneNode1->SetProperty("includeInBoundingBox", mitk::BoolProperty::New(false)); + m_PlaneNode1->SetProperty("helper object", mitk::BoolProperty::New(true)); + mapper = mitk::PlaneGeometryDataMapper2D::New(); + m_PlaneNode1->SetMapper(mitk::BaseRenderer::Standard2D, mapper); + + // ... of widget 2 + mitk::BaseRenderer* renderer2 = mitk::BaseRenderer::GetInstance(GetRenderWindow2()->GetRenderWindow()); + m_PlaneNode2 = renderer2->GetCurrentWorldPlaneGeometryNode(); + m_PlaneNode2->SetProperty("visible", mitk::BoolProperty::New(true)); + m_PlaneNode2->SetProperty("name", mitk::StringProperty::New(std::string(renderer2->GetName()) + ".plane")); + m_PlaneNode2->SetProperty("includeInBoundingBox", mitk::BoolProperty::New(false)); + m_PlaneNode2->SetProperty("helper object", mitk::BoolProperty::New(true)); + mapper = mitk::PlaneGeometryDataMapper2D::New(); + m_PlaneNode2->SetMapper(mitk::BaseRenderer::Standard2D, mapper); + + // ... of widget 3 + mitk::BaseRenderer *renderer3 = mitk::BaseRenderer::GetInstance(GetRenderWindow3()->GetRenderWindow()); + m_PlaneNode3 = renderer3->GetCurrentWorldPlaneGeometryNode(); + m_PlaneNode3->SetProperty("visible", mitk::BoolProperty::New(true)); + m_PlaneNode3->SetProperty("name", mitk::StringProperty::New(std::string(renderer3->GetName()) + ".plane")); + m_PlaneNode3->SetProperty("includeInBoundingBox", mitk::BoolProperty::New(false)); + m_PlaneNode3->SetProperty("helper object", mitk::BoolProperty::New(true)); + mapper = mitk::PlaneGeometryDataMapper2D::New(); + m_PlaneNode3->SetMapper(mitk::BaseRenderer::Standard2D, mapper); + + m_ParentNodeForGeometryPlanes = mitk::DataNode::New(); + m_ParentNodeForGeometryPlanes->SetProperty("name", mitk::StringProperty::New("Widgets")); + m_ParentNodeForGeometryPlanes->SetProperty("helper object", mitk::BoolProperty::New(true)); } -bool QmitkStdMultiWidget::IsDepartmentLogoEnabled() const +void QmitkStdMultiWidget::EnsureDisplayContainsPoint(mitk::BaseRenderer *renderer, const mitk::Point3D &p) { - return m_LogoRendering->IsVisible(); + mitk::Point2D pointOnDisplay; + renderer->WorldToDisplay(p, pointOnDisplay); + + if (pointOnDisplay[0] < renderer->GetVtkRenderer()->GetOrigin()[0] || + pointOnDisplay[1] < renderer->GetVtkRenderer()->GetOrigin()[1] || + pointOnDisplay[0] > renderer->GetVtkRenderer()->GetOrigin()[0] + renderer->GetViewportSize()[0] || + pointOnDisplay[1] > renderer->GetVtkRenderer()->GetOrigin()[1] + renderer->GetViewportSize()[1]) + { + mitk::Point2D pointOnPlane; + renderer->GetCurrentWorldPlaneGeometry()->Map(p, pointOnPlane); + renderer->GetCameraController()->MoveCameraToPoint(pointOnPlane); + } } void QmitkStdMultiWidget::SetWidgetPlaneVisibility(const char *widgetName, bool visible, mitk::BaseRenderer *renderer) { - if (m_DataStorage.IsNotNull()) + auto dataStorage = GetDataStorage(); + if (nullptr != dataStorage) { - mitk::DataNode *n = m_DataStorage->GetNamedNode(widgetName); - if (n != nullptr) - n->SetVisibility(visible, renderer); + mitk::DataNode* dataNode = dataStorage->GetNamedNode(widgetName); + if (dataNode != nullptr) + { + dataNode->SetVisibility(visible, renderer); + } } } void QmitkStdMultiWidget::SetWidgetPlanesVisibility(bool visible, mitk::BaseRenderer *renderer) { if (m_PlaneNode1.IsNotNull()) { m_PlaneNode1->SetVisibility(visible, renderer); } if (m_PlaneNode2.IsNotNull()) { m_PlaneNode2->SetVisibility(visible, renderer); } if (m_PlaneNode3.IsNotNull()) { m_PlaneNode3->SetVisibility(visible, renderer); } m_RenderingManager->RequestUpdateAll(); } void QmitkStdMultiWidget::SetWidgetPlanesLocked(bool locked) { // do your job and lock or unlock slices. GetRenderWindow1()->GetSliceNavigationController()->SetSliceLocked(locked); GetRenderWindow2()->GetSliceNavigationController()->SetSliceLocked(locked); GetRenderWindow3()->GetSliceNavigationController()->SetSliceLocked(locked); } void QmitkStdMultiWidget::SetWidgetPlanesRotationLocked(bool locked) { // do your job and lock or unlock slices. GetRenderWindow1()->GetSliceNavigationController()->SetSliceRotationLocked(locked); GetRenderWindow2()->GetSliceNavigationController()->SetSliceRotationLocked(locked); GetRenderWindow3()->GetSliceNavigationController()->SetSliceRotationLocked(locked); } void QmitkStdMultiWidget::SetWidgetPlanesRotationLinked(bool link) { emit WidgetPlanesRotationLinked(link); } void QmitkStdMultiWidget::SetWidgetPlaneMode(int userMode) { + /* MITK_DEBUG << "Changing crosshair mode to " << userMode; emit WidgetNotifyNewCrossHairMode(userMode); // Convert user interface mode to actual mode { - switch (userMode) - { - case 0: - m_MouseModeSwitcher->SetInteractionScheme(mitk::MouseModeSwitcher::InteractionScheme::MITK); - break; - case 1: - m_MouseModeSwitcher->SetInteractionScheme(mitk::MouseModeSwitcher::InteractionScheme::ROTATION); - break; - - case 2: - m_MouseModeSwitcher->SetInteractionScheme(mitk::MouseModeSwitcher::InteractionScheme::ROTATIONLINKED); - break; - - case 3: - m_MouseModeSwitcher->SetInteractionScheme(mitk::MouseModeSwitcher::InteractionScheme::SWIVEL); - break; - } - } -} - -void QmitkStdMultiWidget::SetGradientBackgroundColorForRenderWindow(const mitk::Color &upper, - const mitk::Color &lower, - unsigned int widgetNumber) -{ - if (widgetNumber > 3) - { - MITK_ERROR << "Gradientbackground for unknown widget!"; - return; - } - m_GradientBackgroundColors[widgetNumber].first = upper; - m_GradientBackgroundColors[widgetNumber].second = lower; - vtkRenderer *renderer = GetRenderWindow(widgetNumber)->GetRenderer()->GetVtkRenderer(); - renderer->SetBackground2(upper[0], upper[1], upper[2]); - renderer->SetBackground(lower[0], lower[1], lower[2]); - m_GradientBackgroundFlag = true; -} - -void QmitkStdMultiWidget::SetGradientBackgroundColors(const mitk::Color &upper, const mitk::Color &lower) -{ - for (unsigned int i = 0; i < 4; ++i) + switch (userMode) { - vtkRenderer *renderer = GetRenderWindow(i)->GetRenderer()->GetVtkRenderer(); - renderer->SetBackground2(upper[0], upper[1], upper[2]); - renderer->SetBackground(lower[0], lower[1], lower[2]); - } - m_GradientBackgroundFlag = true; -} - -void QmitkStdMultiWidget::SetDepartmentLogo(const char *path) -{ - QImage* qimage = new QImage(path); - vtkSmartPointer qImageToVtk; - qImageToVtk = vtkSmartPointer::New(); + case 0: + m_MouseModeSwitcher->SetInteractionScheme(mitk::MouseModeSwitcher::InteractionScheme::MITK); + break; + case 1: + m_MouseModeSwitcher->SetInteractionScheme(mitk::MouseModeSwitcher::InteractionScheme::ROTATION); + break; - qImageToVtk->SetQImage(qimage); - qImageToVtk->Update(); + case 2: + m_MouseModeSwitcher->SetInteractionScheme(mitk::MouseModeSwitcher::InteractionScheme::ROTATIONLINKED); + break; - m_LogoRendering->SetLogoImage(qImageToVtk->GetOutput()); - mitk::BaseRenderer *renderer = mitk::BaseRenderer::GetInstance(mitkWidget4->GetRenderWindow()); - m_LogoRendering->Update(renderer); - RequestUpdate(); + case 3: + m_MouseModeSwitcher->SetInteractionScheme(mitk::MouseModeSwitcher::InteractionScheme::SWIVEL); + break; + } + } + */ } +/* void QmitkStdMultiWidget::SetWidgetPlaneModeToSlicing(bool activate) { - if (activate) - { - this->SetWidgetPlaneMode(PLANE_MODE_SLICING); - } -} - -void QmitkStdMultiWidget::SetWidgetPlaneModeToRotation(bool activate) +if (activate) { - if (activate) - { - this->SetWidgetPlaneMode(PLANE_MODE_ROTATION); - } +this->SetWidgetPlaneMode(PLANE_MODE_SLICING); } - -void QmitkStdMultiWidget::SetWidgetPlaneModeToSwivel(bool activate) -{ - if (activate) - { - this->SetWidgetPlaneMode(PLANE_MODE_SWIVEL); - } } -void QmitkStdMultiWidget::OnLayoutDesignChanged(int layoutDesignIndex) +void QmitkStdMultiWidget::SetWidgetPlaneModeToRotation(bool activate) { - switch (layoutDesignIndex) - { - case LAYOUT_DEFAULT: - { - this->changeLayoutToDefault(); - break; - } - case LAYOUT_2D_IMAGES_UP: - { - this->changeLayoutTo2DImagesUp(); - break; - } - case LAYOUT_2D_IMAGES_LEFT: - { - this->changeLayoutTo2DImagesLeft(); - break; - } - case LAYOUT_BIG_3D: - { - this->changeLayoutToBig3D(); - break; - } - case LAYOUT_WIDGET1: - { - this->changeLayoutToWidget1(); - break; - } - case LAYOUT_WIDGET2: - { - this->changeLayoutToWidget2(); - break; - } - case LAYOUT_WIDGET3: - { - this->changeLayoutToWidget3(); - break; - } - case LAYOUT_2X_2D_AND_3D_WIDGET: - { - this->changeLayoutTo2x2Dand3DWidget(); - break; - } - case LAYOUT_ROW_WIDGET_3_AND_4: - { - this->changeLayoutToRowWidget3And4(); - break; - } - case LAYOUT_COLUMN_WIDGET_3_AND_4: - { - this->changeLayoutToColumnWidget3And4(); - break; - } - case LAYOUT_ROW_WIDGET_SMALL3_AND_BIG4: - { - this->changeLayoutToRowWidgetSmall3andBig4(); - break; - } - case LAYOUT_SMALL_UPPER_WIDGET2_BIG3_AND4: - { - this->changeLayoutToSmallUpperWidget2Big3and4(); - break; - } - case LAYOUT_2D_AND_3D_LEFT_2D_RIGHT_WIDGET: - { - this->changeLayoutToLeft2Dand3DRight2D(); - break; - } - }; -} - -void QmitkStdMultiWidget::UpdateAllWidgets() +if (activate) { - mitkWidget1->resize(mitkWidget1Container->frameSize().width() - 1, mitkWidget1Container->frameSize().height()); - mitkWidget1->resize(mitkWidget1Container->frameSize().width(), mitkWidget1Container->frameSize().height()); - - mitkWidget2->resize(mitkWidget2Container->frameSize().width() - 1, mitkWidget2Container->frameSize().height()); - mitkWidget2->resize(mitkWidget2Container->frameSize().width(), mitkWidget2Container->frameSize().height()); - - mitkWidget3->resize(mitkWidget3Container->frameSize().width() - 1, mitkWidget3Container->frameSize().height()); - mitkWidget3->resize(mitkWidget3Container->frameSize().width(), mitkWidget3Container->frameSize().height()); - - mitkWidget4->resize(mitkWidget4Container->frameSize().width() - 1, mitkWidget4Container->frameSize().height()); - mitkWidget4->resize(mitkWidget4Container->frameSize().width(), mitkWidget4Container->frameSize().height()); +this->SetWidgetPlaneMode(PLANE_MODE_ROTATION); } - -void QmitkStdMultiWidget::HideAllWidgetToolbars() -{ - mitkWidget1->HideRenderWindowMenu(); - mitkWidget2->HideRenderWindowMenu(); - mitkWidget3->HideRenderWindowMenu(); - mitkWidget4->HideRenderWindowMenu(); } -void QmitkStdMultiWidget::ActivateMenuWidget(bool state) +void QmitkStdMultiWidget::SetWidgetPlaneModeToSwivel(bool activate) { - mitkWidget1->ActivateMenuWidget(state, this); - mitkWidget2->ActivateMenuWidget(state, this); - mitkWidget3->ActivateMenuWidget(state, this); - mitkWidget4->ActivateMenuWidget(state, this); -} - -bool QmitkStdMultiWidget::IsMenuWidgetEnabled() const +if (activate) { - return mitkWidget1->GetActivateMenuWidgetFlag(); +this->SetWidgetPlaneMode(PLANE_MODE_SWIVEL); } - -void QmitkStdMultiWidget::SetDecorationColor(unsigned int widgetNumber, mitk::Color color) -{ - switch (widgetNumber) - { - case 0: - if (m_PlaneNode1.IsNotNull()) - { - m_PlaneNode1->SetColor(color); - } - break; - case 1: - if (m_PlaneNode2.IsNotNull()) - { - m_PlaneNode2->SetColor(color); - } - break; - case 2: - if (m_PlaneNode3.IsNotNull()) - { - m_PlaneNode3->SetColor(color); - } - break; - case 3: - m_DecorationColorWidget4 = color; - break; - default: - MITK_ERROR << "Decoration color for unknown widget!"; - break; - } } +*/ void QmitkStdMultiWidget::ResetCrosshair() { - if (m_DataStorage.IsNotNull()) + auto dataStorage = GetDataStorage(); + if (nullptr == dataStorage) { - m_RenderingManager->InitializeViewsByBoundingObjects(m_DataStorage); - // m_RenderingManager->InitializeViews( m_DataStorage->ComputeVisibleBoundingGeometry3D() ); - // reset interactor to normal slicing - this->SetWidgetPlaneMode(PLANE_MODE_SLICING); + return; } -} -void QmitkStdMultiWidget::EnableColoredRectangles() -{ - m_RectangleProps[0]->SetVisibility(1); - m_RectangleProps[1]->SetVisibility(1); - m_RectangleProps[2]->SetVisibility(1); - m_RectangleProps[3]->SetVisibility(1); -} + m_RenderingManager->InitializeViewsByBoundingObjects(dataStorage); + // m_RenderingManager->InitializeViews( m_DataStorage->ComputeVisibleBoundingGeometry3D() ); + // reset interactor to normal slicing + SetWidgetPlaneMode(PLANE_MODE_SLICING); +} + +////////////////////////////////////////////////////////////////////////// +// PRIVATE +////////////////////////////////////////////////////////////////////////// +void QmitkStdMultiWidget::SetLayoutImpl() +{ + CreateRenderWindowWidgets(); + InitializeLayout(); + + // Initialize views as axial, sagittal, coronal to all data objects in DataStorage + auto geo = GetDataStorage()->ComputeBoundingGeometry3D(GetDataStorage()->GetAll()); + mitk::RenderingManager::GetInstance()->InitializeViews(geo); +} + +void QmitkStdMultiWidget::CreateRenderWindowWidgets() +{ + // create axial render window (widget) + QString renderWindowWidgetName = GetNameFromIndex(0, 0); + RenderWindowWidgetPointer renderWindowWidget1 = std::make_shared(this, renderWindowWidgetName, GetDataStorage()); + auto renderWindow1 = renderWindowWidget1->GetRenderWindow(); + renderWindow1->GetSliceNavigationController()->SetDefaultViewDirection(mitk::SliceNavigationController::Axial); + renderWindowWidget1->SetDecorationColor(GetDecorationColor(0)); + renderWindowWidget1->SetCornerAnnotationText("Axial"); + renderWindowWidget1->GetRenderWindow()->SetLayoutIndex(AXIAL); + AddRenderWindowWidget(renderWindowWidgetName, renderWindowWidget1); + + // create sagittal render window (widget) + renderWindowWidgetName = GetNameFromIndex(0, 1); + RenderWindowWidgetPointer renderWindowWidget2 = std::make_shared(this, renderWindowWidgetName, GetDataStorage()); + auto renderWindow2 = renderWindowWidget2->GetRenderWindow(); + renderWindow2->GetSliceNavigationController()->SetDefaultViewDirection(mitk::SliceNavigationController::Sagittal); + renderWindowWidget2->SetDecorationColor(GetDecorationColor(1)); + renderWindowWidget2->setStyleSheet("border: 0px"); + renderWindowWidget2->SetCornerAnnotationText("Sagittal"); + renderWindowWidget2->GetRenderWindow()->SetLayoutIndex(SAGITTAL); + AddRenderWindowWidget(renderWindowWidgetName, renderWindowWidget2); + + // create coronal render window (widget) + renderWindowWidgetName = GetNameFromIndex(1, 0); + RenderWindowWidgetPointer renderWindowWidget3 = std::make_shared(this, renderWindowWidgetName, GetDataStorage()); + auto renderWindow3 = renderWindowWidget3->GetRenderWindow(); + renderWindow3->GetSliceNavigationController()->SetDefaultViewDirection(mitk::SliceNavigationController::Frontal); + renderWindowWidget3->SetDecorationColor(GetDecorationColor(2)); + renderWindowWidget3->SetCornerAnnotationText("Coronal"); + renderWindowWidget3->GetRenderWindow()->SetLayoutIndex(CORONAL); + AddRenderWindowWidget(renderWindowWidgetName, renderWindowWidget3); + + // create 3D render window (widget) + renderWindowWidgetName = GetNameFromIndex(1, 1); + RenderWindowWidgetPointer renderWindowWidget4 = std::make_shared(this, renderWindowWidgetName, GetDataStorage()); + auto renderWindow4 = renderWindowWidget4->GetRenderWindow(); + renderWindow4->GetSliceNavigationController()->SetDefaultViewDirection(mitk::SliceNavigationController::Original); + renderWindowWidget4->SetDecorationColor(GetDecorationColor(3)); + renderWindowWidget4->SetCornerAnnotationText("3D"); + mitk::BaseRenderer::GetInstance(renderWindowWidget4->GetRenderWindow()->GetRenderWindow())->SetMapperID(mitk::BaseRenderer::Standard3D); + renderWindowWidget4->GetRenderWindow()->SetLayoutIndex(THREE_D); + AddRenderWindowWidget(renderWindowWidgetName, renderWindowWidget4); + + SetActiveRenderWindowWidget(renderWindowWidget1); -void QmitkStdMultiWidget::DisableColoredRectangles() -{ - m_RectangleProps[0]->SetVisibility(0); - m_RectangleProps[1]->SetVisibility(0); - m_RectangleProps[2]->SetVisibility(0); - m_RectangleProps[3]->SetVisibility(0); -} + // connect to the "time navigation controller": send time via sliceNavigationControllers + m_TimeNavigationController->ConnectGeometryTimeEvent(renderWindow1->GetSliceNavigationController(), false); + m_TimeNavigationController->ConnectGeometryTimeEvent(renderWindow2->GetSliceNavigationController(), false); + m_TimeNavigationController->ConnectGeometryTimeEvent(renderWindow3->GetSliceNavigationController(), false); + m_TimeNavigationController->ConnectGeometryTimeEvent(renderWindow4->GetSliceNavigationController(), false); + renderWindow1->GetSliceNavigationController()->ConnectGeometrySendEvent( + mitk::BaseRenderer::GetInstance(renderWindow4->GetRenderWindow())); -bool QmitkStdMultiWidget::IsColoredRectanglesEnabled() const -{ - return m_RectangleProps[0]->GetVisibility() > 0; + // reverse connection between sliceNavigationControllers and timeNavigationController + renderWindow1->GetSliceNavigationController()->ConnectGeometryTimeEvent(m_TimeNavigationController, false); + renderWindow2->GetSliceNavigationController()->ConnectGeometryTimeEvent(m_TimeNavigationController, false); + renderWindow3->GetSliceNavigationController()->ConnectGeometryTimeEvent(m_TimeNavigationController, false); + //renderWindow4->GetSliceNavigationController()->ConnectGeometryTimeEvent(m_TimeNavigationController, false); } -mitk::MouseModeSwitcher *QmitkStdMultiWidget::GetMouseModeSwitcher() +void QmitkStdMultiWidget::InitializeLayout() { - return m_MouseModeSwitcher; -} + // create layouts + hBoxLayout = new QHBoxLayout(this); + hBoxLayout->setContentsMargins(0, 0, 0, 0); + setLayout(hBoxLayout); + hBoxLayout->setMargin(0); -mitk::DataNode::Pointer QmitkStdMultiWidget::GetWidgetPlane1() -{ - return this->m_PlaneNode1; -} + // create main split + m_MainSplit = new QSplitter(this); + hBoxLayout->addWidget(m_MainSplit); -mitk::DataNode::Pointer QmitkStdMultiWidget::GetWidgetPlane2() -{ - return this->m_PlaneNode2; + // create vertical layout split and add to the main split + m_LayoutSplit = new QSplitter(Qt::Vertical, m_MainSplit); + m_MainSplit->addWidget(m_LayoutSplit); + + // create m_SubSplit1 and m_SubSplit2 + m_SubSplit1 = new QSplitter(m_LayoutSplit); + m_SubSplit2 = new QSplitter(m_LayoutSplit); + + m_SubSplit1->addWidget(GetRenderWindowWidget(0, 0).get()); + m_SubSplit1->addWidget(GetRenderWindowWidget(0, 1).get()); + m_SubSplit2->addWidget(GetRenderWindowWidget(1, 0).get()); + m_SubSplit2->addWidget(GetRenderWindowWidget(1, 1).get()); + + resize(QSize(364, 477).expandedTo(minimumSizeHint())); } -mitk::DataNode::Pointer QmitkStdMultiWidget::GetWidgetPlane3() +void QmitkStdMultiWidget::UpdateAllWidgets() { - return this->m_PlaneNode3; + GetRenderWindow1()->resize(mitkWidget1Container->frameSize().width() - 1, mitkWidget1Container->frameSize().height()); + GetRenderWindow1()->resize(mitkWidget1Container->frameSize().width(), mitkWidget1Container->frameSize().height()); + + GetRenderWindow2()->resize(mitkWidget2Container->frameSize().width() - 1, mitkWidget2Container->frameSize().height()); + GetRenderWindow2()->resize(mitkWidget2Container->frameSize().width(), mitkWidget2Container->frameSize().height()); + + GetRenderWindow3()->resize(mitkWidget3Container->frameSize().width() - 1, mitkWidget3Container->frameSize().height()); + GetRenderWindow3()->resize(mitkWidget3Container->frameSize().width(), mitkWidget3Container->frameSize().height()); + + GetRenderWindow4()->resize(mitkWidget4Container->frameSize().width() - 1, mitkWidget4Container->frameSize().height()); + GetRenderWindow4()->resize(mitkWidget4Container->frameSize().width(), mitkWidget4Container->frameSize().height()); } -mitk::DataNode::Pointer QmitkStdMultiWidget::GetWidgetPlane(int id) +void QmitkStdMultiWidget::HideAllWidgetToolbars() { - switch (id) - { - case 1: - return this->m_PlaneNode1; - break; - case 2: - return this->m_PlaneNode2; - break; - case 3: - return this->m_PlaneNode3; - break; - default: - return nullptr; - } + GetRenderWindow1()->HideRenderWindowMenu(); + GetRenderWindow2()->HideRenderWindowMenu(); + GetRenderWindow3()->HideRenderWindowMenu(); + GetRenderWindow4()->HideRenderWindowMenu(); } diff --git a/Modules/QtWidgetsExt/src/QmitkPointListView.cpp b/Modules/QtWidgetsExt/src/QmitkPointListView.cpp index 0480ab1361..b811947c88 100644 --- a/Modules/QtWidgetsExt/src/QmitkPointListView.cpp +++ b/Modules/QtWidgetsExt/src/QmitkPointListView.cpp @@ -1,334 +1,335 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkPointListView.h" #include "QmitkEditPointDialog.h" #include "QmitkPointListModel.h" +#include "QmitkRenderWindow.h" #include "QmitkStdMultiWidget.h" #include "mitkRenderingManager.h" #include #include #include #include #include QmitkPointListView::QmitkPointListView(QWidget *parent) : QListView(parent), m_PointListModel(new QmitkPointListModel()), m_SelfCall(false), m_showFading(false), m_MultiWidget(nullptr) { QListView::setAlternatingRowColors(true); QListView::setSelectionBehavior(QAbstractItemView::SelectItems); QListView::setSelectionMode(QAbstractItemView::SingleSelection); QListView::setModel(m_PointListModel); 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); QListView::setToolTip(tooltip); this->setContextMenuPolicy(Qt::CustomContextMenu); this->setMinimumHeight(40); this->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); connect(m_PointListModel, SIGNAL(SignalUpdateSelection()), this, SLOT(OnPointSetSelectionChanged())); connect(this, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(OnPointDoubleClicked(const QModelIndex &))); connect(QListView::selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(OnListViewSelectionChanged(const QItemSelection &, const QItemSelection &))); connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(ctxMenu(const QPoint &))); } QmitkPointListView::~QmitkPointListView() { delete m_PointListModel; } void QmitkPointListView::SetPointSetNode(mitk::DataNode *pointSetNode) { m_PointListModel->SetPointSetNode(pointSetNode); } const mitk::PointSet *QmitkPointListView::GetPointSet() const { return m_PointListModel->GetPointSet(); } void QmitkPointListView::SetMultiWidget(QmitkStdMultiWidget *multiWidget) { m_MultiWidget = multiWidget; - this->AddSliceNavigationController(multiWidget->mitkWidget1->GetSliceNavigationController()); - this->AddSliceNavigationController(multiWidget->mitkWidget2->GetSliceNavigationController()); - this->AddSliceNavigationController(multiWidget->mitkWidget3->GetSliceNavigationController()); + this->AddSliceNavigationController(multiWidget->GetRenderWindow1()->GetSliceNavigationController()); + this->AddSliceNavigationController(multiWidget->GetRenderWindow1()->GetSliceNavigationController()); + this->AddSliceNavigationController(multiWidget->GetRenderWindow1()->GetSliceNavigationController()); } QmitkStdMultiWidget *QmitkPointListView::GetMultiWidget() const { return m_MultiWidget; } void QmitkPointListView::OnPointDoubleClicked(const QModelIndex &index) { mitk::PointSet::PointType p; mitk::PointSet::PointIdentifier id; m_PointListModel->GetPointForModelIndex(index, p, id); QmitkEditPointDialog _EditPointDialog(this); _EditPointDialog.SetPoint(m_PointListModel->GetPointSet(), id, m_PointListModel->GetTimeStep()); _EditPointDialog.exec(); } void QmitkPointListView::OnPointSetSelectionChanged() { const mitk::PointSet *pointSet = m_PointListModel->GetPointSet(); if (pointSet == nullptr) return; // update this view's selection status as a result to changes in the point set data structure m_SelfCall = true; int timeStep = m_PointListModel->GetTimeStep(); if (pointSet->GetNumberOfSelected(timeStep) > 1) { MITK_ERROR << "Point set has multiple selected points. This view is not designed for more than one selected point."; } int selectedIndex = pointSet->SearchSelectedPoint(timeStep); if (selectedIndex == -1) // no selected point is found { m_SelfCall = false; return; } QModelIndex index; bool modelIndexOkay = m_PointListModel->GetModelIndexForPointID(selectedIndex, index); if (modelIndexOkay == true) QListView::selectionModel()->select(index, QItemSelectionModel::ClearAndSelect); emit SignalPointSelectionChanged(); m_SelfCall = false; } void QmitkPointListView::OnListViewSelectionChanged(const QItemSelection &selected, const QItemSelection & /*deselected*/) { if (m_SelfCall) return; mitk::PointSet *pointSet = const_cast(m_PointListModel->GetPointSet()); if (pointSet == nullptr) return; // (take care that this widget doesn't react to self-induced changes by setting m_SelfCall) m_SelfCall = true; // update selection of all points in pointset: select the one(s) that are selected in the view, deselect all others QModelIndexList selectedIndexes = selected.indexes(); // only call setSelectInfo on a point set with 'selected = true' if you deselcted the other entries int indexToSelect = -1; for (mitk::PointSet::PointsContainer::Iterator it = pointSet->GetPointSet(m_PointListModel->GetTimeStep())->GetPoints()->Begin(); it != pointSet->GetPointSet(m_PointListModel->GetTimeStep())->GetPoints()->End(); ++it) { QModelIndex index; if (m_PointListModel->GetModelIndexForPointID(it->Index(), index)) { if (selectedIndexes.indexOf(index) != -1) // index is found in the selected indices list { indexToSelect = it->Index(); } else { pointSet->SetSelectInfo(it->Index(), false, m_PointListModel->GetTimeStep()); } } } // force selection of only one index after deselecting the others if (indexToSelect > -1) { pointSet->SetSelectInfo(indexToSelect, true, m_PointListModel->GetTimeStep()); mitk::Point3D p = pointSet->GetPoint(indexToSelect, m_PointListModel->GetTimeStep()); for (auto snc : m_Sncs) snc->SelectSliceByPoint(p); } m_SelfCall = false; emit SignalPointSelectionChanged(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkPointListView::keyPressEvent(QKeyEvent *e) { if (m_PointListModel == nullptr) return; int key = e->key(); switch (key) { case Qt::Key_F2: m_PointListModel->MoveSelectedPointUp(); break; case Qt::Key_F3: m_PointListModel->MoveSelectedPointDown(); break; case Qt::Key_Delete: m_PointListModel->RemoveSelectedPoint(); break; default: break; } } void QmitkPointListView::wheelEvent(QWheelEvent *event) { if (!m_PointListModel || !m_PointListModel->GetPointSet() || (int)(m_PointListModel->GetPointSet()->GetTimeSteps()) == 1) return; int whe = event->delta(); mitk::PointSet::Pointer ps = dynamic_cast(m_PointListModel->GetPointSet()); unsigned int numberOfTS = ps->GetTimeSteps(); if (numberOfTS == 1) return; int currentTS = this->m_PointListModel->GetTimeStep(); if (whe > 0) { if ((currentTS + 1 >= (int)numberOfTS)) return; this->m_PointListModel->SetTimeStep(++currentTS); } else { if ((currentTS <= 0)) return; this->m_PointListModel->SetTimeStep(--currentTS); } 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); this->setToolTip(tooltip); emit SignalTimeStepChanged(currentTS); } void QmitkPointListView::ctxMenu(const QPoint &pos) { QMenu *menu = new QMenu; // add Fading check QAction *showFading = new QAction(this); showFading->setCheckable(false); // TODO: reset when fading is working showFading->setEnabled(false); // TODO: reset when fading is working showFading->setText("Fade TimeStep"); connect(showFading, SIGNAL(triggered(bool)), this, SLOT(SetFading(bool))); menu->addAction(showFading); // add Clear action QAction *clearList = new QAction(this); clearList->setText("Clear List"); connect(clearList, SIGNAL(triggered()), this, SLOT(ClearPointList())); menu->addAction(clearList); // add Clear TimeStep action QAction *clearTS = new QAction(this); clearTS->setText("Clear current time step"); connect(clearTS, SIGNAL(triggered()), this, SLOT(ClearPointListTS())); menu->addAction(clearTS); menu->exec(this->mapToGlobal(pos)); } void QmitkPointListView::SetFading(bool onOff) { m_showFading = onOff; } void QmitkPointListView::ClearPointList() { if (!m_PointListModel->GetPointSet()) return; mitk::PointSet::Pointer curPS = m_PointListModel->GetPointSet(); if (curPS->GetSize() == 0) return; switch (QMessageBox::question(this, tr("Clear Points"), tr("Remove all points from the displayed list?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) { case QMessageBox::Yes: { mitk::PointSet::PointsIterator it; mitk::PointSet::PointsContainer *curPsPoints; while (!curPS->IsEmptyTimeStep(0)) { curPsPoints = curPS->GetPointSet()->GetPoints(); it = curPsPoints->Begin(); curPS->SetSelectInfo(it->Index(), true); m_PointListModel->RemoveSelectedPoint(); } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); break; } case QMessageBox::No: default: break; } } void QmitkPointListView::ClearPointListTS() { } void QmitkPointListView::AddSliceNavigationController(mitk::SliceNavigationController *snc) { if (snc == nullptr) return; m_Sncs.insert(snc); } void QmitkPointListView::RemoveSliceNavigationController(mitk::SliceNavigationController *snc) { if (snc == nullptr) return; m_Sncs.erase(snc); } diff --git a/Plugins/org.mitk.gui.qt.common.legacy/src/QmitkFunctionality.cpp b/Plugins/org.mitk.gui.qt.common.legacy/src/QmitkFunctionality.cpp index 6ac4554f6a..a0e66fde6a 100755 --- a/Plugins/org.mitk.gui.qt.common.legacy/src/QmitkFunctionality.cpp +++ b/Plugins/org.mitk.gui.qt.common.legacy/src/QmitkFunctionality.cpp @@ -1,379 +1,379 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkFunctionality.h" #include "internal/QmitkFunctionalityUtil.h" #include "internal/QmitkCommonLegacyActivator.h" // other includes #include // mitk Includes #include #include // berry Includes #include #include #include #include // Qmitk Includes #include // Qt Includes #include #include #include #include QmitkFunctionality::QmitkFunctionality() : m_Parent(0) , m_Active(false) , m_Visible(false) , m_SelectionProvider(0) , m_DataStorageServiceTracker(QmitkCommonLegacyActivator::GetContext()) , m_HandlesMultipleDataStorages(false) , m_InDataStorageChanged(false) { m_DataStorageServiceTracker.open(); } void QmitkFunctionality::SetHandleMultipleDataStorages(bool multiple) { m_HandlesMultipleDataStorages = multiple; } bool QmitkFunctionality::HandlesMultipleDataStorages() const { return m_HandlesMultipleDataStorages; } mitk::DataStorage::Pointer QmitkFunctionality::GetDataStorage() const { mitk::IDataStorageService* service = m_DataStorageServiceTracker.getService(); if (service != 0) { if(m_HandlesMultipleDataStorages) return service->GetActiveDataStorage()->GetDataStorage(); else return service->GetDefaultDataStorage()->GetDataStorage(); } return 0; } mitk::DataStorage::Pointer QmitkFunctionality::GetDefaultDataStorage() const { mitk::IDataStorageService* service = m_DataStorageServiceTracker.getService(); if (service != 0) { return service->GetDefaultDataStorage()->GetDataStorage(); } return 0; } mitk::IDataStorageReference::Pointer QmitkFunctionality::GetDataStorageReference() const { mitk::IDataStorageService* dsService = m_DataStorageServiceTracker.getService(); if (dsService != 0) { return dsService->GetDataStorage(); } return mitk::IDataStorageReference::Pointer(0); } void QmitkFunctionality::CreatePartControl(QWidget* parent) { // scrollArea QScrollArea* scrollArea = new QScrollArea; //QVBoxLayout* scrollAreaLayout = new QVBoxLayout(scrollArea); scrollArea->setFrameShadow(QFrame::Plain); scrollArea->setFrameShape(QFrame::NoFrame); scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); // m_Parent m_Parent = new QWidget; //m_Parent->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding)); this->CreateQtPartControl(m_Parent); //scrollAreaLayout->addWidget(m_Parent); //scrollArea->setLayout(scrollAreaLayout); // set the widget now scrollArea->setWidgetResizable(true); scrollArea->setWidget(m_Parent); // add the scroll area to the real parent (the view tabbar) QWidget* parentQWidget = static_cast(parent); QVBoxLayout* parentLayout = new QVBoxLayout(parentQWidget); parentLayout->setMargin(0); parentLayout->setSpacing(0); parentLayout->addWidget(scrollArea); // finally set the layout containing the scroll area to the parent widget (= show it) parentQWidget->setLayout(parentLayout); this->AfterCreateQtPartControl(); } void QmitkFunctionality::AfterCreateQtPartControl() { // REGISTER DATASTORAGE LISTENER this->GetDefaultDataStorage()->AddNodeEvent.AddListener( mitk::MessageDelegate1 ( this, &QmitkFunctionality::NodeAddedProxy ) ); this->GetDefaultDataStorage()->ChangedNodeEvent.AddListener( mitk::MessageDelegate1 ( this, &QmitkFunctionality::NodeChangedProxy ) ); this->GetDefaultDataStorage()->RemoveNodeEvent.AddListener( mitk::MessageDelegate1 ( this, &QmitkFunctionality::NodeRemovedProxy ) ); // REGISTER PREFERENCES LISTENER berry::IBerryPreferences::Pointer prefs = this->GetPreferences().Cast(); if(prefs.IsNotNull()) prefs->OnChanged.AddListener(berry::MessageDelegate1(this, &QmitkFunctionality::OnPreferencesChanged)); // REGISTER FOR WORKBENCH SELECTION EVENTS m_BlueBerrySelectionListener.reset(new berry::SelectionChangedAdapter( this, &QmitkFunctionality::BlueBerrySelectionChanged) ); this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->AddPostSelectionListener( /*"org.mitk.views.datamanager",*/ m_BlueBerrySelectionListener.data()); // REGISTER A SELECTION PROVIDER QmitkFunctionalitySelectionProvider::Pointer _SelectionProvider( new QmitkFunctionalitySelectionProvider(this)); m_SelectionProvider = _SelectionProvider.GetPointer(); this->GetSite()->SetSelectionProvider(berry::ISelectionProvider::Pointer(m_SelectionProvider)); // EMULATE INITIAL SELECTION EVENTS - // by default a a multi widget is always available - this->StdMultiWidgetAvailable(*this->GetActiveStdMultiWidget()); + // by default a multi widget is always available + this->MultiWidgetAvailable(*this->GetActiveMultiWidget()); // send datamanager selection this->OnSelectionChanged(this->GetDataManagerSelection()); // send preferences changed event this->OnPreferencesChanged(this->GetPreferences().Cast().GetPointer()); } void QmitkFunctionality::ClosePart() { } void QmitkFunctionality::ClosePartProxy() { this->GetDefaultDataStorage()->AddNodeEvent.RemoveListener( mitk::MessageDelegate1 ( this, &QmitkFunctionality::NodeAddedProxy ) ); this->GetDefaultDataStorage()->RemoveNodeEvent.RemoveListener( mitk::MessageDelegate1 ( this, &QmitkFunctionality::NodeRemovedProxy) ); this->GetDefaultDataStorage()->ChangedNodeEvent.RemoveListener( mitk::MessageDelegate1 ( this, &QmitkFunctionality::NodeChangedProxy ) ); berry::IBerryPreferences::Pointer prefs = this->GetPreferences().Cast(); if(prefs.IsNotNull()) { prefs->OnChanged.RemoveListener(berry::MessageDelegate1(this, &QmitkFunctionality::OnPreferencesChanged)); // flush the preferences here (disabled, everyone should flush them by themselves at the right moment) // prefs->Flush(); } // REMOVE SELECTION PROVIDER this->GetSite()->SetSelectionProvider(berry::ISelectionProvider::Pointer(nullptr)); berry::ISelectionService* s = GetSite()->GetWorkbenchWindow()->GetSelectionService(); if(s) { s->RemovePostSelectionListener(m_BlueBerrySelectionListener.data()); } this->ClosePart(); } QmitkFunctionality::~QmitkFunctionality() { this->Register(); this->ClosePartProxy(); this->UnRegister(false); m_DataStorageServiceTracker.close(); } void QmitkFunctionality::OnPreferencesChanged( const berry::IBerryPreferences* ) { } void QmitkFunctionality::BlueBerrySelectionChanged(const berry::IWorkbenchPart::Pointer& sourcepart, const berry::ISelection::ConstPointer& selection) { if(sourcepart.IsNull() || sourcepart->GetSite()->GetId() != "org.mitk.views.datamanager") return; mitk::DataNodeSelection::ConstPointer _DataNodeSelection = selection.Cast(); this->OnSelectionChanged(this->DataNodeSelectionToVector(_DataNodeSelection)); } bool QmitkFunctionality::IsVisible() const { return m_Visible; } void QmitkFunctionality::SetFocus() { } void QmitkFunctionality::Activated() { } void QmitkFunctionality::Deactivated() { } -void QmitkFunctionality::StdMultiWidgetAvailable( QmitkStdMultiWidget& /*stdMultiWidget*/ ) +void QmitkFunctionality::MultiWidgetAvailable( QmitkAbstractMultiWidget& /*multiWidget*/ ) { } -void QmitkFunctionality::StdMultiWidgetNotAvailable() +void QmitkFunctionality::MultiWidgetNotAvailable() { } void QmitkFunctionality::DataStorageChanged() { } -QmitkStdMultiWidget* QmitkFunctionality::GetActiveStdMultiWidget( bool reCreateWidget ) +QmitkAbstractMultiWidget* QmitkFunctionality::GetActiveMultiWidget( bool reCreateWidget ) { - QmitkStdMultiWidget* activeStdMultiWidget = 0; + QmitkAbstractMultiWidget* activeMultiWidget = nullptr; berry::IEditorPart::Pointer editor = this->GetSite()->GetPage()->GetActiveEditor(); if (reCreateWidget || editor.Cast().IsNull() ) { mitk::DataStorageEditorInput::Pointer editorInput( new mitk::DataStorageEditorInput( this->GetDataStorageReference() )); // open a new multi-widget editor, but do not give it the focus berry::IEditorPart::Pointer editor = this->GetSite()->GetPage()->OpenEditor(editorInput, QmitkStdMultiWidgetEditor::EDITOR_ID, false, berry::IWorkbenchPage::MATCH_ID); - activeStdMultiWidget = editor.Cast()->GetStdMultiWidget(); + activeMultiWidget = editor.Cast()->GetMultiWidget(); } else if (editor.Cast().IsNotNull()) { - activeStdMultiWidget = editor.Cast()->GetStdMultiWidget(); + activeMultiWidget = editor.Cast()->GetMultiWidget(); } - return activeStdMultiWidget; + return activeMultiWidget; } void QmitkFunctionality::HandleException( const char* str, QWidget* parent, bool showDialog ) const { //itkGenericOutputMacro( << "Exception caught: " << str ); MITK_ERROR << str; if ( showDialog ) { QMessageBox::critical ( parent, "Exception caught!", str ); } } void QmitkFunctionality::HandleException( std::exception& e, QWidget* parent, bool showDialog ) const { HandleException( e.what(), parent, showDialog ); } -void QmitkFunctionality::StdMultiWidgetClosed( QmitkStdMultiWidget& /*stdMultiWidget*/ ) +void QmitkFunctionality::MultiWidgetClosed( QmitkAbstractMultiWidget& /*multiWidget*/ ) { } void QmitkFunctionality::WaitCursorOn() { QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) ); } void QmitkFunctionality::BusyCursorOn() { QApplication::setOverrideCursor( QCursor(Qt::BusyCursor) ); } void QmitkFunctionality::WaitCursorOff() { this->RestoreOverrideCursor(); } void QmitkFunctionality::BusyCursorOff() { this->RestoreOverrideCursor(); } void QmitkFunctionality::RestoreOverrideCursor() { QApplication::restoreOverrideCursor(); } berry::IPreferences::Pointer QmitkFunctionality::GetPreferences() const { berry::IPreferencesService* prefService = berry::Platform::GetPreferencesService(); // const_cast workaround for bad programming: const uncorrectness this->GetViewSite() should be const QString id = "/" + (const_cast(this))->GetViewSite()->GetId(); return prefService != nullptr ? prefService->GetSystemPreferences()->Node(id): berry::IPreferences::Pointer(0); } void QmitkFunctionality::Visible() { } void QmitkFunctionality::Hidden() { } bool QmitkFunctionality::IsExclusiveFunctionality() const { return true; } void QmitkFunctionality::SetVisible( bool visible ) { m_Visible = visible; } void QmitkFunctionality::SetActivated( bool activated ) { m_Active = activated; } bool QmitkFunctionality::IsActivated() const { return m_Active; } diff --git a/Plugins/org.mitk.gui.qt.common.legacy/src/QmitkFunctionality.h b/Plugins/org.mitk.gui.qt.common.legacy/src/QmitkFunctionality.h index 7e46c84b1a..18ab39e588 100755 --- a/Plugins/org.mitk.gui.qt.common.legacy/src/QmitkFunctionality.h +++ b/Plugins/org.mitk.gui.qt.common.legacy/src/QmitkFunctionality.h @@ -1,400 +1,400 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QMITKFUNCTIONALITY_H_ #define QMITKFUNCTIONALITY_H_ //# blueberry stuff #include #include #include #include //# mitk stuff #include #include "mitkDataNodeSelection.h" #include #include #include -#include +#include // CTK Includes #include //# forward declarations namespace mitk { class DataNode; struct IDataStorageService; } namespace berry { struct IBerryPreferences; } class QmitkFunctionalitySelectionProvider; /// /// \ingroup org_mitk_gui_qt_common_legacy /// /// \class QmitkFunctionality /// /// \brief The base class of all MITK related blueberry views (~ in the old version of MITK, this was called "Functionality") /// /// QmitkFunctionality provides several convenience methods that eases the introduction of a new view: /// ///
    ///
  1. Access to the DataStorage (~ the shared data repository) -///
  2. Access to the StdMultiWidget (the 2x2 RenderWindow arrangement) +///
  3. Access to the MultiWidget ///
  4. Access to and update notification for the functionality/view preferences ///
  5. Access to and update notification for the current DataNode selection / to DataNode selection events send through the SelectionService ///
  6. Methods to send DataNode selections through the SelectionService ///
  7. Some events for unproblematic inter-View communication (e.g. when to add/remove interactors) ///
  8. Some minor important convenience methods (like changing the mouse cursor/exception handling) ///
/// /// Please use the Activated/Deactivated method to add/remove interactors, disabling multiwidget crosshair or anything which may /// "affect" other functionalities. For further reading please have a look at QmitkFunctionality::IsExclusiveFunctionality(). /// class MITK_QT_COMMON_LEGACY QmitkFunctionality : public berry::QtViewPart { //# public virtual methods which can be overwritten public: /// /// Creates smartpointer typedefs /// berryObjectMacro(QmitkFunctionality); /// /// Nothing to do in the standard ctor. Initiliaze your GUI in CreateQtPartControl(QWidget*) /// \see berry::QtViewPart::CreateQtPartControl(QWidget*) /// QmitkFunctionality(); /// /// Disconnects all standard event listeners /// virtual ~QmitkFunctionality(); /// /// Called, when the WorkbenchPart gets closed /// by the user directly or by closing the whole /// app (e.g. for removing event listeners) /// virtual void ClosePart(); /// /// Called when the selection in the workbench changed /// virtual void OnSelectionChanged(std::vector /*nodes*/); /// /// Called when the preferences object of this view changed. /// \see GetPreferences() /// virtual void OnPreferencesChanged(const berry::IBerryPreferences*); /// /// Make this view manage multiple DataStorage. If set to true GetDataStorage() /// will return the currently active DataStorage (and not the default one). /// \see GetDataStorage() /// void SetHandleMultipleDataStorages(bool multiple); /// /// \return true if this view handles multiple DataStorages, false otherwise /// bool HandlesMultipleDataStorages() const; /// - /// Called when a StdMultiWidget is available. Should not be used anymore, see GetActiveStdMultiWidget() - /// \see GetActiveStdMultiWidget() + /// Called when a MultiWidget is available. Should not be used anymore, see GetActiveMultiWidget() + /// \see GetActiveMultiWidget() /// - virtual void StdMultiWidgetAvailable(QmitkStdMultiWidget& stdMultiWidget); + virtual void MultiWidgetAvailable(QmitkAbstractMultiWidget& multiWidget); /// - /// Called when a StdMultiWidget is available. Should not be used anymore, see GetActiveStdMultiWidget() - /// \see GetActiveStdMultiWidget() + /// Called when a MultiWidget is available. Should not be used anymore, see GetActiveMultiWidget() + /// \see GetActiveMultiWidget() /// - virtual void StdMultiWidgetClosed(QmitkStdMultiWidget& stdMultiWidget); + virtual void MultiWidgetClosed(QmitkAbstractMultiWidget& multiWidget); /// - /// Called when no StdMultiWidget is available anymore. Should not be used anymore, see GetActiveStdMultiWidget() - /// \see GetActiveStdMultiWidget() + /// Called when no MultiWidget is available anymore. Should not be used anymore, see GetActiveMultiWidget() + /// \see GetActiveMultiWidget() /// - virtual void StdMultiWidgetNotAvailable(); + virtual void MultiWidgetNotAvailable(); /// /// Only called when IsExclusiveFunctionality() returns true. /// \see IsExclusiveFunctionality() /// virtual void Activated(); /// /// \return true if this view is currently activated, false otherwise /// bool IsActivated() const; /// /// Only called when IsExclusiveFunctionality() returns true. /// \see IsExclusiveFunctionality() /// virtual void Deactivated(); /// - /// Some functionalities need to add special interactors, removes the crosshair from the stdmultiwidget, etc. + /// Some functionalities need to add special interactors, removes the crosshair from the multiwidget, etc. /// In this case the functionality has to tidy up when changing to another functionality /// which also wants to change the "default configuration". In the old Qt3-based /// version of MITK, two functionalities could never be opened at the same time so that the /// methods Activated() and Deactivated() were the right place for the functionalitites to /// add/remove their interactors, etc. This is still true for the new MITK Workbench, /// but as there can be several functionalities visible at the same time, the behaviour concerning /// when Activated() and Deactivated() are called has changed: /// /// 1. Activated() and Deactivated() are only called if IsExclusiveFunctionality() returns true /// /// 2. If only one standalone functionality is or becomes visible, Activated() will be called on that functionality /// /// 3. If two or more standalone functionalities are visible, /// Activated() will be called on the functionality that receives focus, Deactivated() will be called /// on the one that looses focus, gets hidden or closed /// /// /// As a consequence of 1. if you overwrite IsExclusiveFunctionality() and let it return false, you /// signalize the MITK Workbench that this functionality does nothing to the "default configuration" /// and can easily be visible while other functionalities are also visible. /// /// By default the method returns true. /// /// \return true if this functionality is meant to work as a standalone view, false otherwise /// virtual bool IsExclusiveFunctionality() const; /// /// Informs other parts of the workbench that node is selected via the blueberry selection service. /// void FireNodeSelected(mitk::DataNode* node); /// /// Informs other parts of the workbench that the nodes are selected via the blueberry selection service. /// void FireNodesSelected(std::vector nodes); /// /// Called when this functionality becomes visible ( no matter what IsExclusiveFunctionality() returns ) /// virtual void Visible(); /// /// \return true if this view is currently visible, false otherwise /// bool IsVisible() const; /// /// Called when this functionality is hidden ( no matter what IsExclusiveFunctionality() returns ) /// virtual void Hidden(); //# protected virtual methods which can be overwritten protected: /// /// Called when a DataStorage Add event was thrown. May be reimplemented /// by deriving classes. /// virtual void NodeAdded(const mitk::DataNode* node); /// /// Called when a DataStorage Changed event was thrown. May be reimplemented /// by deriving classes. /// virtual void NodeChanged(const mitk::DataNode* /*node*/); /// /// Called when a DataStorage Remove event was thrown. May be reimplemented /// by deriving classes. /// virtual void NodeRemoved(const mitk::DataNode* node); /// /// Called when a DataStorage add *or* remove *or* change event was thrown. May be reimplemented /// by deriving classes. /// virtual void DataStorageChanged(); /// /// \return the selection of the currently active part of the workbench or an empty vector /// if nothing is selected /// std::vector GetCurrentSelection() const; /// /// Returns the current selection made in the datamanager bundle or an empty vector /// if nothing`s selected or if the bundle does not exist /// std::vector GetDataManagerSelection() const; /// /// Returns the Preferences object for this Functionality. /// Important: When refering to this preferences, e.g. in a PreferencePage: The ID /// for this preferences object is "/", e.g. "/org.mitk.views.datamanager" /// berry::IPreferences::Pointer GetPreferences() const; /// /// Returns the default or the currently active DataStorage if m_HandlesMultipleDataStorages /// is set to true /// \see SetHandleMultipleDataStorages(bool) /// \see HandlesMultipleDataStorages() /// mitk::DataStorage::Pointer GetDataStorage() const; /// /// \return always returns the default DataStorage /// mitk::DataStorage::Pointer GetDefaultDataStorage() const; mitk::IDataStorageReference::Pointer GetDataStorageReference() const; /// - /// Returns the default and active StdMultiWidget. - /// \param reCreateWidget a boolean flag to en-/disable the attept to re-create the StdWidget - /// If there is not StdMultiWidget yet a new one is + /// Returns the default and active MultiWidget. + /// \param reCreateWidget a boolean flag to en-/disable the attempt to re-create the StdWidget + /// If there is not MultiWidget yet a new one is /// created in this method when called with default parameter! /// - QmitkStdMultiWidget* GetActiveStdMultiWidget( bool reCreateWidget = true); + QmitkAbstractMultiWidget* GetActiveMultiWidget( bool reCreateWidget = true); /// /// Outputs an error message to the console and displays a message box containing /// the exception description. /// \param e the exception which should be handled /// \param showDialog controls, whether additionally a message box should be /// displayed to inform the user that something went wrong /// void HandleException( std::exception& e, QWidget* parent = nullptr, bool showDialog = true ) const; /// /// Calls HandleException ( std::exception&, QWidget*, bool ) internally /// \see HandleException ( std::exception&, QWidget*, bool ) /// void HandleException( const char* str, QWidget* parent = nullptr, bool showDialog = true ) const; /// /// Convenient method to set and reset a wait cursor ("hourglass") /// void WaitCursorOn(); /// /// Convenient method to restore the standard cursor /// void WaitCursorOff(); /// /// Convenient method to set and reset a busy cursor /// void BusyCursorOn(); /// /// Convenient method to restore the standard cursor /// void BusyCursorOff(); /// /// Convenient method to restore the standard cursor /// void RestoreOverrideCursor(); //# other public methods which should not be overwritten public: /// /// Creates a scroll area for this view and calls CreateQtPartControl then /// void CreatePartControl(QWidget* parent) override; /// /// Called when this view receives the focus. Same as Activated() /// \see Activated() /// void SetFocus() override; /// /// Called when a DataStorage Add Event was thrown. Sets /// m_InDataStorageChanged to true and calls NodeAdded afterwards. /// \see m_InDataStorageChanged /// void NodeAddedProxy(const mitk::DataNode* node); /// /// Called when a DataStorage remove event was thrown. Sets /// m_InDataStorageChanged to true and calls NodeRemoved afterwards. /// \see m_InDataStorageChanged /// void NodeRemovedProxy(const mitk::DataNode* node); /// /// Called when a DataStorage changed event was thrown. Sets /// m_InDataStorageChanged to true and calls NodeChanged afterwards. /// \see m_InDataStorageChanged /// void NodeChangedProxy(const mitk::DataNode* node); /// /// Toggles the visible flag m_Visible /// void SetVisible(bool visible); /// /// Toggles the activated flag m_Activated /// void SetActivated(bool activated); /// /// Called, when the WorkbenchPart gets closed for removing event listeners /// Internally this method calls ClosePart after it removed the listeners registered /// by QmitkFunctionality. By having this proxy method the user does not have to /// call QmitkFunctionality::ClosePart() when overwriting ClosePart() /// void ClosePartProxy(); //# other protected methods which should not be overwritten (or which are deprecated) protected: /// /// Called immediately after CreateQtPartControl(). /// Here standard event listeners for a QmitkFunctionality are registered /// void AfterCreateQtPartControl(); /// /// code to activate the last visible functionality /// void ActivateLastVisibleFunctionality(); /// /// reactions to selection events from data manager (and potential other senders) /// void BlueBerrySelectionChanged(const berry::IWorkbenchPart::Pointer& sourcepart, const berry::ISelection::ConstPointer& selection); /// /// Converts a mitk::DataNodeSelection to a std::vector (possibly empty /// std::vector DataNodeSelectionToVector(mitk::DataNodeSelection::ConstPointer currentSelection) const; //# protected fields protected: /// /// helper stuff to observe BlueBerry selections /// friend struct berry::SelectionChangedAdapter; /// /// Saves the parent of this view (this is the scrollarea created in CreatePartControl(QWidget*) /// \see CreatePartControl(QWidget*) /// QWidget* m_Parent; /// /// Saves if this view is the currently active one. /// bool m_Active; /// /// Saves if this view is visible /// bool m_Visible; //# private fields: private: /// /// Holds the current selection (selection made by this Functionality !!!) /// QmitkFunctionalitySelectionProvider* m_SelectionProvider; /// /// object to observe BlueBerry selections /// QScopedPointer m_BlueBerrySelectionListener; ctkServiceTracker m_DataStorageServiceTracker; /// /// Saves if this view handles multiple datastorages /// bool m_HandlesMultipleDataStorages; /// /// Saves if this class is currently working on DataStorage changes. /// This is a protector variable to avoid recursive calls on event listener functions. bool m_InDataStorageChanged; /// /// saves all visible functionalities /// std::set m_VisibleFunctionalities; }; #endif /*QMITKFUNCTIONALITY_H_*/ diff --git a/Plugins/org.mitk.gui.qt.common.legacy/src/QmitkFunctionalityCoordinator.cpp b/Plugins/org.mitk.gui.qt.common.legacy/src/QmitkFunctionalityCoordinator.cpp index 0386f218c4..4a234f93a1 100644 --- a/Plugins/org.mitk.gui.qt.common.legacy/src/QmitkFunctionalityCoordinator.cpp +++ b/Plugins/org.mitk.gui.qt.common.legacy/src/QmitkFunctionalityCoordinator.cpp @@ -1,220 +1,220 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkFunctionalityCoordinator.h" #include "QmitkFunctionality.h" #include #include #include #include QmitkFunctionalityCoordinator::QmitkFunctionalityCoordinator() : m_StandaloneFuntionality(0) { } void QmitkFunctionalityCoordinator::Start() { berry::PlatformUI::GetWorkbench()->AddWindowListener(this); QList wnds(berry::PlatformUI::GetWorkbench()->GetWorkbenchWindows()); for (auto i = wnds.begin(); i != wnds.end(); ++i) { (*i)->GetPartService()->AddPartListener(this); } } void QmitkFunctionalityCoordinator::Stop() { if (!berry::PlatformUI::IsWorkbenchRunning()) return; berry::PlatformUI::GetWorkbench()->RemoveWindowListener(this); QList wnds(berry::PlatformUI::GetWorkbench()->GetWorkbenchWindows()); for (auto i = wnds.begin(); i != wnds.end(); ++i) { (*i)->GetPartService()->RemovePartListener(this); } } QmitkFunctionalityCoordinator::~QmitkFunctionalityCoordinator() { } berry::IPartListener::Events::Types QmitkFunctionalityCoordinator::GetPartEventTypes() const { return berry::IPartListener::Events::ACTIVATED | berry::IPartListener::Events::DEACTIVATED | berry::IPartListener::Events::CLOSED | berry::IPartListener::Events::HIDDEN | berry::IPartListener::Events::VISIBLE | berry::IPartListener::Events::OPENED; } void QmitkFunctionalityCoordinator::PartActivated( const berry::IWorkbenchPartReference::Pointer& partRef ) { // change the active standalone functionality this->ActivateStandaloneFunctionality(partRef.GetPointer()); } void QmitkFunctionalityCoordinator::PartDeactivated( const berry::IWorkbenchPartReference::Pointer& /*partRef*/ ) { // nothing to do here: see PartActivated() } void QmitkFunctionalityCoordinator::PartOpened( const berry::IWorkbenchPartReference::Pointer& partRef ) { // check for multiwidget and inform views that it is available now if ( partRef->GetId() == QmitkStdMultiWidgetEditor::EDITOR_ID ) { for (std::set::iterator it = m_Functionalities.begin() ; it != m_Functionalities.end(); it++) { - (*it)->StdMultiWidgetAvailable(*(partRef - ->GetPart(false).Cast()->GetStdMultiWidget())); + (*it)->MultiWidgetAvailable(*(partRef + ->GetPart(false).Cast()->GetMultiWidget())); } } else { // Check for QmitkFunctionality QmitkFunctionality::Pointer _QmitkFunctionality = partRef->GetPart(false).Cast(); if(_QmitkFunctionality.IsNotNull()) { m_Functionalities.insert(_QmitkFunctionality.GetPointer()); // save as opened functionality } } } void QmitkFunctionalityCoordinator::PartClosed( const berry::IWorkbenchPartReference::Pointer& partRef ) { // check for multiwidget and inform views that it not available any more if ( partRef->GetId() == QmitkStdMultiWidgetEditor::EDITOR_ID ) { QmitkStdMultiWidgetEditor::Pointer stdMultiWidgetEditor = partRef->GetPart(false).Cast(); for (std::set::iterator it = m_Functionalities.begin() ; it != m_Functionalities.end(); it++) { - (*it)->StdMultiWidgetClosed(*(stdMultiWidgetEditor->GetStdMultiWidget())); - (*it)->StdMultiWidgetNotAvailable(); // deprecated call, provided for consistence + (*it)->MultiWidgetClosed(*(stdMultiWidgetEditor->GetMultiWidget())); + (*it)->MultiWidgetNotAvailable(); // deprecated call, provided for consistence } } else { // check for functionality QmitkFunctionality::Pointer _QmitkFunctionality = partRef->GetPart(false).Cast(); if(_QmitkFunctionality.IsNotNull()) { // deactivate on close ( the standalone functionality may still be activated ) this->DeactivateStandaloneFunctionality(partRef.GetPointer(), 0); // and set pointer to 0 if(m_StandaloneFuntionality == partRef.GetPointer()) m_StandaloneFuntionality = 0; m_Functionalities.erase(_QmitkFunctionality.GetPointer()); // remove as opened functionality // call PartClosed on the QmitkFunctionality _QmitkFunctionality->ClosePartProxy(); //m_VisibleStandaloneFunctionalities.erase(_QmitkFunctionality.GetPointer()); // remove if necessary (should be done before in PartHidden() } } } void QmitkFunctionalityCoordinator::PartHidden( const berry::IWorkbenchPartReference::Pointer& partRef ) { // Check for QmitkFunctionality QmitkFunctionality::Pointer _QmitkFunctionality = partRef->GetPart(false).Cast(); if(_QmitkFunctionality != 0) { _QmitkFunctionality->SetVisible(false); _QmitkFunctionality->Hidden(); // tracking of Visible Standalone Functionalities m_VisibleStandaloneFunctionalities.erase(partRef.GetPointer()); // activate Functionality if just one Standalone Functionality is visible if( m_VisibleStandaloneFunctionalities.size() == 1 ) this->ActivateStandaloneFunctionality( *m_VisibleStandaloneFunctionalities.begin() ); } } void QmitkFunctionalityCoordinator::PartVisible( const berry::IWorkbenchPartReference::Pointer& partRef ) { // Check for QmitkFunctionality QmitkFunctionality::Pointer _QmitkFunctionality = partRef->GetPart(false).Cast(); if(_QmitkFunctionality.IsNotNull()) { _QmitkFunctionality->SetVisible(true); _QmitkFunctionality->Visible(); // tracking of Visible Standalone Functionalities if( _QmitkFunctionality->IsExclusiveFunctionality() ) { m_VisibleStandaloneFunctionalities.insert(partRef.GetPointer()); // activate Functionality if just one Standalone Functionality is visible if( m_VisibleStandaloneFunctionalities.size() == 1 ) this->ActivateStandaloneFunctionality( *m_VisibleStandaloneFunctionalities.begin() ); } } } void QmitkFunctionalityCoordinator::ActivateStandaloneFunctionality( berry::IWorkbenchPartReference* partRef ) { QmitkFunctionality* functionality = dynamic_cast(partRef->GetPart(false).GetPointer()); if( functionality && !functionality->IsActivated() && functionality->IsExclusiveFunctionality() ) { MITK_INFO << "**** Activating legacy standalone functionality"; // deactivate old one if necessary this->DeactivateStandaloneFunctionality(m_StandaloneFuntionality, partRef); m_StandaloneFuntionality = partRef; MITK_INFO << "setting active flag"; // call activated on this functionality functionality->SetActivated(true); functionality->Activated(); } else if (dynamic_cast(partRef->GetPart(false).GetPointer()) && m_StandaloneFuntionality != partRef) { this->DeactivateStandaloneFunctionality(m_StandaloneFuntionality, partRef); m_StandaloneFuntionality = partRef; } } void QmitkFunctionalityCoordinator::DeactivateStandaloneFunctionality(berry::IWorkbenchPartReference* partRef, berry::IWorkbenchPartReference* newRef) { if (partRef == 0) return; QmitkFunctionality* functionality = dynamic_cast(partRef->GetPart(false).GetPointer()); if(functionality && functionality->IsActivated()) { functionality->SetActivated(false); functionality->Deactivated(); } else if (mitk::IZombieViewPart* zombie = dynamic_cast(partRef->GetPart(false).GetPointer())) { zombie->ActivatedZombieView(berry::IWorkbenchPartReference::Pointer(newRef)); } } void QmitkFunctionalityCoordinator::WindowClosed(const berry::IWorkbenchWindow::Pointer& /*window*/ ) { } void QmitkFunctionalityCoordinator::WindowOpened(const berry::IWorkbenchWindow::Pointer& window ) { window->GetPartService()->AddPartListener(this); } diff --git a/Plugins/org.mitk.gui.qt.common/src/QmitkAbstractMultiWidgetEditor.h b/Plugins/org.mitk.gui.qt.common/src/QmitkAbstractMultiWidgetEditor.h index 355e2b87d3..1d2bee65ca 100644 --- a/Plugins/org.mitk.gui.qt.common/src/QmitkAbstractMultiWidgetEditor.h +++ b/Plugins/org.mitk.gui.qt.common/src/QmitkAbstractMultiWidgetEditor.h @@ -1,136 +1,139 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QMITKABSTRACTMULTIWIDGETEDITOR_H #define QMITKABSTRACTMULTIWIDGETEDITOR_H #include // org mitk gui qt common plugin #include // mitk core #include // berry #include // c++ #include class QmitkAbstractMultiWidget; +class QmitkLevelWindowWidget; class MITK_QT_COMMON QmitkAbstractMultiWidgetEditor : public QmitkAbstractRenderEditor, public berry::IPartListener { Q_OBJECT public: berryObjectMacro(QmitkAbstractMultiWidgetEditor, QmitkAbstractRenderEditor, IPartListener) static const QString EDITOR_ID; QmitkAbstractMultiWidgetEditor(); virtual ~QmitkAbstractMultiWidgetEditor() override; /** * @brief Overridden from QmitkAbstractRenderEditor : IRenderWindowPart */ virtual QmitkRenderWindow* GetActiveQmitkRenderWindow() const override; /** * @brief Overridden from QmitkAbstractRenderEditor : IRenderWindowPart */ virtual QHash GetQmitkRenderWindows() const override; /** * @brief Overridden from QmitkAbstractRenderEditor : IRenderWindowPart */ virtual QmitkRenderWindow* GetQmitkRenderWindow(const QString& id) const override; /** * @brief Overridden from QmitkAbstractRenderEditor : IRenderWindowPart */ virtual mitk::Point3D GetSelectedPosition(const QString& id = QString()) const override; /** * @brief Overridden from QmitkAbstractRenderEditor : IRenderWindowPart */ virtual void SetSelectedPosition(const mitk::Point3D& pos, const QString& id = QString()) override; /** * @brief Overridden from QmitkAbstractRenderEditor : IRenderWindowPart */ virtual void EnableDecorations(bool enable, const QStringList& decorations = QStringList()) override; /** * @brief Overridden from QmitkAbstractRenderEditor : IRenderWindowPart */ virtual bool IsDecorationEnabled(const QString& decoration) const override; /** * @brief Overridden from QmitkAbstractRenderEditor : IRenderWindowPart */ virtual QStringList GetDecorations() const override; /** * @brief Overridden from berry::IPartListener */ virtual berry::IPartListener::Events::Types GetPartEventTypes() const override; /** * @brief Overridden from berry::IPartListener */ virtual void PartOpened(const berry::IWorkbenchPartReference::Pointer& partRef) override; /** * @brief Overridden from berry::IPartListener */ virtual void PartClosed(const berry::IWorkbenchPartReference::Pointer& partRef) override; /** * @brief Retrieve a QmitkRenderWindow by it's index. */ virtual QmitkRenderWindow* GetQmitkRenderWindowByIndex(int index) const; /** * @brief Retrieve a QmitkRenderWindow by the row and column position. */ virtual QmitkRenderWindow* GetQmitkRenderWindowByIndex(int row, int column) const; /** * @brief Set the current multi widget of this editor. */ virtual void SetMultiWidget(QmitkAbstractMultiWidget* multiWidget); /** * @brief Return the current multi widget of this editor. */ virtual QmitkAbstractMultiWidget* GetMultiWidget() const; /** * @brief Return the number of rows of the underlying multi widget. */ virtual int GetRowCount() const; /** * @brief Return the number of columns of the underlying multi widget. */ virtual int GetColumnCount() const; + virtual QmitkLevelWindowWidget GetLevelWindowWidget() const = 0; + public Q_SLOTS: /** * @brief A slot that can be called if the layout has been changed. * This function will call the function 'SetLayout' of the multi widget where * custom behavior can be implemented. * Finally 'FirePropertyChange' is called to inform the workbench about an input change. */ virtual void OnLayoutSet(int row, int column); virtual void OnSynchronize(bool synchronized); virtual void OnInteractionSchemeChanged(mitk::InteractionSchemeSwitcher::InteractionScheme scheme); private: struct Impl; std::unique_ptr m_Impl; }; #endif // QMITKABSTRACTMULTIWIDGETEDITOR_H diff --git a/Plugins/org.mitk.gui.qt.stdmultiwidgeteditor/src/QmitkStdMultiWidgetEditor.cpp b/Plugins/org.mitk.gui.qt.stdmultiwidgeteditor/src/QmitkStdMultiWidgetEditor.cpp index 5504695e80..e74ee05ea4 100644 --- a/Plugins/org.mitk.gui.qt.stdmultiwidgeteditor/src/QmitkStdMultiWidgetEditor.cpp +++ b/Plugins/org.mitk.gui.qt.stdmultiwidgeteditor/src/QmitkStdMultiWidgetEditor.cpp @@ -1,557 +1,404 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkStdMultiWidgetEditor.h" #include #include #include -#include #include -#include - #include #include #include #include #include -#include +// mitk qt widgets module +#include +#include +#include #include -class QmitkStdMultiWidgetEditorPrivate -{ -public: - - QmitkStdMultiWidgetEditorPrivate(); - ~QmitkStdMultiWidgetEditorPrivate(); - - QmitkStdMultiWidget* m_StdMultiWidget; - QmitkMouseModeSwitcher* m_MouseModeToolbar; - /** - * @brief Members for the MultiWidget decorations. - */ - QString m_WidgetBackgroundColor1[4]; - QString m_WidgetBackgroundColor2[4]; - QString m_WidgetDecorationColor[4]; - QString m_WidgetAnnotation[4]; - bool m_MenuWidgetsEnabled; - QScopedPointer m_PartListener; - - QHash m_RenderWindows; +// mitk gui qt common plugin +#include -}; +const QString QmitkStdMultiWidgetEditor::EDITOR_ID = "org.mitk.editors.stdmultiwidget"; -struct QmitkStdMultiWidgetPartListener : public berry::IPartListener +struct QmitkStdMultiWidgetEditor::Impl final { - QmitkStdMultiWidgetPartListener(QmitkStdMultiWidgetEditorPrivate* dd) - : d(dd) - {} - - Events::Types GetPartEventTypes() const override - { - return Events::CLOSED | Events::HIDDEN | Events::VISIBLE | Events::OPENED; - } - - void PartClosed(const berry::IWorkbenchPartReference::Pointer& partRef) override - { - if (partRef->GetId() == QmitkStdMultiWidgetEditor::EDITOR_ID) - { - QmitkStdMultiWidgetEditor::Pointer stdMultiWidgetEditor = partRef->GetPart(false).Cast(); - - if (d->m_StdMultiWidget == stdMultiWidgetEditor->GetStdMultiWidget()) - { - d->m_StdMultiWidget->RemovePlanesFromDataStorage(); - stdMultiWidgetEditor->RequestActivateMenuWidget(false); - } - } - } - - void PartHidden(const berry::IWorkbenchPartReference::Pointer& partRef) override - { - if (partRef->GetId() == QmitkStdMultiWidgetEditor::EDITOR_ID) - { - QmitkStdMultiWidgetEditor::Pointer stdMultiWidgetEditor = partRef->GetPart(false).Cast(); + Impl(); + ~Impl() = default; - if (d->m_StdMultiWidget == stdMultiWidgetEditor->GetStdMultiWidget()) - { - stdMultiWidgetEditor->RequestActivateMenuWidget(false); - } - } - } - - void PartVisible(const berry::IWorkbenchPartReference::Pointer& partRef) override - { - if (partRef->GetId() == QmitkStdMultiWidgetEditor::EDITOR_ID) - { - QmitkStdMultiWidgetEditor::Pointer stdMultiWidgetEditor = partRef->GetPart(false).Cast(); - - if (d->m_StdMultiWidget == stdMultiWidgetEditor->GetStdMultiWidget()) - { - stdMultiWidgetEditor->RequestActivateMenuWidget(true); - } - } - } - - void PartOpened(const berry::IWorkbenchPartReference::Pointer& partRef) override - { - if (partRef->GetId() == QmitkStdMultiWidgetEditor::EDITOR_ID) - { - QmitkStdMultiWidgetEditor::Pointer stdMultiWidgetEditor = partRef->GetPart(false).Cast(); - - if (d->m_StdMultiWidget == stdMultiWidgetEditor->GetStdMultiWidget()) - { - d->m_StdMultiWidget->AddPlanesToDataStorage(); - stdMultiWidgetEditor->RequestActivateMenuWidget(true); - } - } - } - -private: - - QmitkStdMultiWidgetEditorPrivate* const d; + QmitkInteractionSchemeToolBar* m_InteractionSchemeToolBar; + QmitkLevelWindowWidget* m_LevelWindowWidget; + std::unique_ptr m_MultiWidgetDecorationManager; }; -QmitkStdMultiWidgetEditorPrivate::QmitkStdMultiWidgetEditorPrivate() - : m_StdMultiWidget(nullptr), m_MouseModeToolbar(nullptr) - , m_MenuWidgetsEnabled(false) - , m_PartListener(new QmitkStdMultiWidgetPartListener(this)) -{} - -QmitkStdMultiWidgetEditorPrivate::~QmitkStdMultiWidgetEditorPrivate() +QmitkStdMultiWidgetEditor::Impl::Impl() + : m_InteractionSchemeToolBar(nullptr) + , m_LevelWindowWidget(nullptr) { } -const QString QmitkStdMultiWidgetEditor::EDITOR_ID = "org.mitk.editors.stdmultiwidget"; - +////////////////////////////////////////////////////////////////////////// +// QmitkStdMultiWidgetEditor +////////////////////////////////////////////////////////////////////////// QmitkStdMultiWidgetEditor::QmitkStdMultiWidgetEditor() - : d(new QmitkStdMultiWidgetEditorPrivate) -{ -} + : m_Impl(std::make_unique()) +{} QmitkStdMultiWidgetEditor::~QmitkStdMultiWidgetEditor() { - this->GetSite()->GetPage()->RemovePartListener(d->m_PartListener.data()); + GetSite()->GetPage()->RemovePartListener(this); } -QmitkStdMultiWidget* QmitkStdMultiWidgetEditor::GetStdMultiWidget() +berry::IPartListener::Events::Types QmitkStdMultiWidgetEditor::GetPartEventTypes() const { - return d->m_StdMultiWidget; + return Events::CLOSED | Events::OPENED | Events::HIDDEN | Events::VISIBLE; } -QmitkRenderWindow *QmitkStdMultiWidgetEditor::GetActiveQmitkRenderWindow() const +void QmitkStdMultiWidgetEditor::PartClosed(const berry::IWorkbenchPartReference::Pointer& partRef) { - if (d->m_StdMultiWidget) return d->m_StdMultiWidget->GetRenderWindow1(); - return nullptr; + if (partRef->GetId() == QmitkStdMultiWidgetEditor::EDITOR_ID) + { + const auto& multiWidget = GetMultiWidget(); + if (nullptr != multiWidget) + { + //multiWidget->RemovePlanesFromDataStorage(); + //multiWidget->ActivateRenderWindowMenu(false); + } + } } -QHash QmitkStdMultiWidgetEditor::GetQmitkRenderWindows() const +void QmitkStdMultiWidgetEditor::PartOpened(const berry::IWorkbenchPartReference::Pointer& partRef) { - return d->m_RenderWindows; + if (partRef->GetId() == QmitkStdMultiWidgetEditor::EDITOR_ID) + { + const auto& multiWidget = GetMultiWidget(); + if (nullptr != multiWidget) + { + //multiWidget->AddPlanesToDataStorage(); + //multiWidget->ActivateRenderWindowMenu(true); + } + } } -QmitkRenderWindow *QmitkStdMultiWidgetEditor::GetQmitkRenderWindow(const QString &id) const +void QmitkStdMultiWidgetEditor::PartHidden(const berry::IWorkbenchPartReference::Pointer& partRef) { - if (d->m_RenderWindows.contains(id)) - return d->m_RenderWindows[id]; - - return nullptr; + if (partRef->GetId() == QmitkStdMultiWidgetEditor::EDITOR_ID) + { + const auto& multiWidget = GetMultiWidget(); + if (nullptr != multiWidget) + { + //multiWidget->ActivateRenderWindowMenu(false); + } + } } -mitk::Point3D QmitkStdMultiWidgetEditor::GetSelectedPosition(const QString & /*id*/) const +void QmitkStdMultiWidgetEditor::PartVisible(const berry::IWorkbenchPartReference::Pointer& partRef) { - return d->m_StdMultiWidget->GetCrossPosition(); + if (partRef->GetId() == QmitkStdMultiWidgetEditor::EDITOR_ID) + { + const auto& multiWidget = GetMultiWidget(); + if (nullptr != multiWidget) + { + //multiWidget->ActivateRenderWindowMenu(true); + } + } } -void QmitkStdMultiWidgetEditor::SetSelectedPosition(const mitk::Point3D &pos, const QString &/*id*/) +QmitkLevelWindowWidget* QmitkStdMultiWidgetEditor::GetLevelWindowWidget() const { - d->m_StdMultiWidget->MoveCrossToPosition(pos); + return m_Impl->m_LevelWindowWidget; } -void QmitkStdMultiWidgetEditor::EnableDecorations(bool enable, const QStringList &decorations) +void QmitkStdMultiWidgetEditor::EnableSlicingPlanes(bool enable) { - if (decorations.isEmpty() || decorations.contains(DECORATION_BORDER)) - { - enable ? d->m_StdMultiWidget->EnableColoredRectangles() - : d->m_StdMultiWidget->DisableColoredRectangles(); - } - if (decorations.isEmpty() || decorations.contains(DECORATION_LOGO)) + const auto& multiWidget = dynamic_cast(GetMultiWidget()); + if (nullptr == multiWidget) { - enable ? d->m_StdMultiWidget->EnableDepartmentLogo() - : d->m_StdMultiWidget->DisableDepartmentLogo(); + return; } - if (decorations.isEmpty() || decorations.contains(DECORATION_MENU)) + + multiWidget->SetWidgetPlanesVisibility(enable); +} + +bool QmitkStdMultiWidgetEditor::IsSlicingPlanesEnabled() const +{ + const auto& multiWidget = dynamic_cast(GetMultiWidget()); + if (nullptr == multiWidget) { - d->m_StdMultiWidget->ActivateMenuWidget(enable); + return false; } - if (decorations.isEmpty() || decorations.contains(DECORATION_BACKGROUND)) + + mitk::DataNode::Pointer node = multiWidget->GetWidgetPlane1(); + if (node.IsNotNull()) { - enable ? d->m_StdMultiWidget->EnableGradientBackground() - : d->m_StdMultiWidget->DisableGradientBackground(); + bool visible = false; + node->GetVisibility(visible, nullptr); + return visible; } - if (decorations.isEmpty() || decorations.contains(DECORATION_CORNER_ANNOTATION)) + else { - enable ? d->m_StdMultiWidget->SetCornerAnnotationVisibility(true) - : d->m_StdMultiWidget->SetCornerAnnotationVisibility(false); + return false; } } -bool QmitkStdMultiWidgetEditor::IsDecorationEnabled(const QString &decoration) const +void QmitkStdMultiWidgetEditor::OnInteractionSchemeChanged(mitk::InteractionSchemeSwitcher::InteractionScheme scheme) { - if (decoration == DECORATION_BORDER) - { - return d->m_StdMultiWidget->IsColoredRectanglesEnabled(); - } - else if (decoration == DECORATION_LOGO) - { - return d->m_StdMultiWidget->IsColoredRectanglesEnabled(); - } - else if (decoration == DECORATION_MENU) + const auto& multiWidget = GetMultiWidget(); + if (nullptr == multiWidget) { - return d->m_StdMultiWidget->IsMenuWidgetEnabled(); + return; } - else if (decoration == DECORATION_BACKGROUND) + + if (mitk::InteractionSchemeSwitcher::PACSStandard == scheme) { - return d->m_StdMultiWidget->GetGradientBackgroundFlag(); + m_Impl->m_InteractionSchemeToolBar->setVisible(true); } - else if (decoration == DECORATION_CORNER_ANNOTATION) + else { - return d->m_StdMultiWidget->IsCornerAnnotationVisible(); + m_Impl->m_InteractionSchemeToolBar->setVisible(false); } - return false; -} - -QStringList QmitkStdMultiWidgetEditor::GetDecorations() const -{ - QStringList decorations; - decorations << DECORATION_BORDER << DECORATION_LOGO << DECORATION_MENU << DECORATION_BACKGROUND << DECORATION_CORNER_ANNOTATION; - return decorations; -} - -void QmitkStdMultiWidgetEditor::EnableSlicingPlanes(bool enable) -{ - d->m_StdMultiWidget->SetWidgetPlanesVisibility(enable); + multiWidget->SetInteractionScheme(scheme); } -bool QmitkStdMultiWidgetEditor::IsSlicingPlanesEnabled() const +void QmitkStdMultiWidgetEditor::SetFocus() { - mitk::DataNode::Pointer node = this->d->m_StdMultiWidget->GetWidgetPlane1(); - if (node.IsNotNull()) - { - bool visible = false; - node->GetVisibility(visible, nullptr); - return visible; - } - else + const auto& multiWidget = GetMultiWidget(); + if (nullptr != multiWidget) { - return false; + multiWidget->setFocus(); } } void QmitkStdMultiWidgetEditor::CreateQtPartControl(QWidget* parent) { - if (d->m_StdMultiWidget == nullptr) + QHBoxLayout* layout = new QHBoxLayout(parent); + layout->setContentsMargins(0, 0, 0, 0); + + berry::IBerryPreferences* preferences = dynamic_cast(GetPreferences().GetPointer()); + + auto multiWidget = GetMultiWidget(); + if (nullptr == multiWidget) { - QHBoxLayout* layout = new QHBoxLayout(parent); - layout->setContentsMargins(0,0,0,0); + mitk::BaseRenderer::RenderingMode::Type renderingMode = static_cast(preferences->GetInt("Rendering Mode", 0)); + multiWidget = new QmitkStdMultiWidget(parent, 0, nullptr, renderingMode); - if (d->m_MouseModeToolbar == nullptr) + // create left toolbar: interaction scheme toolbar to switch how the render window navigation behaves (in PACS mode) + if (nullptr == m_Impl->m_InteractionSchemeToolBar) { - d->m_MouseModeToolbar = new QmitkMouseModeSwitcher(parent); // delete by Qt via parent - layout->addWidget(d->m_MouseModeToolbar); + m_Impl->m_InteractionSchemeToolBar = new QmitkInteractionSchemeToolBar(parent); + //layout->addWidget(m_Impl->m_InteractionSchemeToolBar); } + m_Impl->m_InteractionSchemeToolBar->SetInteractionEventHandler(multiWidget->GetInteractionEventHandler()); - berry::IPreferences::Pointer prefs = this->GetPreferences(); - - mitk::BaseRenderer::RenderingMode::Type renderingMode = static_cast(prefs->GetInt( "Rendering Mode" , 0 )); - - d->m_StdMultiWidget = new QmitkStdMultiWidget(parent,nullptr,nullptr,renderingMode); - d->m_RenderWindows.insert("axial", d->m_StdMultiWidget->GetRenderWindow1()); - d->m_RenderWindows.insert("sagittal", d->m_StdMultiWidget->GetRenderWindow2()); - d->m_RenderWindows.insert("coronal", d->m_StdMultiWidget->GetRenderWindow3()); - d->m_RenderWindows.insert("3d", d->m_StdMultiWidget->GetRenderWindow4()); - d->m_MouseModeToolbar->setMouseModeSwitcher( d->m_StdMultiWidget->GetMouseModeSwitcher() ); + // add center widget: the std multi widget + layout->addWidget(multiWidget); - layout->addWidget(d->m_StdMultiWidget); + multiWidget->SetDataStorage(GetDataStorage()); + multiWidget->InitializeMultiWidget(); + SetMultiWidget(multiWidget); + } - mitk::DataStorage::Pointer ds = this->GetDataStorage(); + // create level window slider on the right side + if (nullptr == m_Impl->m_LevelWindowWidget) + { + m_Impl->m_LevelWindowWidget = new QmitkLevelWindowWidget(parent); + m_Impl->m_LevelWindowWidget->setObjectName(QString::fromUtf8("levelWindowWidget")); + + QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + sizePolicy.setHeightForWidth(m_Impl->m_LevelWindowWidget->sizePolicy().hasHeightForWidth()); + m_Impl->m_LevelWindowWidget->setSizePolicy(sizePolicy); + m_Impl->m_LevelWindowWidget->setMaximumWidth(50); + } - // Tell the multiWidget which (part of) the tree to render - d->m_StdMultiWidget->SetDataStorage(ds); + /* + auto splitter = new QSplitter(parent); + splitter->addWidget(multiWidget); + splitter->addWidget(m_Impl->m_LevelWindowWidget); + //layout-> + splitter->show(); + */ - // Initialize views as axial, sagittal, coronar to all data objects in DataStorage - // (from top-left to bottom) - auto geo = ds->ComputeBoundingGeometry3D(ds->GetAll()); - mitk::RenderingManager::GetInstance()->InitializeViews(geo); - // Initialize bottom-right view as 3D view - d->m_StdMultiWidget->GetRenderWindow4()->GetRenderer()->SetMapperID( - mitk::BaseRenderer::Standard3D ); + //d->m_StdMultiWidget->EnableNavigationControllerEventListening(); - // Enable standard handler for levelwindow-slider - d->m_StdMultiWidget->EnableStandardLevelWindow(); + m_Impl->m_MultiWidgetDecorationManager = std::make_unique(multiWidget); - // Add the displayed views to the tree to see their positions - // in 2D and 3D - d->m_StdMultiWidget->AddDisplayPlaneSubTree(); + GetSite()->GetPage()->AddPartListener(this); - //d->m_StdMultiWidget->EnableNavigationControllerEventListening(); + InitializePreferences(preferences); + OnPreferencesChanged(preferences); +} - // Store the initial visibility status of the menu widget. - d->m_MenuWidgetsEnabled = d->m_StdMultiWidget->IsMenuWidgetEnabled(); +void QmitkStdMultiWidgetEditor::OnPreferencesChanged(const berry::IBerryPreferences* preferences) +{ + const auto& multiWidget = dynamic_cast(GetMultiWidget()); + if (nullptr == multiWidget) + { + return; + } - this->GetSite()->GetPage()->AddPartListener(d->m_PartListener.data()); + // change and apply decoration preferences + GetPreferenceDecorations(preferences); + m_Impl->m_MultiWidgetDecorationManager->DecorationPreferencesChanged(preferences); - berry::IBerryPreferences* berryprefs = dynamic_cast(prefs.GetPointer()); - InitializePreferences(berryprefs); - this->OnPreferencesChanged(berryprefs); + QmitkAbstractMultiWidget::RenderWindowWidgetMap renderWindowWidgets = multiWidget->GetRenderWindowWidgets(); + int i = 0; + for (const auto& renderWindowWidget : renderWindowWidgets) + { + auto decorationColor = renderWindowWidget.second->GetDecorationColor(); + multiWidget->SetDecorationColor(i, decorationColor); - this->RequestUpdate(); + ++i; } -} - -void QmitkStdMultiWidgetEditor::OnPreferencesChanged(const berry::IBerryPreferences* prefs) -{ - // Enable change of logo. If no DepartmentLogo was set explicitly, MBILogo is used. - // Set new department logo by prefs->Set("DepartmentLogo", "PathToImage"); - // If no logo was set for this plug-in specifically, walk the parent preference nodes - // and lookup a logo value there. + int crosshairgapsize = preferences->GetInt("crosshair gap size", 32); + multiWidget->GetWidgetPlane1()->SetIntProperty("Crosshair.Gap Size", crosshairgapsize); + multiWidget->GetWidgetPlane2()->SetIntProperty("Crosshair.Gap Size", crosshairgapsize); + multiWidget->GetWidgetPlane3()->SetIntProperty("Crosshair.Gap Size", crosshairgapsize); - //We need to disable the logo first, otherwise setting a new logo will have no effect due to how mitkManufacturerLogo works - d->m_StdMultiWidget->DisableDepartmentLogo(); - d->m_StdMultiWidget->SetDepartmentLogo(qPrintable(":/org.mitk.gui.qt.stdmultiwidgeteditor/defaultWatermark.png")); - d->m_StdMultiWidget->EnableDepartmentLogo(); + // zooming and panning preferences + bool constrainedZooming = preferences->GetBool("Use constrained zooming and panning", true); + mitk::RenderingManager::GetInstance()->SetConstrainedPanningZooming(constrainedZooming); - const berry::IPreferences* currentNode = prefs; + // mouse modes switcher toolbar + bool PACSInteractionScheme = preferences->GetBool("PACS like mouse interaction", false); + OnInteractionSchemeChanged(PACSInteractionScheme ? + mitk::InteractionSchemeSwitcher::PACSStandard : + mitk::InteractionSchemeSwitcher::MITKStandard); - while(currentNode) - { - bool logoFound = false; - foreach (const QString& key, currentNode->Keys()) - { - if( key == "DepartmentLogo") - { - QString departmentLogoLocation = currentNode->Get("DepartmentLogo", ""); - - if (departmentLogoLocation.isEmpty()) - { - d->m_StdMultiWidget->DisableDepartmentLogo(); - } - else - { - // we need to disable the logo first, otherwise setting a new logo will have - // no effect due to how mitkManufacturerLogo works... - d->m_StdMultiWidget->DisableDepartmentLogo(); - d->m_StdMultiWidget->SetDepartmentLogo(qPrintable(departmentLogoLocation)); - d->m_StdMultiWidget->EnableDepartmentLogo(); - } - logoFound = true; - break; - } - } + // level window setting + bool showLevelWindowWidget = preferences->GetBool("Show level/window widget", true); + ShowLevelWindowWidget(showLevelWindowWidget); - if (logoFound) break; - currentNode = currentNode->Parent().GetPointer(); - } + mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(GetDataStorage()); + mitk::RenderingManager::GetInstance()->RequestUpdateAll(); +} - //Update internal members - this->FillMembersWithCurrentDecorations(); - this->GetPreferenceDecorations(prefs); - //Now the members can be used to modify the stdmultiwidget - mitk::Color upper = HexColorToMitkColor(d->m_WidgetBackgroundColor1[0]); - mitk::Color lower = HexColorToMitkColor(d->m_WidgetBackgroundColor2[0]); - d->m_StdMultiWidget->SetGradientBackgroundColorForRenderWindow(upper, lower, 0); - upper = HexColorToMitkColor(d->m_WidgetBackgroundColor1[1]); - lower = HexColorToMitkColor(d->m_WidgetBackgroundColor2[1]); - d->m_StdMultiWidget->SetGradientBackgroundColorForRenderWindow(upper, lower, 1); - upper = HexColorToMitkColor(d->m_WidgetBackgroundColor1[2]); - lower = HexColorToMitkColor(d->m_WidgetBackgroundColor2[2]); - d->m_StdMultiWidget->SetGradientBackgroundColorForRenderWindow(upper, lower, 2); - upper = HexColorToMitkColor(d->m_WidgetBackgroundColor1[3]); - lower = HexColorToMitkColor(d->m_WidgetBackgroundColor2[3]); - d->m_StdMultiWidget->SetGradientBackgroundColorForRenderWindow(upper, lower, 3); - d->m_StdMultiWidget->EnableGradientBackground(); - - // preferences for renderWindows - mitk::Color colorDecorationWidget1 = HexColorToMitkColor(d->m_WidgetDecorationColor[0]); - mitk::Color colorDecorationWidget2 = HexColorToMitkColor(d->m_WidgetDecorationColor[1]); - mitk::Color colorDecorationWidget3 = HexColorToMitkColor(d->m_WidgetDecorationColor[2]); - mitk::Color colorDecorationWidget4 = HexColorToMitkColor(d->m_WidgetDecorationColor[3]); - d->m_StdMultiWidget->SetDecorationColor(0, colorDecorationWidget1); - d->m_StdMultiWidget->SetDecorationColor(1, colorDecorationWidget2); - d->m_StdMultiWidget->SetDecorationColor(2, colorDecorationWidget3); - d->m_StdMultiWidget->SetDecorationColor(3, colorDecorationWidget4); - - for(unsigned int i = 0; i < 4; ++i) +void QmitkStdMultiWidgetEditor::InitializePreferences(berry::IBerryPreferences * preferences) +{ + auto multiWidget = GetMultiWidget(); + if (nullptr == multiWidget) { - d->m_StdMultiWidget->SetDecorationProperties(d->m_WidgetAnnotation[i].toStdString(), - HexColorToMitkColor(d->m_WidgetDecorationColor[i]), i); + return; } - //The crosshair gap - int crosshairgapsize = prefs->GetInt("crosshair gap size", 32); - d->m_StdMultiWidget->GetWidgetPlane1()->SetIntProperty("Crosshair.Gap Size", crosshairgapsize); - d->m_StdMultiWidget->GetWidgetPlane2()->SetIntProperty("Crosshair.Gap Size", crosshairgapsize); - d->m_StdMultiWidget->GetWidgetPlane3()->SetIntProperty("Crosshair.Gap Size", crosshairgapsize); - //refresh colors of rectangles - d->m_StdMultiWidget->EnableColoredRectangles(); + GetPreferenceDecorations(preferences); //overwrite if preferences are defined - // Set preferences respecting zooming and panning - bool constrainedZooming = prefs->GetBool("Use constrained zooming and panning", true); + QmitkAbstractMultiWidget::RenderWindowWidgetMap renderWindowWidgets = multiWidget->GetRenderWindowWidgets(); + int i = 0; + for (const auto& renderWindowWidget : renderWindowWidgets) + { + QString widgetName = "widget" + QString::number(i + 1); - mitk::RenderingManager::GetInstance()->SetConstrainedPanningZooming(constrainedZooming); + auto gradientBackgroundColors = renderWindowWidget.second->GetGradientBackgroundColors(); + preferences->Put(widgetName + " first background color", MitkColorToHex(gradientBackgroundColors.first)); + preferences->Put(widgetName + " second background color", MitkColorToHex(gradientBackgroundColors.second)); - mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(this->GetDataStorage()); + auto decorationColor = renderWindowWidget.second->GetDecorationColor(); + preferences->Put(widgetName + " decoration color", MitkColorToHex(decorationColor)); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); + auto cornerAnnotation = renderWindowWidget.second->GetCornerAnnotationText(); + preferences->Put(widgetName + " corner annotation", QString::fromStdString(cornerAnnotation)); - // level window setting - bool showLevelWindowWidget = prefs->GetBool("Show level/window widget", true); - if (showLevelWindowWidget) - { - d->m_StdMultiWidget->EnableStandardLevelWindow(); + ++i; } - else +} + +void QmitkStdMultiWidgetEditor::GetPreferenceDecorations(const berry::IBerryPreferences * preferences) +{ + auto multiWidget = dynamic_cast(GetMultiWidget()); + if (nullptr == multiWidget) { - d->m_StdMultiWidget->DisableStandardLevelWindow(); + return; } - // mouse modes toolbar - bool newMode = prefs->GetBool("PACS like mouse interaction", false); - d->m_MouseModeToolbar->setVisible( newMode ); - d->m_StdMultiWidget->GetMouseModeSwitcher()->SetInteractionScheme( newMode ? mitk::MouseModeSwitcher::PACS : mitk::MouseModeSwitcher::MITK ); + QmitkAbstractMultiWidget::RenderWindowWidgetMap renderWindowWidgets = multiWidget->GetRenderWindowWidgets(); + int i = 0; + auto hexBlack = "#000000"; + for (const auto& renderWindowWidget : renderWindowWidgets) + { + QString widgetName = "widget" + QString::number(i + 1); + auto upper = preferences->Get(widgetName + " first background color", hexBlack); + auto lower = preferences->Get(widgetName + " second background color", hexBlack); + renderWindowWidget.second->SetGradientBackgroundColors(HexColorToMitkColor(upper), HexColorToMitkColor(lower)); + + auto defaultDecorationColor = multiWidget->GetDecorationColor(i); + auto decorationColor = preferences->Get(widgetName + " decoration color", MitkColorToHex(defaultDecorationColor)); + renderWindowWidget.second->SetDecorationColor(HexColorToMitkColor(decorationColor)); + + auto defaultCornerAnnotation = renderWindowWidget.second->GetCornerAnnotationText(); + auto cornerAnnotation = preferences->Get(widgetName + " corner annotation", QString::fromStdString(defaultCornerAnnotation)); + renderWindowWidget.second->SetCornerAnnotationText(cornerAnnotation.toStdString()); + + ++i; + } } mitk::Color QmitkStdMultiWidgetEditor::HexColorToMitkColor(const QString& widgetColorInHex) { QColor qColor(widgetColorInHex); mitk::Color returnColor; float colorMax = 255.0f; if (widgetColorInHex.isEmpty()) // default value { returnColor[0] = 1.0; returnColor[1] = 1.0; returnColor[2] = 1.0; MITK_ERROR << "Using default color for unknown widget " << qPrintable(widgetColorInHex); } else { returnColor[0] = qColor.red() / colorMax; returnColor[1] = qColor.green() / colorMax; returnColor[2] = qColor.blue() / colorMax; } return returnColor; } QString QmitkStdMultiWidgetEditor::MitkColorToHex(const mitk::Color& color) { QColor returnColor; float colorMax = 255.0f; - returnColor.setRed(static_cast(color[0]* colorMax + 0.5)); - returnColor.setGreen(static_cast(color[1]* colorMax + 0.5)); - returnColor.setBlue(static_cast(color[2]* colorMax + 0.5)); + returnColor.setRed(static_cast(color[0] * colorMax + 0.5)); + returnColor.setGreen(static_cast(color[1] * colorMax + 0.5)); + returnColor.setBlue(static_cast(color[2] * colorMax + 0.5)); return returnColor.name(); } -void QmitkStdMultiWidgetEditor::FillMembersWithCurrentDecorations() +void QmitkStdMultiWidgetEditor::ShowLevelWindowWidget(bool show) { - //fill members with current values (or default values) from the std multi widget - for(unsigned int i = 0; i < 4; ++i) + if (show) { - d->m_WidgetDecorationColor[i] = MitkColorToHex(d->m_StdMultiWidget->GetDecorationColor(i)); - d->m_WidgetBackgroundColor1[i] = MitkColorToHex(d->m_StdMultiWidget->GetGradientColors(i).first); - d->m_WidgetBackgroundColor2[i] = MitkColorToHex(d->m_StdMultiWidget->GetGradientColors(i).second); - d->m_WidgetAnnotation[i] = QString::fromStdString(d->m_StdMultiWidget->GetCornerAnnotationText(i)); + m_Impl->m_LevelWindowWidget->disconnect(this); + m_Impl->m_LevelWindowWidget->SetDataStorage(GetDataStorage()); + m_Impl->m_LevelWindowWidget->show(); } -} - -void QmitkStdMultiWidgetEditor::GetPreferenceDecorations(const berry::IBerryPreferences * preferences) -{ - //overwrite members with values from the preferences, if they the prefrence is defined - d->m_WidgetBackgroundColor1[0] = preferences->Get("widget1 first background color", d->m_WidgetBackgroundColor1[0]); - d->m_WidgetBackgroundColor2[0] = preferences->Get("widget1 second background color", d->m_WidgetBackgroundColor2[0]); - d->m_WidgetBackgroundColor1[1] = preferences->Get("widget2 first background color", d->m_WidgetBackgroundColor1[1]); - d->m_WidgetBackgroundColor2[1] = preferences->Get("widget2 second background color", d->m_WidgetBackgroundColor2[1]); - d->m_WidgetBackgroundColor1[2] = preferences->Get("widget3 first background color", d->m_WidgetBackgroundColor1[2]); - d->m_WidgetBackgroundColor2[2] = preferences->Get("widget3 second background color", d->m_WidgetBackgroundColor2[2]); - d->m_WidgetBackgroundColor1[3] = preferences->Get("widget4 first background color", d->m_WidgetBackgroundColor1[3]); - d->m_WidgetBackgroundColor2[3] = preferences->Get("widget4 second background color", d->m_WidgetBackgroundColor2[3]); - - d->m_WidgetDecorationColor[0] = preferences->Get("widget1 decoration color", d->m_WidgetDecorationColor[0]); - d->m_WidgetDecorationColor[1] = preferences->Get("widget2 decoration color", d->m_WidgetDecorationColor[1]); - d->m_WidgetDecorationColor[2] = preferences->Get("widget3 decoration color", d->m_WidgetDecorationColor[2]); - d->m_WidgetDecorationColor[3] = preferences->Get("widget4 decoration color", d->m_WidgetDecorationColor[3]); - - d->m_WidgetAnnotation[0] = preferences->Get("widget1 corner annotation", d->m_WidgetAnnotation[0]); - d->m_WidgetAnnotation[1] = preferences->Get("widget2 corner annotation", d->m_WidgetAnnotation[1]); - d->m_WidgetAnnotation[2] = preferences->Get("widget3 corner annotation", d->m_WidgetAnnotation[2]); - d->m_WidgetAnnotation[3] = preferences->Get("widget4 corner annotation", d->m_WidgetAnnotation[3]); -} - -void QmitkStdMultiWidgetEditor::InitializePreferences(berry::IBerryPreferences * preferences) -{ - this->FillMembersWithCurrentDecorations(); //fill members - this->GetPreferenceDecorations(preferences); //overwrite if preferences are defined - - //create new preferences - preferences->Put("widget1 corner annotation", d->m_WidgetAnnotation[0]); - preferences->Put("widget2 corner annotation", d->m_WidgetAnnotation[1]); - preferences->Put("widget3 corner annotation", d->m_WidgetAnnotation[2]); - preferences->Put("widget4 corner annotation", d->m_WidgetAnnotation[3]); - - preferences->Put("widget1 decoration color", d->m_WidgetDecorationColor[0]); - preferences->Put("widget2 decoration color", d->m_WidgetDecorationColor[1]); - preferences->Put("widget3 decoration color", d->m_WidgetDecorationColor[2]); - preferences->Put("widget4 decoration color", d->m_WidgetDecorationColor[3]); - - preferences->Put("widget1 first background color", d->m_WidgetBackgroundColor1[0]); - preferences->Put("widget2 first background color", d->m_WidgetBackgroundColor1[1]); - preferences->Put("widget3 first background color", d->m_WidgetBackgroundColor1[2]); - preferences->Put("widget4 first background color", d->m_WidgetBackgroundColor1[3]); - preferences->Put("widget1 second background color", d->m_WidgetBackgroundColor2[0]); - preferences->Put("widget2 second background color", d->m_WidgetBackgroundColor2[1]); - preferences->Put("widget3 second background color", d->m_WidgetBackgroundColor2[2]); - preferences->Put("widget4 second background color", d->m_WidgetBackgroundColor2[3]); -} - -void QmitkStdMultiWidgetEditor::SetFocus() -{ - if (d->m_StdMultiWidget != nullptr) - d->m_StdMultiWidget->setFocus(); -} - -void QmitkStdMultiWidgetEditor::RequestActivateMenuWidget(bool on) -{ - if (d->m_StdMultiWidget) + else { - if (on) - { - d->m_StdMultiWidget->ActivateMenuWidget(d->m_MenuWidgetsEnabled); - } - else - { - d->m_MenuWidgetsEnabled = d->m_StdMultiWidget->IsMenuWidgetEnabled(); - d->m_StdMultiWidget->ActivateMenuWidget(false); - } + m_Impl->m_LevelWindowWidget->disconnect(this); + m_Impl->m_LevelWindowWidget->hide(); } } - diff --git a/Plugins/org.mitk.gui.qt.stdmultiwidgeteditor/src/QmitkStdMultiWidgetEditor.h b/Plugins/org.mitk.gui.qt.stdmultiwidgeteditor/src/QmitkStdMultiWidgetEditor.h index 9c46ae9539..fb835de252 100644 --- a/Plugins/org.mitk.gui.qt.stdmultiwidgeteditor/src/QmitkStdMultiWidgetEditor.h +++ b/Plugins/org.mitk.gui.qt.stdmultiwidgeteditor/src/QmitkStdMultiWidgetEditor.h @@ -1,149 +1,129 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ -#ifndef QmitkStdMultiWidgetEditor_h -#define QmitkStdMultiWidgetEditor_h +#ifndef QMITKSTDMULTIWIDGETEDITOR_H +#define QMITKSTDMULTIWIDGETEDITOR_H -#include +// mitk gui qt common plugin +#include #include #include +// c++ +#include + class QmitkStdMultiWidget; -class QmitkMouseModeSwitcher; class QmitkStdMultiWidgetEditorPrivate; /** - * \ingroup org_mitk_gui_qt_stdmultiwidgeteditor + * @brief */ -class ORG_MITK_GUI_QT_STDMULTIWIDGETEDITOR QmitkStdMultiWidgetEditor - : public QmitkAbstractRenderEditor, public mitk::ILinkedRenderWindowPart +class ORG_MITK_GUI_QT_STDMULTIWIDGETEDITOR QmitkStdMultiWidgetEditor final : public QmitkAbstractMultiWidgetEditor, + public mitk::ILinkedRenderWindowPart { Q_OBJECT public: - berryObjectMacro(QmitkStdMultiWidgetEditor) - static const QString EDITOR_ID; QmitkStdMultiWidgetEditor(); - ~QmitkStdMultiWidgetEditor() override; - - QmitkStdMultiWidget* GetStdMultiWidget(); - - /// \brief If on=true will request the QmitkStdMultiWidget set the Menu widget to - /// whatever was the last known enabled state, and if on=false will turn the Menu widget off. - void RequestActivateMenuWidget(bool on); - - // ------------------- mitk::IRenderWindowPart ---------------------- + virtual ~QmitkStdMultiWidgetEditor() override; + virtual QmitkLevelWindowWidget* GetLevelWindowWidget() const override; /** - * \see mitk::IRenderWindowPart::GetActiveQmitkRenderWindow() - */ - QmitkRenderWindow* GetActiveQmitkRenderWindow() const override; - + * @brief Overridden from mitk::ILinkedRenderWindowPart + */ + virtual void EnableSlicingPlanes(bool enable) override; /** - * \see mitk::IRenderWindowPart::GetQmitkRenderWindows() - */ - QHash GetQmitkRenderWindows() const override; - + * @brief Overridden from mitk::ILinkedRenderWindowPart + */ + virtual bool IsSlicingPlanesEnabled() const override; /** - * \see mitk::IRenderWindowPart::GetQmitkRenderWindow(QString) - */ - QmitkRenderWindow* GetQmitkRenderWindow(const QString& id) const override; - + * @brief Overridden from berry::IPartListener + */ + virtual berry::IPartListener::Events::Types GetPartEventTypes() const override; /** - * \see mitk::IRenderWindowPart::GetSelectionPosition() - */ - mitk::Point3D GetSelectedPosition(const QString& id = QString()) const override; - - /** - * \see mitk::IRenderWindowPart::SetSelectedPosition() - */ - void SetSelectedPosition(const mitk::Point3D& pos, const QString& id = QString()) override; - + * @brief Overridden from berry::IPartListener + */ + virtual void PartClosed(const berry::IWorkbenchPartReference::Pointer& partRef) override; /** - * \see mitk::IRenderWindowPart::EnableDecorations() - */ - void EnableDecorations(bool enable, const QStringList& decorations = QStringList()) override; - + * @brief Overridden from berry::IPartListener + */ + virtual void PartOpened(const berry::IWorkbenchPartReference::Pointer& partRef) override; /** - * \see mitk::IRenderWindowPart::IsDecorationEnabled() - */ - bool IsDecorationEnabled(const QString& decoration) const override; - + * @brief Overridden from berry::IPartListener + */ + virtual void PartHidden(const berry::IWorkbenchPartReference::Pointer& partRef) override; /** - * \see mitk::IRenderWindowPart::GetDecorations() - */ - QStringList GetDecorations() const override; + * @brief Overridden from berry::IPartListener + */ + virtual void PartVisible(const berry::IWorkbenchPartReference::Pointer& partRef) override; - // ------------------- mitk::ILinkedRenderWindowPart ---------------------- - - void EnableSlicingPlanes(bool enable) override; - bool IsSlicingPlanesEnabled() const override; - - -protected: + void OnInteractionSchemeChanged(mitk::InteractionSchemeSwitcher::InteractionScheme scheme); +private: /** - * @brief FillMembersWithCurrentDecorations Helper method to fill internal members with - * current values of the std multi widget. - */ - void FillMembersWithCurrentDecorations(); - + * @brief Overridden from QmitkAbstractRenderEditor + */ + virtual void SetFocus() override; + /** + * @brief Overridden from QmitkAbstractRenderEditor + */ + virtual void CreateQtPartControl(QWidget* parent) override; + /** + * @brief Overridden from QmitkAbstractRenderEditor + */ + virtual void OnPreferencesChanged(const berry::IBerryPreferences* preferences) override; + /** + * @brief InitializePreferences Internal helper method to set default preferences. + * This method is used to show the current preferences in the first call of + * the preference page (the GUI). + * + * @param preferences berry preferences. + */ + void InitializePreferences(berry::IBerryPreferences *preferences); /** * @brief GetPreferenceDecorations Getter to fill internal members with values of preferences. * @param preferences The berry preferences. * * If a preference is set, the value will overwrite the current value. If it does not exist, * the value will not change. */ void GetPreferenceDecorations(const berry::IBerryPreferences *preferences); - - void SetFocus() override; - - void OnPreferencesChanged(const berry::IBerryPreferences*) override; - - void CreateQtPartControl(QWidget* parent) override; - /** * @brief GetColorForWidget helper method to convert a saved color string to mitk::Color. - * @param widgetColorInHex color in hex format (#12356) where each diget is in the form (0-F). + * @param widgetColorInHex color in hex format (#12356) where each digit is in the form (0-F). * @return the color in mitk format. */ mitk::Color HexColorToMitkColor(const QString& widgetColorInHex); /** * @brief MitkColorToHex Convert an mitk::Color to hex string. * @param color mitk format. * @return String in hex (#RRGGBB). */ QString MitkColorToHex(const mitk::Color& color); - /** - * @brief InitializePreferences Internal helper method to set default preferences. - * This method is used to show the current preferences in the first call of - * the preference page (the GUI). - * - * @param preferences berry preferences. - */ - void InitializePreferences(berry::IBerryPreferences *preferences); + void ShowLevelWindowWidget(bool show); + + struct Impl; + std::unique_ptr m_Impl; -private: - const QScopedPointer d; }; -#endif /*QmitkStdMultiWidgetEditor_h*/ + +#endif // QMITKSTDMULTIWIDGETEDITOR_H