From c599fd39f8bbbbe9f7117e3da7858ab0672bdd25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Thu, 20 Aug 2015 10:24:03 +0200 Subject: [PATCH] (#372) Drag Drop Move implemented. User question on closing/moving a statistics source case --- .../Commands/RicCloseCaseFeature.cpp | 112 ++++++++++++++++-- .../Commands/RicCloseCaseFeature.h | 12 +- .../RimIdenticalGridCaseGroup.cpp | 21 +++- .../ProjectDataModel/RimUiTreeModelPdm.cpp | 3 + .../ProjectDataModel/RimUiTreeView.cpp | 1 + ApplicationCode/UserInterface/RiuDragDrop.cpp | 71 ++++++----- ApplicationCode/UserInterface/RiuDragDrop.h | 9 ++ 7 files changed, 178 insertions(+), 51 deletions(-) diff --git a/ApplicationCode/Commands/RicCloseCaseFeature.cpp b/ApplicationCode/Commands/RicCloseCaseFeature.cpp index e00328b257..adc6d5ad0f 100644 --- a/ApplicationCode/Commands/RicCloseCaseFeature.cpp +++ b/ApplicationCode/Commands/RicCloseCaseFeature.cpp @@ -19,21 +19,26 @@ #include "RicCloseCaseFeature.h" -#include "RimEclipseCase.h" -#include "RimGeoMechCase.h" -#include "RimIdenticalGridCaseGroup.h" -#include "RimEclipseCaseCollection.h" -#include "RimCaseCollection.h" -#include "RimProject.h" -#include "RimOilField.h" -#include "RimGeoMechModels.h" - #include "RiaApplication.h" -#include "cafSelectionManager.h" +#include "RimCaseCollection.h" +#include "RimEclipseCase.h" +#include "RimEclipseCaseCollection.h" +#include "RimEclipseStatisticsCase.h" +#include "RimGeoMechCase.h" +#include "RimGeoMechModels.h" +#include "RimIdenticalGridCaseGroup.h" +#include "RimOilField.h" +#include "RimProject.h" + +#include "RiuMainWindow.h" + #include "cafPdmFieldHandle.h" +#include "cafPdmObjectGroup.h" +#include "cafSelectionManager.h" #include +#include CAF_CMD_SOURCE_INIT(RicCloseCaseFeature, "RicCloseCaseFeature"); @@ -54,7 +59,13 @@ void RicCloseCaseFeature::onActionTriggered(bool isChecked) RimGeoMechCase* geoMechCase = selectedGeoMechCase(); if (eclipseCase) { - deleteEclipseCase(eclipseCase); + std::vector casesToBeDeleted; + casesToBeDeleted.push_back(eclipseCase); + + if (userConfirmedGridCaseGroupChange(casesToBeDeleted)) + { + deleteEclipseCase(eclipseCase); + } } else if (geoMechCase) { @@ -169,3 +180,82 @@ void RicCloseCaseFeature::deleteGeoMechCase(RimGeoMechCase* geoMechCase) delete geoMechCase; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicCloseCaseFeature::hasAnyStatisticsResults(RimIdenticalGridCaseGroup* gridCaseGroup) +{ + CVF_ASSERT(gridCaseGroup); + + for (size_t i = 0; i < gridCaseGroup->statisticsCaseCollection()->reservoirs().size(); i++) + { + RimEclipseStatisticsCase* rimStaticsCase = dynamic_cast(gridCaseGroup->statisticsCaseCollection()->reservoirs[i]); + if (rimStaticsCase) + { + if (rimStaticsCase->hasComputedStatistics()) + { + return true; + } + } + } + + return false; +} + + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicCloseCaseFeature::userConfirmedGridCaseGroupChange(const std::vector& casesToBeDeleted) +{ + std::vector gridCaseGroups; + + for (size_t i = 0; i < casesToBeDeleted.size(); i++) + { + RimIdenticalGridCaseGroup* gridCaseGroup = NULL; + casesToBeDeleted[i]->firstAnchestorOrThisOfType(gridCaseGroup); + + if (hasAnyStatisticsResults(gridCaseGroup)) + { + gridCaseGroups.push_back(gridCaseGroup); + } + } + + if (gridCaseGroups.size() > 0) + { + RiuMainWindow* mainWnd = RiuMainWindow::instance(); + + QMessageBox msgBox(mainWnd); + msgBox.setIcon(QMessageBox::Question); + + QString questionText; + if (gridCaseGroups.size() == 1) + { + questionText = QString("This operation will invalidate statistics results in grid case group\n\"%1\".\n").arg(gridCaseGroups[0]->name()); + questionText += "Computed results in this group will be deleted if you continue."; + } + else + { + questionText = "This operation will invalidate statistics results in grid case groups\n"; + for (size_t i = 0; i < gridCaseGroups.size(); i++) + { + questionText += QString("\"%1\"\n").arg(gridCaseGroups[i]->name()); + } + + questionText += "Computed results in these groups will be deleted if you continue."; + } + + msgBox.setText(questionText); + msgBox.setInformativeText("Do you want to continue?"); + msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); + + int ret = msgBox.exec(); + if (ret == QMessageBox::No) + { + return false; + } + } + + return true; +} diff --git a/ApplicationCode/Commands/RicCloseCaseFeature.h b/ApplicationCode/Commands/RicCloseCaseFeature.h index edd2d319c9..7e6199f9b1 100644 --- a/ApplicationCode/Commands/RicCloseCaseFeature.h +++ b/ApplicationCode/Commands/RicCloseCaseFeature.h @@ -21,8 +21,11 @@ #include "cafCmdFeature.h" +#include + class RimEclipseCase; class RimGeoMechCase; +class RimIdenticalGridCaseGroup; //================================================================================================== /// @@ -31,6 +34,10 @@ class RicCloseCaseFeature : public caf::CmdFeature { CAF_CMD_HEADER_INIT; +public: + static void deleteEclipseCase(RimEclipseCase* eclipseCase); + static bool userConfirmedGridCaseGroupChange(const std::vector& casesToBeDeleted); + protected: // Overrides virtual bool isCommandEnabled(); @@ -41,9 +48,10 @@ private: RimEclipseCase* selectedEclipseCase() const; RimGeoMechCase* selectedGeoMechCase() const; - void removeCaseFromAllGroups(RimEclipseCase* eclipseCase); - void deleteEclipseCase(RimEclipseCase* eclipseCase); void deleteGeoMechCase(RimGeoMechCase* geoMechCase); + + static bool hasAnyStatisticsResults(RimIdenticalGridCaseGroup* gridCaseGroup); + static void removeCaseFromAllGroups(RimEclipseCase* eclipseCase); }; diff --git a/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp b/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp index 99149d8313..06bb8efa0a 100644 --- a/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp +++ b/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp @@ -385,11 +385,14 @@ void RimIdenticalGridCaseGroup::updateMainGridAndActiveCellsForStatisticsCases() { RimEclipseCase* rimStaticsCase = statisticsCaseCollection->reservoirs[i]; - rimStaticsCase->reservoirData()->setMainGrid(this->mainGrid()); - - if (i == 0) + if (rimStaticsCase->reservoirData()) { - rimStaticsCase->reservoirData()->computeActiveCellBoundingBoxes(); + rimStaticsCase->reservoirData()->setMainGrid(this->mainGrid()); + + if (i == 0) + { + rimStaticsCase->reservoirData()->computeActiveCellBoundingBoxes(); + } } } } @@ -404,8 +407,14 @@ void RimIdenticalGridCaseGroup::clearStatisticsResults() RimEclipseCase* rimStaticsCase = statisticsCaseCollection->reservoirs[i]; if (!rimStaticsCase) continue; - rimStaticsCase->results(RifReaderInterface::MATRIX_RESULTS)->cellResults()->clearAllResults(); - rimStaticsCase->results(RifReaderInterface::FRACTURE_RESULTS)->cellResults()->clearAllResults(); + if (rimStaticsCase->results(RifReaderInterface::MATRIX_RESULTS)->cellResults()) + { + rimStaticsCase->results(RifReaderInterface::MATRIX_RESULTS)->cellResults()->clearAllResults(); + } + if (rimStaticsCase->results(RifReaderInterface::FRACTURE_RESULTS)->cellResults()) + { + rimStaticsCase->results(RifReaderInterface::FRACTURE_RESULTS)->cellResults()->clearAllResults(); + } for (size_t j = 0; j < rimStaticsCase->reservoirViews.size(); j++) { diff --git a/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp b/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp index 8ece7a0073..d4b7aedb91 100644 --- a/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp +++ b/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp @@ -962,6 +962,7 @@ Qt::ItemFlags RimUiTreeModelPdm::flags(const QModelIndex &index) const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- +// OBSOLETE - moved to RiuDragDrop bool RimUiTreeModelPdm::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { const MimeDataWithIndexes* myMimeData = qobject_cast(data); @@ -996,6 +997,7 @@ bool RimUiTreeModelPdm::dropMimeData(const QMimeData *data, Qt::DropAction actio //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- +// OBSOLETE - moved to RiuDragDrop QMimeData* RimUiTreeModelPdm::mimeData(const QModelIndexList &indexes) const { MimeDataWithIndexes* myObj = new MimeDataWithIndexes(); @@ -1006,6 +1008,7 @@ QMimeData* RimUiTreeModelPdm::mimeData(const QModelIndexList &indexes) const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- +// OBSOLETE - moved to RiuDragDrop QStringList RimUiTreeModelPdm::mimeTypes() const { QStringList types; diff --git a/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp b/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp index 2203d2a049..1afcf13b04 100644 --- a/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp +++ b/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp @@ -1180,6 +1180,7 @@ bool RimUiTreeView::hasClipboardValidData() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- +// OBSOLETE - See RiuDragDrop void RimUiTreeView::dropEvent(QDropEvent* dropEvent) { QModelIndexList affectedModels; diff --git a/ApplicationCode/UserInterface/RiuDragDrop.cpp b/ApplicationCode/UserInterface/RiuDragDrop.cpp index f8c766d568..0b3c96a5a3 100644 --- a/ApplicationCode/UserInterface/RiuDragDrop.cpp +++ b/ApplicationCode/UserInterface/RiuDragDrop.cpp @@ -19,16 +19,20 @@ #include "RiuDragDrop.h" +#include "OperationsUsingObjReferences/RicPasteEclipseCasesFeature.h" +#include "RicCloseCaseFeature.h" + +#include "RimCaseCollection.h" +#include "RimEclipseCase.h" +#include "RimEclipseResultCase.h" +#include "RimIdenticalGridCaseGroup.h" +#include "RimMimeData.h" + +#include "RiuMainWindow.h" + #include "cafPdmObjectGroup.h" #include "cafPdmUiTreeView.h" -#include "RimIdenticalGridCaseGroup.h" -#include "RimCaseCollection.h" -#include "RimEclipseCase.h" -#include "RimMimeData.h" -#include "RiuMainWindow.h" - -#include "OperationsUsingObjReferences/RicPasteEclipseCasesFeature.h" #include #include @@ -78,27 +82,6 @@ Qt::ItemFlags RiuDragDrop::flags(const QModelIndex &index) const Qt::ItemFlags itemflags; return itemflags; -/* - Qt::ItemFlags defaultFlags = caf::UiTreeModelPdm::flags(index); - if (index.isValid()) - { - caf::PdmUiTreeItem* currentItem = getTreeItemFromIndex(index); - CVF_ASSERT(currentItem); - - if (dynamic_cast(currentItem->dataObject().p()) || - dynamic_cast(currentItem->dataObject().p())) - { - return Qt::ItemIsDropEnabled | defaultFlags; - } - else if (dynamic_cast(currentItem->dataObject().p())) - { - // TODO: Remember to handle reservoir holding the main grid - return Qt::ItemIsDragEnabled | defaultFlags; - } - } - - return itemFlags; -*/ } //-------------------------------------------------------------------------------------------------- @@ -140,13 +123,10 @@ bool RiuDragDrop::dropMimeData(const QMimeData *data, Qt::DropAction action, int if (action == Qt::CopyAction) { caf::RicPasteEclipseCasesFeature::addCasesToGridCaseGroup(pog, gridCaseGroup); - - //addObjects(parent, pog); } else if (action == Qt::MoveAction) { - assert(false); - //moveObjects(parent, pog); + moveCasesToGridGroup(pog, gridCaseGroup); } return true; @@ -174,3 +154,30 @@ QStringList RiuDragDrop::mimeTypes() const types << MimeDataWithIndexes::formatName(); return types; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuDragDrop::moveCasesToGridGroup(caf::PdmObjectGroup& objectGroup, RimIdenticalGridCaseGroup* gridCaseGroup) +{ + std::vector > typedObjects; + objectGroup.objectsByType(&typedObjects); + + std::vector casesToBeDeleted; + for (size_t i = 0; i < typedObjects.size(); i++) + { + RimEclipseCase* eclipseCase = typedObjects[i]; + casesToBeDeleted.push_back(eclipseCase); + } + + if (RicCloseCaseFeature::userConfirmedGridCaseGroupChange(casesToBeDeleted)) + { + caf::RicPasteEclipseCasesFeature::addCasesToGridCaseGroup(objectGroup, gridCaseGroup); + + for (size_t i = 0; i < casesToBeDeleted.size(); i++) + { + RicCloseCaseFeature::deleteEclipseCase(casesToBeDeleted[i]); + } + } +} + diff --git a/ApplicationCode/UserInterface/RiuDragDrop.h b/ApplicationCode/UserInterface/RiuDragDrop.h index 7713b069f4..c561a00c2c 100644 --- a/ApplicationCode/UserInterface/RiuDragDrop.h +++ b/ApplicationCode/UserInterface/RiuDragDrop.h @@ -21,6 +21,12 @@ #include "cafPdmUiDragDropHandle.h" +class RimIdenticalGridCaseGroup; + +namespace caf +{ + class PdmObjectGroup; +} //-------------------------------------------------------------------------------------------------- /// @@ -36,5 +42,8 @@ public: virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); virtual QMimeData* mimeData(const QModelIndexList &indexes) const; virtual QStringList mimeTypes() const; + +private: + void moveCasesToGridGroup(caf::PdmObjectGroup& objectGroup, RimIdenticalGridCaseGroup* gridCaseGroup); };