diff options
-rw-r--r-- | source/blender/blenkernel/BKE_idprop.h | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/idprop.c | 25 |
2 files changed, 30 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_idprop.h b/source/blender/blenkernel/BKE_idprop.h index 9c7460851cb..7981fadccb6 100644 --- a/source/blender/blenkernel/BKE_idprop.h +++ b/source/blender/blenkernel/BKE_idprop.h @@ -82,6 +82,11 @@ void IDP_UnlinkID(struct IDProperty *prop); /*-------- Group Functions -------*/ +/* + replaces all properties with the same name in a destination group from a source group. +*/ +void IDP_ReplaceGroupInGroup(struct IDProperty *dest, struct IDProperty *src); + /*checks if a property with the same name as prop exists, and if so replaces it. Use this to preserve order!*/ void IDP_ReplaceInGroup(struct IDProperty *group, struct IDProperty *prop); diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c index 7e081982f24..ddfb28437a9 100644 --- a/source/blender/blenkernel/intern/idprop.c +++ b/source/blender/blenkernel/intern/idprop.c @@ -386,6 +386,31 @@ IDProperty *IDP_CopyGroup(IDProperty *prop) } /* + replaces all properties with the same name in a destination group from a source group. +*/ +void IDP_ReplaceGroupInGroup(IDProperty *dest, IDProperty *src) +{ + IDProperty *loop, *prop; + for (prop=src->data.group.first; prop; prop=prop->next) { + IDProperty *copy = IDP_CopyProperty(prop); + + for (loop=dest->data.group.first; loop; loop=loop->next) { + if (BSTR_EQ(loop->name, prop->name)) { + if (loop->next) BLI_insertlinkbefore(&dest->data.group, loop->next, copy); + else BLI_addtail(&dest->data.group, copy); + + BLI_remlink(&dest->data.group, loop); + IDP_FreeProperty(loop); + MEM_freeN(loop); + break; + } + } + + dest->len++; + BLI_addtail(&dest->data.group, copy); + } +} +/* replaces a property with the same name in a group, or adds it if the propery doesn't exist. */ |