Fix ADL lookup for cvf pdmToVariant/pdmFromVariant overloads

Move pdmToVariant/pdmFromVariant overloads for cvf::Color3f, Vec3d, Mat4d, and
Mat3d from namespace caf to namespace cvf. Templates in
cafInternalPdmFieldTypeSpecializations.h use "using caf::pdmToVariant" followed
by an unqualified call, so ADL searches the argument's namespace (cvf). With the
overloads only in caf, the default template was selected, causing cvf::Color3f to
be stored raw in a QVariant instead of as QColor — breaking color field editing
and producing QVariant::save warnings.

All call sites now use the unqualified "using caf::pdmXxx; pdmXxx(value)" pattern
so ADL finds the correct overload without depending on cvf:: as a visible prefix.
Add AdlVariantTest to cafPdmCoreColor3fTest.cpp that exercises this exact pattern.

Adds caf::toVariant<T> and caf::fromVariant<T> to cafPdmFieldTraits.h as
thin wrappers that encapsulate the ADL two-step internally. Client code can
now call caf::toVariant(x) directly instead of requiring a using-declaration
at every call site.
This commit is contained in:
Magne Sjaastad authored and GitHub committed 2026-04-08 23:12:49 +02:00
1 parent 700549fb3b
commit e8223485b1
13 files changed
+107 -38

No files matched your search

@@ -94,7 +94,7 @@ void RicApplyUserDefinedCameraFeature::readCameraFromSettings( cvf::Vec3d& eye,
QVariant upVariant = settings.value( RicStoreUserDefinedCameraFeature::upName() );
if ( eyeVariant.isNull() || vrpVariant.isNull() || upVariant.isNull() ) return;
caf::pdmFromVariant( eyeVariant, eye );
caf::pdmFromVariant( vrpVariant, vrp );
caf::pdmFromVariant( upVariant, up );
caf::fromVariant( eyeVariant, eye );
caf::fromVariant( vrpVariant, vrp );
caf::fromVariant( upVariant, up );
}
@@ -104,14 +104,9 @@ void RicStoreUserDefinedCameraFeature::onActionTriggered( bool isChecked )
camera->toLookAt( &eye, &vrp, &up );
QVariant eyeVariant = caf::pdmToVariant( eye );
settings.setValue( RicStoreUserDefinedCameraFeature::eyeName(), eyeVariant );
QVariant vrpVariant = caf::pdmToVariant( vrp );
settings.setValue( RicStoreUserDefinedCameraFeature::viewReferencePointName(), vrpVariant );
QVariant upVariant = caf::pdmToVariant( up );
settings.setValue( RicStoreUserDefinedCameraFeature::upName(), upVariant );
settings.setValue( RicStoreUserDefinedCameraFeature::eyeName(), caf::toVariant( eye ) );
settings.setValue( RicStoreUserDefinedCameraFeature::viewReferencePointName(), caf::toVariant( vrp ) );
settings.setValue( RicStoreUserDefinedCameraFeature::upName(), caf::toVariant( up ) );
RiuMainWindow::instance()->refreshViewActions();
}
@@ -177,7 +177,7 @@ void RicTextAnnotation3dEditor::updatePoint( caf::PdmUiFieldHandle* uiField, con
cvf::Vec3d domainPos = dispXf->transformToDomainCoord( newPos );
domainPos.z() = -domainPos.z();
QVariant originVariant = caf::pdmToVariant( domainPos );
QVariant originVariant = caf::toVariant( domainPos );
caf::PdmUiCommandSystemProxy::instance()->setUiValueToField( uiField, originVariant );
}
@@ -142,7 +142,7 @@ void RicPolylineTarget3dEditor::slotUpdated( const cvf::Vec3d& origin, const cvf
cvf::Vec3d domainOrigin = dispXf->transformToDomainCoord( origin );
domainOrigin.z() = -domainOrigin.z();
QVariant originVariant = caf::pdmToVariant( domainOrigin );
QVariant originVariant = caf::toVariant( domainOrigin );
caf::PdmUiCommandSystemProxy::instance()->setUiValueToField( target->targetPointUiCapability(), originVariant );
}
@@ -520,7 +520,7 @@ void RimWellPathGeometryDef::fieldChangedByUi( const caf::PdmFieldHandle* change
linkedDefs.end() );
cvf::Vec3d oldPos;
caf::pdmFromVariant( oldValue, oldPos );
caf::fromVariant( oldValue, oldPos );
auto delta = m_referencePointUtmXyd() - oldPos;