diff --git a/ApplicationLibCode/Commands/ToolCommands/RicAddFieldToQuickAccessFeature.cpp b/ApplicationLibCode/Commands/ToolCommands/RicAddFieldToQuickAccessFeature.cpp index c0a7184eb0..713072508c 100644 --- a/ApplicationLibCode/Commands/ToolCommands/RicAddFieldToQuickAccessFeature.cpp +++ b/ApplicationLibCode/Commands/ToolCommands/RicAddFieldToQuickAccessFeature.cpp @@ -25,6 +25,8 @@ #include "Riu3DMainWindowTools.h" +#include "cafSelectionManagerTools.h" + #include CAF_CMD_SOURCE_INIT( RicAddFieldToQuickAccessFeature, "RicAddFieldToQuickAccessFeature" ); @@ -42,7 +44,9 @@ void RicAddFieldToQuickAccessFeature::onActionTriggered( bool isChecked ) RimFieldReference fieldRef; fieldRef.setObject( firstObject ); - caf::PdmUiPropertyViewDialog propertyDialog( Riu3DMainWindowTools::mainWindowWidget(), &fieldRef, "Select Field", "" ); + caf::PdmUiPropertyViewDialog propertyDialog( Riu3DMainWindowTools::mainWindowWidget(), &fieldRef, "Pin Field to Quick Access", "" ); + propertyDialog.setWindowIcon( QIcon( ":/pin.svg" ) ); + if ( propertyDialog.exec() == QDialog::Accepted ) { auto field = fieldRef.field(); diff --git a/ApplicationLibCode/ProjectDataModel/RimFieldReference.cpp b/ApplicationLibCode/ProjectDataModel/RimFieldReference.cpp index bcddbd466e..0cd182f0cd 100644 --- a/ApplicationLibCode/ProjectDataModel/RimFieldReference.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimFieldReference.cpp @@ -28,7 +28,7 @@ CAF_PDM_SOURCE_INIT( RimFieldReference, "RimFieldReference" ); RimFieldReference::RimFieldReference() { CAF_PDM_InitFieldNoDefault( &m_object, "Object", "Object" ); - CAF_PDM_InitFieldNoDefault( &m_fieldName, "FieldName", "FieldName" ); + CAF_PDM_InitFieldNoDefault( &m_fieldKeyword, "FieldKeyword", "Field Keyword" ); } //-------------------------------------------------------------------------------------------------- @@ -38,10 +38,10 @@ void RimFieldReference::setObject( caf::PdmObject* object ) { m_object = object; - std::vector fieldNames = RimFieldReference::fieldNames( object ); - if ( !fieldNames.empty() ) + auto keywordAndNames = RimFieldReference::fieldKeywordAndNames( object ); + if ( !keywordAndNames.empty() ) { - m_fieldName = fieldNames[0]; + m_fieldKeyword = keywordAndNames[0].first; } } @@ -61,27 +61,67 @@ void RimFieldReference::setField( caf::PdmFieldHandle* field ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimFieldReference::fieldNames( caf::PdmObject* object ) +std::vector> RimFieldReference::fieldKeywordAndNames( caf::PdmObject* object ) { - std::vector names; + std::vector> names; if ( object ) { - auto allFields = object->fields(); - for ( auto field : allFields ) + // Get the fields for the current uiOrdering. Calling object->fields() will not work as it will return all fields. + caf::PdmUiOrdering uiOrdering; + object->uiOrdering( "", uiOrdering ); + + std::vector fields; + for ( auto item : uiOrdering.uiItems() ) { - names.push_back( field->keyword() ); + findFieldsRecursively( item, fields ); + } + + for ( auto item : fields ) + { + if ( auto field = dynamic_cast( item ) ) + { + auto text = field->keyword(); + + if ( auto uiCapability = field->uiCapability() ) + { + text = uiCapability->uiName(); + } + + names.push_back( { field->keyword(), text } ); + } } } return names; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimFieldReference::findFieldsRecursively( caf::PdmUiItem* object, std::vector& fields ) +{ + if ( auto uiFieldHandle = dynamic_cast( object ) ) + { + if ( uiFieldHandle->fieldHandle() ) fields.push_back( uiFieldHandle->fieldHandle() ); + } + + if ( auto group = dynamic_cast( object ) ) + { + for ( auto child : group->uiItems() ) + { + findFieldsRecursively( child, fields ); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimFieldReference::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { + uiOrdering.add( &m_object ); + uiOrdering.add( &m_fieldKeyword ); } //-------------------------------------------------------------------------------------------------- @@ -91,12 +131,12 @@ QList RimFieldReference::calculateValueOptions( const ca { QList options; - if ( fieldNeedingOptions == &m_fieldName ) + if ( fieldNeedingOptions == &m_fieldKeyword ) { - auto fieldNames = RimFieldReference::fieldNames( m_object ); - for ( const auto& name : fieldNames ) + auto keywordAndNames = RimFieldReference::fieldKeywordAndNames( m_object ); + for ( const auto& [keyword, name] : keywordAndNames ) { - options.push_back( caf::PdmOptionItemInfo( name, name ) ); + options.push_back( caf::PdmOptionItemInfo( name, keyword ) ); } } else if ( fieldNeedingOptions == &m_object ) @@ -129,7 +169,7 @@ caf::PdmFieldHandle* RimFieldReference::field() const { if ( !m_object() ) return nullptr; - return m_object->findField( m_fieldName() ); + return m_object->findField( m_fieldKeyword() ); } //-------------------------------------------------------------------------------------------------- @@ -153,6 +193,6 @@ void RimFieldReference::setObjectsForSelection( const std::vector fieldNames( caf::PdmObject* object ); + static std::vector> fieldKeywordAndNames( caf::PdmObject* object ); + static void findFieldsRecursively( caf::PdmUiItem* object, std::vector& fields ); private: caf::PdmPtrField m_object; - caf::PdmField m_fieldName; + caf::PdmField m_fieldKeyword; std::vector m_objectsForSelection; };