Store dock state in project

This commit is contained in:
Jon Jenssen
2026-06-17 13:55:32 +02:00
committed by JJ
parent 7bd429b937
commit 09ea2e7028
8 changed files with 112 additions and 81 deletions
@@ -227,11 +227,6 @@ RiaGuiApplication::~RiaGuiApplication()
}
processEvents();
delete m_mainWindow.data();
m_mainWindow.clear();
m_mainPlotWindow.reset();
}
//--------------------------------------------------------------------------------------------------
@@ -404,6 +399,37 @@ void RiaGuiApplication::storeTreeViewState()
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiaGuiApplication::storeDockState()
{
if ( m_mainWindow )
{
project()->mainWindowDockState = m_mainWindow->dockWidgetStateString();
}
if ( m_mainPlotWindow )
{
project()->plotWindowDockState = m_mainPlotWindow->dockWidgetStateString();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiaGuiApplication::restoreDockState()
{
if ( m_mainWindow && !project()->mainWindowDockState().isEmpty() )
{
m_mainWindow->restoreDockWidgetState( project()->mainWindowDockState );
}
if ( m_mainPlotWindow && !project()->plotWindowDockState().isEmpty() )
{
m_mainPlotWindow->restoreDockWidgetState( project()->plotWindowDockState );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -1074,7 +1100,7 @@ void RiaGuiApplication::createMainPlotWindow()
// Always enable undo/redo framework, as multi-select operations perform significantly better with it enabled
caf::CmdExecCommandManager::instance()->enableUndoCommandSystem( true );
m_mainPlotWindow = std::make_unique<RiuPlotMainWindow>();
m_mainPlotWindow = new RiuPlotMainWindow();
m_mainPlotWindow->setWindowTitle( "Plots - ResInsight" );
m_mainPlotWindow->setDefaultWindowSize();
m_mainPlotWindow->loadWinGeoAndDockToolBarLayout();
@@ -1376,6 +1402,8 @@ void RiaGuiApplication::onProjectOpened()
m_mainPlotWindow->raise();
m_mainPlotWindow->activateWindow();
}
restoreDockState();
}
//--------------------------------------------------------------------------------------------------
@@ -1417,6 +1445,7 @@ void RiaGuiApplication::onProjectBeingSaved()
{
setLastUsedDialogDirectory( "BINARY_GRID", QFileInfo( m_project->fileName() ).absolutePath() );
storeTreeViewState();
storeDockState();
if ( auto sumCaseMainColl = RiaSummaryTools::summaryCaseMainCollection() )
{
@@ -156,14 +156,16 @@ private:
void createMainPlotWindow();
void storeTreeViewState();
void storeDockState();
void restoreDockState();
private slots:
void slotWorkerProcessFinished( int exitCode, QProcess::ExitStatus exitStatus );
void onLastWindowClosed();
private:
QPointer<RiuMainWindow> m_mainWindow;
std::unique_ptr<RiuPlotMainWindow> m_mainPlotWindow;
QPointer<RiuMainWindow> m_mainWindow;
QPointer<RiuPlotMainWindow> m_mainPlotWindow;
std::unique_ptr<RiuRecentFileActionProvider> m_recentFileActionProvider;
};
@@ -171,11 +171,11 @@ RimProject::RimProject()
CAF_PDM_InitField( &m_showPlotWindowOnTopOf3DWindow, "showPlotWindowOnTopOf3DWindow", false, "Show Plot On Top" );
m_showPlotWindowOnTopOf3DWindow.uiCapability()->setUiHidden( true );
CAF_PDM_InitField( &m_subWindowsTiled3DWindow_OBSOLETE, "tiled3DWindow", false, "Tile 3D Window" );
m_subWindowsTiled3DWindow_OBSOLETE.uiCapability()->setUiHidden( true );
CAF_PDM_InitField( &mainWindowDockState, "MainWindowDockState", QString(), "Dock State 3D Window" );
mainWindowDockState.uiCapability()->setUiHidden( true );
CAF_PDM_InitField( &m_subWindowsTiledPlotWindow_OBSOLETE, "tiledPlotWindow", false, "Tile Plot Window" );
m_subWindowsTiledPlotWindow_OBSOLETE.uiCapability()->setUiHidden( true );
CAF_PDM_InitField( &plotWindowDockState, "PlotWindowDockState", QString(), "Dock State Plot Window" );
plotWindowDockState.uiCapability()->setUiHidden( true );
CAF_PDM_InitFieldNoDefault( &m_dialogData, "DialogData", "DialogData" );
m_dialogData = new RimDialogData();
@@ -188,11 +188,6 @@ RimProject::RimProject()
CAF_PDM_InitFieldNoDefault( &caseGroupsObsolete, "CaseGroups", "" );
RiaFieldHandleTools::disableWriteAndSetFieldHidden( &caseGroupsObsolete );
CAF_PDM_InitFieldNoDefault( &m_subWindowsTileMode3DWindow, "TileMode3DWindow", "TileMode3DWindow" );
m_subWindowsTileMode3DWindow.uiCapability()->setUiHidden( true );
CAF_PDM_InitFieldNoDefault( &m_subWindowsTileModePlotWindow, "TileModePlotWindow", "TileModePlotWindow" );
m_subWindowsTileModePlotWindow.uiCapability()->setUiHidden( true );
// Initialization
scriptCollection = new RimScriptCollection();
@@ -329,9 +324,6 @@ void RimProject::updatesAfterProjectFileIsRead()
RimOilField* oilField = oilFields[oilFieldIdx];
if ( oilField == nullptr || oilField->wellPathCollection == nullptr ) continue;
}
if ( m_subWindowsTiled3DWindow_OBSOLETE ) m_subWindowsTileMode3DWindow = RiaDefines::WindowTileMode::DEFAULT;
if ( m_subWindowsTiledPlotWindow_OBSOLETE ) m_subWindowsTileModePlotWindow = RiaDefines::WindowTileMode::DEFAULT;
}
//--------------------------------------------------------------------------------------------------
@@ -1012,38 +1004,6 @@ bool RimProject::showPlotWindowOnTop() const
return m_showPlotWindowOnTopOf3DWindow();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiaDefines::WindowTileMode RimProject::subWindowsTileMode3DWindow() const
{
return m_subWindowsTileMode3DWindow();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiaDefines::WindowTileMode RimProject::subWindowsTileModePlotWindow() const
{
return m_subWindowsTileModePlotWindow();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimProject::setSubWindowsTileMode3DWindow( RiaDefines::WindowTileMode tileMode )
{
m_subWindowsTileMode3DWindow = tileMode;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimProject::setSubWindowsTileModePlotWindow( RiaDefines::WindowTileMode tileMode )
{
m_subWindowsTileModePlotWindow = tileMode;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -113,6 +113,9 @@ public:
caf::PdmField<QString> plotWindowTreeViewStates;
caf::PdmField<QString> plotWindowCurrentModelIndexPaths;
caf::PdmField<QString> mainWindowDockState;
caf::PdmField<QString> plotWindowDockState;
bool writeProjectFile();
void setScriptDirectories( const QString& scriptDirectories, int maxFolderDepth );
@@ -154,11 +157,6 @@ public:
bool showPlotWindow() const;
bool showPlotWindowOnTop() const;
RiaDefines::WindowTileMode subWindowsTileMode3DWindow() const;
RiaDefines::WindowTileMode subWindowsTileModePlotWindow() const;
void setSubWindowsTileMode3DWindow( RiaDefines::WindowTileMode tileMode );
void setSubWindowsTileModePlotWindow( RiaDefines::WindowTileMode tileMode );
void reloadCompletionTypeResultsInAllViews();
void reloadCompletionTypeResultsForEclipseCase( RimEclipseCase* eclipseCase );
@@ -222,12 +220,6 @@ private:
caf::PdmField<bool> m_showPlotWindow;
caf::PdmField<bool> m_showPlotWindowOnTopOf3DWindow;
caf::PdmField<bool> m_subWindowsTiled3DWindow_OBSOLETE;
caf::PdmField<bool> m_subWindowsTiledPlotWindow_OBSOLETE;
caf::PdmField<caf::AppEnum<RiaDefines::WindowTileMode>> m_subWindowsTileMode3DWindow;
caf::PdmField<caf::AppEnum<RiaDefines::WindowTileMode>> m_subWindowsTileModePlotWindow;
caf::PdmChildArrayField<RimEclipseCase*> casesObsolete; // obsolete
caf::PdmChildArrayField<RimIdenticalGridCaseGroup*> caseGroupsObsolete; // obsolete
};
@@ -18,6 +18,11 @@
#include "RiuDockWidgetTools.h"
#include "RiaGuiApplication.h"
#include "Rim3dView.h"
#include "RimViewWindow.h"
#include "RiuMainWindow.h"
#include "RiuPlotMainWindow.h"
@@ -350,6 +355,40 @@ QAction* RiuDockWidgetTools::toggleActionForWidget( const ads::CDockManager* doc
return nullptr;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiuDockWidgetTools::setDockLayout( RiuMainWindowBase* mainWindow, const QString& layoutName )
{
if ( mainWindow == nullptr ) return;
QString activeViewerName;
if ( auto activeViewer = RiaGuiApplication::instance()->activeReservoirView() )
{
activeViewerName = activeViewer->dockWindowName();
}
if ( auto dm = mainWindow->dockManager() )
{
QByteArray state = RiuDockWidgetTools::defaultDockState( layoutName );
if ( dm->restoreState( state, RiuMainWindowBase::DOCKSTATE_VERSION ) )
{
for ( auto view : mainWindow->viewWindows() )
{
if ( view->showWindow() && view->dockWidget() )
{
dm->addDockWidget( ads::DockWidgetArea::CenterDockWidgetArea, view->dockWidget(), dm->centralWidget()->dockAreaWidget() );
}
}
}
if ( auto dw = dm->findDockWidget( activeViewerName ) )
{
dw->setAsCurrentTab();
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -26,7 +26,7 @@
class QObject;
class QAction;
class Rim3dView;
class RiuMainWindowBase;
namespace ads
{
@@ -93,6 +93,8 @@ public:
static QString viewWindowPrefix();
static void setDockLayout( RiuMainWindowBase* mainWindow, const QString& layoutName );
static QAction* toggleActionForWidget( const ads::CDockManager* dockManager, const QString& dockWidgetName );
static ads::CDockWidget* findDockWidget( const ads::CDockManager* dockManager, const QString& dockWidgetName );
@@ -117,6 +117,23 @@ ads::CDockManager* RiuMainWindowBase::dockManager() const
return m_dockManager;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RiuMainWindowBase::dockWidgetStateString() const
{
return QString::fromUtf8( m_dockManager->saveState( DOCKSTATE_VERSION ).toBase64() );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiuMainWindowBase::restoreDockWidgetState( QString dockStateString )
{
QByteArray dockState = QByteArray::fromBase64( dockStateString.toUtf8() );
m_dockManager->restoreState( dockState, DOCKSTATE_VERSION );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -585,10 +602,7 @@ void RiuMainWindowBase::setDefaultDockLayout()
if ( action )
{
QString layoutName = action->text();
QByteArray state = RiuDockWidgetTools::defaultDockState( layoutName );
dockManager()->restoreState( state, DOCKSTATE_VERSION );
RiuDockWidgetTools::setDockLayout( this, layoutName );
}
}
@@ -601,7 +615,7 @@ void RiuMainWindowBase::setDockLayout()
if ( action )
{
QString layoutName = action->text();
dockManager()->openPerspective( layoutName );
RiuDockWidgetTools::setDockLayout( this, layoutName );
}
}
@@ -729,13 +743,6 @@ void RiuMainWindowBase::addDefaultEntriesToWindowsMenu()
connect( exportLayoutAction, SIGNAL( triggered() ), this, SLOT( exportDockLayout() ) );
}
// 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() ) );
caf::CmdFeatureManager* cmdFeatureMgr = caf::CmdFeatureManager::instance();
auto featureNames = windowsMenuFeatureNames();
@@ -743,9 +750,6 @@ void RiuMainWindowBase::addDefaultEntriesToWindowsMenu()
{
m_windowMenu->addAction( cmdFeatureMgr->action( name ) );
}
// m_windowMenu->addAction( cascadeWindowsAction );
// m_windowMenu->addAction( closeAllSubWindowsAction );
}
//--------------------------------------------------------------------------------------------------
@@ -59,6 +59,8 @@ class RiuMainWindowBase : public QMainWindow
Q_OBJECT
public:
static const int DOCKSTATE_VERSION = 4;
RiuMainWindowBase();
~RiuMainWindowBase() override;
@@ -91,6 +93,9 @@ public:
ads::CDockManager* dockManager() const;
QString dockWidgetStateString() const;
void restoreDockWidgetState( QString dockStateString );
protected:
void createTreeViews( int numberOfTrees );
void setUpCentralDockWidget();
@@ -137,8 +142,6 @@ protected:
QMenu* m_windowMenu;
const int DOCKSTATE_VERSION = 4;
QByteArray m_lastDockState;
std::vector<caf::PdmUiTreeView*> m_projectTreeViews;