From 66896f8330768f27475f54615bec5ad67ad376f0 Mon Sep 17 00:00:00 2001 From: jonjenssen <69144954+jonjenssen@users.noreply.github.com> Date: Thu, 7 Jul 2022 12:03:02 +0200 Subject: [PATCH] New dockingsystem (#9116) * Use Qt Advanced Docking as forked submodule * Use new docking system in code --- .gitmodules | 2 +- ApplicationExeCode/CMakeLists.txt | 4 + .../Application/RiaGuiApplication.cpp | 1 - ApplicationLibCode/Commands/CMakeLists.txt | 4 +- .../ProjectDataModel/RimMainPlotCollection.h | 1 - .../Summary/RimSummaryPlotManager.h | 2 +- .../UserInterface/RiuDockWidgetTools.cpp | 61 ++--- .../UserInterface/RiuDockWidgetTools.h | 19 +- .../UserInterface/RiuMainWindow.cpp | 236 ++++++------------ .../UserInterface/RiuMainWindow.h | 10 +- .../UserInterface/RiuMainWindowBase.cpp | 169 ++++++++++++- .../UserInterface/RiuMainWindowBase.h | 25 +- .../UserInterface/RiuMessagePanel.cpp | 11 +- .../UserInterface/RiuMessagePanel.h | 3 +- .../UserInterface/RiuPlotMainWindow.cpp | 149 +++++------ .../UserInterface/RiuPlotMainWindow.h | 4 +- .../UserInterface/RiuProcessMonitor.cpp | 2 +- .../UserInterface/RiuProcessMonitor.h | 3 +- .../UserInterface/RiuPvtPlotPanel.cpp | 4 +- .../UserInterface/RiuPvtPlotPanel.h | 3 +- .../RiuRelativePermeabilityPlotPanel.cpp | 3 +- .../RiuRelativePermeabilityPlotPanel.h | 3 +- .../UserInterface/RiuResultInfoPanel.cpp | 4 +- .../UserInterface/RiuResultInfoPanel.h | 3 +- CMakeLists.txt | 28 +-- ThirdParty/qtadvanceddocking | 2 +- 26 files changed, 408 insertions(+), 348 deletions(-) diff --git a/.gitmodules b/.gitmodules index c212beaf20..7b2b5f8413 100644 --- a/.gitmodules +++ b/.gitmodules @@ -9,4 +9,4 @@ url = https://github.com/fastfloat/fast_float [submodule "ThirdParty/qtadvanceddocking"] path = ThirdParty/qtadvanceddocking - url = https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System.git + url = https://github.com/CeetronSolutions/qtadvanceddocking.git diff --git a/ApplicationExeCode/CMakeLists.txt b/ApplicationExeCode/CMakeLists.txt index 443e6c5b40..6212817d17 100644 --- a/ApplicationExeCode/CMakeLists.txt +++ b/ApplicationExeCode/CMakeLists.txt @@ -287,6 +287,10 @@ endif() target_link_libraries(ResInsight ${LINK_LIBRARIES}) +if(UNIX AND NOT APPLE) + target_link_libraries(ResInsight xcb) +endif() + # ############################################################################## # Unity builds # ############################################################################## diff --git a/ApplicationLibCode/Application/RiaGuiApplication.cpp b/ApplicationLibCode/Application/RiaGuiApplication.cpp index 86d1d0f1a7..6fefcf5d8c 100644 --- a/ApplicationLibCode/Application/RiaGuiApplication.cpp +++ b/ApplicationLibCode/Application/RiaGuiApplication.cpp @@ -989,7 +989,6 @@ void RiaGuiApplication::createMainPlotWindow() m_mainPlotWindow->setWindowTitle( "Plots - ResInsight" ); m_mainPlotWindow->setDefaultWindowSize(); m_mainPlotWindow->loadWinGeoAndDockToolBarLayout(); - m_mainPlotWindow->hideAllDockWidgets(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/CMakeLists.txt b/ApplicationLibCode/Commands/CMakeLists.txt index 238341ac98..7297fa3543 100644 --- a/ApplicationLibCode/Commands/CMakeLists.txt +++ b/ApplicationLibCode/Commands/CMakeLists.txt @@ -62,9 +62,11 @@ add_library( target_include_directories( ${PROJECT_NAME} - PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/ThirdParty + PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_SOURCE_DIR}/ThirdParty ${CMAKE_SOURCE_DIR}/ThirdParty/custom-opm-common/generated-opm-common ${CMAKE_SOURCE_DIR}/ThirdParty/custom-opm-common/opm-common + ${CMAKE_SOURCE_DIR}/ThirdParty/qtadvanceddocking/src ) if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") diff --git a/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.h b/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.h index 9114c8da08..0dd87c344c 100644 --- a/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.h +++ b/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.h @@ -23,7 +23,6 @@ #include "cafPdmField.h" #include "cafPdmObject.h" -#include #include class RimAnalysisPlotCollection; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotManager.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotManager.h index 913f3d7dda..83b0bd4488 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotManager.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotManager.h @@ -61,7 +61,7 @@ private: void onSelectionManagerSelectionChanged( const std::set& changedSelectionLevels ) override; - // Override eventFilter to be able to track key events from QDockWidget + // Override eventFilter to be able to track key events from QWidget bool eventFilter( QObject* obj, QEvent* event ) override; void updateCurveCandidates(); diff --git a/ApplicationLibCode/UserInterface/RiuDockWidgetTools.cpp b/ApplicationLibCode/UserInterface/RiuDockWidgetTools.cpp index 2b759b319e..f8c8009759 100644 --- a/ApplicationLibCode/UserInterface/RiuDockWidgetTools.cpp +++ b/ApplicationLibCode/UserInterface/RiuDockWidgetTools.cpp @@ -25,7 +25,9 @@ #include "cvfAssert.h" -#include +#include "DockManager.h" +#include "DockWidget.h" + #include //-------------------------------------------------------------------------------------------------- @@ -243,27 +245,17 @@ QMap RiuDockWidgetTools::widgetVisibilitiesForGeoMech() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QDockWidget* RiuDockWidgetTools::findDockWidget( const QObject* parent, const QString& dockWidgetName ) +ads::CDockWidget* RiuDockWidgetTools::findDockWidget( const ads::CDockManager* dockManager, const QString& dockWidgetName ) { - QList dockWidgets = parent->findChildren(); - - for ( QDockWidget* dock : dockWidgets ) - { - if ( dock->objectName() == dockWidgetName ) - { - return dock; - } - } - - return nullptr; + return dockManager->findDockWidget( dockWidgetName ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QAction* RiuDockWidgetTools::toggleActionForWidget( const QObject* parent, const QString& dockWidgetName ) +QAction* RiuDockWidgetTools::toggleActionForWidget( const ads::CDockManager* dockManager, const QString& dockWidgetName ) { - auto w = RiuDockWidgetTools::findDockWidget( parent, dockWidgetName ); + auto w = findDockWidget( dockManager, dockWidgetName ); if ( w ) { return w->toggleViewAction(); @@ -282,7 +274,7 @@ void RiuDockWidgetTools::setVisibleDockingWindowsForEclipse() RiuMainWindow* mainWindow = RiuMainWindow::instance(); auto widgetVisibilities = widgetVisibilitiesForEclipse(); - applyDockWidgetVisibilities( mainWindow, widgetVisibilities ); + applyDockWidgetVisibilities( mainWindow->dockManager(), widgetVisibilities ); } //-------------------------------------------------------------------------------------------------- @@ -295,15 +287,17 @@ void RiuDockWidgetTools::setVisibleDockingWindowsForGeoMech() RiuMainWindow* mainWindow = RiuMainWindow::instance(); auto widgetVisibilities = widgetVisibilitiesForGeoMech(); - applyDockWidgetVisibilities( mainWindow, widgetVisibilities ); + applyDockWidgetVisibilities( mainWindow->dockManager(), widgetVisibilities ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuDockWidgetTools::setDockWidgetVisibility( const QObject* parent, const QString& dockWidgetName, bool isVisible ) +void RiuDockWidgetTools::setDockWidgetVisibility( const ads::CDockManager* dockManager, + const QString& dockWidgetName, + bool isVisible ) { - QDockWidget* dockWidget = findDockWidget( parent, dockWidgetName ); + ads::CDockWidget* dockWidget = findDockWidget( dockManager, dockWidgetName ); if ( dockWidget ) { dockWidget->setVisible( isVisible ); @@ -313,20 +307,18 @@ void RiuDockWidgetTools::setDockWidgetVisibility( const QObject* parent, const Q //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QVariant RiuDockWidgetTools::dockWidgetsVisibility( const QObject* parent ) +QVariant RiuDockWidgetTools::dockWidgetsVisibility( const ads::CDockManager* dockManager ) { QMap widgetVisibility; - QList dockWidgets = parent->findChildren(); + auto dockWidgets = dockManager->dockWidgetsMap(); - for ( QDockWidget* dock : dockWidgets ) + for ( auto dock : dockWidgets ) { if ( dock ) { bool isVisible = dock->isVisible(); widgetVisibility[dock->objectName()] = isVisible; - - // qDebug() << "Store " << dock->objectName() << " : " << (isVisible ? "visible" : "not visible"); } } @@ -356,17 +348,16 @@ void RiuDockWidgetTools::workaroundForQwtDockWidgets() RiuMainWindow* mainWindow = RiuMainWindow::instance(); - QList dockWidgets = mainWindow->findChildren(); - dockWidgets.removeAll( nullptr ); + auto dockWidgets = mainWindow->dockManager()->dockWidgetsMap(); - for ( QDockWidget* dock : dockWidgets ) + for ( auto dock : dockWidgets ) { - dock->setVisible( false ); + if ( dock ) dock->setVisible( false ); } QApplication::processEvents(); { - auto dock = findDockWidget( mainWindow, relPermPlotName() ); + auto dock = mainWindow->dockManager()->findDockWidget( relPermPlotName() ); if ( dock ) { dock->setVisible( true ); @@ -374,7 +365,7 @@ void RiuDockWidgetTools::workaroundForQwtDockWidgets() } { - auto dock = findDockWidget( mainWindow, pvtPlotName() ); + auto dock = mainWindow->dockManager()->findDockWidget( pvtPlotName() ); if ( dock ) { dock->setVisible( true ); @@ -383,19 +374,19 @@ void RiuDockWidgetTools::workaroundForQwtDockWidgets() QApplication::processEvents(); - mainWindow->restoreDockWidgetVisibilities(); mainWindow->loadWinGeoAndDockToolBarLayout(); + mainWindow->restoreDockWidgetVisibilities(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuDockWidgetTools::applyDockWidgetVisibilities( const QObject* parent, +void RiuDockWidgetTools::applyDockWidgetVisibilities( const ads::CDockManager* dockManager, const QMap& widgetVisibilities ) { - QList dockWidgets = parent->findChildren(); + auto dockWidgets = dockManager->dockWidgetsMap(); - for ( QDockWidget* dock : dockWidgets ) + for ( auto dock : dockWidgets ) { if ( dock ) { @@ -408,8 +399,6 @@ void RiuDockWidgetTools::applyDockWidgetVisibilities( const QObject* } dock->setVisible( isVisible ); - - // qDebug() << "Restore " << dock->objectName() << " : " << (isVisible ? "visible" : "not visible"); } } } diff --git a/ApplicationLibCode/UserInterface/RiuDockWidgetTools.h b/ApplicationLibCode/UserInterface/RiuDockWidgetTools.h index dc96e9114b..b0da92517d 100644 --- a/ApplicationLibCode/UserInterface/RiuDockWidgetTools.h +++ b/ApplicationLibCode/UserInterface/RiuDockWidgetTools.h @@ -22,12 +22,17 @@ #include #include -class QDockWidget; class QObject; class QAction; class Rim3dView; +namespace ads +{ +class CDockWidget; +class CDockManager; +}; // namespace ads + //================================================================================================== // // @@ -61,9 +66,9 @@ public: static QString plotMainWindowMessagesName(); static QString plotMainWindowUndoStackName(); - static QAction* toggleActionForWidget( const QObject* parent, const QString& dockWidgetName ); + static QAction* toggleActionForWidget( const ads::CDockManager* dockManager, const QString& dockWidgetName ); - static QVariant dockWidgetsVisibility( const QObject* parent ); + static QVariant dockWidgetsVisibility( const ads::CDockManager* dockManager ); static QVariant defaultDockWidgetVisibilities(); static void workaroundForQwtDockWidgets(); @@ -71,10 +76,12 @@ public: static void setVisibleDockingWindowsForEclipse(); static void setVisibleDockingWindowsForGeoMech(); - static void setDockWidgetVisibility( const QObject* parent, const QString& dockWidgetName, bool isVisible ); - static void applyDockWidgetVisibilities( const QObject* parent, const QMap& visibilityMap ); + static void + setDockWidgetVisibility( const ads::CDockManager* dockManager, const QString& dockWidgetName, bool isVisible ); + static void applyDockWidgetVisibilities( const ads::CDockManager* dockManager, + const QMap& visibilityMap ); - static QDockWidget* findDockWidget( const QObject* parent, const QString& dockWidgetName ); + static ads::CDockWidget* findDockWidget( const ads::CDockManager*, const QString& dockWidgetName ); private: static QMap widgetVisibilitiesForEclipse(); diff --git a/ApplicationLibCode/UserInterface/RiuMainWindow.cpp b/ApplicationLibCode/UserInterface/RiuMainWindow.cpp index d5f071a79f..c2cb5e5cb1 100644 --- a/ApplicationLibCode/UserInterface/RiuMainWindow.cpp +++ b/ApplicationLibCode/UserInterface/RiuMainWindow.cpp @@ -82,11 +82,12 @@ #include "cvfTimer.h" +#include "DockAreaWidget.h" + #include #include #include #include -#include #include #include #include @@ -120,16 +121,16 @@ RiuMainWindow::RiuMainWindow() , m_relPermPlotPanel( nullptr ) , m_pvtPlotPanel( nullptr ) , m_mohrsCirclePlot( nullptr ) - , m_windowMenu( nullptr ) , m_holoLensToolBar( nullptr ) { setAttribute( Qt::WA_DeleteOnClose ); m_mdiArea = new RiuMdiArea( this ); connect( m_mdiArea, SIGNAL( subWindowActivated( QMdiSubWindow* ) ), SLOT( slotSubWindowActivated( QMdiSubWindow* ) ) ); - setCentralWidget( m_mdiArea ); - // m_mainViewer = createViewer(); + ads::CDockWidget* widget = new ads::CDockWidget( "3D Views", this ); + widget->setWidget( m_mdiArea ); + dockManager()->setCentralWidget( widget ); createActions(); createMenus(); @@ -741,22 +742,27 @@ void RiuMainWindow::createDockPanels() RiuDockWidgetTools::mainWindowDataSourceTreeName(), RiuDockWidgetTools::mainWindowScriptsTreeName() }; + const std::vector defaultDockWidgetArea{ ads::DockWidgetArea::LeftDockWidgetArea, + ads::DockWidgetArea::LeftDockWidgetArea, + ads::DockWidgetArea::LeftDockWidgetArea }; + createTreeViews( nTreeViews ); - QDockWidget* dockOntopOfWidget = nullptr; + std::vector rightWidgets; + std::vector leftWidgets; + std::vector bottomWidgets; for ( int i = 0; i < nTreeViews; i++ ) { - QDockWidget* dockWidget = new QDockWidget( treeViewTitles[i], this ); + ads::CDockWidget* dockWidget = new ads::CDockWidget( treeViewTitles[i], this ); dockWidget->setObjectName( treeViewDockNames[i] ); - dockWidget->setAllowedAreas( Qt::AllDockWidgetAreas ); caf::PdmUiTreeView* projectTree = projectTreeView( i ); projectTree->enableSelectionManagerUpdating( true ); - projectTree->enableAppendOfClassNameToUiItemText( RiaPreferencesSystem::current()->appendClassNameToUiText() ); dockWidget->setWidget( projectTree ); + dockWidget->hide(); projectTree->treeView()->setHeaderHidden( true ); projectTree->treeView()->setSelectionMode( QAbstractItemView::ExtendedSelection ); @@ -771,19 +777,11 @@ void RiuMainWindow::createDockPanels() RiuTreeViewEventFilter* treeViewEventFilter = new RiuTreeViewEventFilter( this, projectTree ); projectTree->treeView()->installEventFilter( treeViewEventFilter ); - addDockWidget( Qt::LeftDockWidgetArea, dockWidget ); - - if ( dockOntopOfWidget ) - { - tabifyDockWidget( dockOntopOfWidget, dockWidget ); - } - else - { - dockOntopOfWidget = dockWidget; - } + if ( defaultDockWidgetArea[i] == ads::DockWidgetArea::LeftDockWidgetArea ) leftWidgets.push_back( dockWidget ); + if ( defaultDockWidgetArea[i] == ads::DockWidgetArea::RightDockWidgetArea ) + rightWidgets.push_back( dockWidget ); connect( dockWidget, SIGNAL( visibilityChanged( bool ) ), projectTree, SLOT( treeVisibilityChanged( bool ) ) ); - connect( projectTree, SIGNAL( selectionChanged() ), this, SLOT( selectedObjectsChanged() ) ); projectTree->treeView()->setContextMenuPolicy( Qt::CustomContextMenu ); @@ -794,129 +792,102 @@ void RiuMainWindow::createDockPanels() projectTree->setUiConfigurationName( treeViewConfigs[i] ); } - QDockWidget* resultPlotDock = nullptr; - QDockWidget* relPermPlotDock = nullptr; - QDockWidget* pvtPlotDock = nullptr; -#ifdef USE_ODB_API - QDockWidget* mohrsCirclePlotDock = nullptr; -#endif + // undo/redo view + if ( m_undoView && RiaPreferences::current()->useUndoRedo() ) + { + ads::CDockWidget* dockWidget = new ads::CDockWidget( "Undo Stack", this ); + dockWidget->setObjectName( RiuDockWidgetTools::undoStackName() ); + dockWidget->setWidget( m_undoView ); + rightWidgets.push_back( dockWidget ); + } { - QDockWidget* dockWidget = new QDockWidget( "Property Editor", this ); + ads::CDockWidget* dockWidget = new ads::CDockWidget( "Result Plot", this ); + dockWidget->setObjectName( RiuDockWidgetTools::resultPlotName() ); + m_resultQwtPlot = new RiuResultQwtPlot( dockWidget ); + dockWidget->setWidget( m_resultQwtPlot ); + bottomWidgets.push_back( dockWidget ); + } + + ads::CDockAreaWidget* leftArea = addTabbedWidgets( leftWidgets, ads::DockWidgetArea::LeftDockWidgetArea ); + ads::CDockAreaWidget* rightArea = addTabbedWidgets( rightWidgets, ads::DockWidgetArea::RightDockWidgetArea ); + ads::CDockAreaWidget* bottomArea = addTabbedWidgets( bottomWidgets, + ads::DockWidgetArea::BottomDockWidgetArea, + dockManager()->centralWidget()->dockAreaWidget() ); + + { + ads::CDockWidget* dockWidget = new ads::CDockWidget( "Property Editor", this ); dockWidget->setObjectName( RiuDockWidgetTools::propertyEditorName() ); - dockWidget->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); m_pdmUiPropertyView = new caf::PdmUiPropertyView( dockWidget ); dockWidget->setWidget( m_pdmUiPropertyView ); - - addDockWidget( Qt::LeftDockWidgetArea, dockWidget ); - } - - { - QDockWidget* dockWidget = new QDockWidget( "Result Info", this ); - dockWidget->setObjectName( RiuDockWidgetTools::resultInfoName() ); - dockWidget->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea ); - m_resultInfoPanel = new RiuResultInfoPanel( dockWidget ); - dockWidget->setWidget( m_resultInfoPanel ); - - addDockWidget( Qt::BottomDockWidgetArea, dockWidget ); - } - - { - QDockWidget* dockWidget = new QDockWidget( "Process Monitor", this ); - dockWidget->setObjectName( RiuDockWidgetTools::processMonitorName() ); - dockWidget->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea ); - m_processMonitor = new RiuProcessMonitor( dockWidget ); - dockWidget->setWidget( m_processMonitor ); - - addDockWidget( Qt::BottomDockWidgetArea, dockWidget ); - dockWidget->hide(); - } - - { - QDockWidget* dockWidget = new QDockWidget( "Result Plot", this ); - dockWidget->setObjectName( RiuDockWidgetTools::resultPlotName() ); - dockWidget->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea ); - m_resultQwtPlot = new RiuResultQwtPlot( dockWidget ); - dockWidget->setWidget( m_resultQwtPlot ); - - addDockWidget( Qt::BottomDockWidgetArea, dockWidget ); - resultPlotDock = dockWidget; + dockManager()->addDockWidget( ads::DockWidgetArea::BottomDockWidgetArea, dockWidget, leftArea ); } #ifdef USE_ODB_API { - QDockWidget* dockWidget = new QDockWidget( "Mohr's Circle Plot", this ); + ads::CDockWidget* dockWidget = new ads::CDockWidget( "Mohr's Circle Plot", this ); dockWidget->setObjectName( RiuDockWidgetTools::mohrsCirclePlotName() ); - dockWidget->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea ); m_mohrsCirclePlot = new RiuMohrsCirclePlot( dockWidget ); dockWidget->setWidget( m_mohrsCirclePlot ); - - addDockWidget( Qt::BottomDockWidgetArea, dockWidget ); - mohrsCirclePlotDock = dockWidget; - - dockWidget->hide(); + dockManager()->addDockWidgetTabToArea( dockWidget, bottomArea ); } #endif { - QDockWidget* dockWidget = new QDockWidget( "Relative Permeability Plot", this ); + ads::CDockWidget* dockWidget = new ads::CDockWidget( "Relative Permeability Plot", this ); dockWidget->setObjectName( RiuDockWidgetTools::relPermPlotName() ); - dockWidget->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea ); m_relPermPlotPanel = new RiuRelativePermeabilityPlotPanel( dockWidget ); dockWidget->setWidget( m_relPermPlotPanel ); - - addDockWidget( Qt::BottomDockWidgetArea, dockWidget ); - relPermPlotDock = dockWidget; + dockManager()->addDockWidgetTabToArea( dockWidget, bottomArea ); } { - QDockWidget* dockWidget = new QDockWidget( "PVT Plot", this ); + ads::CDockWidget* dockWidget = new ads::CDockWidget( "PVT Plot", this ); dockWidget->setObjectName( RiuDockWidgetTools::pvtPlotName() ); - dockWidget->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea ); m_pvtPlotPanel = new RiuPvtPlotPanel( dockWidget ); dockWidget->setWidget( m_pvtPlotPanel ); + dockManager()->addDockWidgetTabToArea( dockWidget, bottomArea ); + } - addDockWidget( Qt::BottomDockWidgetArea, dockWidget ); - pvtPlotDock = dockWidget; + // result info + { + ads::CDockWidget* dockWidget = new ads::CDockWidget( "Result Info", this ); + dockWidget->setObjectName( RiuDockWidgetTools::resultInfoName() ); + m_resultInfoPanel = new RiuResultInfoPanel( dockWidget ); + dockWidget->setWidget( m_resultInfoPanel ); + dockManager()->addDockWidget( ads::DockWidgetArea::LeftDockWidgetArea, dockWidget, bottomArea ); + } + + ads::CDockAreaWidget* procAndMsgTabs = nullptr; + // process monitor + { + ads::CDockWidget* dockWidget = new ads::CDockWidget( "Process Monitor", this ); + dockWidget->setObjectName( RiuDockWidgetTools::processMonitorName() ); + m_processMonitor = new RiuProcessMonitor( dockWidget ); + dockWidget->setWidget( m_processMonitor ); + procAndMsgTabs = dockManager()->addDockWidget( ads::DockWidgetArea::RightDockWidgetArea, dockWidget, bottomArea ); } { - QDockWidget* dockWidget = new QDockWidget( "Messages", this ); + ads::CDockWidget* dockWidget = new ads::CDockWidget( "Messages", this ); dockWidget->setObjectName( RiuDockWidgetTools::messagesName() ); m_messagePanel = new RiuMessagePanel( dockWidget ); dockWidget->setWidget( m_messagePanel ); - addDockWidget( Qt::BottomDockWidgetArea, dockWidget ); - dockWidget->hide(); + dockManager()->addDockWidgetTabToArea( dockWidget, procAndMsgTabs ); } - if ( m_undoView && RiaPreferences::current()->useUndoRedo() ) - { - QDockWidget* dockWidget = new QDockWidget( "Undo Stack", this ); - dockWidget->setObjectName( RiuDockWidgetTools::undoStackName() ); - dockWidget->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); - dockWidget->setWidget( m_undoView ); + if ( leftArea ) leftArea->setCurrentIndex( 0 ); + if ( rightArea ) rightArea->setCurrentIndex( 0 ); + if ( bottomArea ) bottomArea->setCurrentIndex( 0 ); - addDockWidget( Qt::RightDockWidgetArea, dockWidget ); - dockWidget->hide(); - } - - setCorner( Qt::BottomLeftCorner, Qt::LeftDockWidgetArea ); - setCorner( Qt::BottomRightCorner, Qt::BottomDockWidgetArea ); - - // Tabify docks - tabifyDockWidget( pvtPlotDock, relPermPlotDock ); -#ifdef USE_ODB_API - tabifyDockWidget( relPermPlotDock, mohrsCirclePlotDock ); - tabifyDockWidget( mohrsCirclePlotDock, resultPlotDock ); -#else - tabifyDockWidget( relPermPlotDock, resultPlotDock ); -#endif - - QList dockWidgets = findChildren(); - for ( QDockWidget* dock : dockWidgets ) + auto widgets = dockManager()->dockWidgetsMap().values(); + std::reverse( widgets.begin(), widgets.end() ); + for ( ads::CDockWidget* dock : widgets ) { connect( dock->toggleViewAction(), SIGNAL( triggered() ), SLOT( slotDockWidgetToggleViewActionTriggered() ) ); + dock->setVisible( true ); + dock->raise(); } } @@ -1423,22 +1394,6 @@ RiuProcessMonitor* RiuMainWindow::processMonitor() return m_processMonitor; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void appendToggleActionForDockingWidget( QMenu* menu, QWidget* parent, const QString& dockWidgetName ) -{ - if ( menu ) - { - QAction* action = RiuDockWidgetTools::toggleActionForWidget( parent, dockWidgetName ); - if ( action ) - { - // Some dock windows are depending on configuration (mohrs circle plot), so do not assert they exist - menu->addAction( action ); - } - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1451,38 +1406,10 @@ void RiuMainWindow::slotBuildWindowActions() m_windowMenu->addAction( cmdFeatureMgr->action( "RicShowPlotWindowFeature" ) ); m_windowMenu->addSeparator(); - m_windowMenu->addAction( cmdFeatureMgr->action( "RicDefaultDockConfigEclipseFeature" ) ); -#ifdef USE_ODB_API - m_windowMenu->addAction( cmdFeatureMgr->action( "RicDefaultDockConfigGeoMechFeature" ) ); -#endif m_windowMenu->addSeparator(); } - appendToggleActionForDockingWidget( m_windowMenu, this, RiuDockWidgetTools::projectTreeName() ); - appendToggleActionForDockingWidget( m_windowMenu, this, RiuDockWidgetTools::propertyEditorName() ); - appendToggleActionForDockingWidget( m_windowMenu, this, RiuDockWidgetTools::messagesName() ); - appendToggleActionForDockingWidget( m_windowMenu, this, RiuDockWidgetTools::processMonitorName() ); - appendToggleActionForDockingWidget( m_windowMenu, this, RiuDockWidgetTools::undoStackName() ); - - m_windowMenu->addSeparator(); - - appendToggleActionForDockingWidget( m_windowMenu, this, RiuDockWidgetTools::resultInfoName() ); - appendToggleActionForDockingWidget( m_windowMenu, this, RiuDockWidgetTools::resultPlotName() ); - appendToggleActionForDockingWidget( m_windowMenu, this, RiuDockWidgetTools::relPermPlotName() ); - appendToggleActionForDockingWidget( m_windowMenu, this, RiuDockWidgetTools::pvtPlotName() ); - appendToggleActionForDockingWidget( m_windowMenu, this, RiuDockWidgetTools::mohrsCirclePlotName() ); - - m_windowMenu->addSeparator(); - QAction* cascadeWindowsAction = new QAction( "Cascade Windows", this ); - cascadeWindowsAction->setIcon( QIcon( ":/CascadeWindows.svg" ) ); - connect( cascadeWindowsAction, SIGNAL( triggered() ), m_mdiArea, SLOT( cascadeSubWindows() ) ); - - QAction* closeAllSubWindowsAction = new QAction( "Close All Windows", this ); - connect( closeAllSubWindowsAction, SIGNAL( triggered() ), m_mdiArea, SLOT( closeAllSubWindows() ) ); - - m_windowMenu->addAction( caf::CmdFeatureManager::instance()->action( "RicTileWindowsFeature" ) ); - m_windowMenu->addAction( cascadeWindowsAction ); - m_windowMenu->addAction( closeAllSubWindowsAction ); + addDefaultEntriesToWindowsMenu(); m_windowMenu->addSeparator(); m_windowMenu->addAction( m_newPropertyView ); @@ -1565,16 +1492,15 @@ void RiuMainWindow::selectedObjectsChanged() //-------------------------------------------------------------------------------------------------- void RiuMainWindow::slotNewObjectPropertyView() { - QDockWidget* dockWidget = - new QDockWidget( QString( "Additional Project Tree (%1)" ).arg( m_additionalProjectViews.size() + 1 ), this ); - dockWidget->setObjectName( "dockWidget" ); - dockWidget->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); + ads::CDockWidget* dockWidget = + new ads::CDockWidget( QString( "Additional Project Tree (%1)" ).arg( m_additionalProjectViews.size() + 1 ), this ); + dockWidget->setObjectName( "AdditionalDockWidget" ); RiuProjectAndPropertyView* projPropView = new RiuProjectAndPropertyView( dockWidget ); dockWidget->setWidget( projPropView ); projPropView->setPdmItem( m_pdmRoot ); - addDockWidget( Qt::RightDockWidgetArea, dockWidget ); + dockManager()->addDockWidget( ads::DockWidgetArea::RightDockWidgetArea, dockWidget ); m_additionalProjectViews.push_back( dockWidget ); } @@ -1835,7 +1761,7 @@ void RiuMainWindow::updateMemoryUsage() //-------------------------------------------------------------------------------------------------- void RiuMainWindow::showProcessMonitorDockPanel() { - RiuDockWidgetTools::setDockWidgetVisibility( this, RiuDockWidgetTools::processMonitorName(), true ); + RiuDockWidgetTools::setDockWidgetVisibility( this->dockManager(), RiuDockWidgetTools::processMonitorName(), true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/RiuMainWindow.h b/ApplicationLibCode/UserInterface/RiuMainWindow.h index 3b4ae0e2d2..9de3fcb70d 100644 --- a/ApplicationLibCode/UserInterface/RiuMainWindow.h +++ b/ApplicationLibCode/UserInterface/RiuMainWindow.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -69,6 +70,11 @@ namespace ssihub class Interface; } +namespace ads +{ +class CDockWidget; +}; + //================================================================================================== // // @@ -171,7 +177,6 @@ private: caf::AnimationToolBar* m_animationToolBar; - RiuMdiArea* m_mdiArea; RiuResultInfoPanel* m_resultInfoPanel; RiuProcessMonitor* m_processMonitor; QPointer m_messagePanel; @@ -182,7 +187,6 @@ private: RiuPvtPlotPanel* m_pvtPlotPanel; std::unique_ptr m_gridCalculatorDialog; - QMenu* m_windowMenu; QLabel* m_memoryCriticalWarning; QToolButton* m_memoryUsedButton; QLabel* m_memoryTotalStatus; @@ -269,5 +273,5 @@ private: QToolBar* m_holoLensToolBar; - std::vector> m_additionalProjectViews; + std::vector> m_additionalProjectViews; }; diff --git a/ApplicationLibCode/UserInterface/RiuMainWindowBase.cpp b/ApplicationLibCode/UserInterface/RiuMainWindowBase.cpp index 46dc29bb68..057530167a 100644 --- a/ApplicationLibCode/UserInterface/RiuMainWindowBase.cpp +++ b/ApplicationLibCode/UserInterface/RiuMainWindowBase.cpp @@ -25,6 +25,7 @@ #include "RiuDockWidgetTools.h" #include "RiuDragDrop.h" +#include "RiuMdiArea.h" #include "RiuMdiSubWindow.h" #include "RimProject.h" @@ -35,10 +36,14 @@ #include "cafPdmUiTreeView.h" #include "cafQTreeViewStateSerializer.h" +#include "DockWidget.h" + #include -#include +#include #include #include +#include +#include #include #include #include @@ -52,8 +57,10 @@ RiuMainWindowBase::RiuMainWindowBase() , m_showFirstVisibleWindowMaximized( true ) , m_blockSubWindowActivation( false ) , m_blockSubWindowProjectTreeSelection( false ) + , m_windowMenu( nullptr ) + , m_mdiArea( nullptr ) { - setDockNestingEnabled( true ); + m_dockManager = new ads::CDockManager( this ); if ( RiaPreferences::current()->useUndoRedo() && RiaApplication::enableDevelopmentFeatures() ) { @@ -86,6 +93,14 @@ RiuMainWindowBase::~RiuMainWindowBase() m_projectTreeViews.clear(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +ads::CDockManager* RiuMainWindowBase::dockManager() const +{ + return m_dockManager; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -122,8 +137,9 @@ void RiuMainWindowBase::loadWinGeoAndDockToolBarLayout() // Company and appname set through QCoreApplication QSettings settings; - QVariant winGeo = settings.value( QString( "%1/winGeometry" ).arg( registryFolderName() ) ); - QVariant layout = settings.value( QString( "%1/dockAndToolBarLayout" ).arg( registryFolderName() ) ); + QVariant winGeo = settings.value( QString( "%1/winGeometry" ).arg( registryFolderName() ) ); + QVariant layout = settings.value( QString( "%1/toolBarLayout" ).arg( registryFolderName() ) ); + QVariant dockState = settings.value( QString( "%1/dockLayout" ).arg( registryFolderName() ) ); if ( winGeo.isValid() ) { @@ -135,6 +151,13 @@ void RiuMainWindowBase::loadWinGeoAndDockToolBarLayout() } } } + if ( dockState.isValid() ) + { + m_dockManager->restoreState( dockState.toByteArray(), 1 ); + } + + settings.beginGroup( registryFolderName() ); + m_dockManager->loadPerspectives( settings ); restoreDockWidgetVisibilities(); } @@ -161,13 +184,15 @@ void RiuMainWindowBase::saveWinGeoAndDockToolBarLayout() settings.setValue( QString( "%1/winGeometry" ).arg( registryFolderName() ), winGeo ); QByteArray layout = saveState( 0 ); - settings.setValue( QString( "%1/dockAndToolBarLayout" ).arg( registryFolderName() ), layout ); + settings.setValue( QString( "%1/toolBarLayout" ).arg( registryFolderName() ), layout ); settings.setValue( QString( "%1/isMaximized" ).arg( registryFolderName() ), isMaximized() ); + settings.setValue( QString( "%1/dockLayout" ).arg( registryFolderName() ), m_dockManager->saveState( 1 ) ); + if ( this->isVisible() ) { - QVariant dockWindowVisibilities = RiuDockWidgetTools::dockWidgetsVisibility( this ); + QVariant dockWindowVisibilities = RiuDockWidgetTools::dockWidgetsVisibility( this->dockManager() ); QString key = mainWindowDockWidgetSettingsKey( registryFolderName() ); settings.setValue( key, dockWindowVisibilities ); @@ -201,7 +226,7 @@ void RiuMainWindowBase::restoreDockWidgetVisibilities() QString key = mainWindowDockWidgetSettingsKey( registryFolderName() ); QVariant dockWindowVisibilities = settings.value( key ); - RiuDockWidgetTools::applyDockWidgetVisibilities( this, dockWindowVisibilities.toMap() ); + RiuDockWidgetTools::applyDockWidgetVisibilities( this->dockManager(), dockWindowVisibilities.toMap() ); } //-------------------------------------------------------------------------------------------------- @@ -226,9 +251,7 @@ void RiuMainWindowBase::showWindow() //-------------------------------------------------------------------------------------------------- void RiuMainWindowBase::hideAllDockWidgets() { - QList dockWidgets = findChildren(); - - for ( QDockWidget* dock : dockWidgets ) + for ( auto dock : dockManager()->dockWidgetsMap() ) { if ( dock ) { @@ -258,7 +281,7 @@ void RiuMainWindowBase::selectAsCurrentItem( const caf::PdmObject* object, bool if ( tv ) { tv->selectAsCurrentItem( object ); - QDockWidget* dw = dynamic_cast( tv->parentWidget() ); + ads::CDockWidget* dw = dynamic_cast( tv->parentWidget() ); if ( dw ) { dw->show(); @@ -405,7 +428,7 @@ void RiuMainWindowBase::slotDockWidgetToggleViewActionTriggered() { if ( !sender() ) return; - auto dockWidget = dynamic_cast( sender()->parent() ); + auto dockWidget = dynamic_cast( sender()->parent() ); if ( dockWidget ) { if ( dockWidget->isVisible() ) @@ -585,3 +608,125 @@ void RiuMainWindowBase::restoreTreeViewStates( QString treeStateString, QString } } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +ads::CDockAreaWidget* RiuMainWindowBase::addTabbedWidgets( std::vector widgets, + ads::DockWidgetArea whereToDock, + ads::CDockAreaWidget* dockInside ) +{ + ads::CDockAreaWidget* areaToDockIn = nullptr; + + for ( auto widget : widgets ) + { + if ( areaToDockIn ) + { + m_dockManager->addDockWidgetTabToArea( widget, areaToDockIn ); + } + else + { + areaToDockIn = m_dockManager->addDockWidget( whereToDock, widget, dockInside ); + } + } + return areaToDockIn; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuMainWindowBase::setDockLayout() +{ + QAction* action = dynamic_cast( this->sender() ); + if ( action ) + { + QString layoutName = action->text(); + dockManager()->openPerspective( layoutName ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuMainWindowBase::deleteDockLayout() +{ + QAction* action = dynamic_cast( this->sender() ); + if ( action ) + { + QString name = action->text(); + + QString questionStr = "Are you sure you want to delete the window layout \"" + name + "\"?"; + auto reply = QMessageBox::question( this, + "Delete Window Layout", + questionStr, + QMessageBox::Yes | QMessageBox::No, + QMessageBox::No ); + if ( reply == QMessageBox::Yes ) + { + dockManager()->removePerspective( name ); + QSettings settings; + settings.beginGroup( registryFolderName() ); + dockManager()->savePerspectives( settings ); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuMainWindowBase::saveDockLayout() +{ + bool ok = false; + QString name = + QInputDialog::getText( this, "Save Window Layout", "Give the window layout a name:", QLineEdit::Normal, "", &ok ); + if ( ok && !name.isEmpty() ) + { + dockManager()->addPerspective( name ); + QSettings settings; + settings.beginGroup( registryFolderName() ); + dockManager()->savePerspectives( settings ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuMainWindowBase::addDefaultEntriesToWindowsMenu() +{ + QMenu* showHideMenu = m_windowMenu->addMenu( "Show/Hide Windows" ); + + for ( auto dock : dockManager()->dockWidgetsMap() ) + { + showHideMenu->addAction( dock->toggleViewAction() ); + } + m_windowMenu->addSeparator(); + + QAction* saveLayoutAction = m_windowMenu->addAction( "Save Window Layout..." ); + connect( saveLayoutAction, SIGNAL( triggered() ), this, SLOT( saveDockLayout() ) ); + + QStringList names = dockManager()->perspectiveNames(); + if ( names.size() > 0 ) + { + QMenu* layoutsMenu = m_windowMenu->addMenu( "Use Window Layout" ); + QMenu* deleteLayoutMenu = m_windowMenu->addMenu( "Delete Window Layout" ); + + for ( auto& layout : names ) + { + QAction* chooseLayoutAction = layoutsMenu->addAction( layout ); + connect( chooseLayoutAction, SIGNAL( triggered() ), this, SLOT( setDockLayout() ) ); + QAction* deleteLayoutAction = deleteLayoutMenu->addAction( layout ); + connect( deleteLayoutAction, SIGNAL( triggered() ), this, SLOT( deleteDockLayout() ) ); + } + } + + m_windowMenu->addSeparator(); + QAction* cascadeWindowsAction = new QAction( "Cascade Windows", this ); + connect( cascadeWindowsAction, SIGNAL( triggered() ), m_mdiArea, SLOT( cascadeSubWindows() ) ); + + QAction* closeAllSubWindowsAction = new QAction( "Close All Windows", this ); + connect( closeAllSubWindowsAction, SIGNAL( triggered() ), m_mdiArea, SLOT( closeAllSubWindows() ) ); + + m_windowMenu->addAction( caf::CmdFeatureManager::instance()->action( "RicTilePlotWindowsFeature" ) ); + m_windowMenu->addAction( cascadeWindowsAction ); + m_windowMenu->addAction( closeAllSubWindowsAction ); +} diff --git a/ApplicationLibCode/UserInterface/RiuMainWindowBase.h b/ApplicationLibCode/UserInterface/RiuMainWindowBase.h index 8f10db2864..1c4cfa5800 100644 --- a/ApplicationLibCode/UserInterface/RiuMainWindowBase.h +++ b/ApplicationLibCode/UserInterface/RiuMainWindowBase.h @@ -22,12 +22,16 @@ #include "cafPdmUiDragDropInterface.h" +#include "DockManager.h" + #include #include class QMdiArea; struct RimMdiWindowGeometry; +class RiuMdiArea; + namespace caf { class PdmObject; @@ -47,8 +51,8 @@ class RiuMainWindowBase : public QMainWindow Q_OBJECT public: - RiuMainWindowBase(); - ~RiuMainWindowBase() override; + RiuMainWindowBase(); + ~RiuMainWindowBase() override; virtual QString mainWindowName() = 0; @@ -93,6 +97,8 @@ public: void setBlockViewSelectionOnSubWindowActivated( bool block ); bool isBlockingViewSelectionOnSubWindowActivated() const; + ads::CDockManager* dockManager() const; + protected: void createTreeViews( int numberOfTrees ); void removeViewerFromMdiArea( QMdiArea* mdiArea, QWidget* viewer ); @@ -103,6 +109,12 @@ protected: void restoreTreeViewStates( QString treeStateString, QString treeIndexString ); + ads::CDockAreaWidget* addTabbedWidgets( std::vector widgets, + ads::DockWidgetArea whereToDock, + ads::CDockAreaWidget* dockInside = nullptr ); + + void addDefaultEntriesToWindowsMenu(); + protected slots: void slotDockWidgetToggleViewActionTriggered(); void slotRefreshHelpActions(); @@ -111,6 +123,10 @@ protected slots: void slotUndo(); void slotRefreshUndoRedoActions(); + void setDockLayout(); + void deleteDockLayout(); + void saveDockLayout(); + protected: bool m_allowActiveViewChangeFromSelection; // To be used in selectedObjectsChanged() to control // whether to select the corresponding active view or not @@ -119,6 +135,9 @@ protected: QAction* m_redoAction; QUndoView* m_undoView; + RiuMdiArea* m_mdiArea; + QMenu* m_windowMenu; + private: QString registryFolderName(); @@ -129,4 +148,6 @@ private: bool m_showFirstVisibleWindowMaximized; bool m_blockSubWindowActivation; bool m_blockSubWindowProjectTreeSelection; + + ads::CDockManager* m_dockManager; }; diff --git a/ApplicationLibCode/UserInterface/RiuMessagePanel.cpp b/ApplicationLibCode/UserInterface/RiuMessagePanel.cpp index 4f07cd7d12..a6597c744d 100644 --- a/ApplicationLibCode/UserInterface/RiuMessagePanel.cpp +++ b/ApplicationLibCode/UserInterface/RiuMessagePanel.cpp @@ -22,7 +22,8 @@ #include "RiuGuiTheme.h" -#include +#include "DockWidget.h" + #include #include #include @@ -37,7 +38,7 @@ //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RiuMessagePanel::RiuMessagePanel( QDockWidget* parent ) +RiuMessagePanel::RiuMessagePanel( QWidget* parent ) : QWidget( parent ) { QVBoxLayout* layout = new QVBoxLayout( this ); @@ -80,7 +81,7 @@ void RiuMessagePanel::addMessage( RILogLevel messageLevel, const QString& msg ) { if ( messageLevel == RILogLevel::RI_LL_ERROR || messageLevel == RILogLevel::RI_LL_WARNING ) { - QDockWidget* parentDockWidget = dynamic_cast( this->parent() ); + ads::CDockWidget* parentDockWidget = dynamic_cast( this->parent() ); if ( parentDockWidget && !parentDockWidget->isVisible() ) { parentDockWidget->toggleViewAction()->trigger(); @@ -104,7 +105,7 @@ void RiuMessagePanel::slotShowContextMenu( const QPoint& pos ) { QMenu menu; - // Reworked from implemenmtation in QTextControl::createStandardContextMenu() + // Reworked from implementation in QTextControl::createStandardContextMenu() { QAction* a = menu.addAction( "&Copy", m_textEdit, SLOT( copy() ), QKeySequence::Copy ); a->setEnabled( m_textEdit->textCursor().hasSelection() ); @@ -211,7 +212,7 @@ void RiuMessagePanelLogger::writeToMessagePanel( RILogLevel messageLevel, const return; } - for ( auto panel : m_messagePanel ) + for ( auto& panel : m_messagePanel ) { if ( panel ) { diff --git a/ApplicationLibCode/UserInterface/RiuMessagePanel.h b/ApplicationLibCode/UserInterface/RiuMessagePanel.h index 53264fd3e6..2103eab6cd 100644 --- a/ApplicationLibCode/UserInterface/RiuMessagePanel.h +++ b/ApplicationLibCode/UserInterface/RiuMessagePanel.h @@ -23,7 +23,6 @@ #include #include -class QDockWidget; class QPlainTextEdit; //================================================================================================== @@ -36,7 +35,7 @@ class RiuMessagePanel : public QWidget Q_OBJECT public: - explicit RiuMessagePanel( QDockWidget* parent ); + explicit RiuMessagePanel( QWidget* parent ); void addMessage( RILogLevel messageLevel, const QString& msg ); QSize sizeHint() const override; diff --git a/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp b/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp index 77f3473fe6..cf7efc51f8 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp +++ b/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp @@ -65,11 +65,14 @@ #include "cafPdmUiTreeView.h" #include "cafSelectionManager.h" +#include "DockAreaWidget.h" + #include -#include #include #include #include +#include +#include #include #include #include @@ -80,11 +83,14 @@ //-------------------------------------------------------------------------------------------------- RiuPlotMainWindow::RiuPlotMainWindow() : m_activePlotViewWindow( nullptr ) - , m_windowMenu( nullptr ) { m_mdiArea = new RiuMdiArea( this ); connect( m_mdiArea, SIGNAL( subWindowActivated( QMdiSubWindow* ) ), SLOT( slotSubWindowActivated( QMdiSubWindow* ) ) ); - setCentralWidget( m_mdiArea ); + + ads::CDockWidget* widget = new ads::CDockWidget( "Plots", this ); + widget->setWidget( m_mdiArea ); + auto dockArea = dockManager()->setCentralWidget( widget ); + dockArea->setVisible( true ); createMenus(); createToolBars(); @@ -483,21 +489,22 @@ void RiuPlotMainWindow::createDockPanels() RiuDockWidgetTools::plotMainWindowTemplateTreeName(), RiuDockWidgetTools::plotMainWindowScriptsTreeName() }; - const std::vector defaultDockWidgetArea{ Qt::LeftDockWidgetArea, - Qt::RightDockWidgetArea, - Qt::LeftDockWidgetArea, - Qt::LeftDockWidgetArea }; + const std::vector defaultDockWidgetArea{ ads::DockWidgetArea::LeftDockWidgetArea, + ads::DockWidgetArea::RightDockWidgetArea, + ads::DockWidgetArea::LeftDockWidgetArea, + ads::DockWidgetArea::LeftDockWidgetArea }; createTreeViews( nTreeViews ); - std::vector rightTabbedWidgets; - std::vector leftTabbedWidgets; + std::vector rightWidgets; + std::vector leftWidgets; + std::vector bottomWidgets; + // the project trees for ( int i = 0; i < nTreeViews; i++ ) { - QDockWidget* dockWidget = new QDockWidget( treeViewTitles[i], this ); + ads::CDockWidget* dockWidget = new ads::CDockWidget( treeViewTitles[i], this ); dockWidget->setObjectName( treeViewDockNames[i] ); - dockWidget->setAllowedAreas( Qt::AllDockWidgetAreas ); caf::PdmUiTreeView* projectTree = projectTreeView( i ); projectTree->enableSelectionManagerUpdating( true ); @@ -519,10 +526,9 @@ void RiuPlotMainWindow::createDockPanels() RiuTreeViewEventFilter* treeViewEventFilter = new RiuTreeViewEventFilter( this, projectTree ); projectTree->treeView()->installEventFilter( treeViewEventFilter ); - addDockWidget( defaultDockWidgetArea[i], dockWidget ); - - if ( defaultDockWidgetArea[i] == Qt::LeftDockWidgetArea ) leftTabbedWidgets.push_back( dockWidget ); - if ( defaultDockWidgetArea[i] == Qt::RightDockWidgetArea ) rightTabbedWidgets.push_back( dockWidget ); + if ( defaultDockWidgetArea[i] == ads::DockWidgetArea::LeftDockWidgetArea ) leftWidgets.push_back( dockWidget ); + if ( defaultDockWidgetArea[i] == ads::DockWidgetArea::RightDockWidgetArea ) + rightWidgets.push_back( dockWidget ); connect( dockWidget, SIGNAL( visibilityChanged( bool ) ), projectTree, SLOT( treeVisibilityChanged( bool ) ) ); connect( projectTree, SIGNAL( selectionChanged() ), this, SLOT( selectedObjectsChanged() ) ); @@ -535,28 +541,9 @@ void RiuPlotMainWindow::createDockPanels() projectTree->setUiConfigurationName( treeViewConfigs[i] ); } + // the plot manager { - QDockWidget* dockWidget = new QDockWidget( "Property Editor", this ); - dockWidget->setObjectName( RiuDockWidgetTools::plotMainWindowPropertyEditorName() ); - dockWidget->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); - - m_pdmUiPropertyView = std::make_unique( dockWidget ); - dockWidget->setWidget( m_pdmUiPropertyView.get() ); - - addDockWidget( Qt::LeftDockWidgetArea, dockWidget ); - } - - { - QDockWidget* dockWidget = new QDockWidget( "Messages", this ); - dockWidget->setObjectName( RiuDockWidgetTools::plotMainWindowMessagesName() ); - m_messagePanel = new RiuMessagePanel( dockWidget ); - dockWidget->setWidget( m_messagePanel ); - splitDockWidget( rightTabbedWidgets.front(), dockWidget, Qt::Vertical ); - dockWidget->hide(); - } - - { - QDockWidget* dockWidget = new QDockWidget( "Plot Manager", this ); + ads::CDockWidget* dockWidget = new ads::CDockWidget( "Plot Manager", this ); dockWidget->setObjectName( RiuDockWidgetTools::summaryPlotManagerName() ); m_summaryPlotManagerView = std::make_unique( dockWidget ); @@ -567,54 +554,56 @@ void RiuPlotMainWindow::createDockPanels() m_summaryPlotManager = std::move( plotManager ); dockWidget->setWidget( m_summaryPlotManagerView.get() ); - addDockWidget( Qt::RightDockWidgetArea, dockWidget ); - rightTabbedWidgets.push_back( dockWidget ); - - dockWidget->hide(); + rightWidgets.push_back( dockWidget ); } + // the undo stack if ( m_undoView && RiaPreferences::current()->useUndoRedo() ) { - QDockWidget* dockWidget = new QDockWidget( "Undo Stack", this ); + ads::CDockWidget* dockWidget = new ads::CDockWidget( "Undo Stack", this ); dockWidget->setObjectName( RiuDockWidgetTools::plotMainWindowUndoStackName() ); - dockWidget->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); - dockWidget->setWidget( m_undoView ); - addDockWidget( Qt::RightDockWidgetArea, dockWidget ); - rightTabbedWidgets.push_back( dockWidget ); - - dockWidget->hide(); + rightWidgets.push_back( dockWidget ); } + ads::CDockAreaWidget* leftArea = addTabbedWidgets( leftWidgets, ads::DockWidgetArea::LeftDockWidgetArea ); + ads::CDockAreaWidget* rightArea = addTabbedWidgets( rightWidgets, ads::DockWidgetArea::RightDockWidgetArea ); + ads::CDockAreaWidget* bottomArea = addTabbedWidgets( bottomWidgets, + ads::DockWidgetArea::BottomDockWidgetArea, + dockManager()->centralWidget()->dockAreaWidget() ); + + // the property editor { - QDockWidget* topDock = nullptr; - for ( auto d : leftTabbedWidgets ) - { - if ( !topDock ) - topDock = d; - else - tabifyDockWidget( topDock, d ); - } + ads::CDockWidget* dockWidget = new ads::CDockWidget( "Property Editor", this ); + dockWidget->setObjectName( RiuDockWidgetTools::plotMainWindowPropertyEditorName() ); + + m_pdmUiPropertyView = std::make_unique( dockWidget ); + dockWidget->setWidget( m_pdmUiPropertyView.get() ); + dockManager()->addDockWidget( ads::DockWidgetArea::BottomDockWidgetArea, dockWidget, leftArea ); } + + // the log message view { - QDockWidget* topDock = nullptr; - for ( auto d : rightTabbedWidgets ) - { - if ( !topDock ) - topDock = d; - else - tabifyDockWidget( topDock, d ); - } + ads::CDockWidget* dockWidget = new ads::CDockWidget( "Messages", this ); + dockWidget->setObjectName( RiuDockWidgetTools::plotMainWindowMessagesName() ); + m_messagePanel = new RiuMessagePanel( dockWidget ); + dockWidget->setWidget( m_messagePanel ); + dockManager()->addDockWidget( ads::DockWidgetArea::BottomDockWidgetArea, dockWidget, rightArea ); } - setCorner( Qt::BottomLeftCorner, Qt::LeftDockWidgetArea ); - setCorner( Qt::BottomRightCorner, Qt::BottomDockWidgetArea ); + if ( leftArea ) leftArea->setCurrentIndex( 0 ); + if ( rightArea ) rightArea->setCurrentIndex( 0 ); + if ( bottomArea ) bottomArea->setCurrentIndex( 0 ); - QList dockWidgets = findChildren(); - for ( QDockWidget* dock : dockWidgets ) + auto widgets = dockManager()->dockWidgetsMap().values(); + std::reverse( widgets.begin(), widgets.end() ); + + for ( ads::CDockWidget* dock : widgets ) { connect( dock->toggleViewAction(), SIGNAL( triggered() ), SLOT( slotDockWidgetToggleViewActionTriggered() ) ); + dock->setVisible( true ); + dock->raise(); } } @@ -799,7 +788,8 @@ RiuMessagePanel* RiuPlotMainWindow::messagePanel() //-------------------------------------------------------------------------------------------------- void RiuPlotMainWindow::showAndSetKeyboardFocusToSummaryPlotManager() { - auto dockWidget = RiuDockWidgetTools::findDockWidget( this, RiuDockWidgetTools::summaryPlotManagerName() ); + auto dockWidget = + RiuDockWidgetTools::findDockWidget( this->dockManager(), RiuDockWidgetTools::summaryPlotManagerName() ); if ( dockWidget ) { dockWidget->setVisible( true ); @@ -919,28 +909,11 @@ void RiuPlotMainWindow::slotBuildWindowActions() { m_windowMenu->clear(); - { - caf::CmdFeatureManager* cmdFeatureMgr = caf::CmdFeatureManager::instance(); - m_windowMenu->addAction( cmdFeatureMgr->action( "RicShowMainWindowFeature" ) ); - m_windowMenu->addSeparator(); - } - - QList dockWidgets = findChildren(); - for ( QDockWidget* dock : dockWidgets ) - { - m_windowMenu->addAction( dock->toggleViewAction() ); - } - + caf::CmdFeatureManager* cmdFeatureMgr = caf::CmdFeatureManager::instance(); + m_windowMenu->addAction( cmdFeatureMgr->action( "RicShowMainWindowFeature" ) ); m_windowMenu->addSeparator(); - QAction* cascadeWindowsAction = new QAction( "Cascade Windows", this ); - connect( cascadeWindowsAction, SIGNAL( triggered() ), m_mdiArea, SLOT( cascadeSubWindows() ) ); - QAction* closeAllSubWindowsAction = new QAction( "Close All Windows", this ); - connect( closeAllSubWindowsAction, SIGNAL( triggered() ), m_mdiArea, SLOT( closeAllSubWindows() ) ); - - m_windowMenu->addAction( caf::CmdFeatureManager::instance()->action( "RicTilePlotWindowsFeature" ) ); - m_windowMenu->addAction( cascadeWindowsAction ); - m_windowMenu->addAction( closeAllSubWindowsAction ); + addDefaultEntriesToWindowsMenu(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/RiuPlotMainWindow.h b/ApplicationLibCode/UserInterface/RiuPlotMainWindow.h index 53759b548e..fd19fd3e3f 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotMainWindow.h +++ b/ApplicationLibCode/UserInterface/RiuPlotMainWindow.h @@ -24,6 +24,7 @@ #include "cafPdmPointer.h" #include +#include #include @@ -128,12 +129,9 @@ private slots: private: QByteArray m_initialDockAndToolbarLayout; // Initial dock window and toolbar layout, used to reset GUI - RiuMdiArea* m_mdiArea; caf::PdmPointer m_activePlotViewWindow; QPointer m_messagePanel; - QMenu* m_windowMenu; - std::unique_ptr m_wellLogPlotToolBarEditor; std::unique_ptr m_multiPlotToolBarEditor; std::unique_ptr m_multiPlotLayoutToolBarEditor; diff --git a/ApplicationLibCode/UserInterface/RiuProcessMonitor.cpp b/ApplicationLibCode/UserInterface/RiuProcessMonitor.cpp index 46451c9f3a..3a8421c4d6 100644 --- a/ApplicationLibCode/UserInterface/RiuProcessMonitor.cpp +++ b/ApplicationLibCode/UserInterface/RiuProcessMonitor.cpp @@ -35,7 +35,7 @@ //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RiuProcessMonitor::RiuProcessMonitor( QDockWidget* pParent ) +RiuProcessMonitor::RiuProcessMonitor( QWidget* pParent ) : QWidget( pParent ) { m_monitoredProcess = nullptr; diff --git a/ApplicationLibCode/UserInterface/RiuProcessMonitor.h b/ApplicationLibCode/UserInterface/RiuProcessMonitor.h index ea876d4caf..71fb5fe946 100644 --- a/ApplicationLibCode/UserInterface/RiuProcessMonitor.h +++ b/ApplicationLibCode/UserInterface/RiuProcessMonitor.h @@ -20,7 +20,6 @@ #include -class QDockWidget; class QLabel; class QPlainTextEdit; class QPushButton; @@ -45,7 +44,7 @@ private: caf::UiProcess* m_monitoredProcess; // Pointer to the process we're monitoring. Needed to fetch text public: - explicit RiuProcessMonitor( QDockWidget* pParent ); + explicit RiuProcessMonitor( QWidget* pParent ); ~RiuProcessMonitor() override; void startMonitorWorkProcess( caf::UiProcess* process ); diff --git a/ApplicationLibCode/UserInterface/RiuPvtPlotPanel.cpp b/ApplicationLibCode/UserInterface/RiuPvtPlotPanel.cpp index d3e19c9daa..ceef455511 100644 --- a/ApplicationLibCode/UserInterface/RiuPvtPlotPanel.cpp +++ b/ApplicationLibCode/UserInterface/RiuPvtPlotPanel.cpp @@ -41,10 +41,10 @@ #include "qwt_text.h" #include -#include #include #include #include +#include //================================================================================================== // @@ -511,7 +511,7 @@ void RiuPvtPlotWidget::slotPickerActivated( bool on ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RiuPvtPlotPanel::RiuPvtPlotPanel( QDockWidget* parent ) +RiuPvtPlotPanel::RiuPvtPlotPanel( QWidget* parent ) : QWidget( parent ) , m_unitSystem( RiaDefines::EclipseUnitSystem::UNITS_UNKNOWN ) , m_plotUpdater( new RiuPvtPlotUpdater( this ) ) diff --git a/ApplicationLibCode/UserInterface/RiuPvtPlotPanel.h b/ApplicationLibCode/UserInterface/RiuPvtPlotPanel.h index d6ee920f10..bfc4ab0615 100644 --- a/ApplicationLibCode/UserInterface/RiuPvtPlotPanel.h +++ b/ApplicationLibCode/UserInterface/RiuPvtPlotPanel.h @@ -32,7 +32,6 @@ class RiuPvtPlotUpdater; class RiuPvtQwtPicker; class RiuPvtPlotPanel; -class QDockWidget; class QComboBox; class QLabel; @@ -121,7 +120,7 @@ public: }; public: - RiuPvtPlotPanel( QDockWidget* parent ); + RiuPvtPlotPanel( QWidget* parent ); ~RiuPvtPlotPanel() override; void setPlotData( RiaDefines::EclipseUnitSystem unitSystem, diff --git a/ApplicationLibCode/UserInterface/RiuRelativePermeabilityPlotPanel.cpp b/ApplicationLibCode/UserInterface/RiuRelativePermeabilityPlotPanel.cpp index bd40c5bf8f..43a2d073fc 100644 --- a/ApplicationLibCode/UserInterface/RiuRelativePermeabilityPlotPanel.cpp +++ b/ApplicationLibCode/UserInterface/RiuRelativePermeabilityPlotPanel.cpp @@ -46,7 +46,6 @@ #include #include #include -#include #include #include #include @@ -84,7 +83,7 @@ public: //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RiuRelativePermeabilityPlotPanel::RiuRelativePermeabilityPlotPanel( QDockWidget* parent ) +RiuRelativePermeabilityPlotPanel::RiuRelativePermeabilityPlotPanel( QWidget* parent ) : QWidget( parent ) , m_unitSystem( RiaDefines::EclipseUnitSystem::UNITS_UNKNOWN ) , m_swat( HUGE_VAL ) diff --git a/ApplicationLibCode/UserInterface/RiuRelativePermeabilityPlotPanel.h b/ApplicationLibCode/UserInterface/RiuRelativePermeabilityPlotPanel.h index 548c222cbe..35c2d8dfb3 100644 --- a/ApplicationLibCode/UserInterface/RiuRelativePermeabilityPlotPanel.h +++ b/ApplicationLibCode/UserInterface/RiuRelativePermeabilityPlotPanel.h @@ -28,7 +28,6 @@ class RiuDockedQwtPlot; class RiuRelativePermeabilityPlotUpdater; -class QDockWidget; class QButtonGroup; class QCheckBox; class QwtPlot; @@ -46,7 +45,7 @@ class RiuRelativePermeabilityPlotPanel : public QWidget Q_OBJECT public: - RiuRelativePermeabilityPlotPanel( QDockWidget* parent ); + RiuRelativePermeabilityPlotPanel( QWidget* parent ); ~RiuRelativePermeabilityPlotPanel() override; void setPlotData( RiaDefines::EclipseUnitSystem unitSystem, diff --git a/ApplicationLibCode/UserInterface/RiuResultInfoPanel.cpp b/ApplicationLibCode/UserInterface/RiuResultInfoPanel.cpp index f96fecbe38..99fe053705 100644 --- a/ApplicationLibCode/UserInterface/RiuResultInfoPanel.cpp +++ b/ApplicationLibCode/UserInterface/RiuResultInfoPanel.cpp @@ -18,10 +18,8 @@ #include "RiuResultInfoPanel.h" -#include #include #include -#include //================================================================================================== /// @@ -35,7 +33,7 @@ //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RiuResultInfoPanel::RiuResultInfoPanel( QDockWidget* parent ) +RiuResultInfoPanel::RiuResultInfoPanel( QWidget* parent ) : QWidget( parent ) { m_textEdit = new QTextEdit( this ); diff --git a/ApplicationLibCode/UserInterface/RiuResultInfoPanel.h b/ApplicationLibCode/UserInterface/RiuResultInfoPanel.h index 0dacd120cf..b50777f3f5 100644 --- a/ApplicationLibCode/UserInterface/RiuResultInfoPanel.h +++ b/ApplicationLibCode/UserInterface/RiuResultInfoPanel.h @@ -20,7 +20,6 @@ #include -class QDockWidget; class QTextEdit; //================================================================================================== @@ -33,7 +32,7 @@ class RiuResultInfoPanel : public QWidget Q_OBJECT public: - explicit RiuResultInfoPanel( QDockWidget* parent ); + explicit RiuResultInfoPanel( QWidget* parent ); void setInfo( const QString& info ); diff --git a/CMakeLists.txt b/CMakeLists.txt index 0923db7e45..26b0757b38 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -444,15 +444,6 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") target_compile_options(qwt PRIVATE -Wno-deprecated) endif() -if(RESINSIGHT_ENABLE_UNITY_BUILD) - message("Cmake Unity build is enabled on : qwt") - set_property(TARGET qwt PROPERTY UNITY_BUILD true) - message("Cmake Unity build is enabled on : custom-opm-flowdiagnostics") - set_property(TARGET custom-opm-flowdiagnostics PROPERTY UNITY_BUILD true) - message("Cmake Unity build is enabled on : custom-opm-common") - set_property(TARGET custom-opm-common PROPERTY UNITY_BUILD true) -endif() - list(APPEND THIRD_PARTY_LIBRARIES qwt) # ############################################################################## @@ -470,11 +461,6 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") target_compile_options(qtadvanceddocking PRIVATE -Wno-deprecated) endif() -if(RESINSIGHT_ENABLE_UNITY_BUILD) - message("Cmake Unity build is enabled on : QtADS") - set_property(TARGET qtadvanceddocking PROPERTY UNITY_BUILD true) -endif() - list(APPEND THIRD_PARTY_LIBRARIES qtadvanceddocking) # ############################################################################## @@ -519,6 +505,20 @@ list(APPEND THIRD_PARTY_LIBRARIES clipper) # ############################################################################## set_property(TARGET ${THIRD_PARTY_LIBRARIES} PROPERTY FOLDER "Thirdparty") +# ############################################################################## +# Unity Build +# ############################################################################## +if(RESINSIGHT_ENABLE_UNITY_BUILD) + message("Cmake Unity build is enabled on : qwt") + set_property(TARGET qwt PROPERTY UNITY_BUILD true) + message("Cmake Unity build is enabled on : custom-opm-flowdiagnostics") + set_property(TARGET custom-opm-flowdiagnostics PROPERTY UNITY_BUILD true) + message("Cmake Unity build is enabled on : custom-opm-common") + set_property(TARGET custom-opm-common PROPERTY UNITY_BUILD true) + message("Cmake Unity build is enabled on : qtadvanceddocking") + set_property(TARGET qtadvanceddocking PROPERTY UNITY_BUILD true) +endif() + # ############################################################################## # Vizualization Framework # ############################################################################## diff --git a/ThirdParty/qtadvanceddocking b/ThirdParty/qtadvanceddocking index 75d58b3ea3..3d365a0b84 160000 --- a/ThirdParty/qtadvanceddocking +++ b/ThirdParty/qtadvanceddocking @@ -1 +1 @@ -Subproject commit 75d58b3ea310a609ecaee695ef8d0f065413bc86 +Subproject commit 3d365a0b84e4ae87481e5545c30abd002676812c