#4892 Simplified Link View command. Allowed to link a view without a previous primary view.

This commit is contained in:
Jacob Støren 2019-10-28 15:39:01 +01:00
parent 5ee8c3b50e
commit 159d54477a
4 changed files with 131 additions and 114 deletions

View File

@ -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<RiuViewer*>(
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<RimEclipseContourMapView*>( activeView ) ) return false;
if ( dynamic_cast<RimGeoMechContourMapView*>( activeView ) ) return false;
if ( activeView->assosiatedViewLinker() ) return false;
m_viewsToLink.push_back( activeView );
return true;
}
std::vector<RimGridView*> selectedGridViews;
caf::SelectionManager::instance()->objectsByTypeStrict( &selectedGridViews );
bool hasAnyUnlinkableViews = false;
for ( auto gridView : selectedGridViews )
{
if ( dynamic_cast<RimEclipseContourMapView*>( gridView ) )
{
hasAnyUnlinkableViews = true;
break;
}
if ( dynamic_cast<RimGeoMechContourMapView*>( 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<caf::PdmUiItem*> allSelectedItems;
std::vector<RimGridView*> selectedGridViews;
auto contextViewer = dynamic_cast<RiuViewer*>( 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<RimGridView*>( activeView );
if ( gridView )
{
std::vector<RimGridView*> views;
views.push_back( gridView );
RicLinkVisibleViewsFeature::linkViews( views );
}
}
#endif
}
const std::vector<RimGridView*>& viewsToLink() { return m_viewsToLink;}
private:
std::vector<RimGridView*> m_viewsToLink;
};
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicLinkViewFeature::isCommandEnabled()
{
std::vector<caf::PdmUiItem*> allSelectedItems;
std::vector<RimGridView*> selectedGridViews;
std::vector<RimEclipseContourMapView*> 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<RiuViewer*>( 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<caf::PdmUiItem*> allSelectedItems;
std::vector<RimGridView*> selectedGridViews;
auto contextViewer = dynamic_cast<RiuViewer*>( 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<RimGridView*>( activeView );
if ( gridView )
{
std::vector<RimGridView*> 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<RiuViewer*>( caf::CmdFeatureManager::instance()->currentContextMenuTargetWidget() );
RicLinkViewFeatureImpl cmdImpl;
cmdImpl.prepareToExecute();
std::vector<RimGridView*> 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"));
}
}
}

View File

@ -34,6 +34,7 @@
#include "cafPdmUiPropertyViewDialog.h"
#include "RimGeoMechContourMapView.h"
#include <QAction>
#include <QMessageBox>
#include <QTreeView>
@ -65,7 +66,7 @@ bool RicLinkVisibleViewsFeature::isCommandEnabled()
if ( visibleGridViews.size() >= 2 && ( linkedviews.size() < visibleGridViews.size() ) )
{
std::vector<RimGridView*> 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<RimGridView*> views;
findNotLinkedVisibleViews( views );
std::vector<RimGridView*> linkableViews;
findLinkableVisibleViews( linkableViews );
linkViews( views );
linkViews( linkableViews );
return;
}
@ -110,81 +111,51 @@ void RicLinkVisibleViewsFeature::allLinkedViews( std::vector<RimGridView*>& view
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicLinkVisibleViewsFeature::findNotLinkedVisibleViews( std::vector<RimGridView*>& views )
void RicLinkVisibleViewsFeature::findLinkableVisibleViews( std::vector<RimGridView*>& views )
{
RimProject* proj = RiaApplication::instance()->project();
std::vector<RimGridView*> alreadyLinkedViews;
allLinkedViews( alreadyLinkedViews );
std::vector<RimGridView*> visibleViews;
proj->allVisibleGridViews( visibleViews );
std::vector<RimGridView*> 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<RimEclipseContourMapView*>( gridView ) ) continue;
if ( dynamic_cast<RimGeoMechContourMapView*>( gridView ) ) continue;
if ( gridView->assosiatedViewLinker() ) continue;
if ( !isLinked )
{
views.push_back( visibleViews[i] );
}
views.push_back( gridView );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicLinkVisibleViewsFeature::linkViews( std::vector<RimGridView*>& views )
void RicLinkVisibleViewsFeature::linkViews( std::vector<RimGridView*>& linkableViews )
{
RimProject* proj = RiaApplication::instance()->project();
RimViewLinker* viewLinker = proj->viewLinkerCollection->viewLinker();
std::vector<RimGridView*> masterCandidates;
for ( RimGridView* view : views )
{
if ( dynamic_cast<RimEclipseContourMapView*>( view ) == nullptr )
{
masterCandidates.push_back( view );
}
}
std::vector<RimGridView*> 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 );

View File

@ -43,6 +43,6 @@ protected:
void setupActionLook( QAction* actionToSetup ) override;
private:
void findNotLinkedVisibleViews( std::vector<RimGridView*>& views );
void findLinkableVisibleViews( std::vector<RimGridView*>& views );
void allLinkedViews( std::vector<RimGridView*>& views );
};

View File

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