diff --git a/ApplicationCode/Commands/RicLinkVisibleViewsFeature.cpp b/ApplicationCode/Commands/RicLinkVisibleViewsFeature.cpp index f0b9029fe1..2fb6d5bd51 100644 --- a/ApplicationCode/Commands/RicLinkVisibleViewsFeature.cpp +++ b/ApplicationCode/Commands/RicLinkVisibleViewsFeature.cpp @@ -21,6 +21,8 @@ #include "RiaApplication.h" +#include "RicLinkVisibleViewsFeatureUi.h" + #include "RimLinkedViews.h" #include "RimManagedViewConfig.h" #include "RimProject.h" @@ -28,12 +30,13 @@ #include "RiuMainWindow.h" +#include "cafPdmUiPropertyViewDialog.h" #include "cafPdmUiTreeView.h" #include #include -#include "RicLinkVisibleViewsFeatureUi.h" -#include "cafPdmUiPropertyViewDialog.h" +#include + CAF_CMD_SOURCE_INIT(RicLinkVisibleViewsFeature, "RicLinkVisibleViewsFeature"); @@ -57,14 +60,20 @@ bool RicLinkVisibleViewsFeature::isCommandEnabled() void RicLinkVisibleViewsFeature::onActionTriggered(bool isChecked) { RimProject* proj = RiaApplication::instance()->project(); + std::vector views; - proj->allVisibleViews(views); - CVF_ASSERT(views.size() > 1); + findNotLinkedVisibleViews(views); + if (views.size() < 2) + { + QMessageBox::warning(RiuMainWindow::instance(), "Link Visible Views", "Less than two views available for linking. Please open at least two not linked views before creating a new link group."); + + return; + } RicLinkVisibleViewsFeatureUi featureUi; featureUi.setViews(views); - caf::PdmUiPropertyViewDialog propertyDialog(NULL, &featureUi, "New View Group", ""); + caf::PdmUiPropertyViewDialog propertyDialog(NULL, &featureUi, "Link Visible Views", ""); propertyDialog.setWindowIcon(QIcon(":/chain.png")); if (propertyDialog.exec() != QDialog::Accepted) return; @@ -109,3 +118,54 @@ void RicLinkVisibleViewsFeature::setupActionLook(QAction* actionToSetup) actionToSetup->setIcon(QIcon(":/chain.png")); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicLinkVisibleViewsFeature::allLinkedViews(std::vector& views) +{ + RimProject* proj = RiaApplication::instance()->project(); + for (size_t i = 0; i < proj->linkedViews().size(); i++) + { + RimLinkedViews* linkedViews = proj->linkedViews()[i]; + linkedViews->allViews(views); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicLinkVisibleViewsFeature::findNotLinkedVisibleViews(std::vector &views) +{ + RimProject* proj = RiaApplication::instance()->project(); + + std::vector alreadyLinkedViews; + allLinkedViews(alreadyLinkedViews); + + std::vector visibleViews; + proj->allVisibleViews(visibleViews); + + bool anyAlreadyLinkedViews = false; + for (size_t i = 0; i < visibleViews.size(); i++) + { + bool isLinked = false; + for (size_t j = 0; j < alreadyLinkedViews.size(); j++) + { + if (visibleViews[i] == alreadyLinkedViews[j]) + { + anyAlreadyLinkedViews = true; + isLinked = true; + } + } + + if (!isLinked) + { + views.push_back(visibleViews[i]); + } + } + + if (anyAlreadyLinkedViews) + { + QMessageBox::warning(RiuMainWindow::instance(), "Link Visible Views", "Detected one or more visible view(s) already part of a Linked View Group.\nThese views were removed from the list of visible views."); + } +} + diff --git a/ApplicationCode/Commands/RicLinkVisibleViewsFeature.h b/ApplicationCode/Commands/RicLinkVisibleViewsFeature.h index 15d9ec8da4..fada41eb54 100644 --- a/ApplicationCode/Commands/RicLinkVisibleViewsFeature.h +++ b/ApplicationCode/Commands/RicLinkVisibleViewsFeature.h @@ -21,6 +21,10 @@ #include "cafCmdFeature.h" +#include + +class RimView; + //================================================================================================== /// //================================================================================================== @@ -32,6 +36,11 @@ protected: // Overrides virtual bool isCommandEnabled(); virtual void onActionTriggered( bool isChecked ); - virtual void setupActionLook( QAction* actionToSetup ); + + virtual void setupActionLook(QAction* actionToSetup); + +private: + void findNotLinkedVisibleViews(std::vector &views); + void allLinkedViews(std::vector& views); }; diff --git a/ApplicationCode/Commands/RicLinkVisibleViewsFeatureUi.cpp b/ApplicationCode/Commands/RicLinkVisibleViewsFeatureUi.cpp index 5d7ee3d3a8..1d655e735f 100644 --- a/ApplicationCode/Commands/RicLinkVisibleViewsFeatureUi.cpp +++ b/ApplicationCode/Commands/RicLinkVisibleViewsFeatureUi.cpp @@ -24,6 +24,7 @@ #include "RimView.h" #include "RimLinkedViews.h" +#include "cafPdmUiItem.h" CAF_PDM_SOURCE_INIT(RicLinkVisibleViewsFeatureUi, "RicLinkVisibleViewsFeatureUi"); @@ -34,8 +35,9 @@ RicLinkVisibleViewsFeatureUi::RicLinkVisibleViewsFeatureUi(void) { CAF_PDM_InitObject("Link Visible Views Feature UI", ":/chain.png", "", ""); - CAF_PDM_InitFieldNoDefault(&m_allViewsAsText, "VisibleViews", "Visible Views", "", "", ""); + CAF_PDM_InitFieldNoDefault(&m_allViewsAsText, "VisibleViews", "Visible Views (Case name : View Name)", "", "", ""); m_allViewsAsText.uiCapability()->setUiEditorTypeName(caf::PdmUiTextEditor::uiEditorTypeName()); + m_allViewsAsText.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::TOP); CAF_PDM_InitFieldNoDefault(&m_masterView, "MasterView", "Master View", "", "", ""); } diff --git a/ApplicationCode/ProjectDataModel/RimLinkedViews.cpp b/ApplicationCode/ProjectDataModel/RimLinkedViews.cpp index b37c581230..7380c4c170 100644 --- a/ApplicationCode/ProjectDataModel/RimLinkedViews.cpp +++ b/ApplicationCode/ProjectDataModel/RimLinkedViews.cpp @@ -354,3 +354,19 @@ RimView* RimLinkedViews::mainView() return m_mainView; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimLinkedViews::allViews(std::vector& views) +{ + views.push_back(m_mainView()); + + for (size_t i = 0; i < viewConfigs.size(); i++) + { + if (viewConfigs[i]->managedView()) + { + views.push_back(viewConfigs[i]->managedView()); + } + } +} + diff --git a/ApplicationCode/ProjectDataModel/RimLinkedViews.h b/ApplicationCode/ProjectDataModel/RimLinkedViews.h index bb0fdec680..1810fd47a1 100644 --- a/ApplicationCode/ProjectDataModel/RimLinkedViews.h +++ b/ApplicationCode/ProjectDataModel/RimLinkedViews.h @@ -58,6 +58,7 @@ public: void configureOverrides(); void allViewsForCameraSync(std::vector& views); + void allViews(std::vector& views); public: static QString displayNameForView(RimView* view);