Rewrote Add and Delete View for GeoMech

See issue #292
This commit is contained in:
Jacob Støren 2015-05-20 12:33:06 +02:00
parent 6a9555a196
commit 10388ea3dc
6 changed files with 97 additions and 149 deletions

View File

@ -149,30 +149,6 @@ RimReservoirView* RimEclipseCase::createAndAddReservoirView()
return riv;
}
//--------------------------------------------------------------------------------------------------
/// TODO: Move this functionality to PdmPointersField
//--------------------------------------------------------------------------------------------------
void RimEclipseCase::removeReservoirView(RimReservoirView* reservoirView)
{
std::vector<size_t> 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();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -68,7 +68,6 @@ public:
RimReservoirCellResultsStorage* results(RifReaderInterface::PorosityModelResultType porosityModel);
RimReservoirView* createAndAddReservoirView();
void removeReservoirView(RimReservoirView* reservoirView);
void removeResult(const QString& resultName);

View File

@ -41,11 +41,13 @@
#include "RimUiTreeView.h"
#include "RimWellCollection.h"
#include "RimWellPathCollection.h"
#include "RimGeoMechView.h"
#include "cvfAssert.h"
#include <QClipboard>
#include <QFileSystemWatcher>
#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<RimCellRangeFilterCollection*>(parentItem->dataObject().p()) ||
dynamic_cast<RimCellPropertyFilterCollection*>(parentItem->dataObject().p()))
{
canCreateChildren = true;
}
else if (dynamic_cast<RimCellFilter*>(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<RimCellRangeFilterCollection*>(parentItem->dataObject().p()))
{
RimCellRangeFilterCollection* rangeFilterCollection = dynamic_cast<RimCellRangeFilterCollection*>(parentItem->dataObject().p());
RimCellRangeFilter* rangeFilter = rangeFilterCollection->createAndAppendRangeFilter();
caf::PdmUiTreeItem* childItem = new caf::PdmUiTreeItem(parentItem, position + i, rangeFilter);
}
else if (dynamic_cast<RimCellPropertyFilterCollection*>(parentItem->dataObject().p()))
{
RimCellPropertyFilterCollection* propertyFilterCollection = dynamic_cast<RimCellPropertyFilterCollection*>(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<caf::PdmUiItem*>& treeSelection)
{
CVF_ASSERT(itemIndex.isValid());
std::set<RimCase*> ownerCases;
caf::PdmUiTreeItem* uiItem = getTreeItemFromIndex(itemIndex);
CVF_ASSERT(uiItem);
for (size_t sIdx = 0; sIdx < treeSelection.size(); ++sIdx)
{
RimView* reservoirView = dynamic_cast<RimView*>(treeSelection[sIdx]);
ownerCases.insert(reservoirView->ownerCase());
RimReservoirView* reservoirView = dynamic_cast<RimReservoirView*>(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
}
reservoirView->eclipseCase()->removeReservoirView(reservoirView);
delete reservoirView;
for (std::set<RimCase*>::iterator it = ownerCases.begin(); it != ownerCases.end(); ++it)
{
updateUiSubTree(*it);
}
// updateUiSubTree(reservoirView->eclipseCase()); // To be enabled
clearClipboard();
return true;
}
//--------------------------------------------------------------------------------------------------
@ -378,50 +326,42 @@ RimCellRangeFilter* RimUiTreeModelPdm::addRangeFilter(const QModelIndex& itemInd
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimReservoirView* RimUiTreeModelPdm::addReservoirView(const QModelIndex& itemIndex, QModelIndex& insertedModelIndex)
RimView* RimUiTreeModelPdm::addReservoirView(const std::vector<caf::PdmUiItem*>& 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<RimReservoirView*>(currentItem->dataObject().p()))
// Establish type of selected object
RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>(currentItem);
RimGeoMechCase* geomCase = dynamic_cast<RimGeoMechCase*>(currentItem);
RimGeoMechView* geoMechView = dynamic_cast<RimGeoMechView*>(currentItem);
RimReservoirView* reservoirView = dynamic_cast<RimReservoirView*>(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<RimEclipseCase*>(currentItem->dataObject().p()))
else if (geomCase)
{
collectionItem = currentItem;
collectionIndex = itemIndex;
position = collectionItem->childCount();
insertedView = geomCase->createAndAddReservoirView();
}
if (collectionItem)
{
RimEclipseCase* rimReservoir = dynamic_cast<RimEclipseCase*>(collectionItem->dataObject().p());
RimReservoirView* insertedView = rimReservoir->createAndAddReservoirView();
// Must be run before buildViewItems, as wells are created in this function
// Must be run before buildViewItems, as wells are created in this function
insertedView->loadDataAndUpdate();
insertedView->loadDataAndUpdate();
beginInsertRows(collectionIndex, position, position);
if (eclipseCase ) this->updateUiSubTree(eclipseCase);
if (geomCase ) this->updateUiSubTree(geomCase);
// 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;
return insertedView;
}

View File

@ -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<caf::PdmUiItem*>& treeSelection);
void deleteReservoirViews(const std::vector<caf::PdmUiItem*>& treeSelection);
void addInputProperty(const QModelIndex& itemIndex, const QStringList& fileNames);
void addToParentAndBuildUiItems(caf::PdmUiTreeItem* parentTreeItem, int position, caf::PdmObject* pdmObject);

View File

@ -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<RimReservoirView*>(uiItem->dataObject().p()))
if (dynamic_cast<RimGeoMechView*>(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<RimReservoirView*>(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<RimGeoMechCase*>(uiItem->dataObject().p()))
{
menu.addAction(QString("New View"), this, SLOT(slotAddView()));
}
else if (dynamic_cast<RimEclipseCase*>(uiItem->dataObject().p()))
{
menu.addAction(QString("Copy"), this, SLOT(slotCopyPdmObjectToClipboard()));
@ -628,12 +640,12 @@ void RimUiTreeView::slotExecuteScriptForSelectedCases()
//--------------------------------------------------------------------------------------------------
void RimUiTreeView::slotAddView()
{
QModelIndex index = currentIndex();
RimUiTreeModelPdm* myModel = dynamic_cast<RimUiTreeModelPdm*>(model());
caf::PdmUiTreeItem* uiItem = myModel->getTreeItemFromIndex(currentIndex());
std::vector<caf::PdmUiItem*> selection;
this->selectedUiItems(selection);
QModelIndex insertedIndex;
myModel->addReservoirView(index, insertedIndex);
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<RimUiTreeModelPdm*>(model());
if (myModel)
{
myModel->deleteReservoirView(currentIndex());
std::vector<caf::PdmUiItem*> 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<caf::PdmUiItem*>& objects)
{
RimUiTreeModelPdm* myModel = dynamic_cast<RimUiTreeModelPdm*>(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);
}
}
}

View File

@ -44,6 +44,9 @@ public:
virtual void setModel(QAbstractItemModel* model);
void selectedUiItems(std::vector<caf::PdmUiItem*>& objects);
void applyTreeViewStateFromString(const QString& treeViewState);
void storeTreeViewStateToString(QString& treeViewState);