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; 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); RimReservoirCellResultsStorage* results(RifReaderInterface::PorosityModelResultType porosityModel);
RimReservoirView* createAndAddReservoirView(); RimReservoirView* createAndAddReservoirView();
void removeReservoirView(RimReservoirView* reservoirView);
void removeResult(const QString& resultName); void removeResult(const QString& resultName);

View File

@ -41,11 +41,13 @@
#include "RimUiTreeView.h" #include "RimUiTreeView.h"
#include "RimWellCollection.h" #include "RimWellCollection.h"
#include "RimWellPathCollection.h" #include "RimWellPathCollection.h"
#include "RimGeoMechView.h"
#include "cvfAssert.h" #include "cvfAssert.h"
#include <QClipboard> #include <QClipboard>
#include <QFileSystemWatcher> #include <QFileSystemWatcher>
#include "RimGeoMechCase.h"
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -60,60 +62,6 @@ RimUiTreeModelPdm::RimUiTreeModelPdm(QObject* parent)
connect(m_scriptChangeDetector, SIGNAL(fileChanged(QString)), this, SLOT(slotRefreshScriptTree(QString))); 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); for (size_t sIdx = 0; sIdx < treeSelection.size(); ++sIdx)
CVF_ASSERT(uiItem); {
RimView* reservoirView = dynamic_cast<RimView*>(treeSelection[sIdx]);
ownerCases.insert(reservoirView->ownerCase());
RimReservoirView* reservoirView = dynamic_cast<RimReservoirView*>(uiItem->dataObject().p()); reservoirView->removeFromParentFields();
CVF_ASSERT(reservoirView); 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); for (std::set<RimCase*>::iterator it = ownerCases.begin(); it != ownerCases.end(); ++it)
delete reservoirView; {
updateUiSubTree(*it);
}
// updateUiSubTree(reservoirView->eclipseCase()); // To be enabled
clearClipboard(); 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 (!treeSelection.size() || treeSelection[0] == NULL) return NULL;
if (!currentItem) return NULL;
caf::PdmUiTreeItem* collectionItem = NULL; caf::PdmUiItem* currentItem = treeSelection[0];
bool itemIndexIsCollection = false; // Establish type of selected object
QModelIndex collectionIndex; RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>(currentItem);
int position = 0; RimGeoMechCase* geomCase = dynamic_cast<RimGeoMechCase*>(currentItem);
if (dynamic_cast<RimReservoirView*>(currentItem->dataObject().p())) 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(); insertedView = eclipseCase->createAndAddReservoirView();
collectionIndex = itemIndex.parent();
position = itemIndex.row();
} }
else if (dynamic_cast<RimEclipseCase*>(currentItem->dataObject().p())) else if (geomCase)
{ {
collectionItem = currentItem; insertedView = geomCase->createAndAddReservoirView();
collectionIndex = itemIndex;
position = collectionItem->childCount();
} }
if (collectionItem) // Must be run before buildViewItems, as wells are created in this function
{
RimEclipseCase* rimReservoir = dynamic_cast<RimEclipseCase*>(collectionItem->dataObject().p());
RimReservoirView* insertedView = rimReservoir->createAndAddReservoirView();
// 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 return insertedView;
caf::PdmUiTreeItem* childItem = caf::UiTreeItemBuilderPdm::buildViewItems(collectionItem, position, insertedView);
endInsertRows();
insertedModelIndex = index(position, 0, collectionIndex);
return insertedView;
}
return NULL;
} }

View File

@ -35,6 +35,8 @@ class RimInputProperty;
class RimStatisticsCase; class RimStatisticsCase;
class RimIdenticalGridCaseGroup; class RimIdenticalGridCaseGroup;
class RimView;
//================================================================================================== //==================================================================================================
/// ///
@ -47,21 +49,20 @@ class RimUiTreeModelPdm : public caf::UiTreeModelPdm
public: public:
RimUiTreeModelPdm(QObject* parent); RimUiTreeModelPdm(QObject* parent);
// TO BE DELETED, NOT USED
virtual bool insertRows_special(int position, int rows, const QModelIndex &parent = QModelIndex());
// Special edit methods // Special edit methods
bool deleteRangeFilter(const QModelIndex& itemIndex); bool deleteRangeFilter(const QModelIndex& itemIndex);
bool deletePropertyFilter(const QModelIndex& itemIndex); bool deletePropertyFilter(const QModelIndex& itemIndex);
bool deleteReservoirView(const QModelIndex& itemIndex);
void deleteInputProperty(const QModelIndex& itemIndex); void deleteInputProperty(const QModelIndex& itemIndex);
void deleteReservoir(RimEclipseCase* reservoir); void deleteReservoir(RimEclipseCase* reservoir);
void deleteAllWellPaths(const QModelIndex& itemIndex); void deleteAllWellPaths(const QModelIndex& itemIndex);
RimCellPropertyFilter* addPropertyFilter(const QModelIndex& itemIndex, QModelIndex& insertedModelIndex); RimCellPropertyFilter* addPropertyFilter(const QModelIndex& itemIndex, QModelIndex& insertedModelIndex);
RimCellRangeFilter* addRangeFilter(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 addInputProperty(const QModelIndex& itemIndex, const QStringList& fileNames);
void addToParentAndBuildUiItems(caf::PdmUiTreeItem* parentTreeItem, int position, caf::PdmObject* pdmObject); void addToParentAndBuildUiItems(caf::PdmUiTreeItem* parentTreeItem, int position, caf::PdmObject* pdmObject);

View File

@ -68,6 +68,8 @@
#include "RimAnalysisModels.h" #include "RimAnalysisModels.h"
#include "RimInputProperty.h" #include "RimInputProperty.h"
#include "RigSingleWellResultsData.h" #include "RigSingleWellResultsData.h"
#include "RimGeoMechView.h"
#include "RimGeoMechCase.h"
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -114,8 +116,14 @@ void RimUiTreeView::contextMenuEvent(QContextMenuEvent* event)
{ {
QMenu menu; QMenu menu;
// Range filters if (dynamic_cast<RimGeoMechView*>(uiItem->dataObject().p()))
if (dynamic_cast<RimReservoirView*>(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("New View"), this, SLOT(slotAddView()));
menu.addAction(QString("Copy View"), this, SLOT(slotCopyPdmObjectToClipboard())); 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("Compute"), this, SLOT(slotComputeStatistics()));
menu.addAction(QString("Close"), this, SLOT(slotCloseCase())); 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())) else if (dynamic_cast<RimEclipseCase*>(uiItem->dataObject().p()))
{ {
menu.addAction(QString("Copy"), this, SLOT(slotCopyPdmObjectToClipboard())); menu.addAction(QString("Copy"), this, SLOT(slotCopyPdmObjectToClipboard()));
@ -628,12 +640,12 @@ void RimUiTreeView::slotExecuteScriptForSelectedCases()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimUiTreeView::slotAddView() void RimUiTreeView::slotAddView()
{ {
QModelIndex index = currentIndex();
RimUiTreeModelPdm* myModel = dynamic_cast<RimUiTreeModelPdm*>(model()); RimUiTreeModelPdm* myModel = dynamic_cast<RimUiTreeModelPdm*>(model());
caf::PdmUiTreeItem* uiItem = myModel->getTreeItemFromIndex(currentIndex()); std::vector<caf::PdmUiItem*> selection;
this->selectedUiItems(selection);
QModelIndex insertedIndex; RimView* newView = myModel->addReservoirView(selection);
myModel->addReservoirView(index, insertedIndex); QModelIndex insertedIndex = myModel->getModelIndexFromPdmObject(newView);
// Expand parent collection and inserted view item // Expand parent collection and inserted view item
setExpandedUpToRoot(insertedIndex); setExpandedUpToRoot(insertedIndex);
@ -647,13 +659,12 @@ void RimUiTreeView::slotAddView()
void RimUiTreeView::slotDeleteView() void RimUiTreeView::slotDeleteView()
{ {
RimUiTreeModelPdm* myModel = dynamic_cast<RimUiTreeModelPdm*>(model()); RimUiTreeModelPdm* myModel = dynamic_cast<RimUiTreeModelPdm*>(model());
if (myModel) std::vector<caf::PdmUiItem*> selection;
{ this->selectedUiItems(selection);
myModel->deleteReservoirView(currentIndex()); myModel->deleteReservoirViews(selection);
RiaApplication* app = RiaApplication::instance(); RiaApplication* app = RiaApplication::instance();
app->setActiveReservoirView(NULL); 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); virtual void setModel(QAbstractItemModel* model);
void selectedUiItems(std::vector<caf::PdmUiItem*>& objects);
void applyTreeViewStateFromString(const QString& treeViewState); void applyTreeViewStateFromString(const QString& treeViewState);
void storeTreeViewStateToString(QString& treeViewState); void storeTreeViewStateToString(QString& treeViewState);