Active view tracking for 3d window

This commit is contained in:
Jon Jenssen authored and JJ committed 2026-06-17 13:55:32 +02:00
1 parent ad73f8d26c
commit 7fd55a0b91
14 files changed
+145 -32

No files matched your search

@@ -1144,15 +1144,9 @@ RimViewWindow* RiaGuiApplication::activeViewWindow()
{
viewWindow = RiaGuiApplication::instance()->activeReservoirView();
}
else if ( dynamic_cast<RiuPlotMainWindow*>( mainWindowWidget ) )
else if ( auto mainPlotWindow = dynamic_cast<RiuPlotMainWindow*>( mainWindowWidget ) )
{
RiuPlotMainWindow* mainPlotWindow = dynamic_cast<RiuPlotMainWindow*>( mainWindowWidget );
// QList<QMdiSubWindow*> subwindows = mainPlotWindow->subWindowList( QMdiArea::StackingOrder );
// if ( !subwindows.empty() )
//{
// viewWindow = RiuInterfaceToViewWindow::viewWindowFromWidget( subwindows.back()->widget() );
// }
viewWindow = mainPlotWindow->activePlotView();
}
return viewWindow;
@@ -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<Rim3dView*>( pdmView ) )
{
RiaApplication::instance()->setActiveReservoirView( resView );
if ( auto mainWin = dynamic_cast<RiuMainWindow*>( getMainWindow() ) )
{
mainWin->refreshViewActions();
mainWin->refreshAnimationActions();
mainWin->refreshDrawStyleActions();
}
}
}
}
}
@@ -42,7 +42,7 @@ public:
void setViewToControl( RimViewWindow* view );
int mainWindowId() const;
void setActiveViewer();
void setAsActiveViewer();
void updateViewerWidget();
void handleViewerDeletion();
@@ -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 );
}
//--------------------------------------------------------------------------------------------------
@@ -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
@@ -320,6 +320,14 @@ QString RiuDockWidgetTools::dockStateHideAll3DWindowName()
return "Hide All";
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RiuDockWidgetTools::viewWindowPrefix()
{
return "DockViewWindow_";
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -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 );
@@ -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<RimViewWindow*> RiuMainWindow::viewWindows()
{
std::vector<RimViewWindow*> 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();
}
@@ -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<RimViewWindow*> viewWindows() override;
void setResultInfo( const QString& info ) const;
void refreshViewActions();
@@ -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<ads::CDockWidget*>( sender() ) )
{
for ( auto view : viewWindows() )
{
if ( view->dockWidget() == dockWidget )
{
view->setAsActiveViewer();
break;
}
}
}
}
@@ -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<RimViewWindow*> viewWindows() = 0;
void loadWinGeoAndDockToolBarLayout();
void saveWinGeoAndDockToolBarLayout();
@@ -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<RimViewWindow*> RiuPlotMainWindow::viewWindows()
{
std::vector<RimViewWindow*> views;
for ( auto v : RimProject::current()->descendantsOfType<RimPlotWindow>() )
{
views.push_back( v );
}
return views;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimViewWindow* RiuPlotMainWindow::activePlotView()
{
for ( auto view : viewWindows() )
{
if ( view->isActive() )
{
return view;
}
}
return nullptr;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -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<RimViewWindow*> viewWindows() override;
RimViewWindow* activePlotView();
void setDefaultWindowSize();
void enable3DSelectionLink( bool enable );
@@ -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();
}
}