#983, #917 Multiselect commands Switch axis and Delete

This commit is contained in:
Jacob Støren
2016-11-17 14:47:43 +01:00
parent c0309b4368
commit fbf4f5e07d
4 changed files with 173 additions and 69 deletions

View File

@@ -32,23 +32,71 @@
#include "cafSelectionManager.h" #include "cafSelectionManager.h"
#include <QAction> #include <QAction>
#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 namespace caf
{ {
CAF_CMD_SOURCE_INIT(RicDeleteItemFeature, "RicDeleteItemFeature"); CAF_CMD_SOURCE_INIT(RicDeleteItemFeature, "RicDeleteItemFeature");
bool isDeletable(PdmUiItem * uiItem)
{
if (dynamic_cast<RimGeoMechView*>(uiItem)) return true;
if (dynamic_cast<RimEclipseView*>(uiItem)) return true;
if (dynamic_cast<RimIdenticalGridCaseGroup*>(uiItem)) return true;
if (dynamic_cast<RimEclipseInputProperty*>(uiItem)) return true;
if (dynamic_cast<RimCellRangeFilter*>(uiItem)) return true;
if (dynamic_cast<RimEclipsePropertyFilter*>(uiItem)) return true;
if (dynamic_cast<RimGeoMechPropertyFilter*>(uiItem)) return true;
if (dynamic_cast<RimViewController*>(uiItem)) return true;
if (dynamic_cast<RimWellLogPlot*>(uiItem)) return true;
if (dynamic_cast<RimWellLogCurve*>(uiItem)) return true;
if (dynamic_cast<RimSummaryPlot*>(uiItem)) return true;
if (dynamic_cast<RimSummaryCurve*>(uiItem)) return true;
if (dynamic_cast<RimSummaryCurveFilter*>(uiItem)) return true;
if (dynamic_cast<RimIntersection*>(uiItem)) return true;
if (dynamic_cast<RimIntersectionBox*>(uiItem)) return true;
if (dynamic_cast<RimFormationNames*>(uiItem)) return true;
if (dynamic_cast<RimFormationNamesCollection*>(uiItem)) return true;
return false;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RicDeleteItemFeature::isCommandEnabled() bool RicDeleteItemFeature::isCommandEnabled()
{ {
caf::PdmObject* currentPdmObject = dynamic_cast<caf::PdmObject*>(caf::SelectionManager::instance()->selectedItem()); std::vector<PdmUiItem*> items;
if (!currentPdmObject) return false; caf::SelectionManager::instance()->selectedItems(items);
if (items.empty() ) return false;
caf::PdmChildArrayFieldHandle* childArrayFieldHandle = dynamic_cast<caf::PdmChildArrayFieldHandle*>(currentPdmObject->parentField()); for (PdmUiItem* item : items)
if (!childArrayFieldHandle) return false; {
if (!isDeletable(item)) return false;
caf::PdmObject* currentPdmObject = dynamic_cast<caf::PdmObject*>(item);
if ( !currentPdmObject ) return false;
caf::PdmChildArrayFieldHandle* childArrayFieldHandle = dynamic_cast<caf::PdmChildArrayFieldHandle*>(currentPdmObject->parentField());
if ( !childArrayFieldHandle ) return false;
}
return true; return true;
} }
@@ -61,36 +109,42 @@ void RicDeleteItemFeature::onActionTriggered(bool isChecked)
SelectionManager::instance()->selectedItems(items); SelectionManager::instance()->selectedItems(items);
assert(items.size() > 0); assert(items.size() > 0);
caf::PdmObject* currentPdmObject = dynamic_cast<caf::PdmObject*>(items[0]); for (PdmUiItem* item: items)
assert(currentPdmObject);
caf::PdmChildArrayFieldHandle* childArrayFieldHandle = dynamic_cast<caf::PdmChildArrayFieldHandle*>(currentPdmObject->parentField());
int indexAfter = -1;
std::vector<PdmObjectHandle*> childObjects;
childArrayFieldHandle->childObjects(&childObjects);
for (size_t i = 0; i < childObjects.size(); i++)
{ {
if (childObjects[i] == currentPdmObject) if (!isDeletable(item)) continue;
caf::PdmObject* currentPdmObject = dynamic_cast<caf::PdmObject*>(item);
if ( !currentPdmObject) continue;
caf::PdmChildArrayFieldHandle* childArrayFieldHandle = dynamic_cast<caf::PdmChildArrayFieldHandle*>(currentPdmObject->parentField());
if ( !childArrayFieldHandle) continue;
int indexAfter = -1;
std::vector<PdmObjectHandle*> childObjects;
childArrayFieldHandle->childObjects(&childObjects);
for ( size_t i = 0; i < childObjects.size(); i++ )
{ {
indexAfter = static_cast<int>(i); if ( childObjects[i] == currentPdmObject )
{
indexAfter = static_cast<int>(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);
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -34,7 +34,12 @@ CAF_CMD_SOURCE_INIT(RicSummaryCurveSwitchAxisFeature, "RicSummaryCurveSwitchAxis
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RicSummaryCurveSwitchAxisFeature::isCommandEnabled() bool RicSummaryCurveSwitchAxisFeature::isCommandEnabled()
{ {
return true; std::set<RimSummaryCurveFilter*> selectedCurveFilters;
std::set<RimSummaryCurve*> selectedSoloCurves;
RicSummaryCurveSwitchAxisFeature::extractSelectedCurveFiltersAndSoloCurves(&selectedCurveFilters,
&selectedSoloCurves);
return (selectedCurveFilters.size() || selectedSoloCurves.size());
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -42,13 +47,33 @@ bool RicSummaryCurveSwitchAxisFeature::isCommandEnabled()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicSummaryCurveSwitchAxisFeature::onActionTriggered(bool isChecked) void RicSummaryCurveSwitchAxisFeature::onActionTriggered(bool isChecked)
{ {
RimSummaryCurve* summaryCurve = RicSummaryCurveSwitchAxisFeature::selectedSummaryCurve(); std::set<RimSummaryCurveFilter*> selectedCurveFilters;
RimSummaryCurveFilter* summaryCurveFilter = RicSummaryCurveSwitchAxisFeature::selectedSummaryCurveFilter(); std::set<RimSummaryCurve*> selectedSoloCurves;
if (summaryCurve)
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(); RimDefines::PlotAxis plotAxis = summaryCurve->associatedPlotAxis();
if (plotAxis == RimDefines::PLOT_AXIS_LEFT) if ( plotAxis == RimDefines::PLOT_AXIS_LEFT )
{ {
summaryCurve->setPlotAxis(RimDefines::PLOT_AXIS_RIGHT); summaryCurve->setPlotAxis(RimDefines::PLOT_AXIS_RIGHT);
} }
@@ -62,22 +87,7 @@ void RicSummaryCurveSwitchAxisFeature::onActionTriggered(bool isChecked)
RimSummaryPlot* plot = nullptr; RimSummaryPlot* plot = nullptr;
summaryCurve->firstAncestorOrThisOfType(plot); summaryCurve->firstAncestorOrThisOfType(plot);
if (plot) plot->updateAxes(); 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();
} }
} }
@@ -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<RimSummaryCurveFilter*>* selectedCurveFilters,
std::set<RimSummaryCurve*>* selectedSoloCurves)
{ {
std::vector<RimSummaryCurve*> selection;
caf::SelectionManager::instance()->objectsByType(&selection);
return selection.size() > 0 ? selection[0] : nullptr;
}
//-------------------------------------------------------------------------------------------------- selectedSoloCurves->clear();
/// {
//-------------------------------------------------------------------------------------------------- std::vector<RimSummaryCurve*> selection;
RimSummaryCurveFilter* RicSummaryCurveSwitchAxisFeature::selectedSummaryCurveFilter() caf::SelectionManager::instance()->objectsByType(&selection);
{ for (RimSummaryCurve* curve: selection)
std::vector<RimSummaryCurveFilter*> selection; {
caf::SelectionManager::instance()->objectsByType(&selection); selectedSoloCurves->insert(curve);
return selection.size() > 0 ? selection[0] : nullptr; }
} }
selectedCurveFilters->clear();
{
std::vector<RimSummaryCurveFilter*> selection;
caf::SelectionManager::instance()->objectsByType(&selection);
for ( RimSummaryCurveFilter* curveFilter: selection )
{
selectedCurveFilters->insert(curveFilter);
}
}
std::vector<RimSummaryCurve*> 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);
}
}

View File

@@ -20,9 +20,13 @@
#include "cafCmdFeature.h" #include "cafCmdFeature.h"
#include <set>
class RimSummaryCurve; class RimSummaryCurve;
class RimSummaryCurveFilter; class RimSummaryCurveFilter;
//================================================================================================== //==================================================================================================
/// ///
//================================================================================================== //==================================================================================================
@@ -36,6 +40,6 @@ protected:
virtual void setupActionLook( QAction* actionToSetup ) override; virtual void setupActionLook( QAction* actionToSetup ) override;
private: private:
static RimSummaryCurve* selectedSummaryCurve(); static void extractSelectedCurveFiltersAndSoloCurves(std::set<RimSummaryCurveFilter*>* selectedCurveFilters,
static RimSummaryCurveFilter* selectedSummaryCurveFilter(); std::set<RimSummaryCurve*>* selectedSoloCurves);
}; };

View File

@@ -374,9 +374,12 @@ QStringList RimContextCommandBuilder::commandsFromSelection()
{ {
commandIds << "RicExecuteScriptForCasesFeature"; commandIds << "RicExecuteScriptForCasesFeature";
} }
else if (dynamic_cast<RimSummaryCurve*>(uiItem)) else if (dynamic_cast<RimSummaryCurve*>(uiItem) ||
dynamic_cast<RimSummaryCurveFilter*>(uiItem) )
{ {
commandIds << "RicCopyReferencesToClipboardFeature"; commandIds << "RicCopyReferencesToClipboardFeature";
commandIds << "RicSummaryCurveSwitchAxisFeature";
} }
else if (dynamic_cast<RimWellLogCurve*>(uiItem) || else if (dynamic_cast<RimWellLogCurve*>(uiItem) ||
dynamic_cast<RimWellLogTrack*>(uiItem) || dynamic_cast<RimWellLogTrack*>(uiItem) ||
@@ -387,6 +390,11 @@ QStringList RimContextCommandBuilder::commandsFromSelection()
} }
} }
if (uiItems.size() > 1)
{
commandIds << "RicDeleteItemFeature";
}
if (RicToggleItemsFeatureImpl::isToggleCommandsAvailable()) if (RicToggleItemsFeatureImpl::isToggleCommandsAvailable())
{ {
commandIds << "Separator"; commandIds << "Separator";