diff --git a/Modules/QtWidgets/include/QmitkMultiWidgetLayoutManager.h b/Modules/QtWidgets/include/QmitkMultiWidgetLayoutManager.h index 891c413882..0c5b2dd6a1 100644 --- a/Modules/QtWidgets/include/QmitkMultiWidgetLayoutManager.h +++ b/Modules/QtWidgets/include/QmitkMultiWidgetLayoutManager.h @@ -1,82 +1,94 @@ /*=================================================================== 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 QMITKMULTIWIDGETLAYOUTMANAGER_H #define QMITKMULTIWIDGETLAYOUTMANAGER_H #include "MitkQtWidgetsExports.h" #include class QmitkAbstractMultiWidget; class QmitkRenderWindowWidget; /** * @brief * * */ class MITKQTWIDGETS_EXPORT QmitkMultiWidgetLayoutManager : public QObject { Q_OBJECT public: enum class LayoutDesign { DEFAULT = 0, ALL_2D_TOP_3D_BOTTOM, ALL_2D_LEFT_3D_RIGHT, ONE_BIG, ONLY_2D_HORIZONTAL, ONLY_2D_VERTICAL, ONE_TOP_3D_BOTTOM, ONE_LEFT_3D_RIGHT, ALL_HORIZONTAL, ALL_VERTICAL, REMOVE_ONE, NONE }; QmitkMultiWidgetLayoutManager(QmitkAbstractMultiWidget* multiwidget); + /** + * @brief This function is called by render window widgets. Given a specific + * layout design the layout of the multi widget data member is set with this method. + */ void OnLayoutDesignChanged(LayoutDesign layoutDesign); - -private: + /** + * @brief Allow setting the current render window widget without relying on the sending object. + * + * Calling 'OnLayoutDesignChanged' will overwrite the current render window widget but using the public + * layout setter the current render window widget cna be defined using the function. + * This is necessary for layouts that work with a specific selected render window widget. + */ + void SetCurrentRenderWindowWidget(QmitkRenderWindowWidget* renderWindowWidget); void SetDefaultLayout(); void SetAll2DTop3DBottomLayout(); void SetAll2DLeft3DRightLayout(); void SetOneBigLayout(); void SetOnly2DHorizontalLayout(); void SetOnly2DVerticalLayout(); void SetOneTop3DBottomLayout(); void SetOneLeft3DRightLayout(); void SetAllHorizontalLayout(); void SetAllVerticalLayout(); void RemoveOneLayout(); +private: + QmitkAbstractMultiWidget* m_MultiWidget; QmitkRenderWindowWidget* m_CurrentRenderWindowWidget; }; #endif // QMITKMULTIWIDGETLAYOUTMANAGER_H diff --git a/Modules/QtWidgets/src/QmitkMultiWidgetLayoutManager.cpp b/Modules/QtWidgets/src/QmitkMultiWidgetLayoutManager.cpp index 63ae2a54be..7d6c3b0e69 100644 --- a/Modules/QtWidgets/src/QmitkMultiWidgetLayoutManager.cpp +++ b/Modules/QtWidgets/src/QmitkMultiWidgetLayoutManager.cpp @@ -1,449 +1,536 @@ /*=================================================================== 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 "QmitkMultiWidgetLayoutManager.h" #include #include #include #include // qt #include #include QmitkMultiWidgetLayoutManager::QmitkMultiWidgetLayoutManager(QmitkAbstractMultiWidget* multiwidget) : QObject(multiwidget) , m_MultiWidget(multiwidget) , m_CurrentRenderWindowWidget(nullptr) { // nothing here } void QmitkMultiWidgetLayoutManager::OnLayoutDesignChanged(LayoutDesign layoutDesign) { if (nullptr == m_MultiWidget) { return; } // retrieve the render window name from the sending render window auto renderWindow = dynamic_cast(QObject::sender()); m_CurrentRenderWindowWidget = m_MultiWidget->GetRenderWindowWidget(renderWindow).get(); - m_MultiWidget->ActivateMenuWidget(false); - switch (layoutDesign) { case LayoutDesign::DEFAULT: { SetDefaultLayout(); break; } case LayoutDesign::ALL_2D_TOP_3D_BOTTOM: { SetAll2DTop3DBottomLayout(); break; } case LayoutDesign::ALL_2D_LEFT_3D_RIGHT: { SetAll2DLeft3DRightLayout(); break; } case LayoutDesign::ONE_BIG: { SetOneBigLayout(); break; } case LayoutDesign::ONLY_2D_HORIZONTAL: { SetOnly2DHorizontalLayout(); break; } case LayoutDesign::ONLY_2D_VERTICAL: { SetOnly2DVerticalLayout(); break; } case LayoutDesign::ONE_TOP_3D_BOTTOM: { SetOneTop3DBottomLayout(); break; } case LayoutDesign::ONE_LEFT_3D_RIGHT: { SetOneLeft3DRightLayout(); break; } case LayoutDesign::ALL_HORIZONTAL: { SetAllHorizontalLayout(); break; } case LayoutDesign::ALL_VERTICAL: { SetAllVerticalLayout(); break; } case LayoutDesign::REMOVE_ONE: { RemoveOneLayout(); break; } }; - - m_MultiWidget->ActivateMenuWidget(true); - - if (LayoutDesign::REMOVE_ONE == layoutDesign) - { - auto allRenderWindows = m_MultiWidget->GetRenderWindows(); - for (auto& renderWindow : allRenderWindows) - { - renderWindow->SetLayoutDesign(LayoutDesign::NONE); - } - - m_CurrentRenderWindowWidget->GetRenderWindow()->SetLayoutDesign(LayoutDesign::REMOVE_ONE); - } - else - { - auto allRenderWindows = m_MultiWidget->GetRenderWindows(); - for (auto& renderWindow : allRenderWindows) - { - renderWindow->SetLayoutDesign(layoutDesign); - } - } } void QmitkMultiWidgetLayoutManager::SetDefaultLayout() { MITK_INFO << "Set default layout" << std::endl; + m_MultiWidget->ActivateMenuWidget(false); + delete m_MultiWidget->layout(); auto hBoxLayout = new QHBoxLayout(m_MultiWidget); hBoxLayout->setContentsMargins(0, 0, 0, 0); m_MultiWidget->setLayout(hBoxLayout); hBoxLayout->setMargin(0); auto mainSplit = new QSplitter(Qt::Vertical, m_MultiWidget); hBoxLayout->addWidget(mainSplit); QList splitterSizeRow; for (int row = 0; row < m_MultiWidget->GetRowCount(); ++row) { splitterSizeRow.push_back(1000); QList splitterSizeColumn; auto splitter = new QSplitter(mainSplit); for (int column = 0; column < m_MultiWidget->GetColumnCount(); ++column) { splitterSizeColumn.push_back(1000); auto renderWindowWidget = m_MultiWidget->GetRenderWindowWidget(row, column); splitter->addWidget(renderWindowWidget.get()); renderWindowWidget->show(); } splitter->setSizes(splitterSizeColumn); } mainSplit->setSizes(splitterSizeRow); + + m_MultiWidget->ActivateMenuWidget(true); + + auto allRenderWindows = m_MultiWidget->GetRenderWindows(); + for (auto& renderWindow : allRenderWindows) + { + renderWindow->LayoutDesignListChanged(LayoutDesign::DEFAULT); + } } void QmitkMultiWidgetLayoutManager::SetAll2DTop3DBottomLayout() { MITK_INFO << "Set all 2D top and 3D bottom layout" << std::endl; + m_MultiWidget->ActivateMenuWidget(false); + delete m_MultiWidget->layout(); auto hBoxLayout = new QHBoxLayout(m_MultiWidget); hBoxLayout->setContentsMargins(0, 0, 0, 0); m_MultiWidget->setLayout(hBoxLayout); hBoxLayout->setMargin(0); auto mainSplit = new QSplitter(Qt::Vertical, m_MultiWidget); hBoxLayout->addWidget(mainSplit); auto subSplit2D = new QSplitter(mainSplit); QList splitterSize; auto all2DRenderWindowWidgets = m_MultiWidget->Get2DRenderWindowWidgets(); for (const auto& renderWindowWidget : all2DRenderWindowWidgets) { subSplit2D->addWidget(renderWindowWidget.second.get()); renderWindowWidget.second->show(); splitterSize.push_back(1000); } subSplit2D->setSizes(splitterSize); auto subSplit3D = new QSplitter(mainSplit); splitterSize.clear(); auto all3DRenderWindowWidgets = m_MultiWidget->Get3DRenderWindowWidgets(); for (const auto& renderWindowWidget : all3DRenderWindowWidgets) { subSplit3D->addWidget(renderWindowWidget.second.get()); renderWindowWidget.second->show(); splitterSize.push_back(1000); } subSplit3D->setSizes(splitterSize); // set size for main splitter splitterSize.clear(); splitterSize.push_back(600); splitterSize.push_back(1000); mainSplit->setSizes(splitterSize); + + m_MultiWidget->ActivateMenuWidget(true); + + auto allRenderWindows = m_MultiWidget->GetRenderWindows(); + for (auto& renderWindow : allRenderWindows) + { + renderWindow->LayoutDesignListChanged(LayoutDesign::ALL_2D_TOP_3D_BOTTOM); + } } void QmitkMultiWidgetLayoutManager::SetAll2DLeft3DRightLayout() { MITK_INFO << "Set all 2D left and 3D right layout" << std::endl; + m_MultiWidget->ActivateMenuWidget(false); + delete m_MultiWidget->layout(); auto hBoxLayout = new QHBoxLayout(m_MultiWidget); hBoxLayout->setContentsMargins(0, 0, 0, 0); m_MultiWidget->setLayout(hBoxLayout); hBoxLayout->setMargin(0); auto mainSplit = new QSplitter(m_MultiWidget); hBoxLayout->addWidget(mainSplit); auto subSplit2D = new QSplitter(Qt::Vertical, mainSplit); QList splitterSize; auto all2DRenderWindowWidgets = m_MultiWidget->Get2DRenderWindowWidgets(); for (const auto& renderWindowWidget : all2DRenderWindowWidgets) { subSplit2D->addWidget(renderWindowWidget.second.get()); renderWindowWidget.second->show(); splitterSize.push_back(1000); } subSplit2D->setSizes(splitterSize); auto subSplit3D = new QSplitter( mainSplit); splitterSize.clear(); auto all3DRenderWindowWidgets = m_MultiWidget->Get3DRenderWindowWidgets(); for (const auto& renderWindowWidget : all3DRenderWindowWidgets) { subSplit3D->addWidget(renderWindowWidget.second.get()); renderWindowWidget.second->show(); splitterSize.push_back(1000); } subSplit3D->setSizes(splitterSize); // set size for main splitter splitterSize.clear(); splitterSize.push_back(600); splitterSize.push_back(1000); mainSplit->setSizes(splitterSize); + + m_MultiWidget->ActivateMenuWidget(true); + + auto allRenderWindows = m_MultiWidget->GetRenderWindows(); + for (auto& renderWindow : allRenderWindows) + { + renderWindow->LayoutDesignListChanged(LayoutDesign::ALL_2D_LEFT_3D_RIGHT); + } } void QmitkMultiWidgetLayoutManager::SetOneBigLayout() { MITK_INFO << "Set single 2D layout" << std::endl; + m_MultiWidget->ActivateMenuWidget(false); + delete m_MultiWidget->layout(); auto hBoxLayout = new QHBoxLayout(m_MultiWidget); hBoxLayout->setContentsMargins(0, 0, 0, 0); m_MultiWidget->setLayout(hBoxLayout); hBoxLayout->setMargin(0); auto mainSplit = new QSplitter(m_MultiWidget); hBoxLayout->addWidget(mainSplit); mainSplit->addWidget(m_CurrentRenderWindowWidget); m_CurrentRenderWindowWidget->show(); + + m_MultiWidget->ActivateMenuWidget(true); + + auto allRenderWindows = m_MultiWidget->GetRenderWindows(); + for (auto& renderWindow : allRenderWindows) + { + renderWindow->LayoutDesignListChanged(LayoutDesign::ONE_BIG); + } } void QmitkMultiWidgetLayoutManager::SetOnly2DHorizontalLayout() { MITK_INFO << "Set only 2D layout" << std::endl; + m_MultiWidget->ActivateMenuWidget(false); + delete m_MultiWidget->layout(); auto hBoxLayout = new QHBoxLayout(m_MultiWidget); hBoxLayout->setContentsMargins(0, 0, 0, 0); m_MultiWidget->setLayout(hBoxLayout); hBoxLayout->setMargin(0); auto mainSplit = new QSplitter(m_MultiWidget); hBoxLayout->addWidget(mainSplit); QList splitterSize; auto all2DRenderWindowWidgets = m_MultiWidget->Get2DRenderWindowWidgets(); for (const auto& renderWindowWidget : all2DRenderWindowWidgets) { mainSplit->addWidget(renderWindowWidget.second.get()); renderWindowWidget.second->show(); splitterSize.push_back(1000); } mainSplit->setSizes(splitterSize); + + m_MultiWidget->ActivateMenuWidget(true); + + auto allRenderWindows = m_MultiWidget->GetRenderWindows(); + for (auto& renderWindow : allRenderWindows) + { + renderWindow->LayoutDesignListChanged(LayoutDesign::ONLY_2D_HORIZONTAL); + } } void QmitkMultiWidgetLayoutManager::SetOnly2DVerticalLayout() { MITK_INFO << "Set only 2D layout" << std::endl; + m_MultiWidget->ActivateMenuWidget(false); + delete m_MultiWidget->layout(); auto hBoxLayout = new QHBoxLayout(m_MultiWidget); hBoxLayout->setContentsMargins(0, 0, 0, 0); m_MultiWidget->setLayout(hBoxLayout); hBoxLayout->setMargin(0); auto mainSplit = new QSplitter(Qt::Vertical, m_MultiWidget); hBoxLayout->addWidget(mainSplit); QList splitterSize; auto all2DRenderWindowWidgets = m_MultiWidget->Get2DRenderWindowWidgets(); for (const auto& renderWindowWidget : all2DRenderWindowWidgets) { mainSplit->addWidget(renderWindowWidget.second.get()); renderWindowWidget.second->show(); splitterSize.push_back(1000); } mainSplit->setSizes(splitterSize); + + m_MultiWidget->ActivateMenuWidget(true); + + auto allRenderWindows = m_MultiWidget->GetRenderWindows(); + for (auto& renderWindow : allRenderWindows) + { + renderWindow->LayoutDesignListChanged(LayoutDesign::ONLY_2D_VERTICAL); + } } void QmitkMultiWidgetLayoutManager::SetOneTop3DBottomLayout() { MITK_INFO << "Set one 2D top and 3D bottom layout" << std::endl; + m_MultiWidget->ActivateMenuWidget(false); + delete m_MultiWidget->layout(); auto hBoxLayout = new QHBoxLayout(m_MultiWidget); hBoxLayout->setContentsMargins(0, 0, 0, 0); m_MultiWidget->setLayout(hBoxLayout); hBoxLayout->setMargin(0); auto mainSplit = new QSplitter(Qt::Vertical, m_MultiWidget); hBoxLayout->addWidget(mainSplit); mainSplit->addWidget(m_CurrentRenderWindowWidget); m_CurrentRenderWindowWidget->show(); auto subSplit3D = new QSplitter(mainSplit); QList splitterSize; auto all3DRenderWindowWidgets = m_MultiWidget->Get3DRenderWindowWidgets(); for (const auto& renderWindowWidget : all3DRenderWindowWidgets) { subSplit3D->addWidget(renderWindowWidget.second.get()); renderWindowWidget.second->show(); splitterSize.push_back(1000); } subSplit3D->setSizes(splitterSize); // set size for main splitter splitterSize.clear(); splitterSize.push_back(1000); splitterSize.push_back(1000); mainSplit->setSizes(splitterSize); + + m_MultiWidget->ActivateMenuWidget(true); + + auto allRenderWindows = m_MultiWidget->GetRenderWindows(); + for (auto& renderWindow : allRenderWindows) + { + renderWindow->LayoutDesignListChanged(LayoutDesign::ONE_TOP_3D_BOTTOM); + } } void QmitkMultiWidgetLayoutManager::SetOneLeft3DRightLayout() { MITK_INFO << "Set one 2D left and 3D right layout" << std::endl; + m_MultiWidget->ActivateMenuWidget(false); + delete m_MultiWidget->layout(); auto hBoxLayout = new QHBoxLayout(m_MultiWidget); hBoxLayout->setContentsMargins(0, 0, 0, 0); m_MultiWidget->setLayout(hBoxLayout); hBoxLayout->setMargin(0); auto mainSplit = new QSplitter(m_MultiWidget); hBoxLayout->addWidget(mainSplit); mainSplit->addWidget(m_CurrentRenderWindowWidget); m_CurrentRenderWindowWidget->show(); auto subSplit3D = new QSplitter(Qt::Vertical, mainSplit); QList splitterSize; auto all3DRenderWindowWidgets = m_MultiWidget->Get3DRenderWindowWidgets(); for (const auto& renderWindowWidget : all3DRenderWindowWidgets) { subSplit3D->addWidget(renderWindowWidget.second.get()); renderWindowWidget.second->show(); splitterSize.push_back(1000); } subSplit3D->setSizes(splitterSize); // set size for main splitter splitterSize.clear(); splitterSize.push_back(1000); splitterSize.push_back(1000); mainSplit->setSizes(splitterSize); + + m_MultiWidget->ActivateMenuWidget(true); + + auto allRenderWindows = m_MultiWidget->GetRenderWindows(); + for (auto& renderWindow : allRenderWindows) + { + renderWindow->LayoutDesignListChanged(LayoutDesign::ONE_LEFT_3D_RIGHT); + } } void QmitkMultiWidgetLayoutManager::SetAllHorizontalLayout() { MITK_INFO << "Set default layout" << std::endl; + m_MultiWidget->ActivateMenuWidget(false); + delete m_MultiWidget->layout(); auto hBoxLayout = new QHBoxLayout(m_MultiWidget); hBoxLayout->setContentsMargins(0, 0, 0, 0); m_MultiWidget->setLayout(hBoxLayout); hBoxLayout->setMargin(0); auto mainSplit = new QSplitter(m_MultiWidget); hBoxLayout->addWidget(mainSplit); QList splitterSize; auto allRenderWindowWidgets = m_MultiWidget->GetRenderWindowWidgets(); for (const auto& renderWindowWidget : allRenderWindowWidgets) { if (nullptr != renderWindowWidget.second) { mainSplit->addWidget(renderWindowWidget.second.get()); renderWindowWidget.second->show(); splitterSize.push_back(1000); } } // set size for main splitter mainSplit->setSizes(splitterSize); + + m_MultiWidget->ActivateMenuWidget(true); + + auto allRenderWindows = m_MultiWidget->GetRenderWindows(); + for (auto& renderWindow : allRenderWindows) + { + renderWindow->LayoutDesignListChanged(LayoutDesign::ALL_HORIZONTAL); + } } void QmitkMultiWidgetLayoutManager::SetAllVerticalLayout() { MITK_INFO << "Set all vertical" << std::endl; + m_MultiWidget->ActivateMenuWidget(false); + delete m_MultiWidget->layout(); auto hBoxLayout = new QHBoxLayout(m_MultiWidget); hBoxLayout->setContentsMargins(0, 0, 0, 0); m_MultiWidget->setLayout(hBoxLayout); hBoxLayout->setMargin(0); auto mainSplit = new QSplitter(Qt::Vertical, m_MultiWidget); hBoxLayout->addWidget(mainSplit); QList splitterSize; auto allRenderWindowWidgets = m_MultiWidget->GetRenderWindowWidgets(); for (const auto& renderWindowWidget : allRenderWindowWidgets) { mainSplit->addWidget(renderWindowWidget.second.get()); renderWindowWidget.second->show(); splitterSize.push_back(1000); } // set size for splitter mainSplit->setSizes(splitterSize); + + m_MultiWidget->ActivateMenuWidget(true); + + auto allRenderWindows = m_MultiWidget->GetRenderWindows(); + for (auto& renderWindow : allRenderWindows) + { + renderWindow->LayoutDesignListChanged(LayoutDesign::ALL_VERTICAL); + } } void QmitkMultiWidgetLayoutManager::RemoveOneLayout() { MITK_INFO << "Remove single render window" << std::endl; + m_MultiWidget->ActivateMenuWidget(false); + m_CurrentRenderWindowWidget->hide(); + + m_MultiWidget->ActivateMenuWidget(true); + + auto allRenderWindows = m_MultiWidget->GetRenderWindows(); + for (auto& renderWindow : allRenderWindows) + { + renderWindow->LayoutDesignListChanged(LayoutDesign::NONE); + } }