Adds new virtual method configureCapabilities to PdmFieldHandle

This makes it possible to configure the capabilities of a field one place and avoids duplication.

Extends scripting capabilities by introducing a `dataType` method to `PdmAbstractFieldScriptingCapability`.

This allows the Python generator to retrieve the data type of a field directly from its scriptability, providing a more flexible and extensible way to determine the data type for scripting purposes.
This commit is contained in:
Magne Sjaastad committed 2025-08-25 12:43:36 +02:00
1 parent 25b69f3c14
commit dc2816a91c
12 files changed
+108 -4

No files matched your search

@@ -106,3 +106,11 @@ QStringList PdmAbstractFieldScriptingCapability::enumScriptTexts() const
{
return QStringList();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString PdmAbstractFieldScriptingCapability::dataType() const
{
return {};
}
@@ -69,6 +69,7 @@ public:
static QString helpString( const QString& existingTooltip, const QString& keyword );
virtual QStringList enumScriptTexts() const;
virtual QString dataType() const;
protected:
PdmFieldHandle* m_owner;
@@ -140,7 +140,12 @@ QString caf::PdmPythonGenerator::generate( PdmObjectFactory* factory, std::vecto
auto pdmChildArrayField = dynamic_cast<const PdmChildArrayFieldHandle*>( field );
if ( pdmValueField )
{
QString dataType = PdmPythonGenerator::dataTypeString( field, false );
QString dataType = scriptability->dataType();
if ( dataType.isEmpty() )
{
dataType = PdmPythonGenerator::dataTypeString( field, false );
}
if ( field->xmlCapability()->isVectorField() )
{
dataType = QString( "List[%1]" ).arg( dataType );
@@ -11,10 +11,26 @@ void AppEnum<InheritedDemoObj::TestEnumType>::setUp()
addItem( InheritedDemoObj::T3, "T3", "A B letter" );
setDefault( InheritedDemoObj::T1 );
}
template <>
void AppEnum<MyEnum>::setUp()
{
addItem( MyEnum::T1, "T1", "T1" );
addItem( MyEnum::T2, "T2", "T2" );
addItem( MyEnum::T3, "T3", "T3" );
addItem( MyEnum::T4, "T4", "T4" );
addItem( MyEnum::T5, "T5", "T5" );
addItem( MyEnum::T6, "T6", "T6" );
setDefault( MyEnum::T1 );
}
} // namespace caf
CAF_PDM_SOURCE_INIT( SimpleObj, "SimpleObj" );
namespace caf
{
} // namespace caf
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -28,13 +44,11 @@ SimpleObj::SimpleObj()
CAF_PDM_InitField( &m_dir, "Dir", 123.56, "Direction", "", "Tooltip", "WhatsThis" );
CAF_PDM_InitField( &m_up, "Up", 0.0, "Up value", "", "Tooltip", "WhatsThis" );
CAF_PDM_InitFieldNoDefault( &m_numbers, "Numbers", "Important Numbers", "", "Tooltip", "WhatsThis" );
#if 1
m_proxyDouble.registerSetMethod( this, &SimpleObj::setDoubleMember );
m_proxyDouble.registerGetMethod( this, &SimpleObj::doubleMember );
addUiCapabilityToField( &m_proxyDouble );
addXmlCapabilityToField( &m_proxyDouble );
CAF_PDM_InitFieldNoDefault( &m_proxyDouble, "ProxyDouble", "ProxyDouble" );
#endif
}
//--------------------------------------------------------------------------------------------------
@@ -131,8 +145,9 @@ InheritedDemoObj::InheritedDemoObj()
CAF_PDM_InitScriptableFieldNoDefault( &m_texts, "Texts", "Some words" );
CAF_PDM_InitScriptableFieldNoDefault( &m_numbers, "Numbers", "Some words" );
CAF_PDM_InitScriptableFieldNoDefault( &m_optionalNumber, "OptionalNumber", "Optional Number" );
CAF_PDM_InitFieldNoDefault( &m_testEnumField, "TestEnumValue", "An Enum" );
CAF_PDM_InitScriptableFieldNoDefault( &m_myAppEnum, "MyAppEnumValue", "My App Enum" );
CAF_PDM_InitFieldNoDefault( &m_simpleObjectsField,
"SimpleObjects",
"SimpleObjectsField",
@@ -23,6 +23,43 @@
#include <memory>
/// Demo objects to show the usage of the Pdm system
enum class MyEnum
{
T1,
T2,
T3,
T4,
T5,
T6
};
// This is a specialized class that can be used to implement custom behavior in configureCapabilities
// It is required to have a specialization of PdmFieldScriptingCapability for this class, as the new class
// MyAppEnumField is not known to the template
class MyAppEnumField : public caf::PdmField<caf::AppEnum<MyEnum>>
{
public:
MyAppEnumField() {
};
void configureCapabilities() override {};
};
namespace caf
{
template <>
class PdmFieldScriptingCapability<MyAppEnumField> : public PdmFieldScriptingCapability<caf::PdmField<caf::AppEnum<MyEnum>>>
{
public:
PdmFieldScriptingCapability( MyAppEnumField* field, const QString& fieldName, bool giveOwnership )
: PdmFieldScriptingCapability<caf::PdmField<caf::AppEnum<MyEnum>>>( field, fieldName, giveOwnership )
{
}
QString dataType() const override { return "str"; }
};
}; // namespace caf
class SimpleObj : public caf::PdmObject
{
@@ -62,6 +99,7 @@ public:
caf::PdmField<double> m_doubleField;
caf::PdmField<int> m_intField;
caf::PdmField<QString> m_textField;
MyAppEnumField m_myAppEnum;
caf::PdmChildField<SimpleObj*> m_simpleObjPtrField;
caf::PdmChildField<SimpleObj*> m_simpleObjPtrField2;
@@ -32,6 +32,14 @@ PdmFieldHandle::~PdmFieldHandle()
}
}
//--------------------------------------------------------------------------------------------------
/// This function is called to configure capabilities for the field handle. This can be used to avoid duplicated code
/// when setting options for *.uiCapability() and *.xmlCapability().
//--------------------------------------------------------------------------------------------------
void PdmFieldHandle::configureCapabilities()
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -21,6 +21,8 @@ public:
PdmFieldHandle() { m_ownerObject = nullptr; }
virtual ~PdmFieldHandle();
virtual void configureCapabilities();
QString keyword() const { return m_keyword; }
bool matchesKeyword( const QString& keyword ) const;
PdmObjectHandle* ownerObject();
@@ -110,6 +110,7 @@ class PdmObjectCapability;
\
addXmlCapabilityToField( field ); \
addUiCapabilityToField( field ); \
configureCapabilities( field ); \
registerClassWithField( classKeyword(), field ); \
\
static caf::PdmUiItemInfo objDescr( uiName, QString( iconResourceName ), toolTip, whatsThis, keyword ); \
@@ -139,6 +140,7 @@ class PdmObjectCapability;
\
addXmlCapabilityToField( field ); \
addUiCapabilityToField( field ); \
configureCapabilities( field ); \
registerClassWithField( classKeyword(), field ); \
\
static caf::PdmUiItemInfo objDescr( uiName, QString( iconResourceName ), toolTip, whatsThis, keyword ); \
@@ -97,6 +97,12 @@ void addUiCapabilityToField( FieldType* field )
}
}
template <typename FieldType>
void configureCapabilities( FieldType* field )
{
field->configureCapabilities();
}
} // End of namespace caf
#include "cafInternalPdmUiFieldCapability.inl"
@@ -188,6 +188,12 @@ QList<PdmOptionItemInfo> PdmFieldUiCap<FieldType>::valueOptions() const
m_optionEntryCache = uiObj( m_field->ownerObject() )->calculateValueOptions( this->m_field );
}
// Check if the field can provide value option
if ( m_optionEntryCache.empty() && m_valueOptionsGenerator )
{
m_optionEntryCache = m_valueOptionsGenerator();
}
// If we got no options, use the options defined by the type. Normally only caf::AppEnum type
if ( m_optionEntryCache.empty() )
@@ -235,6 +235,14 @@ void PdmUiFieldHandle::setAttributes( const std::vector<std::pair<QString, QStri
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmUiFieldHandle::setValueOptionsGenerator( const std::function<QList<PdmOptionItemInfo>()>& valueOptionsGenerator )
{
m_valueOptionsGenerator = valueOptionsGenerator;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -38,6 +38,11 @@ public:
std::vector<std::pair<QString, QString>> attributes() const override;
void setAttributes( const std::vector<std::pair<QString, QString>>& attributes ) override;
void setValueOptionsGenerator( const std::function<QList<PdmOptionItemInfo>()>& valueOptionsGenerator );
protected:
std::function<QList<PdmOptionItemInfo>()> m_valueOptionsGenerator;
private:
friend class PdmUiCommandSystemProxy;
friend class CmdFieldChangeExec;