(#372) Drag Drop Move implemented.

User question on closing/moving a statistics source case
This commit is contained in:
Jacob Støren 2015-08-20 10:24:03 +02:00
parent ac529b77da
commit c599fd39f8
7 changed files with 178 additions and 51 deletions

View File

@ -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 <QAction>
#include <QMessageBox>
CAF_CMD_SOURCE_INIT(RicCloseCaseFeature, "RicCloseCaseFeature");
@ -54,7 +59,13 @@ void RicCloseCaseFeature::onActionTriggered(bool isChecked)
RimGeoMechCase* geoMechCase = selectedGeoMechCase();
if (eclipseCase)
{
deleteEclipseCase(eclipseCase);
std::vector<RimEclipseCase*> 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<RimEclipseStatisticsCase*>(gridCaseGroup->statisticsCaseCollection()->reservoirs[i]);
if (rimStaticsCase)
{
if (rimStaticsCase->hasComputedStatistics())
{
return true;
}
}
}
return false;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicCloseCaseFeature::userConfirmedGridCaseGroupChange(const std::vector<RimEclipseCase*>& casesToBeDeleted)
{
std::vector<RimIdenticalGridCaseGroup*> 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;
}

View File

@ -21,8 +21,11 @@
#include "cafCmdFeature.h"
#include <vector>
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<RimEclipseCase*>& 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);
};

View File

@ -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++)
{

View File

@ -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<const MimeDataWithIndexes*>(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;

View File

@ -1180,6 +1180,7 @@ bool RimUiTreeView::hasClipboardValidData()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
// OBSOLETE - See RiuDragDrop
void RimUiTreeView::dropEvent(QDropEvent* dropEvent)
{
QModelIndexList affectedModels;

View File

@ -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 <QAbstractItemModel>
#include <QModelIndex>
@ -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<RimIdenticalGridCaseGroup*>(currentItem->dataObject().p()) ||
dynamic_cast<RimCaseCollection*>(currentItem->dataObject().p()))
{
return Qt::ItemIsDropEnabled | defaultFlags;
}
else if (dynamic_cast<RimEclipseCase*>(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<caf::PdmPointer<RimEclipseResultCase> > typedObjects;
objectGroup.objectsByType(&typedObjects);
std::vector<RimEclipseCase*> 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]);
}
}
}

View File

@ -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);
};