From 27d65af027fc3925187535a1549355505caf3b44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Wed, 23 Oct 2019 15:12:54 +0200 Subject: [PATCH 01/17] Fix crashes when scene in one view is empty --- .../ProjectDataModel/RimViewManipulator.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimViewManipulator.cpp b/ApplicationCode/ProjectDataModel/RimViewManipulator.cpp index 92fa451c3e..f6b73aee42 100644 --- a/ApplicationCode/ProjectDataModel/RimViewManipulator.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewManipulator.cpp @@ -53,8 +53,13 @@ void RimViewManipulator::applySourceViewCameraOnDestinationViews( RimGridView* } // Source bounding box in global coordinates including scaleZ - cvf::BoundingBox sourceSceneBB = sourceView->viewer()->currentScene()->boundingBox(); + cvf::BoundingBox sourceSceneBB; { + if ( sourceView->viewer()->currentScene() ) + { + sourceSceneBB = sourceView->viewer()->currentScene()->boundingBox(); + } + cvf::Vec3d offset = cvf::Vec3d::ZERO; RimCase* sourceOwnerCase = sourceView->ownerCase(); if ( sourceOwnerCase ) @@ -68,8 +73,8 @@ void RimViewManipulator::applySourceViewCameraOnDestinationViews( RimGridView* if ( setPointOfInterest ) sourcePointOfInterest += offset; cvf::Mat4d trans; - trans.setTranslation( offset ); - sourceSceneBB.transform( trans ); + trans.setTranslation(offset); + sourceSceneBB.transform(trans); } for ( RimGridView* destinationView : destinationViews ) @@ -84,7 +89,12 @@ void RimViewManipulator::applySourceViewCameraOnDestinationViews( RimGridView* destinationViewer->enableParallelProjection( !sourceView->isPerspectiveView ); // Destination bounding box in global coordinates including scaleZ - cvf::BoundingBox destSceneBB = destinationViewer->currentScene()->boundingBox(); + cvf::BoundingBox destSceneBB; + if ( destinationViewer->currentScene() ) + { + destSceneBB = destinationViewer->currentScene()->boundingBox(); + } + cvf::Vec3d destinationCamEye = sourceCamGlobalEye; cvf::Vec3d destinationCamViewRefPoint = sourceCamGlobalViewRefPoint; cvf::Vec3d offset = cvf::Vec3d::ZERO; From 6af4356f360cf7bd2ba07dd5364dbba9ffc817d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Wed, 23 Oct 2019 15:17:58 +0200 Subject: [PATCH 02/17] #4892 Add Comparison view drop-down to linked view master. Works as shadow of the views comparison view setting. Make it follow the dependent viewcontrollers managed view. Comparison view dropdown moved to "Viewer" group in view panel. Avoid infinite recursion loops when comparison views are set up in circle --- .../ProjectDataModel/Rim3dView.cpp | 55 +++++------ ApplicationCode/ProjectDataModel/Rim3dView.h | 3 +- .../ProjectDataModel/RimViewController.cpp | 7 ++ .../ProjectDataModel/RimViewLinker.cpp | 97 +++++++++++++++++++ .../ProjectDataModel/RimViewLinker.h | 13 +++ 5 files changed, 145 insertions(+), 30 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Rim3dView.cpp b/ApplicationCode/ProjectDataModel/Rim3dView.cpp index db906e69e2..405bc81f74 100644 --- a/ApplicationCode/ProjectDataModel/Rim3dView.cpp +++ b/ApplicationCode/ProjectDataModel/Rim3dView.cpp @@ -80,6 +80,7 @@ CAF_PDM_XML_ABSTRACT_SOURCE_INIT( Rim3dView, "GenericView" ); // Do not use. Abs /// //-------------------------------------------------------------------------------------------------- Rim3dView::Rim3dView( void ) + : m_isCallingUpdateTimestepAndRedraw( false ) { RiaApplication* app = RiaApplication::instance(); RiaPreferences* preferences = app->preferences(); @@ -129,7 +130,6 @@ Rim3dView::Rim3dView( void ) CAF_PDM_InitField( &m_showZScaleLabel, "ShowZScale", true, "Show Z Scale Label", "", "", "" ); - CAF_PDM_InitField( &m_isComparisonViewEnabled, "EnableComparisonView", false, "Enable", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_comparisonView, "ComparisonView", "Comparison View", "", "", "" ); m_crossSectionVizModel = new cvf::ModelBasicList; @@ -322,6 +322,7 @@ void Rim3dView::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOr viewGroup->add( &m_showGridBox ); viewGroup->add( &isPerspectiveView ); viewGroup->add( &m_disableLighting ); + viewGroup->add( &m_comparisonView ); caf::PdmUiGroup* gridGroup = uiOrdering.addNewGroup( "Grid Appearance" ); gridGroup->add( &scaleZ ); @@ -329,10 +330,6 @@ void Rim3dView::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOr gridGroup->add( &meshMode ); gridGroup->add( &surfaceMode ); - caf::PdmUiGroup* compViewGroup = uiOrdering.addNewGroup( "Comparison View" ); - compViewGroup->add( &m_isComparisonViewEnabled ); - compViewGroup->add( &m_comparisonView ); - uiOrdering.skipRemainingFields( true ); } @@ -412,6 +409,15 @@ bool Rim3dView::isScaleZEditable() ( this->viewController() && this->viewController()->isCameraLinked() ) ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void Rim3dView::setComparisonView( Rim3dView* compView ) +{ + m_comparisonView = compView; + m_comparisonView.uiCapability()->updateConnectedEditors(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -484,6 +490,8 @@ void Rim3dView::setCurrentTimeStep( int frameIndex ) //-------------------------------------------------------------------------------------------------- void Rim3dView::updateCurrentTimeStepAndRedraw() { + if ( m_isCallingUpdateTimestepAndRedraw ) return; + if ( nativeOrOverrideViewer() ) { this->updateCurrentTimeStep(); @@ -498,6 +506,8 @@ void Rim3dView::updateCurrentTimeStepAndRedraw() nativeOrOverrideViewer()->update(); } + m_isCallingUpdateTimestepAndRedraw = true; + std::set containerViews = this->viewsUsingThisAsComparisonView(); if ( !containerViews.empty() && !isUsingOverrideViewer() ) { @@ -506,6 +516,7 @@ void Rim3dView::updateCurrentTimeStepAndRedraw() view->updateCurrentTimeStepAndRedraw(); } } + m_isCallingUpdateTimestepAndRedraw = false; RimProject* project; firstAncestorOrThisOfTypeAsserted( project ); @@ -806,18 +817,10 @@ void Rim3dView::fieldChangedByUi( const caf::PdmFieldHandle* changedField, m_viewer->showZScaleLabel( m_showZScaleLabel() ); m_viewer->update(); } - else if ( changedField == &m_isComparisonViewEnabled ) + else if ( changedField == &m_comparisonView ) { createDisplayModelAndRedraw(); } - else if ( changedField == &m_comparisonView ) - { - if ( m_isComparisonViewEnabled() ) - { - createDisplayModelAndRedraw(); - } - } - } //-------------------------------------------------------------------------------------------------- @@ -974,9 +977,12 @@ void Rim3dView::updateAnnotationItems() //-------------------------------------------------------------------------------------------------- void Rim3dView::setScaleZAndUpdate( double scalingFactor ) { - this->scaleZ = scalingFactor; + if ( this->scaleZ != scalingFactor ) + { + this->scaleZ = scalingFactor; - updateScaling(); + updateScaling(); + } } //-------------------------------------------------------------------------------------------------- @@ -1001,9 +1007,9 @@ void Rim3dView::updateScaling() viewer()->setPointOfInterest( poi ); } - if (activeComparisonView()) + if ( activeComparisonView() ) { - activeComparisonView()->setScaleZAndUpdate(scaleZ); + activeComparisonView()->setScaleZAndUpdate( scaleZ ); } updateScaleTransform(); @@ -1403,14 +1409,7 @@ void Rim3dView::appendMeasurementToModel() //-------------------------------------------------------------------------------------------------- Rim3dView* Rim3dView::activeComparisonView() const { - if ( m_isComparisonViewEnabled() ) - { - return m_comparisonView(); - } - else - { - return nullptr; - } + return m_comparisonView(); } //-------------------------------------------------------------------------------------------------- @@ -1430,7 +1429,6 @@ Rim3dView* Rim3dView::prepareComparisonView() return nullptr; } - if ( depView->scaleZ() != scaleZ() ) { depView->setScaleZAndUpdate( scaleZ() ); @@ -1452,6 +1450,5 @@ void Rim3dView::restoreComparisonView() CVF_ASSERT( depView ); depView->setOverrideViewer( nullptr ); - viewer()->setCurrentComparisonFrame(depView->currentTimeStep()); - + viewer()->setCurrentComparisonFrame( depView->currentTimeStep() ); } diff --git a/ApplicationCode/ProjectDataModel/Rim3dView.h b/ApplicationCode/ProjectDataModel/Rim3dView.h index 19618d8328..8d4b6b5b44 100644 --- a/ApplicationCode/ProjectDataModel/Rim3dView.h +++ b/ApplicationCode/ProjectDataModel/Rim3dView.h @@ -166,6 +166,7 @@ public: bool isMasterView() const; Rim3dView* activeComparisonView() const; bool isScaleZEditable(); + void setComparisonView(Rim3dView* compView); std::set viewsUsingThisAsComparisonView(); @@ -310,6 +311,7 @@ private: QPointer m_overrideViewer; int m_comparisonViewOrgTimestep; double m_comparisonViewOrgZScale; + bool m_isCallingUpdateTimestepAndRedraw; // To avoid infinite recursion if comparison views are pointing to each other. caf::PdmField m_name_OBSOLETE; caf::PdmChildField m_nameConfig; @@ -319,6 +321,5 @@ private: caf::PdmField m_backgroundColor; caf::PdmField m_showGridBox; caf::PdmField m_showZScaleLabel; - caf::PdmField m_isComparisonViewEnabled; caf::PdmPtrField m_comparisonView; }; diff --git a/ApplicationCode/ProjectDataModel/RimViewController.cpp b/ApplicationCode/ProjectDataModel/RimViewController.cpp index b88c9e3a54..3222a002c9 100644 --- a/ApplicationCode/ProjectDataModel/RimViewController.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewController.cpp @@ -216,6 +216,8 @@ void RimViewController::fieldChangedByUi( const caf::PdmFieldHandle* changedFiel RimGridView* previousManagedView = dynamic_cast( prevValue ); RimViewController::removeOverrides( previousManagedView ); + ownerViewLinker()->notifyManagedViewChange(previousManagedView, m_managedView()); + setManagedView( m_managedView() ); m_name.uiCapability()->updateConnectedEditors(); @@ -469,6 +471,11 @@ RimGridView* RimViewController::managedView() const //-------------------------------------------------------------------------------------------------- void RimViewController::setManagedView( RimGridView* view ) { + if (m_managedView != view) + { + ownerViewLinker()->notifyManagedViewChange(m_managedView(), view); + } + m_managedView = view; updateOptionSensitivity(); diff --git a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp index 35a0e49e50..eca959a4ac 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp @@ -45,6 +45,7 @@ #include "RiuViewer.h" +#include "RiaOptionItemFactory.h" #include "cafPdmUiTreeOrdering.h" #include "cafQIconProvider.h" #include "cvfCamera.h" @@ -70,6 +71,10 @@ RimViewLinker::RimViewLinker() CAF_PDM_InitFieldNoDefault(&m_viewControllers, "ManagedViews", "Managed Views", "", "", ""); m_viewControllers.uiCapability()->setUiHidden(true); m_viewControllers.uiCapability()->setUiTreeChildrenHidden(true); + + CAF_PDM_InitFieldNoDefault(&m_comparisonView, "LinkedComparisonView", "Comparison View", "", "", ""); + m_comparisonView.xmlCapability()->disableIO(); + // clang-format on } @@ -343,6 +348,10 @@ void RimViewLinker::allViews( std::vector& views ) const void RimViewLinker::initAfterRead() { updateUiNameAndIcon(); + if ( m_masterView() ) + { + m_comparisonView = dynamic_cast( m_masterView->activeComparisonView() ); + } } //-------------------------------------------------------------------------------------------------- @@ -476,6 +485,94 @@ void RimViewLinker::updateCursorPosition( const RimGridView* sourceView, const c } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimViewLinker::notifyManagedViewChange( RimGridView* oldManagedView, RimGridView* newManagedView ) +{ + if ( oldManagedView == m_comparisonView ) + { + m_comparisonView = newManagedView; + m_comparisonView.uiCapability()->updateConnectedEditors(); + + if ( masterView() ) + { + masterView()->setComparisonView( m_comparisonView() ); + masterView()->scheduleCreateDisplayModelAndRedraw(); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList RimViewLinker::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) +{ + QList options; + + RimGridView* actualComparisonView = nullptr; + if ( m_masterView() ) + { + actualComparisonView = dynamic_cast( m_masterView->activeComparisonView() ); + } + + bool isActiveCompViewInList = false; + for ( const auto& viewController : m_viewControllers ) + { + if ( viewController->managedView() ) + { + RiaOptionItemFactory::appendOptionItemFromViewNameAndCaseName( viewController->managedView(), &options ); + if ( viewController->managedView() == actualComparisonView ) + { + isActiveCompViewInList = true; + } + } + } + + if ( !isActiveCompViewInList ) + { + // Add the actually used comparison view to the option list, even though it is not one of the linked views + options.push_front( caf::PdmOptionItemInfo( actualComparisonView->autoName(), + actualComparisonView, + false, + actualComparisonView->uiCapability()->uiIconProvider() ) ); + } + + options.push_front( caf::PdmOptionItemInfo( "None", nullptr ) ); + + return options; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimViewLinker::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + // Update the comparison view from the master view + if ( m_masterView() ) + { + m_comparisonView = dynamic_cast( m_masterView->activeComparisonView() ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimViewLinker::fieldChangedByUi( const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue ) +{ + if ( changedField == &m_comparisonView ) + { + if ( masterView() ) + { + masterView()->setComparisonView( m_comparisonView() ); + masterView()->scheduleCreateDisplayModelAndRedraw(); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimViewLinker.h b/ApplicationCode/ProjectDataModel/RimViewLinker.h index 093407b226..9c41362e03 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLinker.h +++ b/ApplicationCode/ProjectDataModel/RimViewLinker.h @@ -91,12 +91,24 @@ public: void updateCursorPosition( const RimGridView* sourceView, const cvf::Vec3d& domainCoord ); + void notifyManagedViewChange(RimGridView* oldManagedView, RimGridView* newManagedView); + protected: caf::PdmFieldHandle* userDescriptionField() override { return &m_name; } + void initAfterRead() override; + void fieldChangedByUi( const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue ) override; + + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) override; + + + virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override; private: static QString displayNameForView( RimGridView* view ); @@ -109,4 +121,5 @@ private: caf::PdmChildArrayField m_viewControllers; caf::PdmPtrField m_masterView; caf::PdmField m_name; + caf::PdmPtrField m_comparisonView; }; From d5a39ab3aa6f8cea4680042544745fe6e816d8fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Mon, 28 Oct 2019 12:38:20 +0100 Subject: [PATCH 03/17] #4892 Improved names and added improved icons to linked views commands --- .../Commands/ViewLink/RicLinkViewFeature.cpp | 3 ++- .../ViewLink/RicLinkVisibleViewsFeature.cpp | 6 +++--- .../ViewLink/RicLinkVisibleViewsFeatureUi.cpp | 4 ++-- .../Commands/ViewLink/RicSetMasterViewFeature.cpp | 3 ++- .../ViewLink/RicShowLinkOptionsFeature.cpp | 2 +- .../Commands/ViewLink/RicUnLinkViewFeature.cpp | 2 ++ ApplicationCode/ProjectDataModel/RimProject.cpp | 2 +- .../ProjectDataModel/RimViewLinkerCollection.cpp | 2 +- ApplicationCode/Resources/ControlledView16x16.png | Bin 0 -> 218 bytes ApplicationCode/Resources/LinkView16x16.png | Bin 0 -> 255 bytes ApplicationCode/Resources/MasterView16x16.png | Bin 0 -> 229 bytes ApplicationCode/Resources/ResInsight.qrc | 4 ++++ ApplicationCode/Resources/UnLinkView16x16.png | Bin 0 -> 216 bytes 13 files changed, 18 insertions(+), 10 deletions(-) create mode 100644 ApplicationCode/Resources/ControlledView16x16.png create mode 100644 ApplicationCode/Resources/LinkView16x16.png create mode 100644 ApplicationCode/Resources/MasterView16x16.png create mode 100644 ApplicationCode/Resources/UnLinkView16x16.png diff --git a/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp b/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp index 498e2bb6a0..3d46db7f21 100644 --- a/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp @@ -118,10 +118,11 @@ void RicLinkViewFeature::setupActionLook( QAction* actionToSetup ) if ( selectedGridViews.size() > 1u ) { actionToSetup->setText( "Link Selected Views" ); + actionToSetup->setIcon( QIcon( ":/LinkView16x16.png" ) ); } else { actionToSetup->setText( "Link View" ); + actionToSetup->setIcon( QIcon( ":/ControlledView16x16.png" ) ); } - actionToSetup->setIcon( QIcon( ":/chain.png" ) ); } diff --git a/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp b/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp index acfdbef08d..a53350faae 100644 --- a/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp @@ -92,7 +92,7 @@ void RicLinkVisibleViewsFeature::onActionTriggered( bool isChecked ) void RicLinkVisibleViewsFeature::setupActionLook( QAction* actionToSetup ) { actionToSetup->setText( "Link Visible Views" ); - actionToSetup->setIcon( QIcon( ":/chain.png" ) ); + actionToSetup->setIcon( QIcon( ":/LinkView16x16.png" ) ); } //-------------------------------------------------------------------------------------------------- @@ -171,8 +171,8 @@ void RicLinkVisibleViewsFeature::linkViews( std::vector& views ) RicLinkVisibleViewsFeatureUi featureUi; featureUi.setViews( masterCandidates ); - caf::PdmUiPropertyViewDialog propertyDialog( nullptr, &featureUi, "Select Master View", "" ); - propertyDialog.setWindowIcon( QIcon( ":/chain.png" ) ); + caf::PdmUiPropertyViewDialog propertyDialog( nullptr, &featureUi, "Select Primary View", "" ); + propertyDialog.setWindowIcon( QIcon( ":/LinkView16x16.png" ) ); if ( propertyDialog.exec() != QDialog::Accepted ) return; masterView = featureUi.masterView(); diff --git a/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeatureUi.cpp b/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeatureUi.cpp index ef770b0b53..bc920a771c 100644 --- a/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeatureUi.cpp +++ b/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeatureUi.cpp @@ -34,9 +34,9 @@ CAF_PDM_SOURCE_INIT( RicLinkVisibleViewsFeatureUi, "RicLinkVisibleViewsFeatureUi //-------------------------------------------------------------------------------------------------- RicLinkVisibleViewsFeatureUi::RicLinkVisibleViewsFeatureUi( void ) { - CAF_PDM_InitObject( "Link Visible Views Feature UI", ":/chain.png", "", "" ); + CAF_PDM_InitObject( "Link Visible Views Feature UI", ":/LinkView16x16.png", "", "" ); - CAF_PDM_InitFieldNoDefault( &m_masterView, "MasterView", "Master View", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_masterView, "MasterView", "Primary View", "", "", "" ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp b/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp index 4cf841ef86..53ea3445e4 100644 --- a/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp @@ -96,5 +96,6 @@ void RicSetMasterViewFeature::onActionTriggered( bool isChecked ) //-------------------------------------------------------------------------------------------------- void RicSetMasterViewFeature::setupActionLook( QAction* actionToSetup ) { - actionToSetup->setText( "Set As Master View" ); + actionToSetup->setText( "Set As Primary View" ); + actionToSetup->setIcon( QIcon( ":/MasterView16x16.png" ) ); } diff --git a/ApplicationCode/Commands/ViewLink/RicShowLinkOptionsFeature.cpp b/ApplicationCode/Commands/ViewLink/RicShowLinkOptionsFeature.cpp index b29864cd6c..5b2bccb114 100644 --- a/ApplicationCode/Commands/ViewLink/RicShowLinkOptionsFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicShowLinkOptionsFeature.cpp @@ -69,5 +69,5 @@ void RicShowLinkOptionsFeature::onActionTriggered( bool isChecked ) //-------------------------------------------------------------------------------------------------- void RicShowLinkOptionsFeature::setupActionLook( QAction* actionToSetup ) { - actionToSetup->setText( "Show Link Options" ); + actionToSetup->setText( "Show Linked View Options" ); } diff --git a/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp b/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp index 3391ecfb4d..e61d017c10 100644 --- a/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp @@ -81,4 +81,6 @@ void RicUnLinkViewFeature::onActionTriggered( bool isChecked ) void RicUnLinkViewFeature::setupActionLook( QAction* actionToSetup ) { actionToSetup->setText( "Unlink View" ); + actionToSetup->setIcon( QIcon( ":/UnLinkView16x16.png" ) ); + } diff --git a/ApplicationCode/ProjectDataModel/RimProject.cpp b/ApplicationCode/ProjectDataModel/RimProject.cpp index c42422d6cc..caad68fcaa 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationCode/ProjectDataModel/RimProject.cpp @@ -127,7 +127,7 @@ RimProject::RimProject( void ) CAF_PDM_InitFieldNoDefault( &viewLinkerCollection, "LinkedViews", "Linked Views (field in RimProject", - ":/chain.png", + ":/LinkView16x16.png", "", "" ); viewLinkerCollection.uiCapability()->setUiHidden( true ); diff --git a/ApplicationCode/ProjectDataModel/RimViewLinkerCollection.cpp b/ApplicationCode/ProjectDataModel/RimViewLinkerCollection.cpp index 137f032743..3b16bd1344 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLinkerCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewLinkerCollection.cpp @@ -30,7 +30,7 @@ CAF_PDM_SOURCE_INIT( RimViewLinkerCollection, "RimViewLinkerCollection" ); //-------------------------------------------------------------------------------------------------- RimViewLinkerCollection::RimViewLinkerCollection( void ) { - CAF_PDM_InitObject( "Linked Views", ":/chain.png", "", "" ); + CAF_PDM_InitObject( "Linked Views", ":/LinkView16x16.png", "", "" ); CAF_PDM_InitField( &isActive, "Active", true, "Active", "", "", "" ); isActive.uiCapability()->setUiHidden( true ); diff --git a/ApplicationCode/Resources/ControlledView16x16.png b/ApplicationCode/Resources/ControlledView16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..7a8f9364be17eabb2486dde67c3c2829fe6cfbc5 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=De8Ak0{?)V>TT$X?><>&pI^OOi)cJ28JfP=q1f)5S5w;`G@`7kLjTaJaPYQ2lIp zY^~bAE6WU9CS@i4G?HsP?x?xE`IvL4u9t}5r+<~wr(7SDF6_ut`yh1qV%CD2$#v@m zaz8c*TQN(>W`0{~<#z7|!!544sU~rj`_{AS>^^o~`iFbT8V8xuo26Ucfb8^i^>bP0 Hl+XkKo5xId literal 0 HcmV?d00001 diff --git a/ApplicationCode/Resources/LinkView16x16.png b/ApplicationCode/Resources/LinkView16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..da9567ace3bb548cf3f6dca24d2686be31dfe5a4 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkEbHUgGKN%Kn&3f?eG361Q0iP^ib##WBR<^w~)V`5F{B+UjRk=48JA zUlY4~yQ}z}jtx1nzs#RAIQ|g%v0}kD&zoU92~+QePJ3|oRGiXGzp7ofnpUhgJ?}(^ zK0cc}^`zQ9mIYg8h!`G!WOY9V@c^}oS7>-!!&D&oU+y`_QgQu&X%Q~loCIFzoR>A-P literal 0 HcmV?d00001 diff --git a/ApplicationCode/Resources/MasterView16x16.png b/ApplicationCode/Resources/MasterView16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..fe4a62f47c2dfb3bd38d7079d54ad6671b4ddbcd GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=De8Ak0{?)V>TT$X?><>&pI^OOi***w$&`M4(WSr;B5V#p$z?E^;1F;BnDciq(y_ zh?#Tf>8yVuok>wkrhQXTI2hBn{J?dk;%l9|LlaY__TG52jGMn#aPP_>FWHo|4v*w1 zL5s>I=Wu2mIk2pA9;Y$$fx7LcB>`ET9`_Hgs&}}|wkm7&!-uwy(-NP~`4}(DlB~7v U($T*UfwnVvy85}Sb4q9e0Ps^%vj6}9 literal 0 HcmV?d00001 diff --git a/ApplicationCode/Resources/ResInsight.qrc b/ApplicationCode/Resources/ResInsight.qrc index efe24fb92e..58656a1d9c 100644 --- a/ApplicationCode/Resources/ResInsight.qrc +++ b/ApplicationCode/Resources/ResInsight.qrc @@ -58,6 +58,10 @@ GeoMechCasePropTable24x24.png GeoMechCases48x48.png chain.png + UnLinkView16x16.png + LinkView16x16.png + MasterView16x16.png + ControlledView16x16.png TileWindows24x24.png Window16x16.png LasFile16x16.png diff --git a/ApplicationCode/Resources/UnLinkView16x16.png b/ApplicationCode/Resources/UnLinkView16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..2b8fbad945e0362101266031620c905ebb3bb518 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkEbHUgGKN%Kn&3f?ZNU&BB@kD3t2y;uvCadhO(cTn7|*oTD|Z-~P8R zzj?ITLg?|f7#EGs^=k#?r~Yk;{2tIfpJmdd)z_~c`Z32zLr7%#tKgXxW=zR`ZAMZt zZGvU$i@!0gVUN~S6}n`Y5o~ni?zO~63itH-KcCFGYh);<{xExQFwjB Date: Mon, 28 Oct 2019 12:51:55 +0100 Subject: [PATCH 04/17] #4892 LinkViews: Avoid using selected views when rightclicking in 3D View --- .../Commands/ViewLink/RicLinkViewFeature.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp b/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp index 3d46db7f21..293f265c3a 100644 --- a/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp @@ -30,6 +30,10 @@ #include "RimViewLinker.h" #include "RimViewLinkerCollection.h" +#include "RiuViewer.h" +#include "RiuViewerCommands.h" + +#include "cafCmdFeatureManager.h" #include "cafSelectionManager.h" #include @@ -50,7 +54,9 @@ bool RicLinkViewFeature::isCommandEnabled() caf::SelectionManager::instance()->objectsByType( &selectedContourMaps ); size_t selectedRegularGridViews = selectedGridViews.size() - selectedContourMaps.size(); - if ( selectedGridViews.size() > 1u && selectedRegularGridViews >= 1u && + auto contextViewer = dynamic_cast( caf::CmdFeatureManager::instance()->currentContextMenuTargetWidget() ); + + if ( !contextViewer && selectedGridViews.size() > 1u && selectedRegularGridViews >= 1u && allSelectedItems.size() == selectedGridViews.size() ) { return true; @@ -88,10 +94,12 @@ void RicLinkViewFeature::onActionTriggered( bool isChecked ) std::vector allSelectedItems; std::vector selectedGridViews; + auto contextViewer = dynamic_cast( caf::CmdFeatureManager::instance()->currentContextMenuTargetWidget() ); + caf::SelectionManager::instance()->selectedItems( allSelectedItems ); caf::SelectionManager::instance()->objectsByType( &selectedGridViews ); - if ( selectedGridViews.size() > 1u && allSelectedItems.size() == selectedGridViews.size() ) + if ( !contextViewer && selectedGridViews.size() > 1u && allSelectedItems.size() == selectedGridViews.size() ) { RicLinkVisibleViewsFeature::linkViews( selectedGridViews ); } @@ -113,9 +121,12 @@ void RicLinkViewFeature::onActionTriggered( bool isChecked ) //-------------------------------------------------------------------------------------------------- void RicLinkViewFeature::setupActionLook( QAction* actionToSetup ) { + auto contextViewer = dynamic_cast( caf::CmdFeatureManager::instance()->currentContextMenuTargetWidget() ); + std::vector selectedGridViews; caf::SelectionManager::instance()->objectsByType( &selectedGridViews ); - if ( selectedGridViews.size() > 1u ) + + if (!contextViewer && selectedGridViews.size() > 1u ) { actionToSetup->setText( "Link Selected Views" ); actionToSetup->setIcon( QIcon( ":/LinkView16x16.png" ) ); From 3710b4ba5898a07e9e2e0f0b63aef153af3365af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Mon, 28 Oct 2019 12:57:40 +0100 Subject: [PATCH 05/17] #4892 Avoid comparison view accidentally added when linking views --- ApplicationCode/ProjectDataModel/RimViewLinker.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp index eca959a4ac..7b50cea3ec 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp @@ -490,7 +490,7 @@ void RimViewLinker::updateCursorPosition( const RimGridView* sourceView, const c //-------------------------------------------------------------------------------------------------- void RimViewLinker::notifyManagedViewChange( RimGridView* oldManagedView, RimGridView* newManagedView ) { - if ( oldManagedView == m_comparisonView ) + if ( oldManagedView && ( oldManagedView == m_comparisonView ) ) { m_comparisonView = newManagedView; m_comparisonView.uiCapability()->updateConnectedEditors(); @@ -530,7 +530,7 @@ QList RimViewLinker::calculateValueOptions( const caf::P } } - if ( !isActiveCompViewInList ) + if ( !isActiveCompViewInList && actualComparisonView != nullptr ) { // Add the actually used comparison view to the option list, even though it is not one of the linked views options.push_front( caf::PdmOptionItemInfo( actualComparisonView->autoName(), @@ -604,10 +604,13 @@ void RimViewLinker::addDependentView( RimGridView* view ) { CVF_ASSERT( view && view != m_masterView ); - RimViewController* viewContr = new RimViewController; - this->m_viewControllers.push_back( viewContr ); + if ( !view->viewController() ) + { + RimViewController* viewContr = new RimViewController; + this->m_viewControllers.push_back( viewContr ); - viewContr->setManagedView( view ); + viewContr->setManagedView( view ); + } } //-------------------------------------------------------------------------------------------------- From b729ce72283da31410f1c40b98bd9eb982778d97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Mon, 28 Oct 2019 13:19:27 +0100 Subject: [PATCH 06/17] #4892 Add (Primary) and (Controlled) labels to view window titles --- ApplicationCode/ProjectDataModel/Rim3dView.cpp | 3 ++- ApplicationCode/ProjectDataModel/RimViewController.cpp | 7 ++++++- ApplicationCode/ProjectDataModel/RimViewLinker.cpp | 6 ++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Rim3dView.cpp b/ApplicationCode/ProjectDataModel/Rim3dView.cpp index 405bc81f74..c45bd9c2d0 100644 --- a/ApplicationCode/ProjectDataModel/Rim3dView.cpp +++ b/ApplicationCode/ProjectDataModel/Rim3dView.cpp @@ -291,7 +291,8 @@ void Rim3dView::updateMdiWindowTitle() { if ( m_viewer ) { - m_viewer->layoutWidget()->setWindowTitle( autoName() ); + m_viewer->layoutWidget()->setWindowTitle( + autoName() + ( isMasterView() ? " (Primary)" : viewController() ? " (Controlled)" : "" ) ); } } diff --git a/ApplicationCode/ProjectDataModel/RimViewController.cpp b/ApplicationCode/ProjectDataModel/RimViewController.cpp index 3222a002c9..81ccf73e12 100644 --- a/ApplicationCode/ProjectDataModel/RimViewController.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewController.cpp @@ -95,6 +95,10 @@ RimViewController::RimViewController() RimViewController::~RimViewController() { this->removeOverrides(); + RimGridView* managedView = m_managedView; + m_managedView = nullptr; + + if (managedView) managedView->updateHolder(); } //-------------------------------------------------------------------------------------------------- @@ -485,6 +489,7 @@ void RimViewController::setManagedView( RimGridView* view ) updateCameraLink(); updateDisplayNameAndIcon(); updateTimeStepLink(); + m_managedView->updateHolder(); } //-------------------------------------------------------------------------------------------------- @@ -1132,7 +1137,7 @@ bool RimViewController::askUserToRestoreOriginalRangeFilterCollection( const QSt questionText = QString( "The range filters in the view \"%1\" are about to be unlinked." ).arg( viewName ); msgBox.setText( questionText ); - msgBox.setInformativeText( "Do you want to keep the range filters from the master view?" ); + msgBox.setInformativeText( "Do you want to keep the range filters from the primary view?" ); msgBox.setStandardButtons( QMessageBox::Yes | QMessageBox::No ); int ret = msgBox.exec(); diff --git a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp index 7b50cea3ec..abc8e5281c 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp @@ -86,6 +86,9 @@ RimViewLinker::~RimViewLinker() removeOverrides(); m_viewControllers.deleteAllChildObjects(); + RimGridView* masterView = m_masterView; + m_masterView = nullptr; + if (masterView) masterView->updateHolder(); } //-------------------------------------------------------------------------------------------------- @@ -408,6 +411,9 @@ void RimViewLinker::updateUiNameAndIcon() { caf::QIconProvider iconProvider; RimViewLinker::findNameAndIconFromView( &m_name.v(), &iconProvider, m_masterView ); + + if (m_masterView) m_masterView->updateHolder(); + setUiIcon( iconProvider ); } From ff7c5860212564cb60a2077bc43f8f9fe30c9306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Mon, 28 Oct 2019 13:39:43 +0100 Subject: [PATCH 07/17] #4892 Add 3DView context command to remove comparison view --- .../Commands/ViewLink/CMakeLists_files.cmake | 2 + .../RicRemoveComparison3dViewFeature.cpp | 89 ++++++++++++++++++ .../RicRemoveComparison3dViewFeature.h | 37 ++++++++ .../Resources/RemoveComparisonView16x16.png | Bin 0 -> 290 bytes ApplicationCode/Resources/ResInsight.qrc | 1 + .../UserInterface/RiuViewerCommands.cpp | 2 + 6 files changed, 131 insertions(+) create mode 100644 ApplicationCode/Commands/ViewLink/RicRemoveComparison3dViewFeature.cpp create mode 100644 ApplicationCode/Commands/ViewLink/RicRemoveComparison3dViewFeature.h create mode 100644 ApplicationCode/Resources/RemoveComparisonView16x16.png diff --git a/ApplicationCode/Commands/ViewLink/CMakeLists_files.cmake b/ApplicationCode/Commands/ViewLink/CMakeLists_files.cmake index f709a38efc..cd4a2aed24 100644 --- a/ApplicationCode/Commands/ViewLink/CMakeLists_files.cmake +++ b/ApplicationCode/Commands/ViewLink/CMakeLists_files.cmake @@ -8,6 +8,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicUnLinkViewFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicShowLinkOptionsFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicDeleteAllLinkedViewsFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicSetMasterViewFeature.h +${CMAKE_CURRENT_LIST_DIR}/RicRemoveComparison3dViewFeature.h ) set (SOURCE_GROUP_SOURCE_FILES @@ -19,6 +20,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicUnLinkViewFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicShowLinkOptionsFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicDeleteAllLinkedViewsFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicSetMasterViewFeature.cpp +${CMAKE_CURRENT_LIST_DIR}/RicRemoveComparison3dViewFeature.cpp ) list(APPEND CODE_HEADER_FILES diff --git a/ApplicationCode/Commands/ViewLink/RicRemoveComparison3dViewFeature.cpp b/ApplicationCode/Commands/ViewLink/RicRemoveComparison3dViewFeature.cpp new file mode 100644 index 0000000000..a471dc9527 --- /dev/null +++ b/ApplicationCode/Commands/ViewLink/RicRemoveComparison3dViewFeature.cpp @@ -0,0 +1,89 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2019- Statoil 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 +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#include "RicRemoveComparison3dViewFeature.h" + +#include "RiaApplication.h" + +#include "Rim3dView.h" + +#include "RiuViewer.h" +#include "RiuViewerCommands.h" + +#include + +CAF_CMD_SOURCE_INIT( RicRemoveComparison3dViewFeature, "RicRemoveComparison3dViewFeature" ); + +class RemoveComparison3dViewImpl +{ +public: + bool makeReady() + { + m_activeView = RiaApplication::instance()->activeReservoirView(); + if ( m_activeView && m_activeView->viewer()->viewerCommands()->isCurrentPickInComparisonView() ) + { + return true; + } + else + { + return false; + } + } + + void execute() + { + m_activeView->setComparisonView( nullptr ); + m_activeView->scheduleCreateDisplayModelAndRedraw(); + } + +private: + Rim3dView* m_activeView = nullptr; +}; + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicRemoveComparison3dViewFeature::isCommandEnabled() +{ + RemoveComparison3dViewImpl cmdImpl; + + return cmdImpl.makeReady(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRemoveComparison3dViewFeature::onActionTriggered( bool isChecked ) +{ + RemoveComparison3dViewImpl cmdImpl; + + if ( cmdImpl.makeReady() ) + { + cmdImpl.execute(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRemoveComparison3dViewFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "Remove Comparison" ); + actionToSetup->setIcon( QIcon( ":/RemoveComparisonView16x16.png" ) ); +} + + diff --git a/ApplicationCode/Commands/ViewLink/RicRemoveComparison3dViewFeature.h b/ApplicationCode/Commands/ViewLink/RicRemoveComparison3dViewFeature.h new file mode 100644 index 0000000000..f4cb92be48 --- /dev/null +++ b/ApplicationCode/Commands/ViewLink/RicRemoveComparison3dViewFeature.h @@ -0,0 +1,37 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2019- Statoil 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 +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +//================================================================================================== +/// +//================================================================================================== +class RicRemoveComparison3dViewFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + // Overrides + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; +}; + + diff --git a/ApplicationCode/Resources/RemoveComparisonView16x16.png b/ApplicationCode/Resources/RemoveComparisonView16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..899bd75a283c9f5a2694e017b813bd29e1144e3b GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=De8Ak0{?)V>TT$X?><>&pI^OOjiYlPimR8c;~G#5JPCIX^cyHLrxhxhOTUBsE2$ zJhLQ2!QIn0AiR-J9H^+v)5S5w;&gI?L_)x^69*1#nC)}ciHC>B%}3-$-jM?b9-MM$ z;`VcV83`2oFDW50&j1KEOh_!&VrD*U#>U15!fZi%3xvF?53_if9^lEcX0~KovGBHE z7vo=`raw1SI!q79d)-&R&fv<%)^;5z=Ji78$PyRhEhP;+F`XO#S_OUKbz)!;zAT_0 Tb+N)9=qd(JS3j3^P6chain.png UnLinkView16x16.png LinkView16x16.png + RemoveComparisonView16x16.png MasterView16x16.png ControlledView16x16.png TileWindows24x24.png diff --git a/ApplicationCode/UserInterface/RiuViewerCommands.cpp b/ApplicationCode/UserInterface/RiuViewerCommands.cpp index ac8dc0023c..9785b73469 100644 --- a/ApplicationCode/UserInterface/RiuViewerCommands.cpp +++ b/ApplicationCode/UserInterface/RiuViewerCommands.cpp @@ -518,7 +518,9 @@ void RiuViewerCommands::displayContextMenu( QMouseEvent* event ) menuBuilder << "RicLinkViewFeature"; menuBuilder << "RicShowLinkOptionsFeature"; menuBuilder << "RicSetMasterViewFeature"; + menuBuilder.addSeparator(); menuBuilder << "RicUnLinkViewFeature"; + menuBuilder << "RicRemoveComparison3dViewFeature"; } else if ( int2dView ) { From b2f8c56a0db6f64c6c85881dc5a08df7ee63d98a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Mon, 28 Oct 2019 13:53:32 +0100 Subject: [PATCH 08/17] Fixed crash on project close introduced by update of MDI window title with Primary/Controlled --- ApplicationCode/ProjectDataModel/RimGridView.cpp | 3 +++ ApplicationCode/ProjectDataModel/RimViewLinker.cpp | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ApplicationCode/ProjectDataModel/RimGridView.cpp b/ApplicationCode/ProjectDataModel/RimGridView.cpp index 85fe7feaba..ddfbb882fe 100644 --- a/ApplicationCode/ProjectDataModel/RimGridView.cpp +++ b/ApplicationCode/ProjectDataModel/RimGridView.cpp @@ -86,6 +86,9 @@ RimGridView::~RimGridView( void ) if ( proj && this->isMasterView() ) { + RimViewLinker* viewLinker = this->assosiatedViewLinker(); + viewLinker->setMasterView(nullptr); + delete proj->viewLinkerCollection->viewLinker(); proj->viewLinkerCollection->viewLinker = nullptr; diff --git a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp index abc8e5281c..05eca00c50 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp @@ -305,7 +305,8 @@ QString RimViewLinker::displayNameForView( RimGridView* view ) //-------------------------------------------------------------------------------------------------- void RimViewLinker::setMasterView( RimGridView* view ) { - RimViewController* previousViewController = view->viewController(); + RimViewController* previousViewController = nullptr; + if (view) previousViewController = view->viewController(); // Remove the view as dependent view if ( previousViewController ) From 5ee8c3b50eb2c29388fe343c576d209e98e9850c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Mon, 28 Oct 2019 14:05:42 +0100 Subject: [PATCH 09/17] #4892 Improved names and added improved icons to linked views commands --- .../RicDeleteAllLinkedViewsFeature.cpp | 44 ++++++++++++------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/ApplicationCode/Commands/ViewLink/RicDeleteAllLinkedViewsFeature.cpp b/ApplicationCode/Commands/ViewLink/RicDeleteAllLinkedViewsFeature.cpp index ace09dca62..f5a0478074 100644 --- a/ApplicationCode/Commands/ViewLink/RicDeleteAllLinkedViewsFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicDeleteAllLinkedViewsFeature.cpp @@ -20,6 +20,7 @@ #include "RicDeleteAllLinkedViewsFeature.h" #include "RiaApplication.h" +#include "RimGridView.h" #include "RimProject.h" #include "RimViewLinker.h" #include "RimViewLinkerCollection.h" @@ -30,6 +31,29 @@ CAF_CMD_SOURCE_INIT( RicDeleteAllLinkedViewsFeature, "RicDeleteAllLinkedViewsFeature" ); +class DeleteAllLinkedViewsImpl +{ +public: + static void execute() + { + RimProject* proj = RiaApplication::instance()->project(); + + RimViewLinker* viewLinker = proj->viewLinkerCollection()->viewLinker(); + if ( viewLinker ) + { + // Remove the view linker object from the view linker collection + // viewLinkerCollection->viewLinker is a PdmChildField containing one RimViewLinker child object + proj->viewLinkerCollection->viewLinker.removeChildObject( viewLinker ); + + viewLinker->applyRangeFilterCollectionByUserChoice(); + + delete viewLinker; + + proj->uiCapability()->updateConnectedEditors(); + } + } +}; + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -43,21 +67,7 @@ bool RicDeleteAllLinkedViewsFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicDeleteAllLinkedViewsFeature::onActionTriggered( bool isChecked ) { - RimProject* proj = RiaApplication::instance()->project(); - - RimViewLinker* viewLinker = proj->viewLinkerCollection()->viewLinker(); - if ( viewLinker ) - { - // Remove the view linker object from the view linker collection - // viewLinkerCollection->viewLinker is a PdmChildField containing one RimViewLinker child object - proj->viewLinkerCollection->viewLinker.removeChildObject( viewLinker ); - - viewLinker->applyRangeFilterCollectionByUserChoice(); - - delete viewLinker; - - proj->uiCapability()->updateConnectedEditors(); - } + DeleteAllLinkedViewsImpl::execute(); } //-------------------------------------------------------------------------------------------------- @@ -65,6 +75,6 @@ void RicDeleteAllLinkedViewsFeature::onActionTriggered( bool isChecked ) //-------------------------------------------------------------------------------------------------- void RicDeleteAllLinkedViewsFeature::setupActionLook( QAction* actionToSetup ) { - actionToSetup->setText( "Delete All Linked Views" ); - actionToSetup->setIcon( QIcon( ":/Erase.png" ) ); + actionToSetup->setText( "Unlink All Views" ); + actionToSetup->setIcon( QIcon( ":/UnLinkView16x16.png" ) ); } From 159d54477a411cc17f42b5e6f67291c090413201 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Mon, 28 Oct 2019 15:39:01 +0100 Subject: [PATCH 10/17] #4892 Simplified Link View command. Allowed to link a view without a previous primary view. --- .../Commands/ViewLink/RicLinkViewFeature.cpp | 176 +++++++++++------- .../ViewLink/RicLinkVisibleViewsFeature.cpp | 65 ++----- .../ViewLink/RicLinkVisibleViewsFeature.h | 2 +- .../ViewLink/RicSetMasterViewFeature.cpp | 2 +- 4 files changed, 131 insertions(+), 114 deletions(-) diff --git a/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp b/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp index 293f265c3a..eb7fa312e6 100644 --- a/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp @@ -25,6 +25,7 @@ #include "Rim3dView.h" #include "RimEclipseContourMapView.h" +#include "RimGeoMechContourMapView.h" #include "RimGridView.h" #include "RimProject.h" #include "RimViewLinker.h" @@ -40,50 +41,107 @@ CAF_CMD_SOURCE_INIT( RicLinkViewFeature, "RicLinkViewFeature" ); +class RicLinkViewFeatureImpl +{ +public: + // 1. Selected views in the tree + // 2. Context menu on a viewer + + bool prepareToExecute() + { + auto contextViewer = dynamic_cast( + caf::CmdFeatureManager::instance()->currentContextMenuTargetWidget() ); + + if ( contextViewer ) + { + // Link only the active view to an existing view link collection. + RimGridView* activeView = RiaApplication::instance()->activeGridView(); + if ( !activeView ) return false; + if ( dynamic_cast( activeView ) ) return false; + if ( dynamic_cast( activeView ) ) return false; + + if ( activeView->assosiatedViewLinker() ) return false; + + m_viewsToLink.push_back( activeView ); + return true; + } + + std::vector selectedGridViews; + + caf::SelectionManager::instance()->objectsByTypeStrict( &selectedGridViews ); + bool hasAnyUnlinkableViews = false; + for ( auto gridView : selectedGridViews ) + { + if ( dynamic_cast( gridView ) ) + { + hasAnyUnlinkableViews = true; + break; + } + + if ( dynamic_cast( gridView ) ) + { + hasAnyUnlinkableViews = true; + break; + } + + if ( !gridView->assosiatedViewLinker() ) + { + m_viewsToLink.push_back( gridView ); + } + } + + if ( !m_viewsToLink.empty() && !hasAnyUnlinkableViews ) + { + return true; + } + + return false; + } + + void execute() + { + RicLinkVisibleViewsFeature::linkViews( m_viewsToLink ); + +#if 0 + std::vector allSelectedItems; + std::vector selectedGridViews; + + auto contextViewer = dynamic_cast( caf::CmdFeatureManager::instance()->currentContextMenuTargetWidget() ); + + caf::SelectionManager::instance()->selectedItems( allSelectedItems ); + caf::SelectionManager::instance()->objectsByType( &selectedGridViews ); + + if ( !contextViewer && selectedGridViews.size() > 1u && allSelectedItems.size() == selectedGridViews.size() ) + { + RicLinkVisibleViewsFeature::linkViews( selectedGridViews ); + } + else + { + Rim3dView* activeView = RiaApplication::instance()->activeReservoirView(); + RimGridView* gridView = dynamic_cast( activeView ); + if ( gridView ) + { + std::vector views; + views.push_back( gridView ); + RicLinkVisibleViewsFeature::linkViews( views ); + } + } +#endif + } + + const std::vector& viewsToLink() { return m_viewsToLink;} + +private: + std::vector m_viewsToLink; +}; + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RicLinkViewFeature::isCommandEnabled() { - std::vector allSelectedItems; - std::vector selectedGridViews; - std::vector selectedContourMaps; - - caf::SelectionManager::instance()->selectedItems( allSelectedItems ); - caf::SelectionManager::instance()->objectsByType( &selectedGridViews ); - caf::SelectionManager::instance()->objectsByType( &selectedContourMaps ); - size_t selectedRegularGridViews = selectedGridViews.size() - selectedContourMaps.size(); - - auto contextViewer = dynamic_cast( caf::CmdFeatureManager::instance()->currentContextMenuTargetWidget() ); - - if ( !contextViewer && selectedGridViews.size() > 1u && selectedRegularGridViews >= 1u && - allSelectedItems.size() == selectedGridViews.size() ) - { - return true; - } - else - { - // Link only the active view to an existing view link collection. - Rim3dView* activeView = RiaApplication::instance()->activeMainOrComparisonGridView(); - if ( !activeView ) return false; - - RimProject* proj = RiaApplication::instance()->project(); - RimViewLinker* viewLinker = proj->viewLinkerCollection->viewLinker(); - - if ( !viewLinker ) return false; - - RimViewController* viewController = activeView->viewController(); - - if ( viewController ) - { - return false; - } - else if ( !activeView->isMasterView() ) - { - return true; - } - } - return false; + RicLinkViewFeatureImpl cmdImpl; + return cmdImpl.prepareToExecute(); } //-------------------------------------------------------------------------------------------------- @@ -91,28 +149,10 @@ bool RicLinkViewFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicLinkViewFeature::onActionTriggered( bool isChecked ) { - std::vector allSelectedItems; - std::vector selectedGridViews; - - auto contextViewer = dynamic_cast( caf::CmdFeatureManager::instance()->currentContextMenuTargetWidget() ); - - caf::SelectionManager::instance()->selectedItems( allSelectedItems ); - caf::SelectionManager::instance()->objectsByType( &selectedGridViews ); - - if ( !contextViewer && selectedGridViews.size() > 1u && allSelectedItems.size() == selectedGridViews.size() ) + RicLinkViewFeatureImpl cmdImpl; + if ( cmdImpl.prepareToExecute() ) { - RicLinkVisibleViewsFeature::linkViews( selectedGridViews ); - } - else - { - Rim3dView* activeView = RiaApplication::instance()->activeMainOrComparisonGridView(); - RimGridView* gridView = dynamic_cast( activeView ); - if ( gridView ) - { - std::vector views; - views.push_back( gridView ); - RicLinkVisibleViewsFeature::linkViews( views ); - } + cmdImpl.execute(); } } @@ -121,12 +161,11 @@ void RicLinkViewFeature::onActionTriggered( bool isChecked ) //-------------------------------------------------------------------------------------------------- void RicLinkViewFeature::setupActionLook( QAction* actionToSetup ) { - auto contextViewer = dynamic_cast( caf::CmdFeatureManager::instance()->currentContextMenuTargetWidget() ); + RicLinkViewFeatureImpl cmdImpl; + cmdImpl.prepareToExecute(); - std::vector selectedGridViews; - caf::SelectionManager::instance()->objectsByType( &selectedGridViews ); - if (!contextViewer && selectedGridViews.size() > 1u ) + if ( cmdImpl.viewsToLink().size() >= 2u ) { actionToSetup->setText( "Link Selected Views" ); actionToSetup->setIcon( QIcon( ":/LinkView16x16.png" ) ); @@ -134,6 +173,13 @@ void RicLinkViewFeature::setupActionLook( QAction* actionToSetup ) else { actionToSetup->setText( "Link View" ); - actionToSetup->setIcon( QIcon( ":/ControlledView16x16.png" ) ); + if (RiaApplication::instance()->project()->viewLinkerCollection()->viewLinker()) + { + actionToSetup->setIcon(QIcon(":/ControlledView16x16.png")); + } + else + { + actionToSetup->setIcon(QIcon(":/MasterView16x16.png")); + } } } diff --git a/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp b/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp index a53350faae..29a544075b 100644 --- a/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp @@ -34,6 +34,7 @@ #include "cafPdmUiPropertyViewDialog.h" +#include "RimGeoMechContourMapView.h" #include #include #include @@ -65,7 +66,7 @@ bool RicLinkVisibleViewsFeature::isCommandEnabled() if ( visibleGridViews.size() >= 2 && ( linkedviews.size() < visibleGridViews.size() ) ) { std::vector views; - findNotLinkedVisibleViews( views ); + findLinkableVisibleViews( views ); RicLinkVisibleViewsFeatureUi testUi; testUi.setViews( views ); return !testUi.masterViewCandidates().empty(); @@ -79,10 +80,10 @@ bool RicLinkVisibleViewsFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicLinkVisibleViewsFeature::onActionTriggered( bool isChecked ) { - std::vector views; - findNotLinkedVisibleViews( views ); + std::vector linkableViews; + findLinkableVisibleViews( linkableViews ); - linkViews( views ); + linkViews( linkableViews ); return; } @@ -110,81 +111,51 @@ void RicLinkVisibleViewsFeature::allLinkedViews( std::vector& view //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicLinkVisibleViewsFeature::findNotLinkedVisibleViews( std::vector& views ) +void RicLinkVisibleViewsFeature::findLinkableVisibleViews( std::vector& views ) { RimProject* proj = RiaApplication::instance()->project(); std::vector alreadyLinkedViews; allLinkedViews( alreadyLinkedViews ); - std::vector visibleViews; - proj->allVisibleGridViews( visibleViews ); + std::vector visibleGridViews; + proj->allVisibleGridViews( visibleGridViews ); - for ( size_t i = 0; i < visibleViews.size(); i++ ) + for ( auto gridView : visibleGridViews ) { - bool isLinked = false; - for ( size_t j = 0; j < alreadyLinkedViews.size(); j++ ) - { - if ( visibleViews[i] == alreadyLinkedViews[j] ) - { - isLinked = true; - } - } + if ( dynamic_cast( gridView ) ) continue; + if ( dynamic_cast( gridView ) ) continue; + if ( gridView->assosiatedViewLinker() ) continue; - if ( !isLinked ) - { - views.push_back( visibleViews[i] ); - } + views.push_back( gridView ); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicLinkVisibleViewsFeature::linkViews( std::vector& views ) +void RicLinkVisibleViewsFeature::linkViews( std::vector& linkableViews ) { RimProject* proj = RiaApplication::instance()->project(); RimViewLinker* viewLinker = proj->viewLinkerCollection->viewLinker(); - std::vector masterCandidates; - for ( RimGridView* view : views ) - { - if ( dynamic_cast( view ) == nullptr ) - { - masterCandidates.push_back( view ); - } - } + std::vector masterCandidates = linkableViews; if ( !viewLinker ) { // Create a new view linker - if ( views.size() < 2 ) - { - return; - } - CVF_ASSERT( !masterCandidates.empty() ); - RimGridView* masterView = masterCandidates.front(); - if ( masterCandidates.size() > 1u ) - { - RicLinkVisibleViewsFeatureUi featureUi; - featureUi.setViews( masterCandidates ); - caf::PdmUiPropertyViewDialog propertyDialog( nullptr, &featureUi, "Select Primary View", "" ); - propertyDialog.setWindowIcon( QIcon( ":/LinkView16x16.png" ) ); - if ( propertyDialog.exec() != QDialog::Accepted ) return; + viewLinker = new RimViewLinker; - masterView = featureUi.masterView(); - } - viewLinker = new RimViewLinker; proj->viewLinkerCollection()->viewLinker = viewLinker; viewLinker->setMasterView( masterView ); } - for ( size_t i = 0; i < views.size(); i++ ) + for ( size_t i = 0; i < linkableViews.size(); i++ ) { - RimGridView* rimView = views[i]; + RimGridView* rimView = linkableViews[i]; if ( rimView == viewLinker->masterView() ) continue; viewLinker->addDependentView( rimView ); diff --git a/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.h b/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.h index 496d154e02..5f94c6c7f9 100644 --- a/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.h +++ b/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.h @@ -43,6 +43,6 @@ protected: void setupActionLook( QAction* actionToSetup ) override; private: - void findNotLinkedVisibleViews( std::vector& views ); + void findLinkableVisibleViews( std::vector& views ); void allLinkedViews( std::vector& views ); }; diff --git a/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp b/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp index 53ea3445e4..4ccd95f370 100644 --- a/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp @@ -96,6 +96,6 @@ void RicSetMasterViewFeature::onActionTriggered( bool isChecked ) //-------------------------------------------------------------------------------------------------- void RicSetMasterViewFeature::setupActionLook( QAction* actionToSetup ) { - actionToSetup->setText( "Set As Primary View" ); + actionToSetup->setText( "Set As Primary Linked View" ); actionToSetup->setIcon( QIcon( ":/MasterView16x16.png" ) ); } From 1774d123ccf4151844c96c18f4c7fcf1da3c046b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Mon, 28 Oct 2019 17:13:18 +0100 Subject: [PATCH 11/17] #4892 Simplified Unlink View command. Works on pprimary view as well. --- .../ViewLink/RicUnLinkViewFeature.cpp | 43 ++++++++++++++----- .../ProjectDataModel/RimViewController.cpp | 2 +- .../ProjectDataModel/RimViewLinker.cpp | 14 +++++- .../ProjectDataModel/RimViewLinker.h | 1 + 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp b/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp index e61d017c10..3d52937626 100644 --- a/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp @@ -31,6 +31,7 @@ #include "cafSelectionManager.h" #include +#include "RimViewLinkerCollection.h" CAF_CMD_SOURCE_INIT( RicUnLinkViewFeature, "RicUnLinkViewFeature" ); @@ -43,9 +44,7 @@ bool RicUnLinkViewFeature::isCommandEnabled() ; if ( !activeView ) return false; - RimViewController* viewController = activeView->viewController(); - - if ( viewController ) + if ( activeView->assosiatedViewLinker() ) { return true; } @@ -63,16 +62,39 @@ void RicUnLinkViewFeature::onActionTriggered( bool isChecked ) if ( !activeView ) return; RimViewController* viewController = activeView->viewController(); - viewController->applyRangeFilterCollectionByUserChoice(); + RimViewLinker* viewLinker = activeView->assosiatedViewLinker(); - caf::SelectionManager::instance()->setSelectedItem( viewController ); - caf::CmdFeature* feature = caf::CmdFeatureManager::instance()->getCommandFeature( "RicDeleteItemFeature" ); - if ( feature ) + if ( viewController ) { - feature->action()->trigger(); - - return; + viewController->applyRangeFilterCollectionByUserChoice(); + delete viewController; + viewLinker->removeViewController( nullptr ); // Remove the slots in the vector that was set to nullptr by the destructor } + else if ( viewLinker ) + { + viewLinker->applyRangeFilterCollectionByUserChoice(); + + RimGridView* firstControlledView = viewLinker->firstControlledView(); + + if ( firstControlledView ) + { + viewLinker->setMasterView(firstControlledView); + + viewLinker->updateDependentViews(); + } + else + { + // Remove the view linker object from the view linker collection + // viewLinkerCollection->viewLinker is a PdmChildField containing one RimViewLinker child object + RiaApplication::instance()->project()->viewLinkerCollection->viewLinker.removeChildObject(viewLinker); + + delete viewLinker; + } + activeView->updateHolder(); + } + + RiaApplication::instance()->project()->viewLinkerCollection.uiCapability()->updateConnectedEditors(); + RiaApplication::instance()->project()->uiCapability()->updateConnectedEditors(); } //-------------------------------------------------------------------------------------------------- @@ -82,5 +104,4 @@ void RicUnLinkViewFeature::setupActionLook( QAction* actionToSetup ) { actionToSetup->setText( "Unlink View" ); actionToSetup->setIcon( QIcon( ":/UnLinkView16x16.png" ) ); - } diff --git a/ApplicationCode/ProjectDataModel/RimViewController.cpp b/ApplicationCode/ProjectDataModel/RimViewController.cpp index 81ccf73e12..35df998522 100644 --- a/ApplicationCode/ProjectDataModel/RimViewController.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewController.cpp @@ -961,7 +961,7 @@ bool RimViewController::isRangeFiltersControlled() const { if ( !isRangeFilterControlPossible() ) return false; - if ( ownerViewLinker()->isActive() && this->m_isActive() ) + if (ownerViewLinker() && ownerViewLinker()->isActive() && this->m_isActive() ) { return m_syncRangeFilters; } diff --git a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp index 05eca00c50..ae14ce4b33 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp @@ -278,6 +278,8 @@ void RimViewLinker::allViewsForCameraSync( const RimGridView* source, std::vecto //-------------------------------------------------------------------------------------------------- void RimViewLinker::updateDependentViews() { + if (m_viewControllers.empty()) return; + updateOverrides(); updateCellResult(); updateScaleZ( m_masterView, m_masterView->scaleZ() ); @@ -642,7 +644,7 @@ void RimViewLinker::addViewControllers( caf::PdmUiTreeOrdering& uiTreeOrdering ) { for ( const auto& viewController : m_viewControllers ) { - uiTreeOrdering.add( viewController ); + if (viewController) uiTreeOrdering.add( viewController ); } } @@ -675,3 +677,13 @@ void RimViewLinker::removeViewController( RimViewController* viewController ) { m_viewControllers.removeChildObject( viewController ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimGridView* RimViewLinker::firstControlledView() +{ + if (m_viewControllers.empty()) return nullptr; + + return m_viewControllers[0]->managedView(); +} diff --git a/ApplicationCode/ProjectDataModel/RimViewLinker.h b/ApplicationCode/ProjectDataModel/RimViewLinker.h index 9c41362e03..b76583b04a 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLinker.h +++ b/ApplicationCode/ProjectDataModel/RimViewLinker.h @@ -64,6 +64,7 @@ public: bool isFirstViewDependentOnSecondView( const RimGridView* firstView, const RimGridView* secondView ) const; void updateDependentViews(); void removeViewController( RimViewController* viewController ); + RimGridView* firstControlledView(); void updateOverrides(); From a89670bc22988b18bd3c6578da0140aa64c41bd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Mon, 28 Oct 2019 17:26:33 +0100 Subject: [PATCH 12/17] #4892 Set As Primary Linked View disabled for unlinked views, to reduce clutter in menu --- .../ViewLink/RicSetMasterViewFeature.cpp | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp b/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp index 4ccd95f370..f22208abeb 100644 --- a/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp @@ -30,6 +30,7 @@ #include "Riu3DMainWindowTools.h" +#include "RimGeoMechContourMapView.h" #include #include @@ -42,23 +43,13 @@ bool RicSetMasterViewFeature::isCommandEnabled() { RimGridView* activeView = RiaApplication::instance()->activeMainOrComparisonGridView(); if ( !activeView ) return false; + if ( dynamic_cast( activeView ) != nullptr ) return false; + if ( dynamic_cast( activeView ) != nullptr ) return false; - RimProject* proj = RiaApplication::instance()->project(); RimViewLinker* viewLinker = activeView->assosiatedViewLinker(); - if ( viewLinker && viewLinker->masterView() == activeView ) - { - return false; - } - if ( !proj->viewLinkerCollection()->viewLinker() ) - { - return false; - } - - if ( dynamic_cast( activeView ) != nullptr ) - { - return false; - } + if ( !viewLinker ) return false; + if ( viewLinker->masterView() == activeView ) return false; return true; } From 5ea43dda1910d8dea1db7b6799eb426b422865c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Tue, 29 Oct 2019 11:45:06 +0100 Subject: [PATCH 13/17] #4892 Add "Compare To ..." command in views --- .../Commands/ViewLink/CMakeLists_files.cmake | 2 + .../ViewLink/RicCompareTo3dViewFeature.cpp | 74 ++++++++++++++++++ .../ViewLink/RicCompareTo3dViewFeature.h | 37 +++++++++ .../Resources/ComparisonView16x16.png | Bin 0 -> 202 bytes ApplicationCode/Resources/ResInsight.qrc | 1 + .../UserInterface/RiuViewerCommands.cpp | 40 ++++++++++ .../UserInterface/RiuViewerCommands.h | 5 +- 7 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 ApplicationCode/Commands/ViewLink/RicCompareTo3dViewFeature.cpp create mode 100644 ApplicationCode/Commands/ViewLink/RicCompareTo3dViewFeature.h create mode 100644 ApplicationCode/Resources/ComparisonView16x16.png diff --git a/ApplicationCode/Commands/ViewLink/CMakeLists_files.cmake b/ApplicationCode/Commands/ViewLink/CMakeLists_files.cmake index cd4a2aed24..1fb797c393 100644 --- a/ApplicationCode/Commands/ViewLink/CMakeLists_files.cmake +++ b/ApplicationCode/Commands/ViewLink/CMakeLists_files.cmake @@ -9,6 +9,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicShowLinkOptionsFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicDeleteAllLinkedViewsFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicSetMasterViewFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicRemoveComparison3dViewFeature.h +${CMAKE_CURRENT_LIST_DIR}/RicCompareTo3dViewFeature.h ) set (SOURCE_GROUP_SOURCE_FILES @@ -21,6 +22,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicShowLinkOptionsFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicDeleteAllLinkedViewsFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicSetMasterViewFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicRemoveComparison3dViewFeature.cpp +${CMAKE_CURRENT_LIST_DIR}/RicCompareTo3dViewFeature.cpp ) list(APPEND CODE_HEADER_FILES diff --git a/ApplicationCode/Commands/ViewLink/RicCompareTo3dViewFeature.cpp b/ApplicationCode/Commands/ViewLink/RicCompareTo3dViewFeature.cpp new file mode 100644 index 0000000000..e0717395e6 --- /dev/null +++ b/ApplicationCode/Commands/ViewLink/RicCompareTo3dViewFeature.cpp @@ -0,0 +1,74 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2019- Statoil 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 +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#include "RicCompareTo3dViewFeature.h" + +#include "RiaApplication.h" + +#include "RimGridView.h" + +#include "RiuViewer.h" +#include "RiuViewerCommands.h" + +#include + +CAF_CMD_SOURCE_INIT( RicCompareTo3dViewFeature, "RicCompareTo3dViewFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicCompareTo3dViewFeature::isCommandEnabled() +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCompareTo3dViewFeature::onActionTriggered( bool isChecked ) +{ + RimGridView* activeView = RiaApplication::instance()->activeGridView(); + + QVariant userData = this->userData(); + auto view = static_cast(userData.value()); + + if (view && activeView) + { + activeView->setComparisonView( view ); + activeView->scheduleCreateDisplayModelAndRedraw(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCompareTo3dViewFeature::setupActionLook( QAction* actionToSetup ) +{ + QVariant userData = actionToSetup->data(); + + auto view = static_cast(userData.value()); + if ( view ) + { + actionToSetup->setIcon(view->uiIconProvider().icon() ); + } + else + { + actionToSetup->setIcon(QIcon(":/ComparisonView16x16.png")); + } +} + + diff --git a/ApplicationCode/Commands/ViewLink/RicCompareTo3dViewFeature.h b/ApplicationCode/Commands/ViewLink/RicCompareTo3dViewFeature.h new file mode 100644 index 0000000000..5a0c33d1b7 --- /dev/null +++ b/ApplicationCode/Commands/ViewLink/RicCompareTo3dViewFeature.h @@ -0,0 +1,37 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2019- Statoil 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 +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +//================================================================================================== +/// +//================================================================================================== +class RicCompareTo3dViewFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + // Overrides + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; +}; + + diff --git a/ApplicationCode/Resources/ComparisonView16x16.png b/ApplicationCode/Resources/ComparisonView16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..c2509b936ffd4be86292c82ef2e2ad9be3ed7af6 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=De8Ak0{?)V>TT$X?><>&pI^OO``eaASAMcA$`CiEBiObAE1aYF-J0b5UwyNotBh zd1gt5g1e`0KzJjcI8c$1r;B5V#p&b(iHrj$4jkApo9XX5pDP8d8}%$&edUkpNjS27 oS$y$IG2_vT9)(^h62BN2id5OxfADTk0qSP(boFyt=akR{0Q7A=H~;_u literal 0 HcmV?d00001 diff --git a/ApplicationCode/Resources/ResInsight.qrc b/ApplicationCode/Resources/ResInsight.qrc index 39428092e3..2e02daeca8 100644 --- a/ApplicationCode/Resources/ResInsight.qrc +++ b/ApplicationCode/Resources/ResInsight.qrc @@ -60,6 +60,7 @@ chain.png UnLinkView16x16.png LinkView16x16.png + ComparisonView16x16.png RemoveComparisonView16x16.png MasterView16x16.png ControlledView16x16.png diff --git a/ApplicationCode/UserInterface/RiuViewerCommands.cpp b/ApplicationCode/UserInterface/RiuViewerCommands.cpp index 9785b73469..00a5556e57 100644 --- a/ApplicationCode/UserInterface/RiuViewerCommands.cpp +++ b/ApplicationCode/UserInterface/RiuViewerCommands.cpp @@ -40,11 +40,13 @@ #include "RigMainGrid.h" #include "RigVirtualPerforationTransmissibilities.h" +#include "RiaOptionItemFactory.h" #include "Rim2dIntersectionView.h" #include "RimCellEdgeColors.h" #include "RimContextCommandBuilder.h" #include "RimEclipseCase.h" #include "RimEclipseCellColors.h" +#include "RimEclipseContourMapView.h" #include "RimEclipseFaultColors.h" #include "RimEclipseView.h" #include "RimEllipseFractureTemplate.h" @@ -53,11 +55,13 @@ #include "RimFracture.h" #include "RimGeoMechCase.h" #include "RimGeoMechCellColors.h" +#include "RimGeoMechContourMapView.h" #include "RimGeoMechView.h" #include "RimIntersection.h" #include "RimIntersectionBox.h" #include "RimLegendConfig.h" #include "RimPerforationInterval.h" +#include "RimProject.h" #include "RimSimWellInView.h" #include "RimStimPlanFractureTemplate.h" #include "RimTextAnnotation.h" @@ -148,6 +152,41 @@ void RiuViewerCommands::setOwnerView( Rim3dView* owner ) m_reservoirView = owner; } +void RiuViewerCommands::addCompareToViewMenu( caf::CmdFeatureMenuBuilder* menuBuilder ) +{ + RimGridView* mainGridView = dynamic_cast( m_reservoirView.p() ); + if ( mainGridView && !mainGridView->activeComparisonView() ) + { + std::vector validComparisonViews; + + std::vector views; + RiaApplication::instance()->project()->allViews( views ); + for ( auto view : views ) + { + if ( !dynamic_cast( view ) ) continue; + if ( dynamic_cast( view ) ) continue; + if ( dynamic_cast( view ) ) continue; + + if ( view != mainGridView ) + { + validComparisonViews.push_back( view ); + } + } + + if ( validComparisonViews.size() ) + { + menuBuilder->subMenuStart( "Compare To ...", QIcon( ":/ComparisonView16x16.png" ) ); + for ( auto view : validComparisonViews ) + { + menuBuilder->addCmdFeatureWithUserData( "RicCompareTo3dViewFeature", + view->autoName(), + QVariant::fromValue( static_cast( view ) ) ); + } + menuBuilder->subMenuEnd(); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -518,6 +557,7 @@ void RiuViewerCommands::displayContextMenu( QMouseEvent* event ) menuBuilder << "RicLinkViewFeature"; menuBuilder << "RicShowLinkOptionsFeature"; menuBuilder << "RicSetMasterViewFeature"; + addCompareToViewMenu( &menuBuilder ); menuBuilder.addSeparator(); menuBuilder << "RicUnLinkViewFeature"; menuBuilder << "RicRemoveComparison3dViewFeature"; diff --git a/ApplicationCode/UserInterface/RiuViewerCommands.h b/ApplicationCode/UserInterface/RiuViewerCommands.h index 0b60eb61ae..f7fda0722f 100644 --- a/ApplicationCode/UserInterface/RiuViewerCommands.h +++ b/ApplicationCode/UserInterface/RiuViewerCommands.h @@ -41,7 +41,8 @@ class QMouseEvent; namespace caf { class PdmObject; -} +class CmdFeatureMenuBuilder; +} // namespace caf namespace cvf { @@ -89,6 +90,8 @@ private: bool handleOverlayItemPicking( int winPosX, int winPosY ); + void addCompareToViewMenu( caf::CmdFeatureMenuBuilder* menuBuilder ); + static void addDefaultPickEventHandler( RicDefaultPickEventHandler* pickEventHandler ); static void removeDefaultPickEventHandler( RicDefaultPickEventHandler* pickEventHandler ); From 3998a6001e5357c54e9a4d87f55310299329b70d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Tue, 29 Oct 2019 12:34:00 +0100 Subject: [PATCH 14/17] #4892 Improve Link Visible Views icon --- .../ViewLink/RicLinkVisibleViewsFeature.cpp | 2 +- ApplicationCode/Resources/LinkView24x24.png | Bin 0 -> 187 bytes ApplicationCode/Resources/ResInsight.qrc | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 ApplicationCode/Resources/LinkView24x24.png diff --git a/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp b/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp index 29a544075b..cab2107614 100644 --- a/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp @@ -93,7 +93,7 @@ void RicLinkVisibleViewsFeature::onActionTriggered( bool isChecked ) void RicLinkVisibleViewsFeature::setupActionLook( QAction* actionToSetup ) { actionToSetup->setText( "Link Visible Views" ); - actionToSetup->setIcon( QIcon( ":/LinkView16x16.png" ) ); + actionToSetup->setIcon( QIcon( ":/LinkView24x24.png" ) ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Resources/LinkView24x24.png b/ApplicationCode/Resources/LinkView24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..140f76df3a9162184ebbd707ce4dbd2dd141bd33 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=De8Ak0{?)V>TT$X?><>&pI^OO{*Odcpdc20$SXPZ!4!kK@S+609r?%2NOBTYnic z2(PU@;PPJKw}0+dXZwx_4W7RLEkV~$c)I>S8EUOC@y~p&%9c9Gf)~pdO$-jXU?bX_ az`!8r&nL0xfN?X>Oa@O^KbLh*2~7Yz-#M88 literal 0 HcmV?d00001 diff --git a/ApplicationCode/Resources/ResInsight.qrc b/ApplicationCode/Resources/ResInsight.qrc index 2e02daeca8..3534f617f4 100644 --- a/ApplicationCode/Resources/ResInsight.qrc +++ b/ApplicationCode/Resources/ResInsight.qrc @@ -60,6 +60,7 @@ chain.png UnLinkView16x16.png LinkView16x16.png + LinkView24x24.png ComparisonView16x16.png RemoveComparisonView16x16.png MasterView16x16.png From 06d1500a3fc37227c034d34d749e7dbf30ea5a5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Mon, 28 Oct 2019 12:57:40 +0100 Subject: [PATCH 15/17] Remove obsolete code --- .../Commands/ViewLink/RicLinkViewFeature.cpp | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp b/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp index eb7fa312e6..8112e4210f 100644 --- a/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp @@ -101,32 +101,6 @@ public: void execute() { RicLinkVisibleViewsFeature::linkViews( m_viewsToLink ); - -#if 0 - std::vector allSelectedItems; - std::vector selectedGridViews; - - auto contextViewer = dynamic_cast( caf::CmdFeatureManager::instance()->currentContextMenuTargetWidget() ); - - caf::SelectionManager::instance()->selectedItems( allSelectedItems ); - caf::SelectionManager::instance()->objectsByType( &selectedGridViews ); - - if ( !contextViewer && selectedGridViews.size() > 1u && allSelectedItems.size() == selectedGridViews.size() ) - { - RicLinkVisibleViewsFeature::linkViews( selectedGridViews ); - } - else - { - Rim3dView* activeView = RiaApplication::instance()->activeReservoirView(); - RimGridView* gridView = dynamic_cast( activeView ); - if ( gridView ) - { - std::vector views; - views.push_back( gridView ); - RicLinkVisibleViewsFeature::linkViews( views ); - } - } -#endif } const std::vector& viewsToLink() { return m_viewsToLink;} From 469397bfd10a846d0be05c3e1edd21da10e57414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Tue, 29 Oct 2019 13:49:24 +0100 Subject: [PATCH 16/17] #4857 Fix crash due to missing guarding when loading project --- ApplicationCode/Application/RiaApplication.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ApplicationCode/Application/RiaApplication.cpp b/ApplicationCode/Application/RiaApplication.cpp index edd4e041f8..3321778a49 100644 --- a/ApplicationCode/Application/RiaApplication.cpp +++ b/ApplicationCode/Application/RiaApplication.cpp @@ -269,7 +269,8 @@ RimGridView* RiaApplication::activeMainOrComparisonGridView() RimGridView* activeView = RiaApplication::instance()->activeGridView(); RimGridView* viewOrComparisonView = activeView; - if ( activeView != nullptr && activeView->viewer()->viewerCommands()->isCurrentPickInComparisonView() ) + if ( activeView != nullptr && activeView->viewer() && + activeView->viewer()->viewerCommands()->isCurrentPickInComparisonView() ) { if ( RimGridView* compView = dynamic_cast( activeView->activeComparisonView() ) ) { From 2702c3b078f4f4ac0315259d8d3a7b3c12331a76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Tue, 29 Oct 2019 13:54:32 +0100 Subject: [PATCH 17/17] #4857 Avoid crash in annotations picking whith distorted view --- .../UserInterface/RiuViewerCommands.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/ApplicationCode/UserInterface/RiuViewerCommands.cpp b/ApplicationCode/UserInterface/RiuViewerCommands.cpp index 00a5556e57..0e97fd674a 100644 --- a/ApplicationCode/UserInterface/RiuViewerCommands.cpp +++ b/ApplicationCode/UserInterface/RiuViewerCommands.cpp @@ -1354,17 +1354,20 @@ void RiuViewerCommands::handleTextPicking( int winPosX, int winPosY, cvf::HitIte ref ray = m_viewer->mainCamera()->rayFromWindowCoordinates( translatedMousePosX, translatedMousePosY ); - for ( size_t pIdx = 0; pIdx < partCollection.size(); ++pIdx ) + if ( ray.notNull() ) { - DrawableText* textDrawable = dynamic_cast( partCollection[pIdx]->drawable() ); - if ( textDrawable ) + for ( size_t pIdx = 0; pIdx < partCollection.size(); ++pIdx ) { - cvf::Vec3d ppoint; - if ( textDrawable->rayIntersect( *ray, *( m_viewer->mainCamera() ), &ppoint ) ) + DrawableText* textDrawable = dynamic_cast(partCollection[pIdx]->drawable()); + if ( textDrawable ) { - cvf::ref hitItem = new HitItem( 0, ppoint ); - hitItem->setPart( partCollection[pIdx].p() ); - hitItems->add( hitItem.p() ); + cvf::Vec3d ppoint; + if ( textDrawable->rayIntersect(*ray, *(m_viewer->mainCamera()), &ppoint) ) + { + cvf::ref hitItem = new HitItem(0, ppoint); + hitItem->setPart(partCollection[pIdx].p()); + hitItems->add(hitItem.p()); + } } } }