diff --git a/ApplicationCode/Commands/RicLinkVisibleViewsFeature.cpp b/ApplicationCode/Commands/RicLinkVisibleViewsFeature.cpp index 6a6b7685c6..624cbbfae2 100644 --- a/ApplicationCode/Commands/RicLinkVisibleViewsFeature.cpp +++ b/ApplicationCode/Commands/RicLinkVisibleViewsFeature.cpp @@ -21,7 +21,7 @@ #include "RiaApplication.h" -#include "RimManagedViewCollection.h" +#include "RimLinkedViews.h" #include "RimManagedViewConfig.h" #include "RimProject.h" #include "RimView.h" @@ -57,28 +57,32 @@ void RicLinkVisibleViewsFeature::onActionTriggered(bool isChecked) RimProject* proj = RiaApplication::instance()->project(); std::vector views; proj->allVisibleViews(views); - CVF_ASSERT(views.size() > 1); - + RimView* masterView = views[0]; - RimManagedViewCollection* managedViewCollection = masterView->managedViewCollection(); + RimLinkedViews* linkedViews = new RimLinkedViews; + linkedViews->mainView = masterView; + for (size_t i = 1; i < views.size(); i++) { RimView* rimView = views[i]; RimManagedViewConfig* viewConfig = new RimManagedViewConfig; viewConfig->managedView = rimView; - managedViewCollection->viewConfigs.push_back(viewConfig); + linkedViews->viewConfigs.push_back(viewConfig); viewConfig->initAfterReadRecursively(); } - managedViewCollection->applyAllOperations(); - managedViewCollection->updateConnectedEditors(); + proj->linkedViews.push_back(linkedViews); + proj->linkedViews.uiCapability()->updateConnectedEditors(); + + linkedViews->applyAllOperations(); + linkedViews->updateConnectedEditors(); // Set managed view collection to selected and expanded in project tree caf::PdmUiTreeView* projTreeView = RiuMainWindow::instance()->projectTreeView(); - QModelIndex modIndex = projTreeView->findModelIndex(managedViewCollection); + QModelIndex modIndex = projTreeView->findModelIndex(linkedViews); projTreeView->treeView()->setCurrentIndex(modIndex); projTreeView->treeView()->setExpanded(modIndex, true); diff --git a/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake b/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake index d9f862c69b..5cd2597fa2 100644 --- a/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake +++ b/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake @@ -60,12 +60,12 @@ ${CEE_CURRENT_LIST_DIR}RimView.h ${CEE_CURRENT_LIST_DIR}RimCase.h ${CEE_CURRENT_LIST_DIR}RimTreeViewStateSerializer.h ${CEE_CURRENT_LIST_DIR}RimManagedViewConfig.h -${CEE_CURRENT_LIST_DIR}RimManagedViewCollection.h ${CEE_CURRENT_LIST_DIR}RimMainPlotCollection.h ${CEE_CURRENT_LIST_DIR}RimWellLogPlotCollection.h ${CEE_CURRENT_LIST_DIR}RimWellLogPlot.h ${CEE_CURRENT_LIST_DIR}RimWellLogPlotTrace.h ${CEE_CURRENT_LIST_DIR}RimWellLogPlotCurve.h +${CEE_CURRENT_LIST_DIR}RimLinkedViews.h ) set (SOURCE_GROUP_SOURCE_FILES @@ -124,12 +124,12 @@ ${CEE_CURRENT_LIST_DIR}RimView.cpp ${CEE_CURRENT_LIST_DIR}RimCase.cpp ${CEE_CURRENT_LIST_DIR}RimTreeViewStateSerializer.cpp ${CEE_CURRENT_LIST_DIR}RimManagedViewConfig.cpp -${CEE_CURRENT_LIST_DIR}RimManagedViewCollection.cpp ${CEE_CURRENT_LIST_DIR}RimMainPlotCollection.cpp ${CEE_CURRENT_LIST_DIR}RimWellLogPlotCollection.cpp ${CEE_CURRENT_LIST_DIR}RimWellLogPlot.cpp ${CEE_CURRENT_LIST_DIR}RimWellLogPlotTrace.cpp ${CEE_CURRENT_LIST_DIR}RimWellLogPlotCurve.cpp +${CEE_CURRENT_LIST_DIR}RimLinkedViews.cpp ) list(APPEND CODE_HEADER_FILES diff --git a/ApplicationCode/ProjectDataModel/RimCellRangeFilterCollection.cpp b/ApplicationCode/ProjectDataModel/RimCellRangeFilterCollection.cpp index f08072803d..195979f605 100644 --- a/ApplicationCode/ProjectDataModel/RimCellRangeFilterCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimCellRangeFilterCollection.cpp @@ -31,7 +31,8 @@ #include "RimEclipseView.h" #include "RimGeoMechCase.h" #include "RimGeoMechView.h" -#include "RimManagedViewCollection.h" +#include "RimLinkedViews.h" +#include "RimProject.h" #include "cafPdmUiEditorHandle.h" @@ -147,16 +148,22 @@ void RimCellRangeFilterCollection::fieldChangedByUi(const caf::PdmFieldHandle* c //-------------------------------------------------------------------------------------------------- void RimCellRangeFilterCollection::updateDisplayModeNotifyManagedViews() { - RimView* rimView = NULL; - firstAnchestorOrThisOfType(rimView); + RimView* view = NULL; + firstAnchestorOrThisOfType(view); - rimView->scheduleGeometryRegen(RANGE_FILTERED); - rimView->scheduleGeometryRegen(RANGE_FILTERED_INACTIVE); + view->scheduleGeometryRegen(RANGE_FILTERED); + view->scheduleGeometryRegen(RANGE_FILTERED_INACTIVE); - rimView->scheduleCreateDisplayModelAndRedraw(); + view->scheduleCreateDisplayModelAndRedraw(); - // Notify managed views of range filter change in master view - rimView->managedViewCollection()->updateRangeFilters(); + RimProject* proj = NULL; + view->firstAnchestorOrThisOfType(proj); + + RimLinkedViews* linkedViews = proj->findLinkedViewsGroupForView(view); + if (linkedViews) + { + linkedViews->updateRangeFilters(); + } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilterCollection.cpp b/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilterCollection.cpp index fcdf428d28..4f91afefb9 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilterCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipsePropertyFilterCollection.cpp @@ -23,7 +23,8 @@ #include "RimEclipseCellColors.h" #include "RimEclipseResultDefinition.h" #include "RimEclipseView.h" -#include "RimManagedViewCollection.h" +#include "RimLinkedViews.h" +#include "RimProject.h" #include "cafPdmUiEditorHandle.h" @@ -145,6 +146,12 @@ void RimEclipsePropertyFilterCollection::updateDisplayModelNotifyManagedViews() view->scheduleGeometryRegen(PROPERTY_FILTERED); view->scheduleCreateDisplayModelAndRedraw(); - // Notify managed views of range filter change in master view - view->managedViewCollection()->updatePropertyFilters(); + RimProject* proj = NULL; + view->firstAnchestorOrThisOfType(proj); + + RimLinkedViews* linkedViews = proj->findLinkedViewsGroupForView(view); + if (linkedViews) + { + linkedViews->updatePropertyFilters(); + } } diff --git a/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp b/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp index e4c7e944fd..649ef38a59 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp @@ -28,11 +28,12 @@ #include "RimEclipseFaultColors.h" #include "RimEclipsePropertyFilter.h" #include "RimEclipseView.h" -#include "RimManagedViewCollection.h" #include "RimReservoirCellResultsStorage.h" #include "RimView.h" #include "cafPdmUiListEditor.h" +#include "RimProject.h" +#include "RimLinkedViews.h" CAF_PDM_SOURCE_INIT(RimEclipseResultDefinition, "ResultDefinition"); @@ -153,10 +154,16 @@ void RimEclipseResultDefinition::fieldChangedByUi(const caf::PdmFieldHandle* cha this->firstAnchestorOrThisOfType(view); if (view) { - view->managedViewCollection->updateCellResult(); + RimProject* proj = NULL; + view->firstAnchestorOrThisOfType(proj); + + RimLinkedViews* linkedViews = proj->findLinkedViewsGroupForView(view); + if (linkedViews) + { + linkedViews->updateCellResult(); + } } } - } RimEclipsePropertyFilter* propFilter = dynamic_cast(this->parentField()->ownerObject()); diff --git a/ApplicationCode/ProjectDataModel/RimGeoMechPropertyFilterCollection.cpp b/ApplicationCode/ProjectDataModel/RimGeoMechPropertyFilterCollection.cpp index a0df142911..b893216974 100644 --- a/ApplicationCode/ProjectDataModel/RimGeoMechPropertyFilterCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimGeoMechPropertyFilterCollection.cpp @@ -22,9 +22,10 @@ #include "RimGeoMechCellColors.h" #include "RimGeoMechPropertyFilter.h" #include "RimGeoMechView.h" -#include "RimManagedViewCollection.h" +#include "RimProject.h" #include "cvfAssert.h" +#include "RimLinkedViews.h" CAF_PDM_SOURCE_INIT(RimGeoMechPropertyFilterCollection, "GeoMechPropertyFilters"); @@ -147,6 +148,12 @@ void RimGeoMechPropertyFilterCollection::updateDisplayModelNotifyManagedViews() view->scheduleGeometryRegen(PROPERTY_FILTERED); view->scheduleCreateDisplayModelAndRedraw(); - // Notify managed views of range filter change in master view - view->managedViewCollection()->updatePropertyFilters(); + RimProject* proj = NULL; + view->firstAnchestorOrThisOfType(proj); + + RimLinkedViews* linkedViews = proj->findLinkedViewsGroupForView(view); + if (linkedViews) + { + linkedViews->updatePropertyFilters(); + } } diff --git a/ApplicationCode/ProjectDataModel/RimGeoMechResultDefinition.cpp b/ApplicationCode/ProjectDataModel/RimGeoMechResultDefinition.cpp index cb411197b5..861521b4e6 100644 --- a/ApplicationCode/ProjectDataModel/RimGeoMechResultDefinition.cpp +++ b/ApplicationCode/ProjectDataModel/RimGeoMechResultDefinition.cpp @@ -30,11 +30,12 @@ #include "RimGeoMechCellColors.h" #include "RimGeoMechPropertyFilter.h" #include "RimGeoMechView.h" -#include "RimManagedViewCollection.h" #include "RiuMainWindow.h" #include "cafPdmUiListEditor.h" +#include "RimProject.h" +#include "RimLinkedViews.h" namespace caf { @@ -188,7 +189,19 @@ void RimGeoMechResultDefinition::fieldChangedByUi(const caf::PdmFieldHandle* cha if (dynamic_cast(this)) { - if (view) view->managedViewCollection->updateCellResult(); + RimView* view = NULL; + this->firstAnchestorOrThisOfType(view); + if (view) + { + RimProject* proj = NULL; + view->firstAnchestorOrThisOfType(proj); + + RimLinkedViews* linkedViews = proj->findLinkedViewsGroupForView(view); + if (linkedViews) + { + linkedViews->updateCellResult(); + } + } } } } diff --git a/ApplicationCode/ProjectDataModel/RimManagedViewCollection.cpp b/ApplicationCode/ProjectDataModel/RimLinkedViews.cpp similarity index 65% rename from ApplicationCode/ProjectDataModel/RimManagedViewCollection.cpp rename to ApplicationCode/ProjectDataModel/RimLinkedViews.cpp index 3fed5c4b83..82e5261d5b 100644 --- a/ApplicationCode/ProjectDataModel/RimManagedViewCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimLinkedViews.cpp @@ -17,31 +17,41 @@ // ///////////////////////////////////////////////////////////////////////////////// -#include "RimManagedViewCollection.h" +#include "RimLinkedViews.h" +#include "RiaApplication.h" + +#include "RimCase.h" #include "RimEclipseCellColors.h" #include "RimEclipseResultDefinition.h" #include "RimEclipseView.h" +#include "RimGeoMechCellColors.h" +#include "RimGeoMechResultDefinition.h" +#include "RimGeoMechView.h" #include "RimManagedViewConfig.h" +#include "RimProject.h" #include "RimView.h" #include "RiuViewer.h" #include "cvfCamera.h" #include "cvfMatrix4.h" -#include "RimGeoMechView.h" -#include "RimGeoMechResultDefinition.h" -#include "RimGeoMechCellColors.h" +#include "cafPdmUiTreeOrdering.h" -CAF_PDM_SOURCE_INIT(RimManagedViewCollection, "RimManagedViewCollection"); +CAF_PDM_SOURCE_INIT(RimLinkedViews, "RimLinkedViews"); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimManagedViewCollection::RimManagedViewCollection(void) +RimLinkedViews::RimLinkedViews(void) { - CAF_PDM_InitObject("Managed Views", ":/chain.png", "", ""); + CAF_PDM_InitObject("Linked Views", ":/chain.png", "", ""); + + CAF_PDM_InitField(&name, "Name", QString("View Group Name"), "View Group Name", "", "", ""); + + CAF_PDM_InitFieldNoDefault(&mainView, "MainView", "Main View", "", "", ""); + mainView.uiCapability()->setUiChildrenHidden(true); CAF_PDM_InitFieldNoDefault(&viewConfigs, "ManagedViews", "Managed Views", "", "", ""); viewConfigs.uiCapability()->setUiHidden(true); @@ -50,23 +60,38 @@ RimManagedViewCollection::RimManagedViewCollection(void) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimManagedViewCollection::~RimManagedViewCollection(void) +RimLinkedViews::~RimLinkedViews(void) { } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimManagedViewCollection::updateTimeStep(int timeStep) +void RimLinkedViews::updateTimeStep(RimView* sourceView, int timeStep) { + RimManagedViewConfig* sourceViewConfig = viewConfigForView(sourceView); + if (sourceViewConfig && !sourceViewConfig->syncTimeStep()) + { + return; + } + + if (sourceView && sourceView != mainView) + { + mainView->viewer()->setCurrentFrame(timeStep); + } + else + { + mainView->viewer()->setCurrentFrame(timeStep); + } + for (size_t i = 0; i < viewConfigs.size(); i++) { RimManagedViewConfig* managedViewConfig = viewConfigs[i]; - if (managedViewConfig->managedView()) + if (managedViewConfig->managedView() && managedViewConfig->managedView() != sourceView) { if (managedViewConfig->syncTimeStep() && managedViewConfig->managedView()->viewer()) { - managedViewConfig->managedView()->viewer()->slotSetCurrentFrame(timeStep); + managedViewConfig->managedView()->viewer()->setCurrentFrame(timeStep); } } } @@ -75,12 +100,10 @@ void RimManagedViewCollection::updateTimeStep(int timeStep) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimManagedViewCollection::updateCellResult() +void RimLinkedViews::updateCellResult() { - RimView* masterView = NULL; - firstAnchestorOrThisOfType(masterView); - - RimEclipseView* masterEclipseView = dynamic_cast(masterView); + RimView* rimView = mainView; + RimEclipseView* masterEclipseView = dynamic_cast(rimView); if (masterEclipseView && masterEclipseView->cellResult()) { RimEclipseResultDefinition* eclipseCellResultDefinition = masterEclipseView->cellResult(); @@ -101,14 +124,11 @@ void RimManagedViewCollection::updateCellResult() eclipeView->cellResult()->setResultVariable(eclipseCellResultDefinition->resultVariable()); } } - - // Notify recursively - managedViewConfig->managedView()->managedViewCollection()->updateCellResult(); } } } - RimGeoMechView* masterGeoView = dynamic_cast(masterView); + RimGeoMechView* masterGeoView = dynamic_cast(rimView); if (masterGeoView && masterGeoView->cellResult()) { RimGeoMechResultDefinition* geoMechResultDefinition = masterGeoView->cellResult(); @@ -128,9 +148,6 @@ void RimManagedViewCollection::updateCellResult() geoView->scheduleCreateDisplayModelAndRedraw(); } } - - // Notify recursively - managedViewConfig->managedView()->managedViewCollection()->updateCellResult(); } } } @@ -139,7 +156,7 @@ void RimManagedViewCollection::updateCellResult() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimManagedViewCollection::updateRangeFilters() +void RimLinkedViews::updateRangeFilters() { for (size_t i = 0; i < viewConfigs.size(); i++) { @@ -167,9 +184,6 @@ void RimManagedViewCollection::updateRangeFilters() geoView->scheduleCreateDisplayModelAndRedraw(); } } - - // Notify recursively - managedViewConfig->managedView()->managedViewCollection()->updateRangeFilters(); } } } @@ -177,7 +191,7 @@ void RimManagedViewCollection::updateRangeFilters() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimManagedViewCollection::updatePropertyFilters() +void RimLinkedViews::updatePropertyFilters() { for (size_t i = 0; i < viewConfigs.size(); i++) { @@ -190,8 +204,7 @@ void RimManagedViewCollection::updatePropertyFilters() RimEclipseView* eclipeView = dynamic_cast(rimView); if (eclipeView) { - eclipeView->scheduleGeometryRegen(RANGE_FILTERED); - eclipeView->scheduleGeometryRegen(RANGE_FILTERED_INACTIVE); + eclipeView->scheduleGeometryRegen(PROPERTY_FILTERED); eclipeView->scheduleCreateDisplayModelAndRedraw(); } @@ -204,9 +217,6 @@ void RimManagedViewCollection::updatePropertyFilters() geoView->scheduleCreateDisplayModelAndRedraw(); } } - - // Notify recursively - managedViewConfig->managedView()->managedViewCollection()->updatePropertyFilters(); } } } @@ -214,7 +224,7 @@ void RimManagedViewCollection::updatePropertyFilters() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimManagedViewCollection::configureOverrides() +void RimLinkedViews::configureOverrides() { for (size_t i = 0; i < viewConfigs.size(); i++) { @@ -226,15 +236,15 @@ void RimManagedViewCollection::configureOverrides() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimManagedViewCollection::allViewsForCameraSync(std::vector& views) +void RimLinkedViews::allViewsForCameraSync(std::vector& views) { + views.push_back(mainView()); + for (size_t i = 0; i < viewConfigs.size(); i++) { if (viewConfigs[i]->syncCamera && viewConfigs[i]->managedView()) { views.push_back(viewConfigs[i]->managedView()); - - viewConfigs[i]->managedView()->managedViewCollection()->allViewsForCameraSync(views); } } } @@ -242,15 +252,82 @@ void RimManagedViewCollection::allViewsForCameraSync(std::vector& view //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimManagedViewCollection::applyAllOperations() +void RimLinkedViews::applyAllOperations() { - RimView* masterView = NULL; - firstAnchestorOrThisOfType(masterView); - configureOverrides(); updateCellResult(); - updateTimeStep(masterView->currentTimeStep()); + updateTimeStep(NULL, mainView->currentTimeStep()); updateRangeFilters(); updatePropertyFilters(); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList RimLinkedViews::calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool * useOptionsOnly) +{ + QList optionList; + + if (fieldNeedingOptions == &mainView) + { + RimProject* proj = RiaApplication::instance()->project(); + std::vector views; + proj->allVisibleViews(views); + + for (size_t i = 0; i < views.size(); i++) + { + optionList.push_back(caf::PdmOptionItemInfo(displayNameForView(views[i]), QVariant::fromValue(caf::PdmPointer(views[i])))); + } + + if (optionList.size() > 0) + { + optionList.push_front(caf::PdmOptionItemInfo("None", QVariant::fromValue(caf::PdmPointer(NULL)))); + } + } + + return optionList; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimLinkedViews::displayNameForView(RimView* view) +{ + RimCase* rimCase = NULL; + view->firstAnchestorOrThisOfType(rimCase); + + QString displayName = rimCase->caseUserDescription() + " : " + view->name; + + return displayName; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimLinkedViews::defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName /*= ""*/) +{ + for (size_t cIdx = 0; cIdx < viewConfigs.size(); ++cIdx) + { + PdmObjectHandle* childObject = viewConfigs[cIdx]; + if (childObject) + { + uiTreeOrdering.add(childObject); + } + } + + uiTreeOrdering.setForgetRemainingFields(true); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimManagedViewConfig* RimLinkedViews::viewConfigForView(RimView* view) +{ + for (size_t i = 0; i < viewConfigs.size(); i++) + { + if (viewConfigs[i]->managedView() == view) return viewConfigs[i]; + } + + return NULL; +} diff --git a/ApplicationCode/ProjectDataModel/RimManagedViewCollection.h b/ApplicationCode/ProjectDataModel/RimLinkedViews.h similarity index 67% rename from ApplicationCode/ProjectDataModel/RimManagedViewCollection.h rename to ApplicationCode/ProjectDataModel/RimLinkedViews.h index 1cfb67ba28..fb2e601f7a 100644 --- a/ApplicationCode/ProjectDataModel/RimManagedViewCollection.h +++ b/ApplicationCode/ProjectDataModel/RimLinkedViews.h @@ -24,6 +24,7 @@ #include "cafPdmChildArrayField.h" #include "cafPdmField.h" #include "cafPdmObject.h" +#include "cafPdmPtrField.h" class RimManagedViewConfig; class RiuViewer; @@ -33,19 +34,22 @@ class RimView; /// /// //================================================================================================== -class RimManagedViewCollection : public caf::PdmObject +class RimLinkedViews : public caf::PdmObject { CAF_PDM_HEADER_INIT; public: - RimManagedViewCollection(void); - virtual ~RimManagedViewCollection(void); + RimLinkedViews(void); + virtual ~RimLinkedViews(void); + + caf::PdmPtrField mainView; + caf::PdmField name; caf::PdmChildArrayField viewConfigs; void applyAllOperations(); - void updateTimeStep(int timeStep); + void updateTimeStep(RimView* sourceView, int timeStep); void updateCellResult(); void updateRangeFilters(); @@ -54,4 +58,13 @@ public: void configureOverrides(); void allViewsForCameraSync(std::vector& views); + +public: + static QString displayNameForView(RimView* view); + RimManagedViewConfig* viewConfigForView(RimView* view); + +protected: + virtual QList calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool * useOptionsOnly); + virtual caf::PdmFieldHandle* userDescriptionField() { return &name; } + virtual void defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = ""); }; diff --git a/ApplicationCode/ProjectDataModel/RimManagedViewConfig.cpp b/ApplicationCode/ProjectDataModel/RimManagedViewConfig.cpp index 7639805ff9..6a0f6f9147 100644 --- a/ApplicationCode/ProjectDataModel/RimManagedViewConfig.cpp +++ b/ApplicationCode/ProjectDataModel/RimManagedViewConfig.cpp @@ -27,7 +27,7 @@ #include "RimEclipseView.h" #include "RimGeoMechPropertyFilterCollection.h" #include "RimGeoMechView.h" -#include "RimManagedViewCollection.h" +#include "RimLinkedViews.h" #include "RimProject.h" #include "RimView.h" @@ -46,6 +46,7 @@ RimManagedViewConfig::RimManagedViewConfig(void) QString defaultName = "View Config : Empty view"; CAF_PDM_InitField(&name, "Name", defaultName, "Managed View Name", "", "", ""); + name.uiCapability()->setUiHidden(true); CAF_PDM_InitFieldNoDefault(&managedView, "ManagedView", "Managed View", "", "", ""); managedView.uiCapability()->setUiChildrenHidden(true); @@ -110,26 +111,25 @@ void RimManagedViewConfig::defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOr //-------------------------------------------------------------------------------------------------- void RimManagedViewConfig::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) { - if (changedField == &syncCamera || changedField == &syncTimeStep) + if (changedField == &syncCamera && syncCamera()) { - RimView* masterView = NULL; - firstAnchestorOrThisOfType(masterView); - - masterView->viewer()->update(); + if (managedView && managedView->viewer()) managedView->viewer()->update(); } - else if (changedField == &syncCellResult) + else if (changedField == &syncTimeStep && syncTimeStep()) { - // When cell result is activated, update cell result in managed views - // Original result Will not be restored when cell result is disabled - - if (syncCellResult()) + if (managedView) { - RimView* masterView = NULL; - firstAnchestorOrThisOfType(masterView); - - masterView->managedViewCollection()->updateCellResult(); + RimLinkedViews* linkedViews = NULL; + this->firstAnchestorOrThisOfType(linkedViews); + linkedViews->updateTimeStep(managedView, managedView->currentTimeStep()); } } + else if (changedField == &syncCellResult && syncCellResult()) + { + RimLinkedViews* linkedViews = NULL; + this->firstAnchestorOrThisOfType(linkedViews); + linkedViews->updateCellResult(); + } else if (changedField == &syncRangeFilters) { configureOverridesUpdateDisplayModel(); @@ -146,10 +146,9 @@ void RimManagedViewConfig::fieldChangedByUi(const caf::PdmFieldHandle* changedFi { if (syncCellResult()) { - RimView* masterView = NULL; - firstAnchestorOrThisOfType(masterView); - - masterView->managedViewCollection()->updateCellResult(); + RimLinkedViews* linkedViews = NULL; + this->firstAnchestorOrThisOfType(linkedViews); + linkedViews->updateCellResult(); } name = displayNameForView(managedView); @@ -174,7 +173,9 @@ void RimManagedViewConfig::fieldChangedByUi(const caf::PdmFieldHandle* changedFi geoView->setOverridePropertyFilterCollection(NULL); } - rimView->managedViewCollection()->configureOverrides(); + RimLinkedViews* linkedViews = NULL; + this->firstAnchestorOrThisOfType(linkedViews); + linkedViews->configureOverrides(); } updateDisplayName(); @@ -241,8 +242,10 @@ void RimManagedViewConfig::configureOverridesUpdateDisplayModel() //-------------------------------------------------------------------------------------------------- void RimManagedViewConfig::configureOverrides() { - RimView* masterView = NULL; - firstAnchestorOrThisOfType(masterView); + RimLinkedViews* linkedViews = NULL; + this->firstAnchestorOrThisOfType(linkedViews); + + RimView* masterView = linkedViews->mainView(); if (managedView) { @@ -288,9 +291,6 @@ void RimManagedViewConfig::configureOverrides() } } } - - // Propagate overrides in current view to managed views - managedView->managedViewCollection()->configureOverrides(); } } @@ -299,6 +299,8 @@ void RimManagedViewConfig::configureOverrides() //-------------------------------------------------------------------------------------------------- QString RimManagedViewConfig::displayNameForView(RimView* view) { + return RimLinkedViews::displayNameForView(view); +/* CVF_ASSERT(view); RimCase* rimCase = NULL; @@ -307,6 +309,7 @@ QString RimManagedViewConfig::displayNameForView(RimView* view) QString displayName = rimCase->caseUserDescription() + " : " + view->name; return displayName; +*/ } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimProject.cpp b/ApplicationCode/ProjectDataModel/RimProject.cpp index 10cbafd012..16d241b22e 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationCode/ProjectDataModel/RimProject.cpp @@ -40,7 +40,6 @@ #include "RimGeoMechCase.h" #include "RimGeoMechModels.h" #include "RimIdenticalGridCaseGroup.h" -#include "RimManagedViewCollection.h" #include "RimManagedViewConfig.h" #include "RimOilField.h" #include "RimScriptCollection.h" @@ -50,6 +49,7 @@ #include "RimMainPlotCollection.h" #include "RimWellLogPlotCollection.h" #include "RimWellLogPlot.h" +#include "RimLinkedViews.h" #include "RiuMainWindow.h" @@ -92,6 +92,9 @@ RimProject::RimProject(void) CAF_PDM_InitFieldNoDefault(&mainPlotCollection, "MainPlotCollection", "Plots", ":/Default.png", "", ""); mainPlotCollection.uiCapability()->setUiHidden(true); + CAF_PDM_InitFieldNoDefault(&linkedViews, "LinkedViews", "Linked Views", ":/chain.png", "", ""); + linkedViews.uiCapability()->setUiHidden(true); + CAF_PDM_InitFieldNoDefault(&commandObjects, "CommandObjects", "CommandObjects", "", "", ""); //wellPathImport.uiCapability()->setUiHidden(true); @@ -751,6 +754,10 @@ void RimProject::actionsBasedOnSelection(QMenu& contextMenu) { commandIds << "RicDeleteItemFeature"; } + else if (dynamic_cast(uiItem)) + { + commandIds << "RicDeleteItemFeature"; + } else if (dynamic_cast(uiItem)) { commandIds << "RicNewWellLogPlotFeature"; @@ -769,18 +776,6 @@ void RimProject::actionsBasedOnSelection(QMenu& contextMenu) { commandIds << "RicDeleteItemFeature"; } - - if (dynamic_cast(uiItem)) - { - RimManagedViewCollection* viewCollection = dynamic_cast(uiItem); - caf::SelectionManager::instance()->setActiveChildArrayFieldHandle(&viewCollection->viewConfigs); - - commandIds << "PdmListField_AddItem"; - } - else - { - caf::SelectionManager::instance()->setActiveChildArrayFieldHandle(NULL); - } } if (RicToggleItemsFeatureImpl::isToggleCommandsAvailable()) @@ -911,6 +906,28 @@ void RimProject::defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering, QS } } + uiTreeOrdering.add(&linkedViews); + uiTreeOrdering.setForgetRemainingFields(true); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimLinkedViews* RimProject::findLinkedViewsGroupForView(RimView* view) +{ + for (size_t i = 0; i < linkedViews.size(); i++) + { + RimLinkedViews* group = linkedViews[i]; + if (view == group->mainView()) return group; + + for (size_t j = 0; j < group->viewConfigs.size(); j++) + { + RimManagedViewConfig* viewConfig = group->viewConfigs[j]; + if (viewConfig->managedView() == view) return group; + } + } + + return NULL; +} + diff --git a/ApplicationCode/ProjectDataModel/RimProject.h b/ApplicationCode/ProjectDataModel/RimProject.h index 568ac0cf01..e97ab38f1f 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.h +++ b/ApplicationCode/ProjectDataModel/RimProject.h @@ -33,11 +33,12 @@ class RimCase; class RimCommandObject; class RimEclipseCase; class RimIdenticalGridCaseGroup; +class RimLinkedViews; +class RimMainPlotCollection; class RimOilField; class RimScriptCollection; -class RimWellPathImport; -class RimMainPlotCollection; class RimView; +class RimWellPathImport; namespace caf { @@ -64,6 +65,7 @@ public: caf::PdmChildField scriptCollection; caf::PdmChildField wellPathImport; caf::PdmChildField mainPlotCollection; + caf::PdmChildArrayField linkedViews; caf::PdmChildArrayField commandObjects; caf::PdmField treeViewState; caf::PdmField currentModelIndexPath; @@ -89,6 +91,8 @@ public: void actionsBasedOnSelection(QMenu& contextMenu); + RimLinkedViews* findLinkedViewsGroupForView(RimView* view); + protected: // Overridden methods void initScriptDirectories(); diff --git a/ApplicationCode/ProjectDataModel/RimView.cpp b/ApplicationCode/ProjectDataModel/RimView.cpp index 57ded71dbe..ac45a0a483 100644 --- a/ApplicationCode/ProjectDataModel/RimView.cpp +++ b/ApplicationCode/ProjectDataModel/RimView.cpp @@ -5,7 +5,7 @@ #include "Rim3dOverlayInfoConfig.h" #include "RimCellRangeFilterCollection.h" -#include "RimManagedViewCollection.h" +#include "RimLinkedViews.h" #include "RimOilField.h" #include "RimProject.h" #include "RimWellPathCollection.h" @@ -86,10 +86,6 @@ RimView::RimView(void) CAF_PDM_InitField(&m_currentTimeStep, "CurrentTimeStep", 0, "Current Time Step", "", "", ""); m_currentTimeStep.uiCapability()->setUiHidden(true); - CAF_PDM_InitFieldNoDefault(&managedViewCollection, "ManagedViewCollection", "Managed View Collection", "", "", ""); - managedViewCollection = new RimManagedViewCollection; - managedViewCollection.uiCapability()->setUiHidden(true); - CAF_PDM_InitFieldNoDefault(&m_overlayInfoConfig, "OverlayInfoConfig", "Info Box", "", "", ""); m_overlayInfoConfig = new Rim3dOverlayInfoConfig(); m_overlayInfoConfig->setReservoirView(this); @@ -456,7 +452,13 @@ void RimView::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QV { m_viewer->issueBaseClassUpdate(); - managedViewCollection->updateTimeStep(m_currentTimeStep); + RimProject* proj = NULL; + this->firstAnchestorOrThisOfType(proj); + RimLinkedViews* linkedViews = proj->findLinkedViewsGroupForView(this); + if (linkedViews) + { + linkedViews->updateTimeStep(this, m_currentTimeStep); + } } } else if (changedField == &backgroundColor) diff --git a/ApplicationCode/ProjectDataModel/RimView.h b/ApplicationCode/ProjectDataModel/RimView.h index d95c90d6ba..99be6478b4 100644 --- a/ApplicationCode/ProjectDataModel/RimView.h +++ b/ApplicationCode/ProjectDataModel/RimView.h @@ -34,7 +34,6 @@ class Rim3dOverlayInfoConfig; class RimCase; class RimCellRangeFilterCollection; -class RimManagedViewCollection; class RiuViewer; namespace cvf @@ -69,8 +68,6 @@ public: caf::PdmField maximumFrameRate; caf::PdmField hasUserRequestedAnimation; - caf::PdmChildField managedViewCollection; - RimCellRangeFilterCollection* rangeFilterCollection(); const RimCellRangeFilterCollection* rangeFilterCollection() const; void setOverrideRangeFilterCollection(RimCellRangeFilterCollection* rfc); diff --git a/ApplicationCode/UserInterface/RiuViewer.cpp b/ApplicationCode/UserInterface/RiuViewer.cpp index b2e0f1fc63..3b3676ed83 100644 --- a/ApplicationCode/UserInterface/RiuViewer.cpp +++ b/ApplicationCode/UserInterface/RiuViewer.cpp @@ -42,7 +42,6 @@ #include "RimFaultCollection.h" #include "RimGeoMechCase.h" #include "RimGeoMechView.h" -#include "RimManagedViewCollection.h" #include "RimManagedViewConfig.h" #include "RimProject.h" #include "RimReservoirCellResultsStorage.h" @@ -64,6 +63,7 @@ #include "cafNavigationPolicy.h" #include "cafPdmFieldCvfColor.h" #include "cafPdmFieldCvfMat4d.h" +#include "RimLinkedViews.h" using cvf::ManipulatorTrackball; @@ -271,18 +271,18 @@ void RiuViewer::slotEndAnimation() //-------------------------------------------------------------------------------------------------- void RiuViewer::slotSetCurrentFrame(int frameIndex) { - cvf::Rendering* firstRendering = m_renderingSequence->firstRendering(); - CVF_ASSERT(firstRendering); - - if (m_reservoirView) m_reservoirView->setCurrentTimeStep(frameIndex); - - caf::Viewer::slotSetCurrentFrame(frameIndex); + setCurrentFrame(frameIndex); if (m_reservoirView) { - m_reservoirView->managedViewCollection()->updateTimeStep(frameIndex); + RimProject* proj = NULL; + m_reservoirView->firstAnchestorOrThisOfType(proj); + RimLinkedViews* linkedViews = proj->findLinkedViewsGroupForView(m_reservoirView); + if (linkedViews) + { + linkedViews->updateTimeStep(m_reservoirView, frameIndex); + } } - } //-------------------------------------------------------------------------------------------------- @@ -509,29 +509,28 @@ void RiuViewer::update() { viewsToUpdate.push_back(m_reservoirView); - RimView* rimView = m_reservoirView; - - std::vector objects; - rimView->objectsWithReferringPtrFields(objects); - - while (objects.size() > 0) + RimProject* proj = NULL; + m_reservoirView->firstAnchestorOrThisOfType(proj); + RimLinkedViews* linkedViews = proj->findLinkedViewsGroupForView(m_reservoirView); + if (linkedViews) { - RimManagedViewConfig* viewConfig = dynamic_cast(objects[0]); - objects.clear(); - - if (viewConfig->syncCamera()) + RimManagedViewConfig* viewConf = linkedViews->viewConfigForView(m_reservoirView); + + // There is no view config for a master view, but all views for sync must be updated + if (!viewConf || viewConf->syncCamera()) { - viewConfig->firstAnchestorOrThisOfType(rimView); - rimView->objectsWithReferringPtrFields(objects); + std::vector allViews; + linkedViews->allViewsForCameraSync(allViews); + + for (size_t i = 0; i < allViews.size(); i++) + { + if (allViews[i] != m_reservoirView) + { + viewsToUpdate.push_back(allViews[i]); + } + } } } - - if (rimView != m_reservoirView) - { - viewsToUpdate.push_back(rimView); - } - - rimView->managedViewCollection()->allViewsForCameraSync(viewsToUpdate); } // Propagate view matrix to all relevant views @@ -560,3 +559,16 @@ void RiuViewer::issueBaseClassUpdate() caf::OpenGLWidget::update(); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuViewer::setCurrentFrame(int frameIndex) +{ + cvf::Rendering* firstRendering = m_renderingSequence->firstRendering(); + CVF_ASSERT(firstRendering); + + if (m_reservoirView) m_reservoirView->setCurrentTimeStep(frameIndex); + + caf::Viewer::slotSetCurrentFrame(frameIndex); +} diff --git a/ApplicationCode/UserInterface/RiuViewer.h b/ApplicationCode/UserInterface/RiuViewer.h index 64459420cc..af47e76f66 100644 --- a/ApplicationCode/UserInterface/RiuViewer.h +++ b/ApplicationCode/UserInterface/RiuViewer.h @@ -77,6 +77,8 @@ public: virtual void update(); // Override of caf::Viewer::update() void issueBaseClassUpdate(); + void setCurrentFrame(int frameIndex); + public slots: virtual void slotSetCurrentFrame(int frameIndex); virtual void slotEndAnimation();