diff --git a/ApplicationCode/Commands/RicDeleteItemFeature.cpp b/ApplicationCode/Commands/RicDeleteItemFeature.cpp index 387fc7be26..10ec79f328 100644 --- a/ApplicationCode/Commands/RicDeleteItemFeature.cpp +++ b/ApplicationCode/Commands/RicDeleteItemFeature.cpp @@ -32,23 +32,71 @@ #include "cafSelectionManager.h" #include +#include "RimGeoMechView.h" +#include "RimEclipseView.h" +#include "RimIdenticalGridCaseGroup.h" +#include "RimEclipseInputProperty.h" +#include "RimCellRangeFilter.h" +#include "RimEclipsePropertyFilter.h" +#include "RimGeoMechPropertyFilter.h" +#include "RimViewController.h" +#include "RimWellLogCurve.h" +#include "RimSummaryCurve.h" +#include "RimSummaryCurveFilter.h" +#include "RimIntersection.h" +#include "RimIntersectionBox.h" +#include "RimFormationNames.h" +#include "RimFormationNamesCollection.h" +#include "RimSummaryPlot.h" namespace caf { CAF_CMD_SOURCE_INIT(RicDeleteItemFeature, "RicDeleteItemFeature"); +bool isDeletable(PdmUiItem * uiItem) +{ + 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; + + return false; +} //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RicDeleteItemFeature::isCommandEnabled() { - caf::PdmObject* currentPdmObject = dynamic_cast(caf::SelectionManager::instance()->selectedItem()); - if (!currentPdmObject) return false; + std::vector items; + caf::SelectionManager::instance()->selectedItems(items); + + if (items.empty() ) return false; - caf::PdmChildArrayFieldHandle* childArrayFieldHandle = dynamic_cast(currentPdmObject->parentField()); - if (!childArrayFieldHandle) return false; + for (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; } @@ -61,36 +109,42 @@ void RicDeleteItemFeature::onActionTriggered(bool isChecked) SelectionManager::instance()->selectedItems(items); assert(items.size() > 0); - caf::PdmObject* currentPdmObject = dynamic_cast(items[0]); - assert(currentPdmObject); - - caf::PdmChildArrayFieldHandle* childArrayFieldHandle = dynamic_cast(currentPdmObject->parentField()); - - int indexAfter = -1; - - std::vector childObjects; - childArrayFieldHandle->childObjects(&childObjects); - - for (size_t i = 0; i < childObjects.size(); i++) + for (PdmUiItem* item: items) { - if (childObjects[i] == currentPdmObject) + 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++ ) { - indexAfter = static_cast(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(SelectionManager::instance()->notificationCenter()); + + RicDeleteItemExecData* data = executeCmd->commandData(); + data->m_rootObject = PdmReferenceHelper::findRoot(childArrayFieldHandle); + data->m_pathToField = PdmReferenceHelper::referenceFromRootToField(data->m_rootObject, childArrayFieldHandle); + data->m_indexToObject = indexAfter; + + + CmdExecCommandManager::instance()->processExecuteCommand(executeCmd); } - - // Did not find currently selected pdm object in the current list field - assert(indexAfter != -1); - - RicDeleteItemExec* executeCmd = new RicDeleteItemExec(SelectionManager::instance()->notificationCenter()); - - RicDeleteItemExecData* data = executeCmd->commandData(); - data->m_rootObject = PdmReferenceHelper::findRoot(childArrayFieldHandle); - data->m_pathToField = PdmReferenceHelper::referenceFromRootToField(data->m_rootObject, childArrayFieldHandle); - data->m_indexToObject = indexAfter; - - - CmdExecCommandManager::instance()->processExecuteCommand(executeCmd); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveSwitchAxisFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveSwitchAxisFeature.cpp index 7ef6029beb..c1e0a6d754 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveSwitchAxisFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveSwitchAxisFeature.cpp @@ -34,7 +34,12 @@ CAF_CMD_SOURCE_INIT(RicSummaryCurveSwitchAxisFeature, "RicSummaryCurveSwitchAxis //-------------------------------------------------------------------------------------------------- bool RicSummaryCurveSwitchAxisFeature::isCommandEnabled() { - return true; + std::set selectedCurveFilters; + std::set selectedSoloCurves; + + RicSummaryCurveSwitchAxisFeature::extractSelectedCurveFiltersAndSoloCurves(&selectedCurveFilters, + &selectedSoloCurves); + return (selectedCurveFilters.size() || selectedSoloCurves.size()); } //-------------------------------------------------------------------------------------------------- @@ -42,13 +47,33 @@ bool RicSummaryCurveSwitchAxisFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicSummaryCurveSwitchAxisFeature::onActionTriggered(bool isChecked) { - RimSummaryCurve* summaryCurve = RicSummaryCurveSwitchAxisFeature::selectedSummaryCurve(); - RimSummaryCurveFilter* summaryCurveFilter = RicSummaryCurveSwitchAxisFeature::selectedSummaryCurveFilter(); - if (summaryCurve) + std::set selectedCurveFilters; + std::set selectedSoloCurves; + + RicSummaryCurveSwitchAxisFeature::extractSelectedCurveFiltersAndSoloCurves(&selectedCurveFilters, + &selectedSoloCurves); + + for (RimSummaryCurveFilter* summaryCurveFilter: selectedCurveFilters) + { + RimDefines::PlotAxis plotAxis = summaryCurveFilter->associatedPlotAxis(); + + if ( plotAxis == RimDefines::PLOT_AXIS_LEFT ) + { + summaryCurveFilter->setPlotAxis(RimDefines::PLOT_AXIS_RIGHT); + } + else + { + summaryCurveFilter->setPlotAxis(RimDefines::PLOT_AXIS_LEFT); + } + + summaryCurveFilter->updateConnectedEditors(); + } + + for (RimSummaryCurve* summaryCurve : selectedSoloCurves) { RimDefines::PlotAxis plotAxis = summaryCurve->associatedPlotAxis(); - if (plotAxis == RimDefines::PLOT_AXIS_LEFT) + if ( plotAxis == RimDefines::PLOT_AXIS_LEFT ) { summaryCurve->setPlotAxis(RimDefines::PLOT_AXIS_RIGHT); } @@ -62,22 +87,7 @@ void RicSummaryCurveSwitchAxisFeature::onActionTriggered(bool isChecked) RimSummaryPlot* plot = nullptr; summaryCurve->firstAncestorOrThisOfType(plot); - if (plot) plot->updateAxes(); - } - else if (summaryCurveFilter) - { - RimDefines::PlotAxis plotAxis = summaryCurveFilter->associatedPlotAxis(); - - if (plotAxis == RimDefines::PLOT_AXIS_LEFT) - { - summaryCurveFilter->setPlotAxis(RimDefines::PLOT_AXIS_RIGHT); - } - else - { - summaryCurveFilter->setPlotAxis(RimDefines::PLOT_AXIS_LEFT); - } - - summaryCurveFilter->updateConnectedEditors(); + if ( plot ) plot->updateAxes(); } } @@ -90,22 +100,50 @@ void RicSummaryCurveSwitchAxisFeature::setupActionLook(QAction* actionToSetup) } //-------------------------------------------------------------------------------------------------- -/// +/// Solo curves means selected curves that does not have a selected curvefilter as parent //-------------------------------------------------------------------------------------------------- -RimSummaryCurve* RicSummaryCurveSwitchAxisFeature::selectedSummaryCurve() +void RicSummaryCurveSwitchAxisFeature::extractSelectedCurveFiltersAndSoloCurves(std::set* selectedCurveFilters, + std::set* selectedSoloCurves) { - std::vector selection; - caf::SelectionManager::instance()->objectsByType(&selection); - return selection.size() > 0 ? selection[0] : nullptr; -} -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimSummaryCurveFilter* RicSummaryCurveSwitchAxisFeature::selectedSummaryCurveFilter() -{ - std::vector selection; - caf::SelectionManager::instance()->objectsByType(&selection); - return selection.size() > 0 ? selection[0] : nullptr; -} + selectedSoloCurves->clear(); + { + std::vector selection; + caf::SelectionManager::instance()->objectsByType(&selection); + for (RimSummaryCurve* curve: selection) + { + selectedSoloCurves->insert(curve); + } + } + selectedCurveFilters->clear(); + { + std::vector selection; + caf::SelectionManager::instance()->objectsByType(&selection); + for ( RimSummaryCurveFilter* curveFilter: selection ) + { + selectedCurveFilters->insert(curveFilter); + } + } + + std::vector curvesToRemove; + + for (RimSummaryCurve* curve: (*selectedSoloCurves)) + { + RimSummaryCurveFilter* parentCurveFilter; + curve->firstAncestorOrThisOfType(parentCurveFilter); + if (parentCurveFilter) + { + if (selectedCurveFilters->count(parentCurveFilter) > 0 ) + { + curvesToRemove.push_back(curve); + } + } + } + + for (RimSummaryCurve* curve: curvesToRemove) + { + selectedSoloCurves->erase(curve); + } + +} \ No newline at end of file diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveSwitchAxisFeature.h b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveSwitchAxisFeature.h index 79b051f805..c48fee37ab 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveSwitchAxisFeature.h +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveSwitchAxisFeature.h @@ -20,9 +20,13 @@ #include "cafCmdFeature.h" +#include + class RimSummaryCurve; class RimSummaryCurveFilter; + + //================================================================================================== /// //================================================================================================== @@ -36,6 +40,6 @@ protected: virtual void setupActionLook( QAction* actionToSetup ) override; private: - static RimSummaryCurve* selectedSummaryCurve(); - static RimSummaryCurveFilter* selectedSummaryCurveFilter(); + static void extractSelectedCurveFiltersAndSoloCurves(std::set* selectedCurveFilters, + std::set* selectedSoloCurves); }; diff --git a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp index 8ea0db3813..78a7a16701 100644 --- a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp +++ b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp @@ -374,9 +374,12 @@ QStringList RimContextCommandBuilder::commandsFromSelection() { commandIds << "RicExecuteScriptForCasesFeature"; } - else if (dynamic_cast(uiItem)) + else if (dynamic_cast(uiItem) || + dynamic_cast(uiItem) ) { commandIds << "RicCopyReferencesToClipboardFeature"; + commandIds << "RicSummaryCurveSwitchAxisFeature"; + } else if (dynamic_cast(uiItem) || dynamic_cast(uiItem) || @@ -387,6 +390,11 @@ QStringList RimContextCommandBuilder::commandsFromSelection() } } + if (uiItems.size() > 1) + { + commandIds << "RicDeleteItemFeature"; + } + if (RicToggleItemsFeatureImpl::isToggleCommandsAvailable()) { commandIds << "Separator";