Merge branch 'master' into blender2.8
[blender.git] / source / blender / blenkernel / intern / idprop.c
index a224ef1e212fa4b2f884a58c6ce8479c472ef158..b3b5afa88a950b6b9f6a73bd5b9f8971715eace3 100644 (file)
@@ -476,6 +476,7 @@ static IDProperty *IDP_CopyGroup(const IDProperty *prop, const int flag)
        BLI_assert(prop->type == IDP_GROUP);
        newp = idp_generic_copy(prop, flag);
        newp->len = prop->len;
+       newp->subtype = prop->subtype;
 
        for (link = prop->data.group.first; link; link = link->next) {
                BLI_addtail(&newp->data.group, IDP_CopyProperty_ex(link, flag));
@@ -602,8 +603,9 @@ void IDP_ReplaceInGroup(IDProperty *group, IDProperty *prop)
 
 /**
  * If a property is missing in \a dest, add it.
+ * Do it recursively.
  */
-void IDP_MergeGroup(IDProperty *dest, const IDProperty *src, const bool do_overwrite)
+void IDP_MergeGroup_ex(IDProperty *dest, const IDProperty *src, const bool do_overwrite, const int flag)
 {
        IDProperty *prop;
 
@@ -612,14 +614,30 @@ void IDP_MergeGroup(IDProperty *dest, const IDProperty *src, const bool do_overw
 
        if (do_overwrite) {
                for (prop = src->data.group.first; prop; prop = prop->next) {
-                       IDProperty *copy = IDP_CopyProperty(prop);
+                       if (prop->type == IDP_GROUP) {
+                               IDProperty *prop_exist = IDP_GetPropertyFromGroup(dest, prop->name);
+
+                               if (prop_exist != NULL) {
+                                       IDP_MergeGroup_ex(prop_exist, prop, do_overwrite, flag);
+                                       continue;
+                               }
+                       }
+
+                       IDProperty *copy = IDP_CopyProperty_ex(prop, flag);
                        IDP_ReplaceInGroup(dest, copy);
                }
        }
        else {
                for (prop = src->data.group.first; prop; prop = prop->next) {
-                       if (IDP_GetPropertyFromGroup(dest, prop->name) == NULL) {
-                               IDProperty *copy = IDP_CopyProperty(prop);
+                       IDProperty *prop_exist = IDP_GetPropertyFromGroup(dest, prop->name);
+                       if (prop_exist != NULL) {
+                               if (prop->type == IDP_GROUP) {
+                                       IDP_MergeGroup_ex(prop_exist, prop, do_overwrite, flag);
+                                       continue;
+                               }
+                       }
+                       else {
+                               IDProperty *copy = IDP_CopyProperty_ex(prop, flag);
                                dest->len++;
                                BLI_addtail(&dest->data.group, copy);
                        }
@@ -627,6 +645,15 @@ void IDP_MergeGroup(IDProperty *dest, const IDProperty *src, const bool do_overw
        }
 }
 
+/**
+ * If a property is missing in \a dest, add it.
+ * Do it recursively.
+ */
+void IDP_MergeGroup(IDProperty *dest, const IDProperty *src, const bool do_overwrite)
+{
+       IDP_MergeGroup_ex(dest, src, do_overwrite, 0);
+}
+
 /**
  * This function has a sanity check to make sure ID properties with the same name don't
  * get added to the group.
@@ -1068,6 +1095,17 @@ void IDP_ClearProperty(IDProperty *prop)
        prop->len = prop->totallen = 0;
 }
 
+void IDP_Reset(IDProperty *prop, const IDProperty *reference)
+{
+       if (prop == NULL) {
+               return;
+       }
+       IDP_ClearProperty(prop);
+       if (reference != NULL) {
+               IDP_MergeGroup(prop, reference, true);
+       }
+}
+
 /** \} */
 
 /* We could write a C version, see: idprop_py_api.c */