Work in progress

This commit is contained in:
jonjenssen
2026-06-17 13:55:32 +02:00
committed by JJ
parent ff40662366
commit fce05bdb81
19 changed files with 82 additions and 255 deletions
@@ -1,9 +1,8 @@
set(SOURCE_GROUP_SOURCE_FILES
${CMAKE_CURRENT_LIST_DIR}/RicApplyUserDefinedCameraFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicStoreUserDefinedCameraFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicPopOutTo3dViewFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicPopOutToPlotViewFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicConvert3dToMdiFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicDockIn3dViewFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicDockInPlotViewFeature.cpp
)
list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES})
@@ -16,7 +16,7 @@
//
/////////////////////////////////////////////////////////////////////////////////
#include "RicConvert3dToMdiFeature.h"
#include "RicDockIn3dViewFeature.h"
#include "RiaGuiApplication.h"
@@ -30,16 +30,19 @@
#include <QAction>
#include <QSettings>
CAF_CMD_SOURCE_INIT( RicConvert3dToMdiFeature, "RicConvert3dToMdiFeature" );
CAF_CMD_SOURCE_INIT( RicDockIn3dViewFeature, "RicDockIn3dViewFeature" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicConvert3dToMdiFeature::isCommandEnabled() const
bool RicDockIn3dViewFeature::isCommandEnabled() const
{
if ( auto view = dynamic_cast<Rim3dView*>( caf::SelectionManager::instance()->selectedItem() ) )
{
return view->isDockingViewer();
if ( ( view->showWindow() ) && ( !view->isDockedIn3DView() ) )
{
return true;
}
}
return false;
}
@@ -47,19 +50,19 @@ bool RicConvert3dToMdiFeature::isCommandEnabled() const
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicConvert3dToMdiFeature::onActionTriggered( bool isChecked )
void RicDockIn3dViewFeature::onActionTriggered( bool isChecked )
{
if ( auto view = dynamic_cast<Rim3dView*>( caf::SelectionManager::instance()->selectedItem() ) )
{
view->convertToMdi( RiaGuiApplication::instance()->mainWindow() );
view->dockInMainWindow();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicConvert3dToMdiFeature::setupActionLook( QAction* actionToSetup )
void RicDockIn3dViewFeature::setupActionLook( QAction* actionToSetup )
{
actionToSetup->setText( "Convert to MDI view" );
actionToSetup->setText( "Dock in 3D Window" );
actionToSetup->setIcon( QIcon( ":/3DWindow.svg" ) );
}
@@ -23,7 +23,7 @@
//==================================================================================================
///
//==================================================================================================
class RicConvert3dToMdiFeature : public caf::CmdFeature
class RicDockIn3dViewFeature : public caf::CmdFeature
{
CAF_CMD_HEADER_INIT;
@@ -16,30 +16,28 @@
//
/////////////////////////////////////////////////////////////////////////////////
#include "RicPopOutTo3dViewFeature.h"
#include "RicDockInPlotViewFeature.h"
#include "RiaGuiApplication.h"
#include "RimGridView.h"
#include "RiuMainWindow.h"
#include "RiuViewer.h"
#include "Rim3dView.h"
#include "cafSelectionManager.h"
#include <QAction>
#include <QSettings>
CAF_CMD_SOURCE_INIT( RicPopOutTo3dViewFeature, "RicPopOutTo3dViewFeature" );
CAF_CMD_SOURCE_INIT( RicDockInPlotViewFeature, "RicDockInPlotViewFeature" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicPopOutTo3dViewFeature::isCommandEnabled() const
bool RicDockInPlotViewFeature::isCommandEnabled() const
{
if ( auto view = dynamic_cast<Rim3dView*>( caf::SelectionManager::instance()->selectedItem() ) )
{
return !view->isDockingViewer();
if ( ( view->showWindow() ) && ( !view->isDockedInPlotView() ) )
{
return true;
}
}
return false;
}
@@ -47,19 +45,19 @@ bool RicPopOutTo3dViewFeature::isCommandEnabled() const
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicPopOutTo3dViewFeature::onActionTriggered( bool isChecked )
void RicDockInPlotViewFeature::onActionTriggered( bool isChecked )
{
if ( auto view = dynamic_cast<Rim3dView*>( caf::SelectionManager::instance()->selectedItem() ) )
{
view->convertToDocking( RiaGuiApplication::instance()->mainWindow() );
view->dockInPlotWindow();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicPopOutTo3dViewFeature::setupActionLook( QAction* actionToSetup )
void RicDockInPlotViewFeature::setupActionLook( QAction* actionToSetup )
{
actionToSetup->setText( "Pop Out (in 3D View)" );
actionToSetup->setIcon( QIcon( ":/3DWindow.svg" ) );
actionToSetup->setText( "Dock in Plot Window" );
actionToSetup->setIcon( QIcon( ":/PlotWindow.svg" ) );
}
@@ -23,7 +23,7 @@
//==================================================================================================
///
//==================================================================================================
class RicPopOutTo3dViewFeature : public caf::CmdFeature
class RicDockInPlotViewFeature : public caf::CmdFeature
{
CAF_CMD_HEADER_INIT;
@@ -1,61 +0,0 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2026 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RicPopOutToPlotViewFeature.h"
#include "RiaGuiApplication.h"
#include "RimGridView.h"
#include "RiuMainWindow.h"
#include "RiuViewer.h"
#include "cafSelectionManager.h"
#include <QAction>
#include <QSettings>
CAF_CMD_SOURCE_INIT( RicPopOutToPlotViewFeature, "RicPopOutToPlotViewFeature" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicPopOutToPlotViewFeature::isCommandEnabled() const
{
return true;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicPopOutToPlotViewFeature::onActionTriggered( bool isChecked )
{
if ( auto view = dynamic_cast<Rim3dView*>( caf::SelectionManager::instance()->selectedItem() ) )
{
view->convertToDocking( RiaGuiApplication::instance()->mainPlotWindow() );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicPopOutToPlotViewFeature::setupActionLook( QAction* actionToSetup )
{
actionToSetup->setText( "Pop Out (in Plot View)" );
actionToSetup->setIcon( QIcon( ":/PlotWindow.svg" ) );
}
@@ -1,34 +0,0 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2026 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "cafCmdFeature.h"
//==================================================================================================
///
//==================================================================================================
class RicPopOutToPlotViewFeature : public caf::CmdFeature
{
CAF_CMD_HEADER_INIT;
protected:
bool isCommandEnabled() const override;
void onActionTriggered( bool isChecked ) override;
void setupActionLook( QAction* actionToSetup ) override;
};
@@ -1897,49 +1897,28 @@ void Rim3dView::synchronizeLocalAnnotationsFromGlobal()
//--------------------------------------------------------------------------------------------------
void Rim3dView::appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const
{
if ( isDockingViewer() )
{
menuBuilder << "RicConvert3dToMdiFeature";
}
else
{
menuBuilder << "RicPopOutTo3dViewFeature";
menuBuilder << "RicPopOutToPlotViewFeature";
}
menuBuilder << "RicDockIn3dViewFeature";
menuBuilder << "RicDockInPlotViewFeature";
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void Rim3dView::convertToDocking( RiuMainWindowBase* mainWindow )
void Rim3dView::dockInMainWindow()
{
if ( isDockingViewer() ) return;
removeWindowFromDock();
QWidget* viewWidget = createViewWidget( nullptr );
m_dockWidget = mainWindow->initializeDockingViewer( viewWidget );
updateViewWidgetAfterCreation();
dockAs3DViewWindow();
updateDockWindowVisibility();
scheduleCreateDisplayModelAndRedraw();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void Rim3dView::convertToMdi( RiuMainWindowBase* mainWindow )
void Rim3dView::dockInPlotWindow()
{
if ( !isDockingViewer() ) return;
mainWindow->dockManager()->removeDockWidget( m_dockWidget );
m_dockWidget->takeWidget();
m_dockWidget = nullptr;
m_windowController->updateViewerWidget();
removeWindowFromDock();
dockAsPlotWindow();
updateDockWindowVisibility();
updateViewWidgetAfterCreation();
scheduleCreateDisplayModelAndRedraw();
}
}
@@ -101,8 +101,6 @@ public:
int id() const final;
bool isDockingViewer() const { return !m_dockWidget.isNull(); }
// Public fields:
caf::PdmField<bool> isPerspectiveView;
@@ -211,8 +209,8 @@ public:
RimAnnotationInViewCollection* annotationCollection() const;
void synchronizeLocalAnnotationsFromGlobal();
void convertToDocking( RiuMainWindowBase* mainWindow );
void convertToMdi( RiuMainWindowBase* mainWindow );
void dockInMainWindow();
void dockInPlotWindow();
protected:
static void removeModelByName( cvf::Scene* scene, const cvf::String& modelName );
@@ -369,6 +367,4 @@ private:
std::unique_ptr<QTimer> m_animationTimer;
const int m_animationIntervalMillisec;
int m_animationTimerUsers;
QPointer<ads::CDockWidget> m_dockWidget;
};
@@ -131,6 +131,7 @@ void RimDockWindowController::updateViewerWidget()
dockWidget->setObjectName( viewPdmObject()->dockWindowName() );
mainWindow->initializeViewer( dockWidget, viewWidget );
mainWindow->connect( dockWidget, SIGNAL( closed() ), mainWindow, SLOT( slotDockViewerClosed() ) );
mainWindow->connect( dockWidget, SIGNAL( visibilityChanged( bool ) ), mainWindow, SLOT( slotDockViewerVisibilityChanged( bool ) ) );
viewPdmObject()->updateViewWidgetAfterCreation();
@@ -165,3 +166,11 @@ void RimDockWindowController::setViewToControl( RimViewWindow* view )
{
m_viewToControl = view;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
int RimDockWindowController::mainWindowId() const
{
return m_mainWindowID;
}
@@ -40,6 +40,7 @@ public:
void setMainWindowId( int mainId );
void setViewToControl( RimViewWindow* view );
int mainWindowId() const;
void updateViewerWidget();
void handleViewerDeletion();
@@ -98,6 +98,22 @@ bool RimViewWindow::isMainDockedWindow() const
return m_windowController != nullptr;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimViewWindow::isDockedIn3DView() const
{
return ( m_windowController != nullptr ) && ( m_windowController->mainWindowId() == 0 );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimViewWindow::isDockedInPlotView() const
{
return ( m_windowController != nullptr ) && ( m_windowController->mainWindowId() == 1 );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -47,6 +47,9 @@ public:
bool isMainDockedWindow() const;
bool isDockedIn3DView() const;
bool isDockedInPlotView() const;
void loadDataAndUpdate();
void updateDockWindowVisibility();
@@ -1204,20 +1204,6 @@ void RiuMainWindow::initializeViewer( ads::CDockWidget* dockWidget, QWidget* vie
slotRefreshViewActions();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
ads::CDockWidget* RiuMainWindow::initializeDockingViewer( QWidget* viewer )
{
auto dockWidget = RiuDockWidgetTools::createDockWidget( "3D Viewer", "3D view", dockManager() );
dockWidget->setWidget( viewer );
dockManager()->addDockWidgetFloating( dockWidget );
slotRefreshViewActions();
return dockWidget;
}
//--------------------------------------------------------------------------------------------------
/// This method needs to handle memory deallocation !!!
//--------------------------------------------------------------------------------------------------
@@ -95,8 +95,6 @@ public:
void removeViewer( QWidget* viewer ) override;
void initializeViewer( ads::CDockWidget* dockWidget, QWidget* viewer ) override;
ads::CDockWidget* initializeDockingViewer( QWidget* viewer ) override;
void setResultInfo( const QString& info ) const;
void refreshViewActions();
@@ -126,16 +126,6 @@ void RiuMainWindowBase::setActiveViewer( QString viewerName )
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
ads::CDockWidget* RiuMainWindowBase::createDockViewWindow()
{
auto widget = RiuDockWidgetTools::createDockWidget( "3D view", "3dview", this );
return widget;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -339,52 +329,6 @@ void RiuMainWindowBase::removeViewerFromDockArea( QWidget* viewer )
}
}
////--------------------------------------------------------------------------------------------------
/////
////--------------------------------------------------------------------------------------------------
// void RiuMainWindowBase::removeViewerFromMdiArea( RiuMdiArea* mdiArea, QWidget* viewer )
//{
// bool removedSubWindowWasActive = false;
// bool wasMaximized = true;
//
// if ( QMdiSubWindow* subWindowBeingClosed = findMdiSubWindow( viewer ) )
// {
// wasMaximized = subWindowBeingClosed->isMaximized();
//
// if ( subWindowBeingClosed->isActiveWindow() )
// {
// // If we are removing the active window, we will need a new active window
// // Start by making the window inactive so Qt doesn't pick the active window itself
// mdiArea->setActiveSubWindow( nullptr );
// removedSubWindowWasActive = true;
// }
// mdiArea->removeSubWindow( subWindowBeingClosed );
//
// // These two lines had to be introduced after themes was used
// // Probably related to polish/unpolish of widgets in an MDI setting
// // https://github.com/OPM/ResInsight/issues/6676
// subWindowBeingClosed->hide();
// subWindowBeingClosed->deleteLater();
// }
//
// QList<QMdiSubWindow*> subWindowList = mdiArea->subWindowList( QMdiArea::ActivationHistoryOrder );
// if ( !subWindowList.empty() )
// {
// if ( removedSubWindowWasActive )
// {
// mdiArea->setActiveSubWindow( nullptr );
// // Make the last activated window the current activated one
// mdiArea->setActiveSubWindow( subWindowList.back() );
// }
// if ( wasMaximized && mdiArea->currentSubWindow() )
// {
// mdiArea->currentSubWindow()->showMaximized();
// }
//
// mdiArea->applyTiling();
// }
// }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -419,10 +363,17 @@ void RiuMainWindowBase::slotDockWidgetToggleViewActionTriggered()
//--------------------------------------------------------------------------------------------------
void RiuMainWindowBase::slotDockViewerVisibilityChanged( bool visible )
{
if ( visible ) return;
// TODO - handle undocking views
if ( auto dockWidget = dynamic_cast<ads::CDockWidget*>( sender() ) )
{
}
}
//--------------------------------------------------------------------------------------------------
///
///
//--------------------------------------------------------------------------------------------------
void RiuMainWindowBase::slotDockViewerClosed()
{
if ( auto dockWidget = dynamic_cast<ads::CDockWidget*>( sender() ) )
{
auto mainWidget = dockWidget->widget();
@@ -61,14 +61,10 @@ public:
virtual QString mainWindowName() = 0;
ads::CDockWidget* createDockViewWindow();
virtual void removeViewer( QWidget* viewer ) = 0;
virtual void initializeViewer( ads::CDockWidget* dockWidget, QWidget* viewer ) {};
virtual void setActiveViewer( QString viewerName );
virtual ads::CDockWidget* initializeDockingViewer( QWidget* viewer ) = 0;
void loadWinGeoAndDockToolBarLayout();
void saveWinGeoAndDockToolBarLayout();
void showWindow();
@@ -112,10 +108,10 @@ protected:
protected slots:
void slotDockWidgetToggleViewActionTriggered();
void slotDockViewerVisibilityChanged( bool visible );
void slotDockViewerClosed();
void slotRefreshHelpActions();
void slotDockViewerVisibilityChanged( bool );
void slotRedo();
void slotUndo();
void slotRefreshUndoRedoActions();
@@ -755,18 +755,6 @@ void RiuPlotMainWindow::initializeViewer( ads::CDockWidget* dockWidget, QWidget*
viewer->update();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
ads::CDockWidget* RiuPlotMainWindow::initializeDockingViewer( QWidget* viewer )
{
auto dockViewer = RiuDockWidgetTools::createDockWidget( "3D Viewer", "3D view", dockManager() );
dockViewer->setWidget( viewer );
dockManager()->addDockWidgetFloating( dockViewer );
return dockViewer;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -68,9 +68,8 @@ public:
void cleanupGuiBeforeProjectClose();
void cleanUpTemporaryWidgets();
void removeViewer( QWidget* viewer ) override;
void initializeViewer( ads::CDockWidget* dockWidget, QWidget* viewer ) override;
ads::CDockWidget* initializeDockingViewer( QWidget* viewer ) override;
void removeViewer( QWidget* viewer ) override;
void initializeViewer( ads::CDockWidget* dockWidget, QWidget* viewer ) override;
void setDefaultWindowSize();
void enable3DSelectionLink( bool enable );