mirror of
https://github.com/OPM/ResInsight.git
synced 2026-08-26 21:27:15 -05:00
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:
@@ -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 );
|
||||
|
||||
Reference in New Issue
Block a user