///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2015- Statoil ASA // Copyright (C) 2015- Ceetron Solutions AS // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU General Public License at // for more details. // ///////////////////////////////////////////////////////////////////////////////// #include "RicDeleteItemFeature.h" #include "RicDeleteItemExec.h" #include "RicDeleteItemExecData.h" #include "RimAsciiDataCurve.h" #include "RimCellRangeFilter.h" #include "RimDerivedEnsembleCaseCollection.h" #include "RimEclipseInputProperty.h" #include "RimEclipsePropertyFilter.h" #include "RimEclipseView.h" #include "RimEllipseFractureTemplate.h" #include "RimEnsembleCurveFilter.h" #include "RimEnsembleCurveSet.h" #include "RimFishboneWellPath.h" #include "RimFishbonesMultipleSubs.h" #include "RimFlowCharacteristicsPlot.h" #include "RimFormationNames.h" #include "RimFormationNamesCollection.h" #include "RimGeoMechPropertyFilter.h" #include "RimGeoMechView.h" #include "RimGridCrossPlot.h" #include "RimGridCrossPlotDataSet.h" #include "RimGridTimeHistoryCurve.h" #include "RimIdenticalGridCaseGroup.h" #include "RimIntersection.h" #include "RimIntersectionBox.h" #include "RimMultiPlotWindow.h" #include "RimPerforationInterval.h" #include "RimPolylinesAnnotation.h" #include "RimReachCircleAnnotation.h" #include "RimSimWellFracture.h" #include "RimSimWellFractureCollection.h" #include "RimStimPlanFractureTemplate.h" #include "RimSummaryCurve.h" #include "RimSummaryCurveFilter.h" #include "RimSummaryPlot.h" #include "RimTextAnnotation.h" #include "RimViewController.h" #include "RimWellAllocationPlot.h" #include "RimWellFlowRateCurve.h" #include "RimWellLogCurve.h" #include "RimWellLogPlot.h" #include "RimWellLogRftCurve.h" #include "RimWellLogTrack.h" #include "RimWellPathFracture.h" #include "RimWellPathFractureCollection.h" #include "RimWellPathValve.h" #include "RimWellRftPlot.h" #include "cafCmdExecCommandManager.h" #include "cafCmdSelectionHelper.h" #include "cafPdmChildArrayField.h" #include "cafPdmField.h" #include "cafPdmReferenceHelper.h" #include "cafSelectionManager.h" #include CAF_CMD_SOURCE_INIT( RicDeleteItemFeature, "RicDeleteItemFeature" ); bool isDeletable( caf::PdmUiItem* uiItem ) { // Enable delete of well allocation plots if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; // Disable delete of all sub objects of a well allocation plot caf::PdmObjectHandle* destinationObject = dynamic_cast( uiItem ); if ( destinationObject ) { RimWellAllocationPlot* wellAllocationPlot = nullptr; RimWellRftPlot* rftPlot = nullptr; destinationObject->firstAncestorOrThisOfType( wellAllocationPlot ); destinationObject->firstAncestorOrThisOfType( rftPlot ); if ( wellAllocationPlot || rftPlot ) { return false; } } if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) { RimMultiPlotWindow* plotWindow = nullptr; static_cast( uiItem )->firstAncestorOrThisOfType( plotWindow ); return plotWindow == nullptr; } if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) { RimMultiPlotWindow* plotWindow = nullptr; static_cast( uiItem )->firstAncestorOrThisOfType( plotWindow ); return plotWindow == nullptr; } if ( dynamic_cast( uiItem ) ) return true; if ( dynamic_cast( uiItem ) ) return true; return false; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RicDeleteItemFeature::isCommandEnabled() { std::vector items; caf::SelectionManager::instance()->selectedItems( items ); if ( items.empty() ) return false; for ( caf::PdmUiItem* item : items ) { if ( !isDeletable( item ) ) return false; caf::PdmObject* currentPdmObject = dynamic_cast( item ); if ( !currentPdmObject ) return false; caf::PdmChildArrayFieldHandle* childArrayFieldHandle = dynamic_cast( currentPdmObject->parentField() ); if ( !childArrayFieldHandle ) return false; } return true; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RicDeleteItemFeature::onActionTriggered( bool isChecked ) { std::vector items; caf::SelectionManager::instance()->selectedItems( items ); assert( items.size() > 0 ); for ( caf::PdmUiItem* item : items ) { if ( !isDeletable( item ) ) continue; caf::PdmObject* currentPdmObject = dynamic_cast( item ); if ( !currentPdmObject ) continue; caf::PdmChildArrayFieldHandle* childArrayFieldHandle = dynamic_cast( currentPdmObject->parentField() ); if ( !childArrayFieldHandle ) continue; int indexAfter = -1; std::vector childObjects; childArrayFieldHandle->childObjects( &childObjects ); for ( size_t i = 0; i < childObjects.size(); i++ ) { if ( childObjects[i] == currentPdmObject ) { indexAfter = static_cast( i ); } } // Did not find currently selected pdm object in the current list field assert( indexAfter != -1 ); RicDeleteItemExec* executeCmd = new RicDeleteItemExec( caf::SelectionManager::instance()->notificationCenter() ); RicDeleteItemExecData* data = executeCmd->commandData(); data->m_rootObject = caf::PdmReferenceHelper::findRoot( childArrayFieldHandle ); data->m_pathToField = caf::PdmReferenceHelper::referenceFromRootToField( data->m_rootObject, childArrayFieldHandle ); data->m_indexToObject = indexAfter; caf::CmdExecCommandManager::instance()->processExecuteCommand( executeCmd ); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RicDeleteItemFeature::setupActionLook( QAction* actionToSetup ) { actionToSetup->setText( "Delete" ); actionToSetup->setIcon( QIcon( ":/Erase.png" ) ); applyShortcutWithHintToAction( actionToSetup, QKeySequence::Delete ); }