From 2b45a9af7ff9b316cda852c6f78133152d0767db Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 14 Feb 2020 15:38:19 +0100 Subject: [PATCH] #5553 AppFwk : Add root in PtrField reference string --- .../cafPdmCore/cafPdmReferenceHelper.cpp | 47 ++++++++++++++----- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmReferenceHelper.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmReferenceHelper.cpp index 9665b8338a..3e615909da 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmReferenceHelper.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmReferenceHelper.cpp @@ -48,6 +48,14 @@ namespace caf { +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString rootIdentifierString() +{ + return "$ROOT$"; +} + //-------------------------------------------------------------------------------------------------- /// @@ -303,9 +311,16 @@ QString PdmReferenceHelper::referenceFromFieldToObject(PdmFieldHandle* fromField QStringList referenceList = referenceFromRootToObjectAsStringList(lastCommonAnchestor, toObj); - for (size_t i = 0; i < levelCountToCommonAnchestor; ++i) + if (idxToLastCommonAnchestor == 0) { - referenceList.push_front(".."); + referenceList.push_front(rootIdentifierString()); + } + else + { + for (size_t i = 0; i < levelCountToCommonAnchestor; ++i) + { + referenceList.push_front(".."); + } } QString completeReference = referenceList.join(" "); @@ -326,19 +341,27 @@ PdmObjectHandle* PdmReferenceHelper::objectFromFieldReference(PdmFieldHandle* fr PdmObjectHandle* lastCommonAnchestor = fromField->ownerObject(); CAF_ASSERT(lastCommonAnchestor); - while (!decodedReference.empty() && decodedReference.front() == "..") + if (!decodedReference.empty() && decodedReference.front() == rootIdentifierString()) { - PdmFieldHandle* parentField = lastCommonAnchestor->parentField(); - if (!parentField) - { - // Error: Relative object reference has an invalid number of parent levels - return nullptr; - } - - lastCommonAnchestor = parentField->ownerObject(); - CAF_ASSERT(lastCommonAnchestor); + lastCommonAnchestor = findRoot(lastCommonAnchestor); decodedReference.pop_front(); } + else + { + while (!decodedReference.empty() && decodedReference.front() == "..") + { + PdmFieldHandle* parentField = lastCommonAnchestor->parentField(); + if (!parentField) + { + // Error: Relative object reference has an invalid number of parent levels + return nullptr; + } + + lastCommonAnchestor = parentField->ownerObject(); + CAF_ASSERT(lastCommonAnchestor); + decodedReference.pop_front(); + } + } return objectFromReferenceStringList(lastCommonAnchestor, decodedReference); }