From 10388ea3dc4658384f339de5ab83a087d7ee75c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Wed, 20 May 2015 12:33:06 +0200 Subject: [PATCH] Rewrote Add and Delete View for GeoMech See issue #292 --- .../ProjectDataModel/RimEclipseCase.cpp | 24 --- .../ProjectDataModel/RimEclipseCase.h | 1 - .../ProjectDataModel/RimUiTreeModelPdm.cpp | 148 ++++++------------ .../ProjectDataModel/RimUiTreeModelPdm.h | 13 +- .../ProjectDataModel/RimUiTreeView.cpp | 57 +++++-- .../ProjectDataModel/RimUiTreeView.h | 3 + 6 files changed, 97 insertions(+), 149 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp b/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp index 43405024fc..d631fd7ddb 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp @@ -149,30 +149,6 @@ RimReservoirView* RimEclipseCase::createAndAddReservoirView() return riv; } -//-------------------------------------------------------------------------------------------------- -/// TODO: Move this functionality to PdmPointersField -//-------------------------------------------------------------------------------------------------- -void RimEclipseCase::removeReservoirView(RimReservoirView* reservoirView) -{ - std::vector indices; - - size_t i; - for (i = 0; i < reservoirViews().size(); i++) - { - if (reservoirViews()[i] == reservoirView) - { - indices.push_back(i); - } - } - - // NB! Make sure the ordering goes from large to low index - while (!indices.empty()) - { - reservoirViews().erase(indices.back()); - indices.pop_back(); - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimEclipseCase.h b/ApplicationCode/ProjectDataModel/RimEclipseCase.h index 0b0e7e029e..0c854de6c9 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseCase.h +++ b/ApplicationCode/ProjectDataModel/RimEclipseCase.h @@ -68,7 +68,6 @@ public: RimReservoirCellResultsStorage* results(RifReaderInterface::PorosityModelResultType porosityModel); RimReservoirView* createAndAddReservoirView(); - void removeReservoirView(RimReservoirView* reservoirView); void removeResult(const QString& resultName); diff --git a/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp b/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp index b9264234cc..03aac5011b 100644 --- a/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp +++ b/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp @@ -41,11 +41,13 @@ #include "RimUiTreeView.h" #include "RimWellCollection.h" #include "RimWellPathCollection.h" +#include "RimGeoMechView.h" #include "cvfAssert.h" #include #include +#include "RimGeoMechCase.h" //-------------------------------------------------------------------------------------------------- @@ -60,60 +62,6 @@ RimUiTreeModelPdm::RimUiTreeModelPdm(QObject* parent) connect(m_scriptChangeDetector, SIGNAL(fileChanged(QString)), this, SLOT(slotRefreshScriptTree(QString))); } -//-------------------------------------------------------------------------------------------------- -/// TO BE DELETED -//-------------------------------------------------------------------------------------------------- -bool RimUiTreeModelPdm::insertRows_special(int position, int rows, const QModelIndex &parent /*= QModelIndex()*/) -{ - caf::PdmUiTreeItem* parentItem = getTreeItemFromIndex(parent); - - bool canCreateChildren = false; - QModelIndex parentIndex = parent; - - if (dynamic_cast(parentItem->dataObject().p()) || - dynamic_cast(parentItem->dataObject().p())) - { - canCreateChildren = true; - } - else if (dynamic_cast(parentItem->dataObject().p())) - { - parentItem = parentItem->parent(); - parentIndex = parent.parent(); - - canCreateChildren = true; - } - - if (canCreateChildren) - { - beginInsertRows(parent, position, position + rows - 1); - - int i; - for (i = 0; i < rows; i++) - { - if (dynamic_cast(parentItem->dataObject().p())) - { - RimCellRangeFilterCollection* rangeFilterCollection = dynamic_cast(parentItem->dataObject().p()); - - RimCellRangeFilter* rangeFilter = rangeFilterCollection->createAndAppendRangeFilter(); - - caf::PdmUiTreeItem* childItem = new caf::PdmUiTreeItem(parentItem, position + i, rangeFilter); - } - else if (dynamic_cast(parentItem->dataObject().p())) - { - RimCellPropertyFilterCollection* propertyFilterCollection = dynamic_cast(parentItem->dataObject().p()); - - RimCellPropertyFilter* propertyFilter = propertyFilterCollection->createAndAppendPropertyFilter(); - - caf::PdmUiTreeItem* childItem = new caf::PdmUiTreeItem(parentItem, position + i, propertyFilter); - } - - } - endInsertRows(); - } - - return canCreateChildren; -} - //-------------------------------------------------------------------------------------------------- @@ -203,26 +151,26 @@ bool RimUiTreeModelPdm::deleteRangeFilter(const QModelIndex& itemIndex) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RimUiTreeModelPdm::deleteReservoirView(const QModelIndex& itemIndex) +void RimUiTreeModelPdm::deleteReservoirViews(const std::vector& treeSelection) { - CVF_ASSERT(itemIndex.isValid()); + std::set ownerCases; - caf::PdmUiTreeItem* uiItem = getTreeItemFromIndex(itemIndex); - CVF_ASSERT(uiItem); + for (size_t sIdx = 0; sIdx < treeSelection.size(); ++sIdx) + { + RimView* reservoirView = dynamic_cast(treeSelection[sIdx]); + ownerCases.insert(reservoirView->ownerCase()); - RimReservoirView* reservoirView = dynamic_cast(uiItem->dataObject().p()); - CVF_ASSERT(reservoirView); + reservoirView->removeFromParentFields(); + delete reservoirView; + + } - // Remove Ui items pointing at the pdm object to delete - removeRows_special(itemIndex.row(), 1, itemIndex.parent()); // To be deleted + for (std::set::iterator it = ownerCases.begin(); it != ownerCases.end(); ++it) + { + updateUiSubTree(*it); + } - reservoirView->eclipseCase()->removeReservoirView(reservoirView); - delete reservoirView; - - // updateUiSubTree(reservoirView->eclipseCase()); // To be enabled clearClipboard(); - - return true; } //-------------------------------------------------------------------------------------------------- @@ -378,51 +326,43 @@ RimCellRangeFilter* RimUiTreeModelPdm::addRangeFilter(const QModelIndex& itemInd //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimReservoirView* RimUiTreeModelPdm::addReservoirView(const QModelIndex& itemIndex, QModelIndex& insertedModelIndex) +RimView* RimUiTreeModelPdm::addReservoirView(const std::vector& treeSelection) { - caf::PdmUiTreeItem* currentItem = getTreeItemFromIndex(itemIndex); - if (!currentItem) return NULL; + if (!treeSelection.size() || treeSelection[0] == NULL) return NULL; - caf::PdmUiTreeItem* collectionItem = NULL; + caf::PdmUiItem* currentItem = treeSelection[0]; - bool itemIndexIsCollection = false; - QModelIndex collectionIndex; - int position = 0; - if (dynamic_cast(currentItem->dataObject().p())) + // Establish type of selected object + RimEclipseCase* eclipseCase = dynamic_cast(currentItem); + RimGeoMechCase* geomCase = dynamic_cast(currentItem); + RimGeoMechView* geoMechView = dynamic_cast(currentItem); + RimReservoirView* reservoirView = dynamic_cast(currentItem); + + // Find case to insert into + + if (geoMechView) geomCase = geoMechView->geoMechCase(); + if (reservoirView) eclipseCase = reservoirView->eclipseCase(); + + RimView* insertedView = NULL; + + if (eclipseCase) { - collectionItem = currentItem->parent(); - collectionIndex = itemIndex.parent(); - position = itemIndex.row(); + insertedView = eclipseCase->createAndAddReservoirView(); } - else if (dynamic_cast(currentItem->dataObject().p())) + else if (geomCase) { - collectionItem = currentItem; - collectionIndex = itemIndex; - position = collectionItem->childCount(); + insertedView = geomCase->createAndAddReservoirView(); } - if (collectionItem) - { - RimEclipseCase* rimReservoir = dynamic_cast(collectionItem->dataObject().p()); - RimReservoirView* insertedView = rimReservoir->createAndAddReservoirView(); + // Must be run before buildViewItems, as wells are created in this function + + insertedView->loadDataAndUpdate(); - // Must be run before buildViewItems, as wells are created in this function - insertedView->loadDataAndUpdate(); - - beginInsertRows(collectionIndex, position, position); - - // NOTE: -1 as second argument indicates append - caf::PdmUiTreeItem* childItem = caf::UiTreeItemBuilderPdm::buildViewItems(collectionItem, position, insertedView); - - endInsertRows(); - - insertedModelIndex = index(position, 0, collectionIndex); - - return insertedView; - } - - return NULL; -} + if (eclipseCase ) this->updateUiSubTree(eclipseCase); + if (geomCase ) this->updateUiSubTree(geomCase); + + return insertedView; +} //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.h b/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.h index 2b4903a95e..28266f8a6a 100644 --- a/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.h +++ b/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.h @@ -35,6 +35,8 @@ class RimInputProperty; class RimStatisticsCase; class RimIdenticalGridCaseGroup; +class RimView; + //================================================================================================== /// @@ -47,21 +49,20 @@ class RimUiTreeModelPdm : public caf::UiTreeModelPdm public: RimUiTreeModelPdm(QObject* parent); - - // TO BE DELETED, NOT USED - virtual bool insertRows_special(int position, int rows, const QModelIndex &parent = QModelIndex()); - // Special edit methods bool deleteRangeFilter(const QModelIndex& itemIndex); bool deletePropertyFilter(const QModelIndex& itemIndex); - bool deleteReservoirView(const QModelIndex& itemIndex); + void deleteInputProperty(const QModelIndex& itemIndex); void deleteReservoir(RimEclipseCase* reservoir); void deleteAllWellPaths(const QModelIndex& itemIndex); RimCellPropertyFilter* addPropertyFilter(const QModelIndex& itemIndex, QModelIndex& insertedModelIndex); RimCellRangeFilter* addRangeFilter(const QModelIndex& itemIndex, QModelIndex& insertedModelIndex); - RimReservoirView* addReservoirView(const QModelIndex& itemIndex, QModelIndex& insertedModelIndex); + + RimView* addReservoirView(const std::vector& treeSelection); + void deleteReservoirViews(const std::vector& treeSelection); + void addInputProperty(const QModelIndex& itemIndex, const QStringList& fileNames); void addToParentAndBuildUiItems(caf::PdmUiTreeItem* parentTreeItem, int position, caf::PdmObject* pdmObject); diff --git a/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp b/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp index 14f1c68407..1926e0c40e 100644 --- a/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp +++ b/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp @@ -68,6 +68,8 @@ #include "RimAnalysisModels.h" #include "RimInputProperty.h" #include "RigSingleWellResultsData.h" +#include "RimGeoMechView.h" +#include "RimGeoMechCase.h" //-------------------------------------------------------------------------------------------------- @@ -114,8 +116,14 @@ void RimUiTreeView::contextMenuEvent(QContextMenuEvent* event) { QMenu menu; - // Range filters - if (dynamic_cast(uiItem->dataObject().p())) + if (dynamic_cast(uiItem->dataObject().p())) + { + menu.addAction(QString("New View"), this, SLOT(slotAddView())); + //menu.addAction(QString("Copy View"), this, SLOT(slotCopyPdmObjectToClipboard())); + //menu.addAction(m_pasteAction); + menu.addAction(QString("Delete"), this, SLOT(slotDeleteView())); + } + else if (dynamic_cast(uiItem->dataObject().p())) { menu.addAction(QString("New View"), this, SLOT(slotAddView())); menu.addAction(QString("Copy View"), this, SLOT(slotCopyPdmObjectToClipboard())); @@ -193,6 +201,10 @@ void RimUiTreeView::contextMenuEvent(QContextMenuEvent* event) menu.addAction(QString("Compute"), this, SLOT(slotComputeStatistics())); menu.addAction(QString("Close"), this, SLOT(slotCloseCase())); } + else if (dynamic_cast(uiItem->dataObject().p())) + { + menu.addAction(QString("New View"), this, SLOT(slotAddView())); + } else if (dynamic_cast(uiItem->dataObject().p())) { menu.addAction(QString("Copy"), this, SLOT(slotCopyPdmObjectToClipboard())); @@ -628,13 +640,13 @@ void RimUiTreeView::slotExecuteScriptForSelectedCases() //-------------------------------------------------------------------------------------------------- void RimUiTreeView::slotAddView() { - QModelIndex index = currentIndex(); RimUiTreeModelPdm* myModel = dynamic_cast(model()); - caf::PdmUiTreeItem* uiItem = myModel->getTreeItemFromIndex(currentIndex()); - - QModelIndex insertedIndex; - myModel->addReservoirView(index, insertedIndex); - + std::vector selection; + this->selectedUiItems(selection); + + RimView* newView = myModel->addReservoirView(selection); + QModelIndex insertedIndex = myModel->getModelIndexFromPdmObject(newView); + // Expand parent collection and inserted view item setExpandedUpToRoot(insertedIndex); @@ -647,13 +659,12 @@ void RimUiTreeView::slotAddView() void RimUiTreeView::slotDeleteView() { RimUiTreeModelPdm* myModel = dynamic_cast(model()); - if (myModel) - { - myModel->deleteReservoirView(currentIndex()); + std::vector selection; + this->selectedUiItems(selection); + myModel->deleteReservoirViews(selection); - RiaApplication* app = RiaApplication::instance(); - app->setActiveReservoirView(NULL); - } + RiaApplication* app = RiaApplication::instance(); + app->setActiveReservoirView(NULL); } //-------------------------------------------------------------------------------------------------- @@ -1587,3 +1598,21 @@ void RimUiTreeView::slotDeleteAllWellPaths() } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimUiTreeView::selectedUiItems(std::vector& objects) +{ + RimUiTreeModelPdm* myModel = dynamic_cast(model()); + QModelIndexList idxList = this->selectionModel()->selectedIndexes(); + + for (int i = 0; i < idxList.size(); i++) + { + caf::PdmUiTreeItem* uiItem = myModel->getTreeItemFromIndex(idxList[i]); + if (uiItem) + { + caf::PdmUiItem* item = uiItem->dataObject(); + objects.push_back(item); + } + } +} diff --git a/ApplicationCode/ProjectDataModel/RimUiTreeView.h b/ApplicationCode/ProjectDataModel/RimUiTreeView.h index 204e961d26..bd01187e29 100644 --- a/ApplicationCode/ProjectDataModel/RimUiTreeView.h +++ b/ApplicationCode/ProjectDataModel/RimUiTreeView.h @@ -44,6 +44,9 @@ public: virtual void setModel(QAbstractItemModel* model); + void selectedUiItems(std::vector& objects); + + void applyTreeViewStateFromString(const QString& treeViewState); void storeTreeViewStateToString(QString& treeViewState);