From 9d66e6195e1ed84d10976d2c31f87bb31ad8d085 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 16 Sep 2024 09:49:22 +0200 Subject: [PATCH] Release adjustments * Use appendMenuItems instead of ContextCommandBuilder * Specify RimEclipseCaseCollection menu features once * Add function to enable up/down arrows for combo box * Guard crash when closing project * Improve UI for grid case ensemble - Create a view for the first case in the ensemble - Show case name in view title - Enable up/down buttons to Eclipse case * Make sure 3D views in grid ensemble are created on project load --- .../Application/RiaApplication.cpp | 16 +++++++ ...reateGridCaseEnsemblesFromFilesFeature.cpp | 42 ++++++++++++++----- ...cCreateGridCaseEnsemblesFromFilesFeature.h | 7 +++- .../Commands/RicNewViewFeature.cpp | 4 +- .../Commands/RicNewViewFeature.h | 2 +- .../Flow/RimWellConnectivityTable.cpp | 9 +--- .../ProjectDataModel/Rim3dView.h | 14 +++---- .../RimContextCommandBuilder.cpp | 19 +-------- .../RimEclipseCaseCollection.cpp | 27 ++++++++++++ .../RimEclipseCaseCollection.h | 5 +++ .../RimEclipseCaseEnsemble.cpp | 11 +++++ .../ProjectDataModel/RimEclipseCaseEnsemble.h | 1 + .../ProjectDataModel/RimEclipseView.cpp | 13 ++++++ .../ProjectDataModel/RimEclipseView.h | 1 + .../Summary/RimSummaryPlotSourceStepping.cpp | 8 ++-- .../RimCustomVfpPlot.cpp | 8 +--- .../RimWellLogCurveCommonDataSource.cpp | 6 +-- .../UserInterface/RiuMenuBarBuildTools.cpp | 15 ++++--- ApplicationLibCode/UserInterface/RiuTools.cpp | 19 ++++++++- ApplicationLibCode/UserInterface/RiuTools.h | 6 +++ .../cafCommand/cafCmdFeatureMenuBuilder.cpp | 23 ++++++++++ .../cafCommand/cafCmdFeatureMenuBuilder.h | 3 ++ 22 files changed, 189 insertions(+), 70 deletions(-) diff --git a/ApplicationLibCode/Application/RiaApplication.cpp b/ApplicationLibCode/Application/RiaApplication.cpp index 976d519475..205e8209c1 100644 --- a/ApplicationLibCode/Application/RiaApplication.cpp +++ b/ApplicationLibCode/Application/RiaApplication.cpp @@ -52,7 +52,9 @@ #include "RimCommandRouter.h" #include "RimCompletionTemplateCollection.h" #include "RimEclipseCaseCollection.h" +#include "RimEclipseCaseEnsemble.h" #include "RimEclipseView.h" +#include "RimEclipseViewCollection.h" #include "RimEnsembleWellLogsCollection.h" #include "RimFaultReactivationModelCollection.h" #include "RimFileWellPath.h" @@ -713,6 +715,20 @@ bool RiaApplication::loadProject( const QString& projectFileName, ProjectLoadAct } } + // Load all grid ensemble views + { + auto gridCaseEnsembles = m_project->activeOilField()->analysisModels()->caseEnsembles.childrenByType(); + + for ( auto gridCaseEnsemble : gridCaseEnsembles ) + { + auto views = gridCaseEnsemble->viewCollection()->views(); + for ( auto view : views ) + { + view->loadDataAndUpdate(); + } + } + } + if ( m_project->viewLinkerCollection() && m_project->viewLinkerCollection()->viewLinker() ) { m_project->viewLinkerCollection()->viewLinker()->updateOverrides(); diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicCreateGridCaseEnsemblesFromFilesFeature.cpp b/ApplicationLibCode/Commands/EclipseCommands/RicCreateGridCaseEnsemblesFromFilesFeature.cpp index daef75bc99..2810064dcd 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/RicCreateGridCaseEnsemblesFromFilesFeature.cpp +++ b/ApplicationLibCode/Commands/EclipseCommands/RicCreateGridCaseEnsemblesFromFilesFeature.cpp @@ -22,13 +22,16 @@ #include "RiaImportEclipseCaseTools.h" #include "RicCreateGridCaseGroupFromFilesFeature.h" +#include "RicNewViewFeature.h" #include "RicRecursiveFileSearchDialog.h" +#include "Rim3dView.h" #include "RimEclipseCaseCollection.h" #include "RimEclipseCaseEnsemble.h" #include "RimEclipseResultCase.h" #include "RimOilField.h" #include "RimProject.h" +#include "RimViewNameConfig.h" #include "cafProgressInfo.h" #include "cafSelectionManager.h" @@ -46,18 +49,35 @@ void RicCreateGridCaseEnsemblesFromFilesFeature::onActionTriggered( bool isCheck QString pathCacheName = "INPUT_FILES"; auto [fileNames, groupByEnsemble] = runRecursiveFileSearchDialog( "Import Grid Ensembles", pathCacheName ); + std::vector gridEnsembles; + if ( groupByEnsemble == RiaEnsembleNameTools::EnsembleGroupingMode::NONE ) { - importSingleGridCaseEnsemble( fileNames ); + gridEnsembles.push_back( importSingleGridCaseEnsemble( fileNames ) ); } else { std::vector groupedByEnsemble = RiaEnsembleNameTools::groupFilesByEnsemble( fileNames, groupByEnsemble ); for ( const QStringList& groupedFileNames : groupedByEnsemble ) { - importSingleGridCaseEnsemble( groupedFileNames ); + gridEnsembles.push_back( importSingleGridCaseEnsemble( groupedFileNames ) ); } } + + if ( gridEnsembles.empty() ) return; + + auto firstEnsemble = gridEnsembles.front(); + if ( firstEnsemble->cases().empty() ) return; + + auto firstCase = firstEnsemble->cases().front(); + if ( !firstCase ) return; + + auto view = RicNewViewFeature::addReservoirView( firstCase, nullptr, firstEnsemble->viewCollection() ); + if ( view ) + { + // Show the case name in the view title, as this is useful information for a grid case ensemble + view->nameConfig()->setAddCaseName( true ); + } } //-------------------------------------------------------------------------------------------------- @@ -66,14 +86,20 @@ void RicCreateGridCaseEnsemblesFromFilesFeature::onActionTriggered( bool isCheck void RicCreateGridCaseEnsemblesFromFilesFeature::setupActionLook( QAction* actionToSetup ) { actionToSetup->setIcon( QIcon( ":/CreateGridCaseGroup16x16.png" ) ); - actionToSetup->setText( "&Create Grid Case Ensembles" ); + actionToSetup->setText( "&Create Grid Case Ensemble" ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicCreateGridCaseEnsemblesFromFilesFeature::importSingleGridCaseEnsemble( const QStringList& fileNames ) +RimEclipseCaseEnsemble* RicCreateGridCaseEnsemblesFromFilesFeature::importSingleGridCaseEnsemble( const QStringList& fileNames ) { + RimProject* project = RimProject::current(); + CVF_ASSERT( project ); + + RimOilField* oilfield = project->activeOilField(); + if ( !oilfield ) return nullptr; + auto eclipseCaseEnsemble = new RimEclipseCaseEnsemble; QString ensembleNameSuggestion = RiaEnsembleNameTools::findSuitableEnsembleName( fileNames, RiaEnsembleNameTools::EnsembleGroupingMode::FMU_FOLDER_STRUCTURE ); @@ -81,12 +107,6 @@ void RicCreateGridCaseEnsemblesFromFilesFeature::importSingleGridCaseEnsemble( c caf::ProgressInfo progInfo( fileNames.size() + 1, "Creating Grid Ensembles" ); - RimProject* project = RimProject::current(); - CVF_ASSERT( project ); - - RimOilField* oilfield = project->activeOilField(); - if ( !oilfield ) return; - for ( auto caseFileName : fileNames ) { auto task = progInfo.task( "Loading files", 1 ); @@ -102,6 +122,8 @@ void RicCreateGridCaseEnsemblesFromFilesFeature::importSingleGridCaseEnsemble( c oilfield->analysisModels()->caseEnsembles.push_back( eclipseCaseEnsemble ); oilfield->analysisModels()->updateConnectedEditors(); + + return eclipseCaseEnsemble; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicCreateGridCaseEnsemblesFromFilesFeature.h b/ApplicationLibCode/Commands/EclipseCommands/RicCreateGridCaseEnsemblesFromFilesFeature.h index a32681e548..653f348c17 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/RicCreateGridCaseEnsemblesFromFilesFeature.h +++ b/ApplicationLibCode/Commands/EclipseCommands/RicCreateGridCaseEnsemblesFromFilesFeature.h @@ -24,6 +24,8 @@ #include +class RimEclipseCaseEnsemble; + //================================================================================================== /// //================================================================================================== @@ -32,7 +34,8 @@ class RicCreateGridCaseEnsemblesFromFilesFeature : public caf::CmdFeature CAF_CMD_HEADER_INIT; RicCreateGridCaseEnsemblesFromFilesFeature() - : m_pathFilter( "*" ) + : caf::CmdFeature() + , m_pathFilter( "*" ) , m_fileNameFilter( "*" ) { } @@ -41,7 +44,7 @@ protected: void onActionTriggered( bool isChecked ) override; void setupActionLook( QAction* actionToSetup ) override; - void importSingleGridCaseEnsemble( const QStringList& fileNames ); + RimEclipseCaseEnsemble* importSingleGridCaseEnsemble( const QStringList& fileNames ); std::pair runRecursiveFileSearchDialog( const QString& dialogTitle, const QString& pathCacheName ); diff --git a/ApplicationLibCode/Commands/RicNewViewFeature.cpp b/ApplicationLibCode/Commands/RicNewViewFeature.cpp index e5ec6a4b9b..2c4baae064 100644 --- a/ApplicationLibCode/Commands/RicNewViewFeature.cpp +++ b/ApplicationLibCode/Commands/RicNewViewFeature.cpp @@ -42,7 +42,7 @@ CAF_CMD_SOURCE_INIT( RicNewViewFeature, "RicNewViewFeature" ); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicNewViewFeature::addReservoirView( RimEclipseCase* eclipseCase, RimGeoMechCase* geomCase, RimEclipseViewCollection* viewColl ) +Rim3dView* RicNewViewFeature::addReservoirView( RimEclipseCase* eclipseCase, RimGeoMechCase* geomCase, RimEclipseViewCollection* viewColl ) { Rim3dView* newView = createReservoirView( eclipseCase, geomCase, viewColl ); @@ -53,6 +53,8 @@ void RicNewViewFeature::addReservoirView( RimEclipseCase* eclipseCase, RimGeoMec // Select the new view to make sure RiaApplication::setActiveReservoirView() is called Riu3DMainWindowTools::selectAsCurrentItem( newView ); } + + return newView; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/RicNewViewFeature.h b/ApplicationLibCode/Commands/RicNewViewFeature.h index acc145bbdb..b3beba0322 100644 --- a/ApplicationLibCode/Commands/RicNewViewFeature.h +++ b/ApplicationLibCode/Commands/RicNewViewFeature.h @@ -37,7 +37,7 @@ class RicNewViewFeature : public caf::CmdFeature CAF_CMD_HEADER_INIT; public: - static void addReservoirView( RimEclipseCase* eclipseCase, RimGeoMechCase* geomCase, RimEclipseViewCollection* viewColl ); + static Rim3dView* addReservoirView( RimEclipseCase* eclipseCase, RimGeoMechCase* geomCase, RimEclipseViewCollection* viewColl ); protected: bool isCommandEnabled() const override; diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellConnectivityTable.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimWellConnectivityTable.cpp index ff0208564f..ca6b6f4bdd 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellConnectivityTable.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellConnectivityTable.cpp @@ -44,6 +44,7 @@ #include "RimWellPlotTools.h" #include "RiuMatrixPlotWidget.h" +#include "RiuTools.h" #include "cafPdmUiComboBoxEditor.h" #include "cafPdmUiPushButtonEditor.h" @@ -530,13 +531,7 @@ void RimWellConnectivityTable::defineEditorAttribute( const caf::PdmFieldHandle* } if ( field == &m_selectedTimeStep || field == &m_selectedFromTimeStep || field == &m_selectedToTimeStep ) { - auto* attrib = dynamic_cast( attribute ); - if ( attrib ) - { - attrib->nextIcon = QIcon( ":/ComboBoxDown.svg" ); - attrib->previousIcon = QIcon( ":/ComboBoxUp.svg" ); - attrib->showPreviousAndNextButtons = true; - } + RiuTools::enableUpDownArrowsForComboBox( attribute ); } } diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dView.h b/ApplicationLibCode/ProjectDataModel/Rim3dView.h index dca057a54b..0a60790f77 100644 --- a/ApplicationLibCode/ProjectDataModel/Rim3dView.h +++ b/ApplicationLibCode/ProjectDataModel/Rim3dView.h @@ -114,9 +114,10 @@ public: virtual RimCase* ownerCase() const = 0; RiuViewer* viewer() const; - void setName( const QString& name ); - QString name() const; - QString autoName() const; + void setName( const QString& name ); + QString name() const; + QString autoName() const; + RimViewNameConfig* nameConfig() const; virtual RiaDefines::View3dContent viewContent() const = 0; @@ -200,10 +201,9 @@ public: protected: static void removeModelByName( cvf::Scene* scene, const cvf::String& modelName ); - virtual void setDefaultView(); - cvf::Mat4d cameraPosition() const; - cvf::Vec3d cameraPointOfInterest() const; - RimViewNameConfig* nameConfig() const; + virtual void setDefaultView(); + cvf::Mat4d cameraPosition() const; + cvf::Vec3d cameraPointOfInterest() const; void disableGridBoxField(); void disablePerspectiveProjectionField(); diff --git a/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp b/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp index 5323aaf512..927648c78b 100644 --- a/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp @@ -46,8 +46,6 @@ #include "RimCustomObjectiveFunction.h" #include "RimCustomObjectiveFunctionCollection.h" #include "RimEclipseCase.h" -#include "RimEclipseCaseCollection.h" -#include "RimEclipseCaseEnsemble.h" #include "RimEclipseCellColors.h" #include "RimEclipseContourMapViewCollection.h" #include "RimEclipseFaultColors.h" @@ -211,18 +209,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() if ( uiItems.size() == 1 ) { - if ( dynamic_cast( firstUiItem ) ) - { - menuBuilder.subMenuStart( "Import" ); - menuBuilder << "RicImportEclipseCaseFeature"; - menuBuilder << "RicImportEclipseCasesFeature"; - menuBuilder << "RicImportInputEclipseCaseFeature"; - menuBuilder << "RicCreateGridCaseGroupFromFilesFeature"; - menuBuilder << "RicCreateGridCaseEnsemblesFromFilesFeature"; - menuBuilder.subMenuEnd(); - menuBuilder << "RicEclipseCaseNewGroupFeature"; - } - else if ( dynamic_cast( firstUiItem ) ) + if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteGeoMechViewsFeature"; menuBuilder << "Separator"; @@ -264,10 +251,6 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "Separator"; menuBuilder << "RicNewStatisticsCaseFeature"; } - else if ( dynamic_cast( firstUiItem ) ) - { - menuBuilder << "RicNewViewForGridEnsembleFeature"; - } else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicImportGeoMechCaseFeature"; diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseCaseCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseCaseCollection.cpp index 99405784ab..1f474e82c7 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseCaseCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseCaseCollection.cpp @@ -33,6 +33,8 @@ #include "RimIdenticalGridCaseGroup.h" #include "RimProject.h" +#include "cafCmdFeatureMenuBuilder.h" + CAF_PDM_SOURCE_INIT( RimEclipseCaseCollection, "ResInsightAnalysisModels" ); //-------------------------------------------------------------------------------------------------- /// @@ -110,6 +112,17 @@ void RimEclipseCaseCollection::removeCaseFromAllGroups( RimEclipseCase* reservoi cases().removeChild( reservoir ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipseCaseCollection::appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const +{ + menuBuilder.subMenuStart( "Import" ); + menuBuilder << importMenuFeatureNames(); + menuBuilder.subMenuEnd(); + menuBuilder << "RicEclipseCaseNewGroupFeature"; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -174,3 +187,17 @@ void RimEclipseCaseCollection::recomputeStatisticsForAllCaseGroups() } } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QStringList RimEclipseCaseCollection::importMenuFeatureNames() +{ + return { "RicImportEclipseCaseFeature", + "RicImportEclipseCasesFeature", + "RicImportEclipseCaseTimeStepFilterFeature", + "RicImportInputEclipseCaseFeature", + "Separator", + "RicCreateGridCaseGroupFromFilesFeature", + "RicCreateGridCaseEnsemblesFromFilesFeature" }; +} diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseCaseCollection.h b/ApplicationLibCode/ProjectDataModel/RimEclipseCaseCollection.h index e204d454d3..2773f09b37 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseCaseCollection.h +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseCaseCollection.h @@ -59,6 +59,11 @@ public: void recomputeStatisticsForAllCaseGroups(); + static QStringList importMenuFeatureNames(); + +private: + void appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const override; + private: RigMainGrid* registerCaseInGridCollection( RimEclipseCase* rimEclipseCase ); cvf::ref m_gridCollection; diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseCaseEnsemble.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseCaseEnsemble.cpp index 65fb04e8d5..f00e47e3d8 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseCaseEnsemble.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseCaseEnsemble.cpp @@ -23,6 +23,7 @@ #include "RimEclipseView.h" #include "RimEclipseViewCollection.h" +#include "cafCmdFeatureMenuBuilder.h" #include "cafPdmFieldScriptingCapability.h" #include "cafPdmObjectScriptingCapability.h" @@ -104,6 +105,8 @@ bool RimEclipseCaseEnsemble::contains( RimEclipseCase* reservoir ) const //-------------------------------------------------------------------------------------------------- std::vector RimEclipseCaseEnsemble::cases() const { + if ( !m_caseCollection ) return {}; + return m_caseCollection->reservoirs.childrenByType(); } @@ -160,6 +163,14 @@ void RimEclipseCaseEnsemble::fieldChangedByUi( const caf::PdmFieldHandle* change } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipseCaseEnsemble::appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const +{ + menuBuilder << "RicNewViewForGridEnsembleFeature"; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseCaseEnsemble.h b/ApplicationLibCode/ProjectDataModel/RimEclipseCaseEnsemble.h index 4104428af1..2e723505e8 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseCaseEnsemble.h +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseCaseEnsemble.h @@ -57,6 +57,7 @@ public: protected: QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + void appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const override; private: caf::PdmField m_groupId; diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp index f85ffd017f..b6a3e4f829 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp @@ -101,6 +101,7 @@ #include "Riu3dSelectionManager.h" #include "RiuMainWindow.h" +#include "RiuTools.h" #include "RiuViewer.h" #include "RivReservoirSimWellsPartMgr.h" @@ -118,6 +119,7 @@ #include "cafOverlayScalarMapperLegend.h" #include "cafPdmFieldScriptingCapability.h" #include "cafPdmObjectScriptingCapability.h" +#include "cafPdmUiComboBoxEditor.h" #include "cafPdmUiTreeOrdering.h" #include "cvfDrawable.h" @@ -2084,6 +2086,17 @@ QList RimEclipseView::calculateValueOptions( const caf:: return RimGridView::calculateValueOptions( fieldNeedingOptions ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipseView::defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) +{ + if ( field == &m_eclipseCase ) + { + RiuTools::enableUpDownArrowsForComboBox( attribute ); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseView.h b/ApplicationLibCode/ProjectDataModel/RimEclipseView.h index 9c65dd3738..4068b8a4bc 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseView.h +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseView.h @@ -187,6 +187,7 @@ protected: virtual std::set allVisibleFaultGeometryTypes() const; QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; + void defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override; private: QString createAutoName() const override; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp index c7d7f5ee9d..0a6bbcee57 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp @@ -40,6 +40,7 @@ #include "RimSummaryPlotControls.h" #include "RiuPlotMainWindow.h" +#include "RiuTools.h" #include "cafPdmUiComboBoxEditor.h" #include "cafPdmUiItem.h" @@ -955,15 +956,12 @@ void RimSummaryPlotSourceStepping::defineEditorAttribute( const caf::PdmFieldHan } else { + RiuTools::enableUpDownArrowsForComboBox( attribute ); + QString nextText = RimSummaryPlotControls::nextStepKeyText(); QString prevText = RimSummaryPlotControls::prevStepKeyText(); myAttr->nextButtonText = "Next (" + nextText + ")"; myAttr->prevButtonText = "Previous (" + prevText + ")"; - - myAttr->nextIcon = QIcon( ":/ComboBoxDown.svg" ); - myAttr->previousIcon = QIcon( ":/ComboBoxUp.svg" ); - - myAttr->showPreviousAndNextButtons = true; } } diff --git a/ApplicationLibCode/ProjectDataModel/VerticalFlowPerformance/RimCustomVfpPlot.cpp b/ApplicationLibCode/ProjectDataModel/VerticalFlowPerformance/RimCustomVfpPlot.cpp index a2920a4e90..81135fe3b6 100644 --- a/ApplicationLibCode/ProjectDataModel/VerticalFlowPerformance/RimCustomVfpPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/VerticalFlowPerformance/RimCustomVfpPlot.cpp @@ -49,6 +49,7 @@ #include "RiuQwtPlotWheelZoomer.h" #include "RiuQwtPlotWidget.h" #include "RiuQwtPlotZoomer.h" +#include "RiuTools.h" #include "cafColorTable.h" #include "cafPdmUiComboBoxEditor.h" @@ -1366,12 +1367,7 @@ void RimCustomVfpPlot::defineEditorAttribute( const caf::PdmFieldHandle* field, if ( field == &m_mainDataSource ) { - if ( auto* myAttr = dynamic_cast( attribute ) ) - { - myAttr->showPreviousAndNextButtons = true; - myAttr->nextIcon = QIcon( ":/ComboBoxDown.svg" ); - myAttr->previousIcon = QIcon( ":/ComboBoxUp.svg" ); - } + RiuTools::enableUpDownArrowsForComboBox( attribute ); } } diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.cpp index 84d557d059..720d35c8bc 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.cpp @@ -45,6 +45,8 @@ #include "RimWellPath.h" #include "RimWellPathCollection.h" +#include "RiuTools.h" + #include "cafPdmUiCheckBoxEditor.h" #include "cafPdmUiCheckBoxTristateEditor.h" #include "cafPdmUiComboBoxEditor.h" @@ -1083,9 +1085,7 @@ void RimWellLogCurveCommonDataSource::defineEditorAttribute( const caf::PdmField if ( field == &m_case || field == &m_summaryCase || field == &m_simWellName || field == &m_wellPath || field == &m_timeStep || field == &m_rftTimeStep || field == &m_rftSegmentBranchIndex || field == &m_rftWellName ) { - myAttr->showPreviousAndNextButtons = true; - myAttr->nextIcon = QIcon( ":/ComboBoxDown.svg" ); - myAttr->previousIcon = QIcon( ":/ComboBoxUp.svg" ); + RiuTools::enableUpDownArrowsForComboBox( attribute ); } QString modifierText; diff --git a/ApplicationLibCode/UserInterface/RiuMenuBarBuildTools.cpp b/ApplicationLibCode/UserInterface/RiuMenuBarBuildTools.cpp index a658e219c9..ad406ff217 100644 --- a/ApplicationLibCode/UserInterface/RiuMenuBarBuildTools.cpp +++ b/ApplicationLibCode/UserInterface/RiuMenuBarBuildTools.cpp @@ -18,13 +18,16 @@ #include "RiuMenuBarBuildTools.h" -#include "cafCmdFeatureManager.h" - -#include "cvfAssert.h" +#include "RimEclipseCaseCollection.h" #include "RiuToolTipMenu.h" #include "RiuTools.h" +#include "cafCmdFeatureManager.h" +#include "cafCmdFeatureMenuBuilder.h" + +#include "cvfAssert.h" + #include #include #include @@ -113,11 +116,7 @@ void RiuMenuBarBuildTools::addImportMenuWithActions( QObject* parent, QMenu* men QMenu* importMenu = menu->addMenu( "&Import" ); QMenu* importEclipseMenu = importMenu->addMenu( QIcon( ":/Case48x48.png" ), "Eclipse Cases" ); - importEclipseMenu->addAction( cmdFeatureMgr->action( "RicImportEclipseCaseFeature" ) ); - importEclipseMenu->addAction( cmdFeatureMgr->action( "RicImportEclipseCasesFeature" ) ); - importEclipseMenu->addAction( cmdFeatureMgr->action( "RicImportEclipseCaseTimeStepFilterFeature" ) ); - importEclipseMenu->addAction( cmdFeatureMgr->action( "RicImportInputEclipseCaseFeature" ) ); - importEclipseMenu->addAction( cmdFeatureMgr->action( "RicCreateGridCaseGroupFromFilesFeature" ) ); + caf::CmdFeatureMenuBuilder::appendToMenu( importEclipseMenu, RimEclipseCaseCollection::importMenuFeatureNames() ); QMenu* importRoffMenu = importMenu->addMenu( QIcon( ":/Case48x48.png" ), "Roff Grid Models" ); importRoffMenu->addAction( cmdFeatureMgr->action( "RicImportRoffCaseFeature" ) ); diff --git a/ApplicationLibCode/UserInterface/RiuTools.cpp b/ApplicationLibCode/UserInterface/RiuTools.cpp index a1359664df..5298f35fd0 100644 --- a/ApplicationLibCode/UserInterface/RiuTools.cpp +++ b/ApplicationLibCode/UserInterface/RiuTools.cpp @@ -18,8 +18,10 @@ #include "RiuTools.h" -#include "QMenu" -#include "QObject" +#include "cafPdmUiComboBoxEditor.h" + +#include +#include //-------------------------------------------------------------------------------------------------- /// @@ -48,3 +50,16 @@ void RiuTools::enableAllActionsOnShow( QObject* object, QMenu* menu ) } ); } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuTools::enableUpDownArrowsForComboBox( caf::PdmUiEditorAttribute* attribute ) +{ + if ( auto attrib = dynamic_cast( attribute ) ) + { + attrib->nextIcon = QIcon( ":/ComboBoxDown.svg" ); + attrib->previousIcon = QIcon( ":/ComboBoxUp.svg" ); + attrib->showPreviousAndNextButtons = true; + } +} diff --git a/ApplicationLibCode/UserInterface/RiuTools.h b/ApplicationLibCode/UserInterface/RiuTools.h index 3f3e416a71..b4b6909322 100644 --- a/ApplicationLibCode/UserInterface/RiuTools.h +++ b/ApplicationLibCode/UserInterface/RiuTools.h @@ -23,8 +23,14 @@ class QMenu; class QObject; +namespace caf +{ +class PdmUiEditorAttribute; +} + namespace RiuTools { Qt::WindowFlags defaultDialogFlags(); void enableAllActionsOnShow( QObject* object, QMenu* menu ); +void enableUpDownArrowsForComboBox( caf::PdmUiEditorAttribute* attribute ); } // end namespace RiuTools diff --git a/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.cpp b/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.cpp index 5b5702c0ee..66191bfd71 100644 --- a/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.cpp +++ b/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.cpp @@ -77,6 +77,19 @@ CmdFeatureMenuBuilder& CmdFeatureMenuBuilder::operator<<( const QString& command return *this; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +CmdFeatureMenuBuilder& CmdFeatureMenuBuilder::operator<<( const QStringList& commandIds ) +{ + for ( const QString& commandId : commandIds ) + { + *this << commandId; + } + + return *this; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -228,6 +241,16 @@ void CmdFeatureMenuBuilder::appendToMenu( QMenu* menu ) } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void CmdFeatureMenuBuilder::appendToMenu( QMenu* menu, const QStringList& commandIds ) +{ + CmdFeatureMenuBuilder builder; + builder << commandIds; + builder.appendToMenu( menu ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.h b/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.h index be06556204..d7b7c300de 100644 --- a/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.h +++ b/Fwk/AppFwk/cafCommand/cafCmdFeatureMenuBuilder.h @@ -58,6 +58,7 @@ public: virtual ~CmdFeatureMenuBuilder(); CmdFeatureMenuBuilder& operator<<( const QString& commandIdOrSeparator ); + CmdFeatureMenuBuilder& operator<<( const QStringList& commandIdOrSeparators ); CmdFeatureMenuBuilder& addCmdFeature( const QString commandId, const QString& customUiText = "" ); CmdFeatureMenuBuilder& addCmdFeatureWithUserData( const QString commandId, const QString& customUiText, const QVariant& userData ); @@ -69,6 +70,8 @@ public: void appendToMenu( QMenu* menu ); + static void appendToMenu( QMenu* menu, const QStringList& commandIds ); + bool isCmdFeatureAdded( const QString& commandId ); size_t itemCount() const;