From 7fd55a0b91f8f5551f392d870fadbb7c5033f456 Mon Sep 17 00:00:00 2001 From: Jon Jenssen Date: Tue, 19 May 2026 18:08:18 +0200 Subject: [PATCH] Active view tracking for 3d window --- .../Application/RiaGuiApplication.cpp | 10 ++---- .../RimDockWindowController.cpp | 36 ++++++++++++++++--- .../RimDockWindowController.h | 2 +- .../ProjectDataModel/RimViewWindow.cpp | 22 ++++++++++-- .../ProjectDataModel/RimViewWindow.h | 2 +- .../UserInterface/RiuDockWidgetTools.cpp | 8 +++++ .../UserInterface/RiuDockWidgetTools.h | 2 ++ .../UserInterface/RiuMainWindow.cpp | 21 +++++++++-- .../UserInterface/RiuMainWindow.h | 4 ++- .../UserInterface/RiuMainWindowBase.cpp | 19 ++++++++-- .../UserInterface/RiuMainWindowBase.h | 6 +++- .../UserInterface/RiuPlotMainWindow.cpp | 34 ++++++++++++++++-- .../UserInterface/RiuPlotMainWindow.h | 6 ++-- .../UserInterface/RiuViewer.cpp | 5 +-- 14 files changed, 145 insertions(+), 32 deletions(-) diff --git a/ApplicationLibCode/Application/RiaGuiApplication.cpp b/ApplicationLibCode/Application/RiaGuiApplication.cpp index 44b0cd88bd..6395397d13 100644 --- a/ApplicationLibCode/Application/RiaGuiApplication.cpp +++ b/ApplicationLibCode/Application/RiaGuiApplication.cpp @@ -1144,15 +1144,9 @@ RimViewWindow* RiaGuiApplication::activeViewWindow() { viewWindow = RiaGuiApplication::instance()->activeReservoirView(); } - else if ( dynamic_cast( mainWindowWidget ) ) + else if ( auto mainPlotWindow = dynamic_cast( mainWindowWidget ) ) { - RiuPlotMainWindow* mainPlotWindow = dynamic_cast( mainWindowWidget ); - - // QList subwindows = mainPlotWindow->subWindowList( QMdiArea::StackingOrder ); - // if ( !subwindows.empty() ) - //{ - // viewWindow = RiuInterfaceToViewWindow::viewWindowFromWidget( subwindows.back()->widget() ); - // } + viewWindow = mainPlotWindow->activePlotView(); } return viewWindow; diff --git a/ApplicationLibCode/ProjectDataModel/RimDockWindowController.cpp b/ApplicationLibCode/ProjectDataModel/RimDockWindowController.cpp index ae85b84233..ba2d40cf2b 100644 --- a/ApplicationLibCode/ProjectDataModel/RimDockWindowController.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimDockWindowController.cpp @@ -19,9 +19,11 @@ #include "RimDockWindowController.h" #include "RiaGuiApplication.h" +#include "Rim3dView.h" #include "RimProject.h" #include "RimViewWindow.h" +#include "RiuDockWidgetTools.h" #include "RiuMainWindowBase.h" #include "RiuViewer.h" @@ -72,7 +74,7 @@ void RimDockWindowController::removeWindowFromDock() viewPdmObject()->deleteDockWidget(); viewPdmObject()->deleteViewWidget(); - mainWin->removeViewer( viewWidget() ); + mainWin->onViewerRemoved(); } } @@ -129,6 +131,7 @@ void RimDockWindowController::updateViewerWidget() QWidget* viewWidget = viewPdmObject()->createViewWidget( dockWidget ); dockWidget->setWidget( viewWidget ); dockWidget->setObjectName( viewPdmObject()->dockWindowName() ); + viewWidget->setObjectName( viewPdmObject()->dockWindowName() ); mainWindow->initializeViewer( dockWidget, viewWidget ); mainWindow->connect( dockWidget, SIGNAL( closed() ), mainWindow, SLOT( slotDockViewerClosed() ) ); @@ -144,9 +147,8 @@ void RimDockWindowController::updateViewerWidget() if ( viewWidget() ) { viewPdmObject()->deleteDockWidget(); - mainWindow->removeViewer( viewWidget() ); - viewPdmObject()->deleteViewWidget(); + mainWindow->onViewerRemoved(); } } } @@ -178,11 +180,35 @@ int RimDockWindowController::mainWindowId() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimDockWindowController::setActiveViewer() +void RimDockWindowController::setAsActiveViewer() { + if ( getMainWindow() == nullptr ) return; + if ( auto pdmView = viewPdmObject() ) { if ( pdmView->isActive() ) return; + + for ( auto viewWin : getMainWindow()->viewWindows() ) + { + if ( viewWin->isActive() ) + { + viewWin->setActive( false ); + viewWin->updateWindowTitle(); + } + } + pdmView->setActive( true ); + pdmView->updateWindowTitle(); + + if ( auto resView = dynamic_cast( pdmView ) ) + { + RiaApplication::instance()->setActiveReservoirView( resView ); + if ( auto mainWin = dynamic_cast( getMainWindow() ) ) + { + mainWin->refreshViewActions(); + mainWin->refreshAnimationActions(); + mainWin->refreshDrawStyleActions(); + } + } } -} \ No newline at end of file +} diff --git a/ApplicationLibCode/ProjectDataModel/RimDockWindowController.h b/ApplicationLibCode/ProjectDataModel/RimDockWindowController.h index cb6d5787e6..a4733c7035 100644 --- a/ApplicationLibCode/ProjectDataModel/RimDockWindowController.h +++ b/ApplicationLibCode/ProjectDataModel/RimDockWindowController.h @@ -42,7 +42,7 @@ public: void setViewToControl( RimViewWindow* view ); int mainWindowId() const; - void setActiveViewer(); + void setAsActiveViewer(); void updateViewerWidget(); void handleViewerDeletion(); diff --git a/ApplicationLibCode/ProjectDataModel/RimViewWindow.cpp b/ApplicationLibCode/ProjectDataModel/RimViewWindow.cpp index f6d7e99e31..12e7e7c0ec 100644 --- a/ApplicationLibCode/ProjectDataModel/RimViewWindow.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimViewWindow.cpp @@ -29,6 +29,8 @@ #include "RimDockWindowController.h" #include "RimProject.h" +#include "RiuDockWidgetTools.h" + #include "cafPdmUiTreeAttributes.h" #include "cafPdmUiTreeViewEditor.h" @@ -275,8 +277,22 @@ void RimViewWindow::updateWindowTitle() if ( viewWidget() && dockWidget() ) { viewWidget()->setWindowTitle( windowTitle() ); - dockWidget()->setWindowTitle( windowTitle() ); - dockWidget()->setIcon( QIcon( ":/ActiveWindow.svg" ) ); + if ( dockWidget()->isFloating() && isActive() ) + { + dockWidget()->setWindowTitle( "* " + windowTitle() ); + } + else + { + dockWidget()->setWindowTitle( windowTitle() ); + } + if ( isActive() ) + { + dockWidget()->setIcon( QIcon( ":/ActiveWindow.svg" ) ); + } + else + { + dockWidget()->setIcon( QIcon() ); + } } } @@ -285,7 +301,7 @@ void RimViewWindow::updateWindowTitle() //-------------------------------------------------------------------------------------------------- QString RimViewWindow::dockWindowName() const { - return QString( "DockViewWindow_%1" ).arg( m_dockWindowId ); + return QString( "%1_%2" ).arg( RiuDockWidgetTools::viewWindowPrefix() ).arg( m_dockWindowId ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimViewWindow.h b/ApplicationLibCode/ProjectDataModel/RimViewWindow.h index a94b0abc65..c09ae225c4 100644 --- a/ApplicationLibCode/ProjectDataModel/RimViewWindow.h +++ b/ApplicationLibCode/ProjectDataModel/RimViewWindow.h @@ -46,6 +46,7 @@ public: void setShowWindow( bool showWindow ); void setAsActiveViewer(); + bool isActive() const; bool isMainDockedWindow() const; @@ -87,7 +88,6 @@ protected: virtual bool isWindowVisible() const; // Virtual To allow special visibility control void deleteDockWidget(); void setActive( bool active ); - bool isActive() const; //// // Derived classes are not supposed to override this function. The intention is to always use m_showWindow diff --git a/ApplicationLibCode/UserInterface/RiuDockWidgetTools.cpp b/ApplicationLibCode/UserInterface/RiuDockWidgetTools.cpp index 7fba43710a..1628e873b2 100644 --- a/ApplicationLibCode/UserInterface/RiuDockWidgetTools.cpp +++ b/ApplicationLibCode/UserInterface/RiuDockWidgetTools.cpp @@ -320,6 +320,14 @@ QString RiuDockWidgetTools::dockStateHideAll3DWindowName() return "Hide All"; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiuDockWidgetTools::viewWindowPrefix() +{ + return "DockViewWindow_"; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/RiuDockWidgetTools.h b/ApplicationLibCode/UserInterface/RiuDockWidgetTools.h index eb13e12d9f..ad5f95f9ca 100644 --- a/ApplicationLibCode/UserInterface/RiuDockWidgetTools.h +++ b/ApplicationLibCode/UserInterface/RiuDockWidgetTools.h @@ -91,6 +91,8 @@ public: static QString dockStateHideAllPlotWindowName(); static QString dockStateHideAll3DWindowName(); + static QString viewWindowPrefix(); + static QAction* toggleActionForWidget( const ads::CDockManager* dockManager, const QString& dockWidgetName ); static ads::CDockWidget* findDockWidget( const ads::CDockManager* dockManager, const QString& dockWidgetName ); diff --git a/ApplicationLibCode/UserInterface/RiuMainWindow.cpp b/ApplicationLibCode/UserInterface/RiuMainWindow.cpp index d0125f88f2..471ff5eb16 100644 --- a/ApplicationLibCode/UserInterface/RiuMainWindow.cpp +++ b/ApplicationLibCode/UserInterface/RiuMainWindow.cpp @@ -1189,9 +1189,11 @@ RiuMessagePanel* RiuMainWindow::messagePanel() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuMainWindow::removeViewer( QWidget* viewer ) +void RiuMainWindow::onViewerRemoved() { slotRefreshViewActions(); + refreshAnimationActions(); + refreshDrawStyleActions(); } //-------------------------------------------------------------------------------------------------- @@ -1204,6 +1206,21 @@ void RiuMainWindow::initializeViewer( ads::CDockWidget* dockWidget, QWidget* vie slotRefreshViewActions(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RiuMainWindow::viewWindows() +{ + std::vector views; + + for ( auto v : RimProject::current()->allViews() ) + { + views.push_back( v ); + } + + return views; +} + //-------------------------------------------------------------------------------------------------- /// This method needs to handle memory deallocation !!! //-------------------------------------------------------------------------------------------------- @@ -1480,7 +1497,7 @@ void RiuMainWindow::selectedObjectsChanged() slotRefreshViewActions(); // The only way to get to this code is by selection change initiated from the project tree view - // As we are activating an MDI-window, the focus is given to this MDI-window + // As we are activating an view window, the focus might be given to this window // Set focus back to the tree view to be able to continue keyboard tree view navigation projectTree->treeView()->setFocus(); } diff --git a/ApplicationLibCode/UserInterface/RiuMainWindow.h b/ApplicationLibCode/UserInterface/RiuMainWindow.h index 2879c3c8ee..3cc346d1e2 100644 --- a/ApplicationLibCode/UserInterface/RiuMainWindow.h +++ b/ApplicationLibCode/UserInterface/RiuMainWindow.h @@ -92,9 +92,11 @@ public: void cleanupGuiCaseClose(); void cleanupGuiBeforeProjectClose(); - void removeViewer( QWidget* viewer ) override; + void onViewerRemoved() override; void initializeViewer( ads::CDockWidget* dockWidget, QWidget* viewer ) override; + std::vector viewWindows() override; + void setResultInfo( const QString& info ) const; void refreshViewActions(); diff --git a/ApplicationLibCode/UserInterface/RiuMainWindowBase.cpp b/ApplicationLibCode/UserInterface/RiuMainWindowBase.cpp index 41416527f2..69d796cdf1 100644 --- a/ApplicationLibCode/UserInterface/RiuMainWindowBase.cpp +++ b/ApplicationLibCode/UserInterface/RiuMainWindowBase.cpp @@ -120,9 +120,14 @@ ads::CDockManager* RiuMainWindowBase::dockManager() const //-------------------------------------------------------------------------------------------------- void RiuMainWindowBase::setActiveViewer( QString viewerName ) { - if ( auto dockWidget = dockManager()->findDockWidget( viewerName ) ) + for ( auto view : viewWindows() ) { - dockWidget->setAsCurrentTab(); + if ( view->dockWidget() && view->dockWidget()->objectName() == viewerName ) + { + view->setAsActiveViewer(); + view->dockWidget()->setAsCurrentTab(); + break; + } } } @@ -363,8 +368,18 @@ void RiuMainWindowBase::slotDockWidgetToggleViewActionTriggered() //-------------------------------------------------------------------------------------------------- void RiuMainWindowBase::slotDockViewerVisibilityChanged( bool visible ) { + if ( !visible ) return; + if ( auto dockWidget = dynamic_cast( sender() ) ) { + for ( auto view : viewWindows() ) + { + if ( view->dockWidget() == dockWidget ) + { + view->setAsActiveViewer(); + break; + } + } } } diff --git a/ApplicationLibCode/UserInterface/RiuMainWindowBase.h b/ApplicationLibCode/UserInterface/RiuMainWindowBase.h index f64e4ccc22..9a7777ba70 100644 --- a/ApplicationLibCode/UserInterface/RiuMainWindowBase.h +++ b/ApplicationLibCode/UserInterface/RiuMainWindowBase.h @@ -48,6 +48,8 @@ class PdmUiPropertyView; class QAction; class QUndoView; +class RimViewWindow; + //================================================================================================== /// //================================================================================================== @@ -61,9 +63,11 @@ public: virtual QString mainWindowName() = 0; - virtual void removeViewer( QWidget* viewer ) = 0; virtual void initializeViewer( ads::CDockWidget* dockWidget, QWidget* viewer ) {}; virtual void setActiveViewer( QString viewerName ); + virtual void onViewerRemoved() = 0; + + virtual std::vector viewWindows() = 0; void loadWinGeoAndDockToolBarLayout(); void saveWinGeoAndDockToolBarLayout(); diff --git a/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp b/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp index 3dd68ad3ad..35806b3776 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp +++ b/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp @@ -740,9 +740,8 @@ void RiuPlotMainWindow::showAndSetKeyboardFocusToSummaryPlotManager() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuPlotMainWindow::removeViewer( QWidget* viewer ) +void RiuPlotMainWindow::onViewerRemoved() { - // removeViewerFromMdiArea( m_mdiArea, viewer ); refreshToolbars(); } @@ -755,6 +754,37 @@ void RiuPlotMainWindow::initializeViewer( ads::CDockWidget* dockWidget, QWidget* viewer->update(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RiuPlotMainWindow::viewWindows() +{ + std::vector views; + + for ( auto v : RimProject::current()->descendantsOfType() ) + { + views.push_back( v ); + } + + return views; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimViewWindow* RiuPlotMainWindow::activePlotView() +{ + for ( auto view : viewWindows() ) + { + if ( view->isActive() ) + { + return view; + } + } + + return nullptr; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/RiuPlotMainWindow.h b/ApplicationLibCode/UserInterface/RiuPlotMainWindow.h index aca4568c99..df3c7c7f2e 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotMainWindow.h +++ b/ApplicationLibCode/UserInterface/RiuPlotMainWindow.h @@ -68,8 +68,10 @@ public: void cleanupGuiBeforeProjectClose(); void cleanUpTemporaryWidgets(); - void removeViewer( QWidget* viewer ) override; - void initializeViewer( ads::CDockWidget* dockWidget, QWidget* viewer ) override; + void onViewerRemoved() override; + void initializeViewer( ads::CDockWidget* dockWidget, QWidget* viewer ) override; + std::vector viewWindows() override; + RimViewWindow* activePlotView(); void setDefaultWindowSize(); void enable3DSelectionLink( bool enable ); diff --git a/ApplicationLibCode/UserInterface/RiuViewer.cpp b/ApplicationLibCode/UserInterface/RiuViewer.cpp index 15149d3702..0f4ea7b9ff 100644 --- a/ApplicationLibCode/UserInterface/RiuViewer.cpp +++ b/ApplicationLibCode/UserInterface/RiuViewer.cpp @@ -724,10 +724,7 @@ void RiuViewer::mousePressEvent( QMouseEvent* mouseEvent ) { m_lastMousePressPosition = mouseEvent->pos(); - if ( mouseEvent->button() == Qt::LeftButton ) - { - if ( auto ownView = ownerViewWindow() ) ownView->setAsActiveViewer(); - } + if ( auto ownView = ownerViewWindow() ) ownView->setAsActiveViewer(); } }