From d83d9e967ba8440a223a8e4435a478306c943398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Thu, 24 Sep 2015 14:29:13 +0200 Subject: [PATCH] Linked Views: Refactored and cleaned up more. Refactored some features. --- .../Commands/ViewLink/RicLinkViewFeature.cpp | 28 ++--- .../ViewLink/RicLinkVisibleViewsFeature.cpp | 60 +++------ .../ViewLink/RicSetMasterViewFeature.cpp | 43 +------ .../ViewLink/RicShowLinkOptionsFeature.cpp | 28 +---- .../ViewLink/RicUnLinkViewFeature.cpp | 39 ++---- .../ProjectDataModel/RimViewLink.cpp | 13 +- .../ProjectDataModel/RimViewLink.h | 1 - .../ProjectDataModel/RimViewLinker.cpp | 116 ++++++++++-------- .../ProjectDataModel/RimViewLinker.h | 24 ++-- .../RimViewLinkerCollection.cpp | 19 +-- 10 files changed, 131 insertions(+), 240 deletions(-) diff --git a/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp b/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp index 28f0bd1687..71bcd95c70 100644 --- a/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicLinkViewFeature.cpp @@ -42,24 +42,24 @@ bool RicLinkViewFeature::isCommandEnabled() RimView* activeView = RiaApplication::instance()->activeReservoirView(); if (!activeView) return false; - RimProject* proj = RiaApplication::instance()->project(); - if (!proj->findViewLinkerFromView(activeView)) + RimViewController* viewController = activeView->controllingViewLink(); + + if(viewController) { - RimViewLinkerCollection* viewLinkerCollection = proj->viewLinkerCollection(); - if (viewLinkerCollection) + return false; + } + else + { + RimViewLinker* vLinker = RimViewLinker::viewLinkerIfMainView(activeView); + if (!vLinker) { - RimViewLinker* viewLinker = viewLinkerCollection->viewLinker(); - if (viewLinker) - { - if (viewLinker->viewLinks().size() > 0) - { - return true; - } - } + return true; + } + else + { + return false; } } - - return false; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp b/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp index f8ee833994..73e7c6eb40 100644 --- a/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp @@ -125,29 +125,9 @@ void RicLinkVisibleViewsFeature::findNotLinkedVisibleViews(std::vector void RicLinkVisibleViewsFeature::linkViews(std::vector& views) { RimProject* proj = RiaApplication::instance()->project(); - RimViewLinker* viewLinker = NULL; + RimViewLinker* viewLinker = proj->viewLinkerCollection->viewLinker(); - if (proj->viewLinkerCollection->viewLinker()) - { - // We have a view linker, add not already linked views - viewLinker = proj->viewLinkerCollection->viewLinker(); - - for (size_t i = 0; i < views.size(); i++) - { - RimView* rimView = views[i]; - if (rimView == viewLinker->masterView()) continue; - - RimViewController* viewLink = new RimViewController; - viewLink->setManagedView(rimView); - - viewLinker->viewLinks.push_back(viewLink); - - viewLink->initAfterReadRecursively(); - viewLink->updateOptionSensitivity(); - viewLink->updateUiIconFromActiveState(); - } - } - else + if (!viewLinker) { // Create a new view linker @@ -167,35 +147,23 @@ void RicLinkVisibleViewsFeature::linkViews(std::vector& views) viewLinker = new RimViewLinker; proj->viewLinkerCollection()->viewLinker = viewLinker; viewLinker->setMasterView(masterView); - - for (size_t i = 0; i < views.size(); i++) - { - RimView* rimView = views[i]; - if (rimView == masterView) continue; - - RimViewController* viewLink = new RimViewController; - viewLink->setManagedView(rimView); - - viewLinker->viewLinks.push_back(viewLink); - - viewLink->initAfterReadRecursively(); - viewLink->updateOptionSensitivity(); - viewLink->updateUiIconFromActiveState(); - } - - viewLinker->updateUiIcon(); - } - viewLinker->applyAllOperations(); + for (size_t i = 0; i < views.size(); i++) + { + RimView* rimView = views[i]; + if (rimView == viewLinker->masterView()) continue; + + viewLinker->addDependentView(rimView); + } + + viewLinker->updateUiNameAndIcon(); + + viewLinker->updateDependentViews(); proj->viewLinkerCollection.uiCapability()->updateConnectedEditors(); proj->updateConnectedEditors(); - // Set managed view collection to selected and expanded in project tree - caf::PdmUiTreeView* projTreeView = RiuMainWindow::instance()->projectTreeView(); - QModelIndex modIndex = projTreeView->findModelIndex(viewLinker); - projTreeView->treeView()->setCurrentIndex(modIndex); + RiuMainWindow::instance()->projectTreeView()->setExpanded(viewLinker, true); - projTreeView->treeView()->setExpanded(modIndex, true); } diff --git a/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp b/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp index 4a0b0b5729..26c5d7bc2a 100644 --- a/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicSetMasterViewFeature.cpp @@ -70,51 +70,18 @@ void RicSetMasterViewFeature::onActionTriggered(bool isChecked) RimView* previousMasterView = viewLinker->masterView(); - RimViewController* previousViewLink = RimViewLinker::viewLinkForView(activeView); - if (previousViewLink) - { - size_t indexToErase = cvf::UNDEFINED_SIZE_T; - for (size_t i = 0; i < viewLinker->viewLinks.size(); i++) - { - if (viewLinker->viewLinks()[i] == previousViewLink) - { - indexToErase = i; - } - } - - if (indexToErase != cvf::UNDEFINED_SIZE_T) - { - viewLinker->viewLinks().erase(indexToErase); - } - - delete previousViewLink; - } - - viewLinker->removeOverrides(); viewLinker->setMasterView(activeView); + viewLinker->addDependentView(previousMasterView); + + viewLinker->updateDependentViews(); - if (previousMasterView) - { - RimViewController* viewLink = new RimViewController; - viewLink->setManagedView(previousMasterView); - - viewLinker->viewLinks.push_back(viewLink); - - viewLink->initAfterReadRecursively(); - viewLink->updateOptionSensitivity(); - viewLink->updateUiIconFromActiveState(); - } - - viewLinker->applyAllOperations(); proj->viewLinkerCollection.uiCapability()->updateConnectedEditors(); proj->updateConnectedEditors(); // Set managed view collection to selected and expanded in project tree caf::PdmUiTreeView* projTreeView = RiuMainWindow::instance()->projectTreeView(); - QModelIndex modIndex = projTreeView->findModelIndex(viewLinker); - projTreeView->treeView()->setCurrentIndex(modIndex); - - projTreeView->treeView()->setExpanded(modIndex, true); + projTreeView->selectAsCurrentItem(viewLinker); + projTreeView->setExpanded(viewLinker, true); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Commands/ViewLink/RicShowLinkOptionsFeature.cpp b/ApplicationCode/Commands/ViewLink/RicShowLinkOptionsFeature.cpp index c408968375..328fd36a9a 100644 --- a/ApplicationCode/Commands/ViewLink/RicShowLinkOptionsFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicShowLinkOptionsFeature.cpp @@ -42,8 +42,9 @@ bool RicShowLinkOptionsFeature::isCommandEnabled() RimView* activeView = RiaApplication::instance()->activeReservoirView(); if (!activeView) return false; - RimProject* proj = RiaApplication::instance()->project(); - if (proj->findViewLinkerFromView(activeView)) + RimViewController* viewController = activeView->controllingViewLink(); + + if (viewController) { return true; } @@ -59,28 +60,9 @@ void RicShowLinkOptionsFeature::onActionTriggered(bool isChecked) RimView* activeView = RiaApplication::instance()->activeReservoirView(); if (!activeView) return; - RimProject* proj = RiaApplication::instance()->project(); - RimViewLinker* viewLinker = proj->findViewLinkerFromView(activeView); - if (viewLinker) - { - if (viewLinker->masterView() == activeView) - { - RiuMainWindow::instance()->projectTreeView()->selectAsCurrentItem(viewLinker); + RimViewController* viewController = activeView->controllingViewLink(); - return; - } - - for (size_t i = 0; i < viewLinker->viewLinks.size(); i++) - { - RimViewController* viewLink = viewLinker->viewLinks[i]; - if (viewLink->managedView() == activeView) - { - RiuMainWindow::instance()->projectTreeView()->selectAsCurrentItem(viewLink); - - return; - } - } - } + RiuMainWindow::instance()->projectTreeView()->selectAsCurrentItem(viewController); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp b/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp index aee829ac3c..0cb182af1f 100644 --- a/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp @@ -39,20 +39,16 @@ bool RicUnLinkViewFeature::isCommandEnabled() { RimView* activeView = RiaApplication::instance()->activeReservoirView(); if (!activeView) return false; - - RimProject* proj = RiaApplication::instance()->project(); - RimViewLinker* viewLinker = proj->findViewLinkerFromView(activeView); - if (viewLinker) + + RimViewController* viewController = activeView->controllingViewLink(); + + if (viewController) { - if (viewLinker->masterView() == activeView) - { - return false; - } - return true; } return false; + } //-------------------------------------------------------------------------------------------------- @@ -62,27 +58,16 @@ void RicUnLinkViewFeature::onActionTriggered(bool isChecked) { RimView* activeView = RiaApplication::instance()->activeReservoirView(); if (!activeView) return; + + RimViewController* viewController = activeView->controllingViewLink(); + caf::SelectionManager::instance()->setSelectedItem(viewController); - RimProject* proj = RiaApplication::instance()->project(); - RimViewLinker* viewLinker = proj->findViewLinkerFromView(activeView); - if (viewLinker) + caf::CmdFeature* feature = caf::CmdFeatureManager::instance()->getCommandFeature("RicDeleteItemFeature"); + if (feature) { - for (size_t i = 0; i < viewLinker->viewLinks.size(); i++) - { - RimViewController* viewLink = viewLinker->viewLinks[i]; - if (viewLink->managedView() == activeView) - { - caf::SelectionManager::instance()->setSelectedItem(viewLink); + feature->action()->trigger(); - caf::CmdFeature* feature = caf::CmdFeatureManager::instance()->getCommandFeature("RicDeleteItemFeature"); - if (feature) - { - feature->action()->trigger(); - - return; - } - } - } + return; } } diff --git a/ApplicationCode/ProjectDataModel/RimViewLink.cpp b/ApplicationCode/ProjectDataModel/RimViewLink.cpp index 7cc7beda31..e35d126672 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLink.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewLink.cpp @@ -147,7 +147,7 @@ void RimViewController::fieldChangedByUi(const caf::PdmFieldHandle* changedField { if (changedField == &isActive) { - updateUiIconFromActiveState(); + updateDisplayNameAndIcon(); if (syncCamera()) doSyncCamera(); if (syncTimeStep()) doSyncTimeStep(); if (syncCellResult()) doSyncCellResult(); @@ -228,7 +228,6 @@ void RimViewController::fieldChangedByUi(const caf::PdmFieldHandle* changedField updateOptionSensitivity(); updateDisplayNameAndIcon(); - updateUiIconFromActiveState(); name.uiCapability()->updateConnectedEditors(); } @@ -246,7 +245,6 @@ void RimViewController::initAfterRead() { configureOverrides(); updateDisplayNameAndIcon(); - updateUiIconFromActiveState(); updateOptionSensitivity(); } @@ -458,20 +456,13 @@ void RimViewController::removeOverrides() } } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimViewController::updateUiIconFromActiveState() -{ - RimViewLinker::applyIconEnabledState(this, m_originalIcon, !isActive()); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimViewController::updateDisplayNameAndIcon() { RimViewLinker::findNameAndIconFromView(&name.v(), &m_originalIcon, managedView()); + RimViewLinker::applyIconEnabledState(this, m_originalIcon, !isActive()); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimViewLink.h b/ApplicationCode/ProjectDataModel/RimViewLink.h index 73e11bf24b..4b76baa5c2 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLink.h +++ b/ApplicationCode/ProjectDataModel/RimViewLink.h @@ -68,7 +68,6 @@ public: void updateOptionSensitivity(); void removeOverrides(); - void updateUiIconFromActiveState(); void updateDisplayNameAndIcon(); protected: diff --git a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp index 9f996a2ae4..d37f6bdd95 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp @@ -188,37 +188,18 @@ void RimViewLinker::updateCellResult() } } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimViewLinker::updateRangeFilters() -{ - if (!isActive()) return; - - this->scheduleGeometryRegenForDepViews(RANGE_FILTERED); - this->scheduleGeometryRegenForDepViews(RANGE_FILTERED_INACTIVE); - this->scheduleCreateDisplayModelAndRedrawForDependentViews(); -} //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewLinker::updatePropertyFilters() +void RimViewLinker::updateOverrides() { - if (!isActive()) return; - this->scheduleGeometryRegenForDepViews(PROPERTY_FILTERED); - this->scheduleCreateDisplayModelAndRedrawForDependentViews(); -} + bool isViewlinkerActive = this->isActive(); -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimViewLinker::configureOverrides() -{ for (size_t i = 0; i < viewLinks.size(); i++) { RimViewController* viewLink = viewLinks[i]; - if (viewLink->isActive) + if (isViewlinkerActive && viewLink->isActive) { viewLink->configureOverrides(); } @@ -229,6 +210,20 @@ void RimViewLinker::configureOverrides() } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimViewLinker::removeOverrides() +{ + for (size_t i = 0; i < viewLinks.size(); i++) + { + if (viewLinks[i]->managedView()) + { + viewLinks[i]->removeOverrides(); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -253,14 +248,13 @@ void RimViewLinker::allViewsForCameraSync(RimView* source, std::vector //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewLinker::applyAllOperations() +void RimViewLinker::updateDependentViews() { - configureOverrides(); + updateOverrides(); updateCellResult(); updateTimeStep(m_masterView, m_masterView->currentTimeStep()); - updateRangeFilters(); - updatePropertyFilters(); + updateScaleZ(m_masterView, m_masterView->scaleZ()); updateCamera(m_masterView); } @@ -288,10 +282,20 @@ QString RimViewLinker::displayNameForView(RimView* view) //-------------------------------------------------------------------------------------------------- void RimViewLinker::setMasterView(RimView* view) { + RimViewController* previousViewLink = RimViewLinker::viewLinkForView(view); + + // Remove the view as dependent view + if (previousViewLink) + { + this->viewLinks.removeChildObject(previousViewLink); + delete previousViewLink; + } + + this->removeOverrides(); + m_masterView = view; - setNameAndIcon(); - updateUiIcon(); + updateUiNameAndIcon(); } //-------------------------------------------------------------------------------------------------- @@ -323,8 +327,7 @@ void RimViewLinker::allViews(std::vector& views) //-------------------------------------------------------------------------------------------------- void RimViewLinker::initAfterRead() { - setNameAndIcon(); - updateUiIcon(); + updateUiNameAndIcon(); } //-------------------------------------------------------------------------------------------------- @@ -384,20 +387,14 @@ void RimViewLinker::applyIconEnabledState(caf::PdmObject* obj, const QIcon& icon obj->setUiIcon(newIcon); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimViewLinker::updateUiIcon() -{ - RimViewLinker::applyIconEnabledState(this, m_originalIcon, false); -} //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewLinker::setNameAndIcon() +void RimViewLinker::updateUiNameAndIcon() { RimViewLinker::findNameAndIconFromView(&m_name.v(), &m_originalIcon, m_masterView); + RimViewLinker::applyIconEnabledState(this, m_originalIcon, false); } //-------------------------------------------------------------------------------------------------- @@ -448,19 +445,6 @@ void RimViewLinker::scheduleCreateDisplayModelAndRedrawForDependentViews() } } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimViewLinker::removeOverrides() -{ - for (size_t i = 0; i < viewLinks.size(); i++) - { - if (viewLinks[i]->managedView()) - { - viewLinks[i]->removeOverrides(); - } - } -} //-------------------------------------------------------------------------------------------------- /// @@ -559,7 +543,7 @@ void RimViewLinker::updateCamera(RimView* sourceView) if (!isActive()) return; - RimViewController* viewLink = RimViewLinker::viewLinkForView(sourceView); + RimViewController* viewLink = sourceView->controllingViewLink(); if (viewLink) { if ((!viewLink->isActive() || !viewLink->syncCamera())) @@ -679,3 +663,31 @@ bool RimViewLinker::isBoundingBoxesOverlappingOrClose(const cvf::BoundingBox& so return false; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimViewLinker::addDependentView(RimView* view) +{ + CVF_ASSERT(view && view != m_masterView); + + RimViewController* viewLink = new RimViewController; + this->viewLinks.push_back(viewLink); + + viewLink->setManagedView(view); + + viewLink->initAfterReadRecursively(); + viewLink->updateOptionSensitivity(); + viewLink->updateDisplayNameAndIcon(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimViewLinker::addViewControllers(caf::PdmUiTreeOrdering& uiTreeOrdering) +{ + for (size_t j = 0; j < viewLinks.size(); j++) + { + uiTreeOrdering.add(viewLinks()[j]); + } +} + diff --git a/ApplicationCode/ProjectDataModel/RimViewLinker.h b/ApplicationCode/ProjectDataModel/RimViewLinker.h index 20254ea349..465204924c 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLinker.h +++ b/ApplicationCode/ProjectDataModel/RimViewLinker.h @@ -52,26 +52,23 @@ public: void setMasterView(RimView* view); RimView* masterView(); - caf::PdmChildArrayField viewLinks; - - void applyAllOperations(); - void removeOverrides(); + void addDependentView(RimView* view); + void updateDependentViews(); void updateCamera(RimView* sourceView); void updateTimeStep(RimView* sourceView, int timeStep); void updateScaleZ(RimView* sourceView, double scaleZ); void updateCellResult(); - void updateRangeFilters(); - void updatePropertyFilters(); void scheduleGeometryRegenForDepViews(RivCellSetEnum geometryType); void scheduleCreateDisplayModelAndRedrawForDependentViews(); void allViews(std::vector& views); - void updateUiIcon(); - void setNameAndIcon(); + void updateUiNameAndIcon(); + + void addViewControllers(caf::PdmUiTreeOrdering& uiTreeOrdering); static void applyIconEnabledState(caf::PdmObject* obj, const QIcon& icon, bool disable); static void findNameAndIconFromView(QString* name, QIcon* icon, RimView* view); @@ -90,13 +87,16 @@ protected: private: void allViewsForCameraSync(RimView* source, std::vector& views); - void configureOverrides(); + + void updateOverrides(); + void removeOverrides(); bool isActive(); static bool isBoundingBoxesOverlappingOrClose(const cvf::BoundingBox& sourceBB, const cvf::BoundingBox& destBB); private: - caf::PdmPtrField m_masterView; - caf::PdmField m_name; - QIcon m_originalIcon; + caf::PdmChildArrayField viewLinks; + caf::PdmPtrField m_masterView; + caf::PdmField m_name; + QIcon m_originalIcon; }; diff --git a/ApplicationCode/ProjectDataModel/RimViewLinkerCollection.cpp b/ApplicationCode/ProjectDataModel/RimViewLinkerCollection.cpp index ff1fab46db..2ec37ad045 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLinkerCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewLinkerCollection.cpp @@ -59,10 +59,7 @@ void RimViewLinkerCollection::defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTre if (childObject) { uiTreeOrdering.add(childObject); - for (size_t j = 0; j < childObject->viewLinks.size(); j++) - { - uiTreeOrdering.add(childObject->viewLinks()[j]); - } + childObject->addViewControllers(uiTreeOrdering); } uiTreeOrdering.setForgetRemainingFields(true); @@ -75,19 +72,9 @@ void RimViewLinkerCollection::fieldChangedByUi(const caf::PdmFieldHandle* change { if (&isActive == changedField) { - if (isActive) + if (viewLinker()) { - if (viewLinker()) - { - viewLinker()->applyAllOperations(); - } - } - else - { - if (viewLinker()) - { - viewLinker()->removeOverrides(); - } + viewLinker()->updateDependentViews(); } }