diff --git a/Modules/QtWidgets/files.cmake b/Modules/QtWidgets/files.cmake index 79e69a0ecc..63641e1017 100644 --- a/Modules/QtWidgets/files.cmake +++ b/Modules/QtWidgets/files.cmake @@ -1,120 +1,118 @@ file(GLOB_RECURSE H_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/*") set(CPP_FILES QmitkAbstractDataStorageModel.cpp QmitkAbstractMultiWidget.cpp QmitkApplicationCursor.cpp QmitkDataStorageComboBox.cpp QmitkDataStorageDefaultListModel.cpp QmitkDataStorageListModel.cpp QmitkDataStorageTableModel.cpp QmitkDataStorageSimpleTreeModel.cpp QmitkDataStorageTreeModel.cpp QmitkDataStorageTreeModelInternalItem.cpp QmitkFileReaderOptionsDialog.cpp QmitkFileReaderWriterOptionsWidget.cpp QmitkFileWriterOptionsDialog.cpp QmitkInteractionSchemeToolBar.cpp QmitkIOUtil.cpp QmitkLevelWindowPresetDefinitionDialog.cpp QmitkLevelWindowRangeChangeDialog.cpp QmitkLevelWindowWidgetContextMenu.cpp QmitkLevelWindowWidget.cpp QmitkLineEditLevelWindowWidget.cpp QmitkMemoryUsageIndicatorView.cpp QmitkMimeTypes.cpp QmitkMouseModeSwitcher.cpp QmitkMultiWidgetConfigurationToolBar.cpp QmitkMultiWidgetLayoutSelectionWidget.cpp QmitkNodeDescriptor.cpp QmitkColoredNodeDescriptor.cpp QmitkNodeDescriptorManager.cpp QmitkProgressBar.cpp QmitkPropertiesTableEditor.cpp QmitkPropertiesTableModel.cpp QmitkPropertyDelegate.cpp QmitkRegisterClasses.cpp QmitkRenderingManager.cpp QmitkRenderingManagerFactory.cpp QmitkRenderWindow.cpp QmitkRenderWindowMenu.cpp QmitkRenderWindowWidget.cpp QmitkServiceListWidget.cpp QmitkSliderLevelWindowWidget.cpp QmitkStdMultiWidget.cpp - QmitkCustomMultiWidget.cpp QmitkDataStorageFilterProxyModel.cpp QmitkDataStorageComboBoxWithSelectNone.cpp QmitkPropertyItem.cpp QmitkPropertyItemDelegate.cpp QmitkPropertyItemModel.cpp QmitkStyleManager.cpp QmitkAbstractDataStorageInspector.cpp QmitkDataStorageListInspector.cpp QmitkDataStorageTreeInspector.cpp QmitkModelViewSelectionConnector.cpp mitkIDataStorageInspectorProvider.cpp mitkQtWidgetsActivator.cpp mitkDataStorageInspectorGenerator.cpp ) set(MOC_H_FILES include/QmitkAbstractDataStorageModel.h include/QmitkAbstractMultiWidget.h include/QmitkDataStorageComboBox.h include/QmitkDataStorageTableModel.h include/QmitkDataStorageTreeModel.h include/QmitkDataStorageSimpleTreeModel.h include/QmitkDataStorageDefaultListModel.h include/QmitkFileReaderOptionsDialog.h include/QmitkFileReaderWriterOptionsWidget.h include/QmitkFileWriterOptionsDialog.h include/QmitkInteractionSchemeToolBar.h include/QmitkLevelWindowPresetDefinitionDialog.h include/QmitkLevelWindowRangeChangeDialog.h include/QmitkLevelWindowWidgetContextMenu.h include/QmitkLevelWindowWidget.h include/QmitkLineEditLevelWindowWidget.h include/QmitkMemoryUsageIndicatorView.h include/QmitkMouseModeSwitcher.h include/QmitkMultiWidgetConfigurationToolBar.h include/QmitkMultiWidgetLayoutSelectionWidget.h include/QmitkNodeDescriptor.h include/QmitkColoredNodeDescriptor.h include/QmitkNodeDescriptorManager.h include/QmitkRenderWindowMenu.h include/QmitkRenderWindowWidget.h include/QmitkProgressBar.h include/QmitkPropertiesTableEditor.h include/QmitkPropertyDelegate.h include/QmitkRenderingManager.h include/QmitkRenderWindow.h include/QmitkServiceListWidget.h include/QmitkSliderLevelWindowWidget.h include/QmitkStdMultiWidget.h - include/QmitkCustomMultiWidget.h include/QmitkDataStorageComboBoxWithSelectNone.h include/QmitkPropertyItemDelegate.h include/QmitkPropertyItemModel.h include/QmitkDataStorageListInspector.h include/QmitkAbstractDataStorageInspector.h include/QmitkDataStorageTreeInspector.h include/QmitkModelViewSelectionConnector.h ) set(UI_FILES src/QmitkFileReaderOptionsDialog.ui src/QmitkFileWriterOptionsDialog.ui src/QmitkLevelWindowPresetDefinition.ui src/QmitkLevelWindowWidget.ui src/QmitkLevelWindowRangeChange.ui src/QmitkMemoryUsageIndicator.ui src/QmitkMultiWidgetLayoutSelectionWidget.ui src/QmitkServiceListWidgetControls.ui src/QmitkDataStorageListInspector.ui src/QmitkDataStorageTreeInspector.ui ) set(QRC_FILES resource/Qmitk.qrc ) diff --git a/Modules/QtWidgets/include/QmitkCustomMultiWidget.h b/Modules/QtWidgets/include/QmitkCustomMultiWidget.h deleted file mode 100644 index 7b39e35f3a..0000000000 --- a/Modules/QtWidgets/include/QmitkCustomMultiWidget.h +++ /dev/null @@ -1,176 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical Image Computing. -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 QMITKCUSTOMMULTIWIDGET_H -#define QMITKCUSTOMMULTIWIDGET_H - -// qt widgets module -#include "MitkQtWidgetsExports.h" -#include "QmitkRenderWindowWidget.h" - -// mitk core -#include -#include -#include -#include - -// qt -#include - -class QHBoxLayout; -class QVBoxLayout; -class QGridLayout; -class QSpacerItem; -class QmitkRenderWindow; - -namespace mitk -{ - class RenderingManager; -} - -/** -* @brief The 'QmitkCustomMultiWidget' is a 'QWidget' that is used to display multiple render windows at once. -* -* Render windows can dynamically be added and removed to change the layout of the multi widget. -*/ -class MITKQTWIDGETS_EXPORT QmitkCustomMultiWidget : public QWidget -{ - Q_OBJECT - -public: - - using RenderWindowWidgetPointer = std::shared_ptr; - using RenderWindowWidgetMap = std::map>; - using RenderWindowHash = QHash; - - QmitkCustomMultiWidget(QWidget* parent = 0, - Qt::WindowFlags f = 0, - mitk::RenderingManager* renderingManager = nullptr, - mitk::BaseRenderer::RenderingMode::Type renderingMode = mitk::BaseRenderer::RenderingMode::Standard, - const QString& multiWidgetName = "custommulti"); - - virtual ~QmitkCustomMultiWidget(); - - void SetDataStorage(mitk::DataStorage* dataStorage); - void InitializeRenderWindowWidgets(); - - mitk::InteractionEventHandler::Pointer GetInteractionEventHandler() { return m_DisplayActionEventBroadcast.GetPointer(); }; - - void ResetLayout(int row, int column); - void Synchronize(bool synchronized); - - RenderWindowWidgetMap GetRenderWindowWidgets() const; - RenderWindowWidgetPointer GetRenderWindowWidget(int row, int column) const; - RenderWindowWidgetPointer GetRenderWindowWidget(const QString& widgetName) const; - RenderWindowHash GetRenderWindows() const; - QmitkRenderWindow* GetRenderWindow(int row, int column) const; - QmitkRenderWindow* GetRenderWindow(const QString& widgetName) const; - - void SetActiveRenderWindowWidget(RenderWindowWidgetPointer activeRenderWindowWidget); - RenderWindowWidgetPointer GetActiveRenderWindowWidget() const; - RenderWindowWidgetPointer GetFirstRenderWindowWidget() const; - RenderWindowWidgetPointer GetLastRenderWindowWidget() const; - - unsigned int GetNumberOfRenderWindowWidgets() const; - - void RequestUpdate(const QString& widgetName); - void RequestUpdateAll(); - void ForceImmediateUpdate(const QString& widgetName); - void ForceImmediateUpdateAll(); - - const mitk::Point3D GetSelectedPosition(const QString& widgetName) const; - -public Q_SLOTS: - - /** - * @brief Listener to the CrosshairPositionEvent - * - * Ensures the CrosshairPositionEvent is handled only once and at the end of the Qt-Event loop - */ - void HandleCrosshairPositionEvent(); - /** - * @brief Receives the signal from HandleCrosshairPositionEvent, executes the StatusBar update - * - */ - void HandleCrosshairPositionEventDelayed(); - - void SetSelectedPosition(const QString& widgetName, const mitk::Point3D& newPosition); - - void ResetCrosshair(); - - // mouse events - void wheelEvent(QWheelEvent* e) override; - - void mousePressEvent(QMouseEvent* e) override; - - void moveEvent(QMoveEvent* e) override; - -Q_SIGNALS: - - void WheelMoved(QWheelEvent *); - void Moved(); - -public: - - enum - { - AXIAL, - SAGITTAL, - CORONAL, - THREE_D - }; - -private: - - void InitializeGUI(); - void InitializeWidget(); - void InitializeDisplayActionEventHandling(); - - void CreateRenderWindowWidget(const std::string& cornerAnnotation = ""); - void DestroyRenderWindowWidget(); - void FillMultiWidgetLayout(); - - QString GetNameFromIndex(int row, int column) const; - QString GetNameFromIndex(size_t index) const; - - // #TODO: see T24173 - mitk::DataNode::Pointer GetTopLayerNode(mitk::DataStorage::SetOfObjects::ConstPointer nodes); - - QGridLayout* m_CustomMultiWidgetLayout; - RenderWindowWidgetMap m_RenderWindowWidgets; - - RenderWindowWidgetPointer m_ActiveRenderWindowWidget; - - int m_MultiWidgetRows; - int m_MultiWidgetColumns; - - int m_PlaneMode; - - mitk::RenderingManager* m_RenderingManager; - mitk::BaseRenderer::RenderingMode::Type m_RenderingMode; - QString m_MultiWidgetName; - - mitk::DisplayActionEventBroadcast::Pointer m_DisplayActionEventBroadcast; - std::unique_ptr m_DisplayActionEventHandler; - - mitk::DataStorage::Pointer m_DataStorage; - - bool m_PendingCrosshairPositionEvent; - bool m_CrosshairNavigationEnabled; - -}; - -#endif // QMITKCUSTOMMULTIWIDGET_H diff --git a/Modules/QtWidgets/src/QmitkCustomMultiWidget.cpp b/Modules/QtWidgets/src/QmitkCustomMultiWidget.cpp deleted file mode 100644 index 80976d7c91..0000000000 --- a/Modules/QtWidgets/src/QmitkCustomMultiWidget.cpp +++ /dev/null @@ -1,577 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical Image Computing. -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 "QmitkCustomMultiWidget.h" - -#include -#include -#include -#include - -// mitk core -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -// qt -#include - -QmitkCustomMultiWidget::QmitkCustomMultiWidget(QWidget* parent, - Qt::WindowFlags f/* = 0*/, - mitk::RenderingManager* renderingManager/* = nullptr*/, - mitk::BaseRenderer::RenderingMode::Type renderingMode/* = mitk::BaseRenderer::RenderingMode::Standard*/, - const QString& multiWidgetName/* = "custommulti"*/) - : QWidget(parent, f) - , m_CustomMultiWidgetLayout(nullptr) - , m_MultiWidgetRows(0) - , m_MultiWidgetColumns(0) - , m_PlaneMode(0) - , m_RenderingManager(renderingManager) - , m_RenderingMode(renderingMode) - , m_MultiWidgetName(multiWidgetName) - , m_DisplayActionEventBroadcast(nullptr) - , m_DisplayActionEventHandler(nullptr) - , m_DataStorage(nullptr) - , m_PendingCrosshairPositionEvent(false) - , m_CrosshairNavigationEnabled(false) -{ - // create widget manually - // create and set layout - InitializeGUI(); - InitializeWidget(); - InitializeDisplayActionEventHandling(); - resize(QSize(364, 477).expandedTo(minimumSizeHint())); -} - -QmitkCustomMultiWidget::~QmitkCustomMultiWidget() -{ - // nothing here -} - -void QmitkCustomMultiWidget::SetDataStorage(mitk::DataStorage* dataStorage) -{ - if (dataStorage == m_DataStorage) - { - return; - } - - m_DataStorage = dataStorage; - // set new data storage for the render window widgets - for (const auto& renderWindowWidget : m_RenderWindowWidgets) - { - renderWindowWidget.second->SetDataStorage(m_DataStorage); - } -} - -void QmitkCustomMultiWidget::InitializeRenderWindowWidgets() -{ - // create render window widget initially - m_MultiWidgetRows = 1; - m_MultiWidgetColumns = 1; - CreateRenderWindowWidget("2015-01-14 - CT"); - InitializeGUI(); -} - -void QmitkCustomMultiWidget::ResetLayout(int row, int column) -{ - m_MultiWidgetRows = row + 1; - m_MultiWidgetColumns = column + 1; - - int requiredRenderWindowWidgets = m_MultiWidgetRows * m_MultiWidgetColumns; - int existingRenderWindowWidgets = m_RenderWindowWidgets.size(); - - int difference = requiredRenderWindowWidgets - existingRenderWindowWidgets; - while(0 < difference) - { - // more render window widgets needed - CreateRenderWindowWidget(); - --difference; - } - while(0 > difference) - { - // less render window widgets needed - DestroyRenderWindowWidget(); - ++difference; - } - - InitializeGUI(); -} - -void QmitkCustomMultiWidget::Synchronize(bool synchronized) -{ - auto allObserverTags = m_DisplayActionEventHandler->GetAllObserverTags(); - for (auto observerTag : allObserverTags) - { - m_DisplayActionEventHandler->DisconnectObserver(observerTag); - } - - if (synchronized) - { - mitk::StdFunctionCommand::ActionFunction actionFunction = mitk::DisplayActionEventFunctions::MoveCameraSynchronizedAction(); - m_DisplayActionEventHandler->ConnectDisplayActionEvent(mitk::DisplayMoveEvent(nullptr, mitk::Vector2D()), actionFunction); - - actionFunction = mitk::DisplayActionEventFunctions::SetCrosshairSynchronizedAction(); - m_DisplayActionEventHandler->ConnectDisplayActionEvent(mitk::DisplaySetCrosshairEvent(nullptr, mitk::Point3D()), actionFunction); - - actionFunction = mitk::DisplayActionEventFunctions::ZoomCameraSynchronizedAction(); - m_DisplayActionEventHandler->ConnectDisplayActionEvent(mitk::DisplayZoomEvent(nullptr, 0.0, mitk::Point2D()), actionFunction); - - actionFunction = mitk::DisplayActionEventFunctions::ScrollSliceStepperSynchronizedAction(); - m_DisplayActionEventHandler->ConnectDisplayActionEvent(mitk::DisplayScrollEvent(nullptr, 0), actionFunction); - } - else - { - mitk::StdFunctionCommand::ActionFunction actionFunction = mitk::DisplayActionEventFunctions::MoveSenderCameraAction(); - m_DisplayActionEventHandler->ConnectDisplayActionEvent(mitk::DisplayMoveEvent(nullptr, mitk::Vector2D()), actionFunction); - - actionFunction = mitk::DisplayActionEventFunctions::SetCrosshairAction(); - m_DisplayActionEventHandler->ConnectDisplayActionEvent(mitk::DisplaySetCrosshairEvent(nullptr, mitk::Point3D()), actionFunction); - - actionFunction = mitk::DisplayActionEventFunctions::ZoomSenderCameraAction(); - m_DisplayActionEventHandler->ConnectDisplayActionEvent(mitk::DisplayZoomEvent(nullptr, 0.0, mitk::Point2D()), actionFunction); - - actionFunction = mitk::DisplayActionEventFunctions::ScrollSliceStepperAction(); - m_DisplayActionEventHandler->ConnectDisplayActionEvent(mitk::DisplayScrollEvent(nullptr, 0), actionFunction); - } - - // use the standard 'set level window' action for both modes - mitk::StdFunctionCommand::ActionFunction actionFunction = mitk::DisplayActionEventFunctions::SetLevelWindowAction(); - m_DisplayActionEventHandler->ConnectDisplayActionEvent(mitk::DisplaySetLevelWindowEvent(nullptr, mitk::ScalarType(), mitk::ScalarType()), actionFunction); -} - -QmitkCustomMultiWidget::RenderWindowWidgetMap QmitkCustomMultiWidget::GetRenderWindowWidgets() const -{ - return m_RenderWindowWidgets; -} - -QmitkCustomMultiWidget::RenderWindowWidgetPointer QmitkCustomMultiWidget::GetRenderWindowWidget(int row, int column) const -{ - return GetRenderWindowWidget(GetNameFromIndex(row, column)); -} - -QmitkCustomMultiWidget::RenderWindowWidgetPointer QmitkCustomMultiWidget::GetRenderWindowWidget(const QString& widgetName) const -{ - RenderWindowWidgetMap::const_iterator it = m_RenderWindowWidgets.find(widgetName); - if (it != m_RenderWindowWidgets.end()) - { - return it->second; - } - - return nullptr; -} - -QmitkCustomMultiWidget::RenderWindowHash QmitkCustomMultiWidget::GetRenderWindows() const -{ - RenderWindowHash result; - // create QHash on demand - auto renderWindowWidgets = GetRenderWindowWidgets(); - for (const auto& renderWindowWidget : renderWindowWidgets) - { - result.insert(renderWindowWidget.first, renderWindowWidget.second->GetRenderWindow()); - } - - return result; -} - -QmitkRenderWindow* QmitkCustomMultiWidget::GetRenderWindow(int row, int column) const -{ - return GetRenderWindow(GetNameFromIndex(row, column)); -} - -QmitkRenderWindow* QmitkCustomMultiWidget::GetRenderWindow(const QString& widgetName) const -{ - RenderWindowWidgetPointer renderWindowWidget = GetRenderWindowWidget(widgetName); - if (nullptr != renderWindowWidget) - { - return renderWindowWidget->GetRenderWindow(); - } - - return nullptr; -} - -void QmitkCustomMultiWidget::SetActiveRenderWindowWidget(RenderWindowWidgetPointer activeRenderWindowWidget) -{ - m_ActiveRenderWindowWidget = activeRenderWindowWidget; -} - -QmitkCustomMultiWidget::RenderWindowWidgetPointer QmitkCustomMultiWidget::GetActiveRenderWindowWidget() const -{ - return m_ActiveRenderWindowWidget; -} - -QmitkCustomMultiWidget::RenderWindowWidgetPointer QmitkCustomMultiWidget::GetFirstRenderWindowWidget() const -{ - if (!m_RenderWindowWidgets.empty()) - { - return m_RenderWindowWidgets.begin()->second; - } - else - { - return nullptr; - } -} - -QmitkCustomMultiWidget::RenderWindowWidgetPointer QmitkCustomMultiWidget::GetLastRenderWindowWidget() const -{ - if (!m_RenderWindowWidgets.empty()) - { - return m_RenderWindowWidgets.rbegin()->second; - } - else - { - return nullptr; - } -} - -unsigned int QmitkCustomMultiWidget::GetNumberOfRenderWindowWidgets() const -{ - return m_RenderWindowWidgets.size(); -} - -void QmitkCustomMultiWidget::RequestUpdate(const QString& widgetName) -{ - RenderWindowWidgetPointer renderWindowWidget = GetRenderWindowWidget(widgetName); - if (nullptr != renderWindowWidget) - { - return renderWindowWidget->RequestUpdate(); - } -} - -void QmitkCustomMultiWidget::RequestUpdateAll() -{ - for (const auto& renderWindowWidget : m_RenderWindowWidgets) - { - renderWindowWidget.second->RequestUpdate(); - } -} - -void QmitkCustomMultiWidget::ForceImmediateUpdate(const QString& widgetName) -{ - RenderWindowWidgetPointer renderWindowWidget = GetRenderWindowWidget(widgetName); - if (nullptr != renderWindowWidget) - { - renderWindowWidget->ForceImmediateUpdate(); - } -} - -void QmitkCustomMultiWidget::ForceImmediateUpdateAll() -{ - for (const auto& renderWindowWidget : m_RenderWindowWidgets) - { - renderWindowWidget.second->ForceImmediateUpdate(); - } -} - -const mitk::Point3D QmitkCustomMultiWidget::GetSelectedPosition(const QString& widgetName) const -{ - /* - 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 != NULL) && (plane2 != NULL) && (plane1->IntersectionLine(plane2, line))) - { - mitk::Point3D point; - if ((plane3 != NULL) && (plane3->IntersectionPoint(line, point))) - { - return point; - } - } - // TODO BUG POSITIONTRACKER; - mitk::Point3D p; - return p; - // return m_LastLeftClickPositionSupplier->GetCurrentPoint(); - */ - return mitk::Point3D(); -} - -////////////////////////////////////////////////////////////////////////// -// PUBLIC SLOTS -////////////////////////////////////////////////////////////////////////// -void QmitkCustomMultiWidget::HandleCrosshairPositionEvent() -{ - /* - if (!m_PendingCrosshairPositionEvent) - { - m_PendingCrosshairPositionEvent = true; - QTimer::singleShot(0, this, SLOT(HandleCrosshairPositionEventDelayed())); - } - */ -} - -void QmitkCustomMultiWidget::HandleCrosshairPositionEventDelayed() -{ - /* - m_PendingCrosshairPositionEvent = false; - - // find image with highest layer - mitk::TNodePredicateDataType::Pointer isImageData = mitk::TNodePredicateDataType::New(); - mitk::DataStorage::SetOfObjects::ConstPointer nodes = this->m_DataStorage->GetSubset(isImageData).GetPointer(); - - mitk::DataNode::Pointer node; - mitk::DataNode::Pointer topSourceNode; - mitk::Image::Pointer image; - bool isBinary = false; - node = this->GetTopLayerNode(nodes); - int component = 0; - if (node.IsNotNull()) - { - node->GetBoolProperty("binary", isBinary); - if (isBinary) - { - mitk::DataStorage::SetOfObjects::ConstPointer sourcenodes = m_DataStorage->GetSources(node, NULL, true); - if (!sourcenodes->empty()) - { - topSourceNode = this->GetTopLayerNode(sourcenodes); - } - 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); - } - } - - mitk::Point3D crosshairPos = this->GetCrossPosition(); - std::string statusText; - std::stringstream stream; - itk::Index<3> p; - mitk::BaseRenderer *baseRenderer = GetRenderWindow()->GetSliceNavigationController()->GetRenderer(); - 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"; - stream << "; Index: <" << p[0] << ", " << p[1] << ", " << p[2] << "> "; - - mitk::ScalarType pixelValue; - - mitkPixelTypeMultiplex5(mitk::FastSinglePixelAccess, - image->GetChannelDescriptor().GetPixelType(), - image, - image->GetVolumeData(baseRenderer->GetTimeStep()), - p, - pixelValue, - component); - - if (fabs(pixelValue) > 1000000 || fabs(pixelValue) < 0.01) - { - stream << "; Time: " << baseRenderer->GetTime() << " ms; Pixelvalue: " << std::scientific << pixelValue << " "; - } - else - { - stream << "; Time: " << baseRenderer->GetTime() << " ms; Pixelvalue: " << pixelValue << " "; - } - } - else - { - stream << "No image information at this position!"; - } - - statusText = stream.str(); - mitk::StatusBar::GetInstance()->DisplayGreyValueText(statusText.c_str()); - */ -} - -void QmitkCustomMultiWidget::SetSelectedPosition(const QString& widgetName, const mitk::Point3D& newPosition) -{ - RenderWindowWidgetPointer renderWindowWidget; - if (widgetName.isNull()) - { - renderWindowWidget = GetActiveRenderWindowWidget(); - } - else - { - renderWindowWidget = GetRenderWindowWidget(widgetName); - } - - if (nullptr != renderWindowWidget) - { - renderWindowWidget->GetSliceNavigationController()->SelectSliceByPoint(newPosition); - renderWindowWidget->RequestUpdate(); - return; - } - - MITK_ERROR << "Position can not be set for an unknown render window widget."; -} - -void QmitkCustomMultiWidget::ResetCrosshair() -{ - // #TODO: new concept: we do not want to initialize all views; - // we do not want to rely on the geometry planes - /* - if (m_DataStorage.IsNotNull()) - { - m_RenderingManager->InitializeViewsByBoundingObjects(m_DataStorage); - // m_RenderingManager->InitializeViews( m_DataStorage->ComputeVisibleBoundingGeometry3D() ); - // reset interactor to normal slicing - SetWidgetPlaneMode(PLANE_MODE_SLICING); - } - */ -} - -////////////////////////////////////////////////////////////////////////// -// MOUSE EVENTS -////////////////////////////////////////////////////////////////////////// -void QmitkCustomMultiWidget::wheelEvent(QWheelEvent* e) -{ - emit WheelMoved(e); -} - -void QmitkCustomMultiWidget::mousePressEvent(QMouseEvent* e) -{ -} - -void QmitkCustomMultiWidget::moveEvent(QMoveEvent* e) -{ - QWidget::moveEvent(e); - - // it is necessary to readjust the position of the overlays as the MultiWidget has moved - // unfortunately it's not done by QmitkRenderWindow::moveEvent -> must be done here - emit Moved(); -} - -////////////////////////////////////////////////////////////////////////// -// PRIVATE -////////////////////////////////////////////////////////////////////////// -void QmitkCustomMultiWidget::InitializeGUI() -{ - delete m_CustomMultiWidgetLayout; - m_CustomMultiWidgetLayout = new QGridLayout(this); - m_CustomMultiWidgetLayout->setContentsMargins(0, 0, 0, 0); - setLayout(m_CustomMultiWidgetLayout); - - FillMultiWidgetLayout(); -} - -void QmitkCustomMultiWidget::InitializeWidget() -{ - // #TODO: some things have to be handled globally (hold for all render window (widgets) - // analyze those things and design a controlling mechanism -} - -void QmitkCustomMultiWidget::InitializeDisplayActionEventHandling() -{ - m_DisplayActionEventBroadcast = mitk::DisplayActionEventBroadcast::New(); - m_DisplayActionEventBroadcast->LoadStateMachine("DisplayInteraction.xml"); - m_DisplayActionEventBroadcast->SetEventConfig("DisplayConfigPACS.xml"); - - m_DisplayActionEventHandler = std::make_unique(); - m_DisplayActionEventHandler->SetObservableBroadcast(m_DisplayActionEventBroadcast); - - Synchronize(true); -} - -void QmitkCustomMultiWidget::CreateRenderWindowWidget(const std::string& cornerAnnotation/* = ""*/) -{ - // create the render window widget and connect signals / slots - QString renderWindowWidgetName = GetNameFromIndex(m_RenderWindowWidgets.size()); - RenderWindowWidgetPointer renderWindowWidget = std::make_shared(this, renderWindowWidgetName, m_DataStorage); - renderWindowWidget->SetCornerAnnotationText(renderWindowWidgetName.toStdString()/*cornerAnnotation*/); - - // store the newly created render window widget with the UID - m_RenderWindowWidgets.insert(std::make_pair(renderWindowWidgetName, renderWindowWidget)); -} - -void QmitkCustomMultiWidget::DestroyRenderWindowWidget() -{ - auto iterator = m_RenderWindowWidgets.find(GetNameFromIndex(m_RenderWindowWidgets.size() - 1)); - if (iterator == m_RenderWindowWidgets.end()) - { - return; - } - - // disconnect each signal of this render window widget - RenderWindowWidgetPointer renderWindowWidgetToRemove = iterator->second; - disconnect(renderWindowWidgetToRemove.get(), 0, 0, 0); - - // erase the render window from the map - m_RenderWindowWidgets.erase(iterator); -} - -void QmitkCustomMultiWidget::FillMultiWidgetLayout() -{ - for (int row = 0; row < m_MultiWidgetRows; ++row) - { - for (int column = 0; column < m_MultiWidgetColumns; ++column) - { - RenderWindowWidgetPointer renderWindowWidget = GetRenderWindowWidget(row, column); - if (nullptr != renderWindowWidget) - { - m_CustomMultiWidgetLayout->addWidget(renderWindowWidget.get(), row, column); - SetActiveRenderWindowWidget(renderWindowWidget); - } - } - } -} - -QString QmitkCustomMultiWidget::GetNameFromIndex(int row, int column) const -{ - if (0 <= row && m_MultiWidgetRows > row && 0 <= column && m_MultiWidgetColumns > column) - { - return GetNameFromIndex(row * m_MultiWidgetColumns + column); - } - - return QString(); -} - -QString QmitkCustomMultiWidget::GetNameFromIndex(size_t index) const -{ - if (index <= m_RenderWindowWidgets.size()) - { - return m_MultiWidgetName + ".widget" + QString::number(index); - } - - return QString(); -} - -mitk::DataNode::Pointer QmitkCustomMultiWidget::GetTopLayerNode(mitk::DataStorage::SetOfObjects::ConstPointer nodes) -{ - // #TODO: see T24173 - return nodes->front(); -} diff --git a/Modules/QtWidgets/src/QmitkRenderWindowWidget.cpp b/Modules/QtWidgets/src/QmitkRenderWindowWidget.cpp index df55cc15a5..b1ea2eb273 100644 --- a/Modules/QtWidgets/src/QmitkRenderWindowWidget.cpp +++ b/Modules/QtWidgets/src/QmitkRenderWindowWidget.cpp @@ -1,226 +1,226 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical Image Computing. 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 "QmitkRenderWindowWidget.h" // mitk qt widgets -#include +#include // vtk #include QmitkRenderWindowWidget::QmitkRenderWindowWidget(QWidget* parent/* = nullptr*/, const QString& widgetName/* = ""*/, mitk::DataStorage* dataStorage/* = nullptr*/, mitk::BaseRenderer::RenderingMode::Type renderingMode/* = mitk::BaseRenderer::RenderingMode::Standard*/) : QWidget(parent) , m_WidgetName(widgetName) , m_DataStorage(dataStorage) , m_RenderingMode(renderingMode) , m_RenderWindow(nullptr) , m_PointSetNode(nullptr) , m_PointSet(nullptr) { InitializeGUI(); } QmitkRenderWindowWidget::~QmitkRenderWindowWidget() { auto sliceNavigationController = m_RenderWindow->GetSliceNavigationController(); if (nullptr != sliceNavigationController) { sliceNavigationController->SetCrosshairEvent.RemoveListener(mitk::MessageDelegate1(this, &QmitkRenderWindowWidget::SetCrosshair)); } if (nullptr != m_DataStorage) { m_DataStorage->Remove(m_PointSetNode); } } void QmitkRenderWindowWidget::SetDataStorage(mitk::DataStorage* dataStorage) { if (dataStorage == m_DataStorage) { return; } m_DataStorage = dataStorage; if (nullptr != m_RenderWindow) { mitk::BaseRenderer::GetInstance(m_RenderWindow->GetRenderWindow())->SetDataStorage(dataStorage); } } mitk::SliceNavigationController* QmitkRenderWindowWidget::GetSliceNavigationController() const { return m_RenderWindow->GetSliceNavigationController(); } void QmitkRenderWindowWidget::RequestUpdate() { m_RenderingManager->RequestUpdate(m_RenderWindow->GetRenderWindow()); } void QmitkRenderWindowWidget::ForceImmediateUpdate() { m_RenderingManager->ForceImmediateUpdate(m_RenderWindow->GetRenderWindow()); } void QmitkRenderWindowWidget::SetGradientBackgroundColors(const mitk::Color& upper, const mitk::Color& lower) { vtkRenderer* vtkRenderer = m_RenderWindow->GetRenderer()->GetVtkRenderer(); if (nullptr == vtkRenderer) { return; } m_GradientBackgroundColors.first = upper; m_GradientBackgroundColors.second = lower; vtkRenderer->SetBackground(lower[0], lower[1], lower[2]); vtkRenderer->SetBackground2(upper[0], upper[1], upper[2]); ShowGradientBackground(true); } void QmitkRenderWindowWidget::ShowGradientBackground(bool show) { m_RenderWindow->GetRenderer()->GetVtkRenderer()->SetGradientBackground(show); } bool QmitkRenderWindowWidget::IsGradientBackgroundOn() const { return m_RenderWindow->GetRenderer()->GetVtkRenderer()->GetGradientBackground(); } void QmitkRenderWindowWidget::SetDecorationColor(const mitk::Color& color) { m_DecorationColor = color; m_RectangleProp->SetColor(m_DecorationColor[0], m_DecorationColor[1], m_DecorationColor[2]); m_CornerAnnotation->GetTextProperty()->SetColor(color[0], color[1], color[2]); } void QmitkRenderWindowWidget::ShowColoredRectangle(bool show) { m_RectangleProp->SetVisibility(show); } bool QmitkRenderWindowWidget::IsColoredRectangleVisible() const { return m_RectangleProp->GetVisibility() > 0; } void QmitkRenderWindowWidget::ShowCornerAnnotation(bool show) { m_CornerAnnotation->SetVisibility(show); } bool QmitkRenderWindowWidget::IsCornerAnnotationVisible() const { return m_CornerAnnotation->GetVisibility() > 0; } void QmitkRenderWindowWidget::SetCornerAnnotationText(const std::string& cornerAnnotation) { m_CornerAnnotation->SetText(0, cornerAnnotation.c_str()); } std::string QmitkRenderWindowWidget::GetCornerAnnotationText() const { return std::string(m_CornerAnnotation->GetText(0)); } bool QmitkRenderWindowWidget::IsRenderWindowMenuActivated() const { return m_RenderWindow->GetActivateMenuWidgetFlag(); } void QmitkRenderWindowWidget::InitializeGUI() { m_Layout = new QHBoxLayout(this); m_Layout->setMargin(0); setLayout(m_Layout); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); // create render window for this render window widget m_RenderingManager = mitk::RenderingManager::GetInstance(); //m_RenderingManager = mitk::RenderingManager::New(); m_RenderingManager->SetDataStorage(m_DataStorage); m_RenderWindow = new QmitkRenderWindow(this, m_WidgetName, nullptr, m_RenderingManager, m_RenderingMode); - m_RenderWindow->SetLayoutIndex(QmitkCustomMultiWidget::SAGITTAL); // TODO: allow to change layout type later + m_RenderWindow->SetLayoutIndex(QmitkAbstractMultiWidget::SAGITTAL); // TODO: allow to change layout type later m_RenderWindow->GetSliceNavigationController()->SetDefaultViewDirection(mitk::SliceNavigationController::Sagittal); m_RenderWindow->GetSliceNavigationController()->SetRenderingManager(m_RenderingManager); m_RenderWindow->GetSliceNavigationController()->SetCrosshairEvent.AddListener(mitk::MessageDelegate1(this, &QmitkRenderWindowWidget::SetCrosshair)); mitk::TimeGeometry::ConstPointer timeGeometry = m_DataStorage->ComputeBoundingGeometry3D(m_DataStorage->GetAll()); m_RenderingManager->InitializeViews(timeGeometry); m_Layout->addWidget(m_RenderWindow); // add point set as a crosshair m_PointSetNode = mitk::DataNode::New(); m_PointSetNode->SetProperty("name", mitk::StringProperty::New("Crosshair of render window " + m_WidgetName.toStdString())); m_PointSetNode->SetProperty("helper object", mitk::BoolProperty::New(true)); // crosshair-node should typically be invisible // set the crosshair only visible for this specific renderer m_PointSetNode->SetBoolProperty("fixedLayer", true, m_RenderWindow->GetRenderer()); m_PointSetNode->SetVisibility(true, m_RenderWindow->GetRenderer()); m_PointSetNode->SetVisibility(false); m_PointSet = mitk::PointSet::New(); m_PointSetNode->SetData(m_PointSet); //m_DataStorage->Add(m_PointSetNode); // set colors and corner annotation InitializeDecorations(); } void QmitkRenderWindowWidget::InitializeDecorations() { vtkRenderer* vtkRenderer = m_RenderWindow->GetRenderer()->GetVtkRenderer(); if (nullptr == vtkRenderer) { return; } // initialize background color gradients float black[3] = { 0.0f, 0.0f, 0.0f }; SetGradientBackgroundColors(black, black); // initialize decoration color, rectangle and annotation text float white[3] = { 1.0f, 1.0f, 1.0f }; m_DecorationColor = white; m_RectangleProp = vtkSmartPointer::New(); m_RectangleProp->SetColor(m_DecorationColor[0], m_DecorationColor[1], m_DecorationColor[2]); if (0 == vtkRenderer->HasViewProp(m_RectangleProp)) { vtkRenderer->AddViewProp(m_RectangleProp); } m_CornerAnnotation = vtkSmartPointer::New(); m_CornerAnnotation->SetText(0, "Sagittal"); m_CornerAnnotation->SetMaximumFontSize(12); m_CornerAnnotation->GetTextProperty()->SetColor(m_DecorationColor[0], m_DecorationColor[1], m_DecorationColor[2]); if (0 == vtkRenderer->HasViewProp(m_CornerAnnotation)) { vtkRenderer->AddViewProp(m_CornerAnnotation); } } void QmitkRenderWindowWidget::SetCrosshair(mitk::Point3D selectedPoint) { m_PointSet->SetPoint(1, selectedPoint, 0); mitk::RenderingManager::GetInstance()->RequestUpdate(m_RenderWindow->GetRenderWindow()); } diff --git a/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/files.cmake b/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/files.cmake index 79481c4266..d42b6de6e5 100644 --- a/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/files.cmake +++ b/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/files.cmake @@ -1,36 +1,38 @@ set(SRC_CPP_FILES + QmitkCustomMultiWidget.cpp QmitkCustomMultiWidgetEditor.cpp QmitkMultiWidgetDecorationManager.cpp ) set(INTERNAL_CPP_FILES mitkPluginActivator.cpp QmitkCustomMultiWidgetEditorPreferencePage.cpp ) set(UI_FILES src/internal/QmitkCustomMultiWidgetEditorPreferencePage.ui ) set(MOC_H_FILES + src/QmitkCustomMultiWidget.h src/QmitkCustomMultiWidgetEditor.h src/internal/mitkPluginActivator.h src/internal/QmitkCustomMultiWidgetEditorPreferencePage.h ) set(CACHED_RESOURCE_FILES resources/CustomMultiWidgetEditor.svg plugin.xml ) set(QRC_FILES ) foreach(file ${SRC_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/${file}) endforeach(file ${SRC_CPP_FILES}) foreach(file ${INTERNAL_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/internal/${file}) endforeach(file ${INTERNAL_CPP_FILES}) diff --git a/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/src/QmitkCustomMultiWidget.cpp b/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/src/QmitkCustomMultiWidget.cpp new file mode 100644 index 0000000000..a33ddbdaf7 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/src/QmitkCustomMultiWidget.cpp @@ -0,0 +1,105 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical Image Computing. +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. + +===================================================================*/ + +// mitk qt widgets module +#include "QmitkCustomMultiWidget.h" +#include "QmitkRenderWindowWidget.h" + +// qt +#include + +QmitkCustomMultiWidget::QmitkCustomMultiWidget(QWidget* parent, + Qt::WindowFlags f/* = 0*/, + mitk::RenderingManager* renderingManager/* = nullptr*/, + mitk::BaseRenderer::RenderingMode::Type renderingMode/* = mitk::BaseRenderer::RenderingMode::Standard*/, + const QString& multiWidgetName/* = "custommulti"*/) + : QmitkAbstractMultiWidget(parent, f, renderingManager, renderingMode, multiWidgetName) + , m_GridLayout(nullptr) +{ + // nothing here +} + +QmitkCustomMultiWidget::~QmitkCustomMultiWidget() +{ + // nothing here +} + +void QmitkCustomMultiWidget::InitializeRenderWindowWidgets() +{ + SetLayout(1, 1); +} + +////////////////////////////////////////////////////////////////////////// +// PRIVATE +////////////////////////////////////////////////////////////////////////// +void QmitkCustomMultiWidget::InitializeGUI() +{ + delete m_GridLayout; + m_GridLayout = new QGridLayout(this); + m_GridLayout->setContentsMargins(0, 0, 0, 0); + setLayout(m_GridLayout); + + FillMultiWidgetLayout(); + resize(QSize(364, 477).expandedTo(minimumSizeHint())); +} + +void QmitkCustomMultiWidget::SetLayoutImpl() +{ + int requiredRenderWindowWidgets = GetRowCount() * GetColumnCount(); + int existingRenderWindowWidgets = GetRenderWindowWidgets().size(); + + int difference = requiredRenderWindowWidgets - existingRenderWindowWidgets; + while (0 < difference) + { + // more render window widgets needed + CreateRenderWindowWidget(); + --difference; + } + while (0 > difference) + { + // less render window widgets needed + RemoveRenderWindowWidget(); + ++difference; + } + + InitializeGUI(); +} + +void QmitkCustomMultiWidget::CreateRenderWindowWidget(const std::string& cornerAnnotation/* = ""*/) +{ + // create the render window widget and connect signals / slots + QString renderWindowWidgetName = GetNameFromIndex(GetRenderWindowWidgets().size()); + RenderWindowWidgetPointer renderWindowWidget = std::make_shared(this, renderWindowWidgetName, GetDataStorage()); + renderWindowWidget->SetCornerAnnotationText(renderWindowWidgetName.toStdString()/*cornerAnnotation*/); + + AddRenderWindowWidget(renderWindowWidgetName, renderWindowWidget); +} + +void QmitkCustomMultiWidget::FillMultiWidgetLayout() +{ + for (int row = 0; row < GetRowCount(); ++row) + { + for (int column = 0; column < GetColumnCount(); ++column) + { + RenderWindowWidgetPointer renderWindowWidget = GetRenderWindowWidget(row, column); + if (nullptr != renderWindowWidget) + { + m_GridLayout->addWidget(renderWindowWidget.get(), row, column); + SetActiveRenderWindowWidget(renderWindowWidget); + } + } + } +} diff --git a/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/src/QmitkCustomMultiWidget.h b/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/src/QmitkCustomMultiWidget.h new file mode 100644 index 0000000000..da78f293d1 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/src/QmitkCustomMultiWidget.h @@ -0,0 +1,66 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical Image Computing. +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 QMITKCUSTOMMULTIWIDGET_H +#define QMITKCUSTOMMULTIWIDGET_H + +// custom multi widget editor +#include + +// mitk qt widgets module +#include "QmitkAbstractMultiWidget.h" + +class QGridLayout; + +/** +* @brief The 'QmitkCustomMultiWidget' is a 'QmitkAbstractMultiWidget' that is used to display multiple render windows at once. +* +* Render windows can dynamically be added and removed to change the layout of the multi widget. +*/ +class CUSTOMMULTIWIDGETEDITOR_EXPORT QmitkCustomMultiWidget : public QmitkAbstractMultiWidget +{ + Q_OBJECT + +public: + + QmitkCustomMultiWidget(QWidget* parent = 0, + Qt::WindowFlags f = 0, + mitk::RenderingManager* renderingManager = nullptr, + mitk::BaseRenderer::RenderingMode::Type renderingMode = mitk::BaseRenderer::RenderingMode::Standard, + const QString& multiWidgetName = "custommulti"); + + virtual ~QmitkCustomMultiWidget() override; + + void InitializeRenderWindowWidgets(); + +private: + + /** + * @brief Overridden from QmitkAbstractMultiWidget + */ + virtual void InitializeGUI() override; + /** + * @brief Overridden from QmitkAbstractMultiWidget + */ + virtual void SetLayoutImpl() override; + + void CreateRenderWindowWidget(const std::string& cornerAnnotation = ""); + void FillMultiWidgetLayout(); + + QGridLayout* m_GridLayout; +}; + +#endif // QMITKCUSTOMMULTIWIDGET_H diff --git a/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/src/QmitkCustomMultiWidgetEditor.cpp b/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/src/QmitkCustomMultiWidgetEditor.cpp index e0e71db4ae..decb9fb5f2 100644 --- a/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/src/QmitkCustomMultiWidgetEditor.cpp +++ b/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/src/QmitkCustomMultiWidgetEditor.cpp @@ -1,268 +1,183 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical Image Computing. 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 "QmitkCustomMultiWidgetEditor.h" +#include "QmitkCustomMultiWidget.h" #include #include #include -#include #include -// custom multi widget editor plugin -#include "QmitkMultiWidgetDecorationManager.h" - // mitk qt widgets module -#include +#include #include #include +// mitk render window manager +#include + +// qt +#include + const QString QmitkCustomMultiWidgetEditor::EDITOR_ID = "org.mitk.editors.custommultiwidget"; class QmitkCustomMultiWidgetEditor::Impl final { public: Impl(); - ~Impl(); void SetControlledRenderer(); - QmitkCustomMultiWidget* m_CustomMultiWidget; QmitkInteractionSchemeToolBar* m_InteractionSchemeToolBar; QmitkMultiWidgetConfigurationToolBar* m_ConfigurationToolBar; - std::unique_ptr m_MultiWidgetDecorationManager; - std::unique_ptr m_RenderWindowViewDirectionController; }; QmitkCustomMultiWidgetEditor::Impl::Impl() - : m_CustomMultiWidget(nullptr) - , m_InteractionSchemeToolBar(nullptr) + : m_InteractionSchemeToolBar(nullptr) , m_ConfigurationToolBar(nullptr) { // nothing here } -QmitkCustomMultiWidgetEditor::Impl::~Impl() -{ - // nothing here -} - void QmitkCustomMultiWidgetEditor::Impl::SetControlledRenderer() { - if (nullptr == m_RenderWindowViewDirectionController || nullptr == m_CustomMultiWidget) + /* + if (nullptr == m_RenderWindowViewDirectionController || nullptr == GetMultiWidget()) { return; } RenderWindowLayerUtilities::RendererVector controlledRenderer; auto renderWindowWidgets = m_CustomMultiWidget->GetRenderWindowWidgets(); for (const auto& renderWindowWidget : renderWindowWidgets) { auto renderWindow = renderWindowWidget.second->GetRenderWindow(); auto vtkRenderWindow = renderWindow->GetRenderWindow(); mitk::BaseRenderer* baseRenderer = mitk::BaseRenderer::GetInstance(vtkRenderWindow); if (nullptr != baseRenderer) { controlledRenderer.push_back(baseRenderer); } } m_RenderWindowViewDirectionController->SetControlledRenderer(controlledRenderer); + */ } ////////////////////////////////////////////////////////////////////////// // QmitkCustomMultiWidgetEditor ////////////////////////////////////////////////////////////////////////// QmitkCustomMultiWidgetEditor::QmitkCustomMultiWidgetEditor() : m_Impl(new Impl()) { // nothing here } -QmitkCustomMultiWidgetEditor::~QmitkCustomMultiWidgetEditor() -{ - // nothing here -} - -QmitkRenderWindow* QmitkCustomMultiWidgetEditor::GetActiveQmitkRenderWindow() const -{ - if (nullptr != m_Impl->m_CustomMultiWidget) - { - auto activeRenderWindowWidget = m_Impl->m_CustomMultiWidget->GetActiveRenderWindowWidget(); - if (nullptr != activeRenderWindowWidget) - { - return activeRenderWindowWidget->GetRenderWindow(); - } - } - - return nullptr; -} - -QHash QmitkCustomMultiWidgetEditor::GetQmitkRenderWindows() const -{ - QHash result; - if (nullptr == m_Impl->m_CustomMultiWidget) - { - return result; - } - - result = m_Impl->m_CustomMultiWidget->GetRenderWindows(); - return result; -} - -QmitkRenderWindow* QmitkCustomMultiWidgetEditor::GetQmitkRenderWindow(const QString& id) const -{ - if (nullptr == m_Impl->m_CustomMultiWidget) - { - return nullptr; - } - - return m_Impl->m_CustomMultiWidget->GetRenderWindow(id); -} - -mitk::Point3D QmitkCustomMultiWidgetEditor::GetSelectedPosition(const QString& id) const -{ - if (nullptr == m_Impl->m_CustomMultiWidget) - { - return mitk::Point3D(); - } - - return m_Impl->m_CustomMultiWidget->GetSelectedPosition(id); -} - -void QmitkCustomMultiWidgetEditor::SetSelectedPosition(const mitk::Point3D& pos, const QString& id) -{ - if (nullptr != m_Impl->m_CustomMultiWidget) - { - m_Impl->m_CustomMultiWidget->SetSelectedPosition(id, pos); - } -} - -void QmitkCustomMultiWidgetEditor::EnableDecorations(bool enable, const QStringList& decorations) -{ - m_Impl->m_MultiWidgetDecorationManager->ShowDecorations(enable, decorations); -} - -bool QmitkCustomMultiWidgetEditor::IsDecorationEnabled(const QString& decoration) const -{ - return m_Impl->m_MultiWidgetDecorationManager->IsDecorationVisible(decoration); -} - -QStringList QmitkCustomMultiWidgetEditor::GetDecorations() const -{ - return m_Impl->m_MultiWidgetDecorationManager->GetDecorations(); -} - -QmitkCustomMultiWidget* QmitkCustomMultiWidgetEditor::GetCustomMultiWidget() -{ - return m_Impl->m_CustomMultiWidget; -} - -void QmitkCustomMultiWidgetEditor::OnLayoutSet(int row, int column) -{ - m_Impl->m_CustomMultiWidget->ResetLayout(row, column); - m_Impl->SetControlledRenderer(); - FirePropertyChange(berry::IWorkbenchPartConstants::PROP_INPUT); -} - -void QmitkCustomMultiWidgetEditor::OnSynchronize(bool synchronized) -{ - m_Impl->m_CustomMultiWidget->Synchronize(synchronized); -} +QmitkCustomMultiWidgetEditor::~QmitkCustomMultiWidgetEditor() {} void QmitkCustomMultiWidgetEditor::OnViewDirectionChanged(ViewDirection viewDirection) { m_Impl->m_RenderWindowViewDirectionController->SetViewDirectionOfRenderer(viewDirection); } ////////////////////////////////////////////////////////////////////////// // PRIVATE ////////////////////////////////////////////////////////////////////////// void QmitkCustomMultiWidgetEditor::SetFocus() { - if (nullptr != m_Impl->m_CustomMultiWidget) + const auto& multiWidget = GetMultiWidget(); + if (nullptr != multiWidget) { - m_Impl->m_CustomMultiWidget->setFocus(); + multiWidget->setFocus(); } } void QmitkCustomMultiWidgetEditor::CreateQtPartControl(QWidget* parent) { - if (nullptr == m_Impl->m_CustomMultiWidget) + auto multiWidget = GetMultiWidget(); + if (nullptr == multiWidget || nullptr == dynamic_cast(multiWidget)) { + // not multi widget set or multi widget is not of type 'QmitkCustomMultiWidget' QHBoxLayout* layout = new QHBoxLayout(parent); layout->setContentsMargins(0, 0, 0, 0); berry::IBerryPreferences* preferences = dynamic_cast(GetPreferences().GetPointer()); mitk::BaseRenderer::RenderingMode::Type renderingMode = static_cast(preferences->GetInt("Rendering Mode", 0)); - m_Impl->m_CustomMultiWidget = new QmitkCustomMultiWidget(parent, 0, 0, renderingMode); - + multiWidget = new QmitkCustomMultiWidget(parent, 0, 0, renderingMode); + SetMultiWidget(multiWidget); // create left toolbar: interaction scheme toolbar to switch how the render window navigation behaves if (nullptr == m_Impl->m_InteractionSchemeToolBar) { m_Impl->m_InteractionSchemeToolBar = new QmitkInteractionSchemeToolBar(parent); layout->addWidget(m_Impl->m_InteractionSchemeToolBar); } - m_Impl->m_InteractionSchemeToolBar->SetInteractionEventHandler(m_Impl->m_CustomMultiWidget->GetInteractionEventHandler()); + m_Impl->m_InteractionSchemeToolBar->SetInteractionEventHandler(multiWidget->GetInteractionEventHandler()); // add center widget: the custom multi widget - layout->addWidget(m_Impl->m_CustomMultiWidget); + layout->addWidget(multiWidget); - m_Impl->m_CustomMultiWidget->SetDataStorage(GetDataStorage()); - m_Impl->m_CustomMultiWidget->InitializeRenderWindowWidgets(); + multiWidget->SetDataStorage(GetDataStorage()); + dynamic_cast(multiWidget)->InitializeRenderWindowWidgets(); // create right toolbar: configuration toolbar to change the render window widget layout if (nullptr == m_Impl->m_ConfigurationToolBar) { - m_Impl->m_ConfigurationToolBar = new QmitkMultiWidgetConfigurationToolBar(m_Impl->m_CustomMultiWidget); + m_Impl->m_ConfigurationToolBar = new QmitkMultiWidgetConfigurationToolBar(multiWidget); layout->addWidget(m_Impl->m_ConfigurationToolBar); } - connect(m_Impl->m_ConfigurationToolBar, &QmitkMultiWidgetConfigurationToolBar::LayoutSet, this, &QmitkCustomMultiWidgetEditor::OnLayoutSet); + connect(m_Impl->m_ConfigurationToolBar, &QmitkMultiWidgetConfigurationToolBar::LayoutSet, this, &QmitkCustomMultiWidgetEditor::OnLayoutChanged); connect(m_Impl->m_ConfigurationToolBar, &QmitkMultiWidgetConfigurationToolBar::Synchronized, this, &QmitkCustomMultiWidgetEditor::OnSynchronize); connect(m_Impl->m_ConfigurationToolBar, &QmitkMultiWidgetConfigurationToolBar::ViewDirectionChanged, this, &QmitkCustomMultiWidgetEditor::OnViewDirectionChanged); - m_Impl->m_MultiWidgetDecorationManager = std::make_unique(m_Impl->m_CustomMultiWidget); + //m_Impl->m_MultiWidgetDecorationManager = std::make_unique(multiWidget); m_Impl->m_RenderWindowViewDirectionController = std::make_unique(); m_Impl->m_RenderWindowViewDirectionController->SetDataStorage(GetDataStorage()); m_Impl->SetControlledRenderer(); OnPreferencesChanged(preferences); } } void QmitkCustomMultiWidgetEditor::OnPreferencesChanged(const berry::IBerryPreferences* preferences) { - if (m_Impl->m_CustomMultiWidget->GetRenderWindowWidgets().empty()) + const auto& multiWidget = GetMultiWidget(); + if (nullptr == multiWidget) + { + return; + } + + if (multiWidget->GetRenderWindowWidgets().empty()) { return; } // update decoration preferences - m_Impl->m_MultiWidgetDecorationManager->DecorationPreferencesChanged(preferences); + //m_Impl->m_MultiWidgetDecorationManager->DecorationPreferencesChanged(preferences); // zooming and panning preferences bool constrainedZooming = preferences->GetBool("Use constrained zooming and panning", true); mitk::RenderingManager::GetInstance()->SetConstrainedPanningZooming(constrainedZooming); mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(GetDataStorage()); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } diff --git a/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/src/QmitkCustomMultiWidgetEditor.h b/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/src/QmitkCustomMultiWidgetEditor.h index 810afc14c7..0091b72af5 100644 --- a/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/src/QmitkCustomMultiWidgetEditor.h +++ b/Plugins/org.mitk.gui.qt.custommultiwidgeteditor/src/QmitkCustomMultiWidgetEditor.h @@ -1,109 +1,66 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical Image Computing. 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 QMITKCUSTOMMULTIWIDGETEDITOR_H #define QMITKCUSTOMMULTIWIDGETEDITOR_H -#include -#include +#include // custom multi widget editor #include -// mitk render window manager -#include +// mitk core +#include +// c++ #include -class QmitkCustomMultiWidget; - -class CUSTOMMULTIWIDGETEDITOR_EXPORT QmitkCustomMultiWidgetEditor final : public QmitkAbstractRenderEditor +class CUSTOMMULTIWIDGETEDITOR_EXPORT QmitkCustomMultiWidgetEditor final : public QmitkAbstractMultiWidgetEditor { Q_OBJECT public: using ViewDirection = mitk::SliceNavigationController::ViewDirection; - berryObjectMacro(QmitkCustomMultiWidgetEditor) - static const QString EDITOR_ID; QmitkCustomMultiWidgetEditor(); ~QmitkCustomMultiWidgetEditor(); - /** - * @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 Return the current custom multi widget of this editor. - */ - QmitkCustomMultiWidget* GetCustomMultiWidget(); - private Q_SLOTS: - void OnLayoutSet(int row, int column); - void OnSynchronize(bool synchronized); void OnViewDirectionChanged(ViewDirection viewDirection); private: /** * @brief Overridden from QmitkAbstractRenderEditor */ virtual void SetFocus() override; /** * @brief Overridden from QmitkAbstractRenderEditor : QtEditorPart */ virtual void CreateQtPartControl(QWidget* parent) override; /** * @brief Overridden from QmitkAbstractRenderEditor */ virtual void OnPreferencesChanged(const berry::IBerryPreferences* preferences) override; class Impl; const std::unique_ptr m_Impl; }; #endif // QMITKCUSTOMMULTIWIDGETEDITOR_H