mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#4892 Simplified Link View command. Allowed to link a view without a previous primary view.
This commit is contained in:
parent
5ee8c3b50e
commit
159d54477a
@ -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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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 );
|
||||
|
@ -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 );
|
||||
};
|
||||
|
@ -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" ) );
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user