Propagate variable changed signal to RicUserDefinedCalculatorUi

- ensure that the UI is updated
- if the grid size is different, set destination case equal to the input variable case
This commit is contained in:
Magne Sjaastad 2023-11-10 08:15:43 +01:00
parent 917fd9b3b5
commit fb890300c5
5 changed files with 50 additions and 14 deletions

View File

@ -25,7 +25,6 @@
#include "cafPdmUiListEditor.h"
#include "cafPdmUiObjectEditorHandle.h"
#include "cafPdmUiPushButtonEditor.h"
#include "cafPdmUiTreeSelectionEditor.h"
CAF_PDM_ABSTRACT_SOURCE_INIT( RicUserDefinedCalculatorUi, "RicUserDefinedCalculator" );
@ -38,7 +37,6 @@ RicUserDefinedCalculatorUi::RicUserDefinedCalculatorUi()
CAF_PDM_InitFieldNoDefault( &m_currentCalculation, "CurrentCalculation", "" );
m_currentCalculation.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN );
// m_currentCalculation.uiCapability()->setUiEditorTypeName(caf::PdmUiTreeSelectionEditor::uiEditorTypeName());
m_currentCalculation.uiCapability()->setUiEditorTypeName( caf::PdmUiListEditor::uiEditorTypeName() );
CAF_PDM_InitFieldNoDefault( &m_newCalculation, "NewCalculation", "New Calculation" );
@ -47,7 +45,7 @@ RicUserDefinedCalculatorUi::RicUserDefinedCalculatorUi()
CAF_PDM_InitFieldNoDefault( &m_deleteCalculation, "DeleteCalculation", "Delete Calculation" );
RicUserDefinedCalculatorUi::assignPushButtonEditor( &m_deleteCalculation );
m_calcContextMenuMgr = std::unique_ptr<RiuCalculationsContextMenuManager>( new RiuCalculationsContextMenuManager() );
m_calcContextMenuMgr = std::make_unique<RiuCalculationsContextMenuManager>();
}
//--------------------------------------------------------------------------------------------------
@ -64,6 +62,8 @@ RimUserDefinedCalculation* RicUserDefinedCalculatorUi::currentCalculation() cons
void RicUserDefinedCalculatorUi::setCurrentCalculation( RimUserDefinedCalculation* calculation )
{
m_currentCalculation = calculation;
connectSignals( m_currentCalculation() );
}
//--------------------------------------------------------------------------------------------------
@ -101,6 +101,7 @@ void RicUserDefinedCalculatorUi::fieldChangedByUi( const caf::PdmFieldHandle* ch
m_newCalculation = false;
m_currentCalculation = calculationCollection()->addCalculation();
connectSignals( m_currentCalculation );
updateConnectedEditors();
}
@ -117,6 +118,10 @@ void RicUserDefinedCalculatorUi::fieldChangedByUi( const caf::PdmFieldHandle* ch
caf::PdmUiObjectEditorHandle::updateUiAllObjectEditors();
}
}
else if ( changedField == &m_currentCalculation && m_currentCalculation() )
{
connectSignals( m_currentCalculation() );
}
}
//--------------------------------------------------------------------------------------------------
@ -126,7 +131,7 @@ void RicUserDefinedCalculatorUi::defineUiOrdering( QString uiConfigName, caf::Pd
{
if ( !m_currentCalculation() && !calculationCollection()->calculations().empty() )
{
m_currentCalculation = calculationCollection()->calculations()[0];
setCurrentCalculation( calculationCollection()->calculations()[0] );
}
{
@ -182,7 +187,7 @@ void RicUserDefinedCalculatorUi::assignPushButtonEditor( caf::PdmFieldHandle* fi
//--------------------------------------------------------------------------------------------------
void RicUserDefinedCalculatorUi::assignPushButtonEditorText( caf::PdmUiEditorAttribute* attribute, const QString& text )
{
caf::PdmUiPushButtonEditorAttribute* attrib = dynamic_cast<caf::PdmUiPushButtonEditorAttribute*>( attribute );
auto* attrib = dynamic_cast<caf::PdmUiPushButtonEditorAttribute*>( attribute );
if ( attrib )
{
attrib->m_buttonText = text;
@ -252,7 +257,7 @@ void RicUserDefinedCalculatorUi::onEditorWidgetsCreated()
for ( const auto& e : m_currentCalculation.uiCapability()->connectedEditors() )
{
caf::PdmUiListEditor* listEditor = dynamic_cast<caf::PdmUiListEditor*>( e );
auto* listEditor = dynamic_cast<caf::PdmUiListEditor*>( e );
if ( !listEditor ) continue;
QWidget* widget = listEditor->editorWidget();
@ -261,3 +266,22 @@ void RicUserDefinedCalculatorUi::onEditorWidgetsCreated()
m_calcContextMenuMgr->attachWidget( widget, this );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicUserDefinedCalculatorUi::onVariableUpdated( const SignalEmitter* emitter )
{
updateConnectedEditors();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicUserDefinedCalculatorUi::connectSignals( RimUserDefinedCalculation* calculation )
{
if ( calculation )
{
calculation->variableUpdated.connect( this, &RicUserDefinedCalculatorUi::onVariableUpdated );
}
}

View File

@ -19,9 +19,11 @@
#pragma once
#include "RiuCalculationsContextMenuManager.h"
#include "cafPdmField.h"
#include "cafPdmObject.h"
#include "cafPdmPtrField.h"
#include <memory>
class RimUserDefinedCalculationCollection;
@ -52,14 +54,16 @@ protected:
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
void defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override;
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override;
void onEditorWidgetsCreated() override;
// TODO : Move to a common caf helper class
static void assignPushButtonEditor( caf::PdmFieldHandle* fieldHandle );
static void assignPushButtonEditorText( caf::PdmUiEditorAttribute* attribute, const QString& text );
private:
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override;
void onEditorWidgetsCreated() override;
void onVariableUpdated( const SignalEmitter* emitter );
void connectSignals( RimUserDefinedCalculation* calculation );
private:
caf::PdmPtrField<RimUserDefinedCalculation*> m_currentCalculation;

View File

@ -295,16 +295,20 @@ void RimGridCalculation::initAfterRead()
//--------------------------------------------------------------------------------------------------
void RimGridCalculation::onVariableUpdated( const SignalEmitter* emitter )
{
if ( m_destinationCase == nullptr )
if ( auto variable = dynamic_cast<const RimGridCalculationVariable*>( emitter ) )
{
auto variable = dynamic_cast<const RimGridCalculationVariable*>( emitter );
if ( variable && variable->eclipseCase() )
if ( auto variableCase = variable->eclipseCase() )
{
m_destinationCase = variable->eclipseCase();
updateConnectedEditors();
if ( !m_destinationCase || !m_destinationCase->isGridSizeEqualTo( variableCase ) )
{
m_destinationCase = variableCase;
}
}
}
updateConnectedEditors();
variableUpdated.send();
}
//--------------------------------------------------------------------------------------------------

View File

@ -42,6 +42,7 @@ CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimUserDefinedCalculation, "RimUserDefinedCalc
///
//--------------------------------------------------------------------------------------------------
RimUserDefinedCalculation::RimUserDefinedCalculation()
: variableUpdated( this )
{
CAF_PDM_InitObject( "RimUserDefinedCalculation", ":/octave.png", "Calculation", "" );

View File

@ -36,6 +36,9 @@ class RimUserDefinedCalculation : public caf::PdmObject
{
CAF_PDM_HEADER_INIT;
public:
caf::Signal<> variableUpdated;
public:
RimUserDefinedCalculation();