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" ) ); }