Dock system selection improvements and fixes (#14305)

* Make sure we don't trigger another select when a view in the project tree is selected.
* Fix for #14255 and related issues
* Make sure we can close and open a main window, keeping the layout when reopened.
This commit is contained in:
JJ
2026-06-24 16:07:21 +02:00
committed by GitHub
parent ac97f76e97
commit 82aa009378
12 changed files with 104 additions and 30 deletions
@@ -1120,6 +1120,13 @@ RiuPlotMainWindow* RiaGuiApplication::getOrCreateAndShowMainPlotWindow()
createMainPlotWindow();
m_mainPlotWindow->initializeGuiNewProjectLoaded();
loadAndUpdatePlotData();
if ( m_project )
{
if ( !m_mainPlotWindow->restoreDockWidgetState( m_project->plotWindowDockState ) )
{
RiuDockWidgetTools::setDockLayout( m_mainPlotWindow, RiuDockWidgetTools::dockStatePlotWindowName() );
}
}
}
if ( m_mainPlotWindow->isMinimized() )
@@ -37,7 +37,7 @@ void RicShowMainWindowFeature::showMainWindow()
{
RiuMainWindow* mainWnd = RiuMainWindow::instance();
if ( mainWnd )
if ( mainWnd != nullptr )
{
if ( mainWnd->isMinimized() )
{
@@ -54,7 +54,7 @@ void RicShowMainWindowFeature::showMainWindow()
else
{
RiaGuiApplication* app = RiaGuiApplication::instance();
app->getOrCreateAndShowMainWindow();
mainWnd = app->getOrCreateAndShowMainWindow();
// When the main window is created, make sure all the views are loaded and displayed
@@ -70,6 +70,10 @@ void RicShowMainWindowFeature::showMainWindow()
}
}
}
if ( mainWnd )
{
mainWnd->restoreDockWidgetState( RimProject::current()->mainWindowDockState );
}
}
}
@@ -181,7 +181,7 @@ int RimDockWindowController::mainWindowId() const
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimDockWindowController::setAsActiveViewer()
void RimDockWindowController::setAsActiveViewer( bool allowSelectionChange )
{
if ( getMainWindow() == nullptr ) return;
@@ -218,7 +218,7 @@ void RimDockWindowController::setAsActiveViewer()
}
else if ( viewPlot )
{
RiuPlotMainWindowTools::selectAsCurrentItem( viewPlot );
if ( allowSelectionChange ) RiuPlotMainWindowTools::selectAsCurrentItem( viewPlot );
RiuPlotMainWindowTools::refreshToolbars();
}
}
@@ -49,7 +49,7 @@ public:
void setViewToControl( RimViewWindow* view );
int mainWindowId() const;
void setAsActiveViewer();
void setAsActiveViewer( bool allowSelectionChange );
void updateViewerWidget();
void handleViewerDeletion();
@@ -88,9 +88,9 @@ void RimViewWindow::setShowWindow( bool showWindow )
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimViewWindow::setAsActiveViewer()
void RimViewWindow::setAsActiveViewer( bool allowSelectionChange )
{
if ( m_windowController ) m_windowController->setAsActiveViewer();
if ( m_windowController ) m_windowController->setAsActiveViewer( allowSelectionChange );
}
//--------------------------------------------------------------------------------------------------
@@ -46,7 +46,7 @@ public:
bool showWindow() const;
void setShowWindow( bool showWindow );
void setAsActiveViewer();
void setAsActiveViewer( bool allowSelectionChange = false );
bool isActiveViewer() const;
bool isMainDockedWindow() const;
@@ -351,8 +351,13 @@ void RiuMainWindow::closeEvent( QCloseEvent* event )
return;
}
}
saveWinGeoAndDockToolBarLayout();
QMainWindow::closeEvent( event );
if ( auto proj = RimProject::current() )
{
proj->mainWindowDockState = dockWidgetStateString();
}
RiuMainWindowBase::closeEvent( event );
}
//--------------------------------------------------------------------------------------------------
@@ -138,10 +138,20 @@ QString RiuMainWindowBase::dockWidgetStateString() const
//--------------------------------------------------------------------------------------------------
bool RiuMainWindowBase::restoreDockWidgetState( QString dockStateString )
{
if ( dockStateString.isEmpty() ) return false;
QByteArray dockState = QByteArray::fromBase64( dockStateString.toLatin1() );
return m_dockManager->restoreState( dockState, DOCKSTATE_VERSION );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RiuMainWindowBase::restoreLastDockWidgetState()
{
if ( m_lastDockState.isEmpty() ) return false;
return m_dockManager->restoreState( m_lastDockState, DOCKSTATE_VERSION );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -153,8 +163,15 @@ void RiuMainWindowBase::setActiveViewer( QString viewerName )
auto dockName = view->dockWidget()->objectName();
if ( view->dockWidget() && view->dockWidget()->objectName() == viewerName )
{
view->setAsActiveViewer();
view->dockWidget()->setAsCurrentTab();
if ( !view->isActiveViewer() )
{
view->setAsActiveViewer( !isBlockingViewSelectionOnSubWindowActivated() );
}
if ( !view->dockWidget()->isCurrentTab() )
{
view->dockWidget()->setAsCurrentTab();
}
break;
}
}
@@ -201,8 +218,6 @@ void RiuMainWindowBase::loadWinGeoAndDockToolBarLayout()
}
}
m_lastDockState = m_dockManager->saveState( DOCKSTATE_VERSION );
settings.beginGroup( registryFolderName() );
m_dockManager->loadPerspectives( settings );
}
@@ -352,17 +367,6 @@ bool RiuMainWindowBase::isBlockingViewSelectionOnSubWindowActivated() const
return m_blockSubWindowProjectTreeSelection;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiuMainWindowBase::removeViewerFromDockArea( QWidget* viewer )
{
if ( auto dw = m_dockManager->findDockWidget( viewer->objectName() ) )
{
dw->close();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -420,7 +424,10 @@ void RiuMainWindowBase::slotDockViewerVisibilityChanged( bool visible )
if ( view->dockWidget() == dockWidget )
{
view->setAsActiveViewer();
selectAsCurrentItem( view );
if ( !isBlockingViewSelectionOnSubWindowActivated() )
{
selectAsCurrentItem( view );
}
break;
}
}
@@ -780,6 +787,21 @@ void RiuMainWindowBase::showEvent( QShowEvent* event )
QMainWindow::showEvent( event );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiuMainWindowBase::closeEvent( QCloseEvent* event )
{
saveWinGeoAndDockToolBarLayout();
for ( auto view : viewWindows() )
{
view->removeWindowFromDock();
}
QMainWindow::closeEvent( event );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -96,13 +96,12 @@ public:
QString dockWidgetStateString() const;
bool restoreDockWidgetState( QString dockStateString );
bool restoreLastDockWidgetState();
protected:
void createTreeViews( int numberOfTrees );
void setUpCentralDockWidget();
void removeViewerFromDockArea( QWidget* viewer );
void restoreTreeViewStates( QString treeStateString, QString treeIndexString );
ads::CDockAreaWidget* addTabbedWidgets( std::vector<ads::CDockWidget*> widgets,
@@ -114,6 +113,7 @@ protected:
virtual QStringList defaultDockStateNames() = 0;
void showEvent( QShowEvent* event ) override;
void closeEvent( QCloseEvent* event ) override;
virtual void onCentralWidgetContextMenu( QMenu& menu ) {};
@@ -57,6 +57,7 @@
#include "RiuMessagePanel.h"
#include "RiuMultiPlotBook.h"
#include "RiuMultiPlotPage.h"
#include "RiuPlotMainWindowTools.h"
#include "RiuToolTipMenu.h"
#include "RiuTools.h"
#include "RiuTreeViewEventFilter.h"
@@ -275,8 +276,15 @@ void RiuPlotMainWindow::closeEvent( QCloseEvent* event )
return;
}
}
saveWinGeoAndDockToolBarLayout();
QMainWindow::closeEvent( event );
RiuPlotMainWindowTools::remove3dViewsFromDocking();
if ( auto proj = RimProject::current() )
{
proj->plotWindowDockState = dockWidgetStateString();
}
RiuMainWindowBase::closeEvent( event );
}
//--------------------------------------------------------------------------------------------------
@@ -17,7 +17,12 @@
/////////////////////////////////////////////////////////////////////////////////
#include "RiuPlotMainWindowTools.h"
#include "RiaGuiApplication.h"
#include "RimViewWindow.h"
#include "RiuMainWindow.h"
#include "RiuPlotMainWindow.h"
#include "cafPdmObject.h"
@@ -156,3 +161,25 @@ void RiuPlotMainWindowTools::onObjectAppended( const caf::PdmObject* objectToSel
RiuPlotMainWindowTools::refreshToolbars();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiuPlotMainWindowTools::remove3dViewsFromDocking()
{
if ( !RiaGuiApplication::isRunning() ) return;
if ( auto mainWnd = RiaGuiApplication::instance()->mainWindow() )
{
for ( auto view : mainWnd->viewWindows() )
{
if ( view->isDockedInPlotView() )
{
view->setShowWindow( false );
view->removeWindowFromDock();
view->dockAs3DViewWindow();
view->updateConnectedEditors();
}
}
}
}
@@ -35,6 +35,7 @@ public:
static void selectAsCurrentItem( const caf::PdmObject* object );
static void selectOrToggleObject( const caf::PdmObject* object, bool toggle );
static void refreshToolbars();
static void remove3dViewsFromDocking();
// Returns the first visible ancestor of the object, or the object itself if it is visible.
static const caf::PdmObject* firstVisibleAncestorOrThis( const caf::PdmObject* object );