Fix T51243: Delete Globally won't work with Datablock ID Properties.
authorBastien Montagne <montagne29@wanadoo.fr>
Wed, 19 Apr 2017 20:07:57 +0000 (22:07 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Wed, 19 Apr 2017 20:07:57 +0000 (22:07 +0200)
That's a quick hack to address that specific case, new pointer IDProp
actually enlights a generic problem - datablocks using themselves - which
is not really handled by current code, would consider this not-so-urgent
TODO though.

source/blender/editors/object/object_add.c

index 20523264cd950de636b73aff90f84c7e3141073b..b278d6e1e87dde2e7d609c03e17c9dce30b65b87 100644 (file)
@@ -1154,7 +1154,21 @@ static int object_delete_exec(bContext *C, wmOperator *op)
                                base->object->id.name + 2, scene->id.name + 2);
                        continue;
                }
+
+               /* This is sort of a quick hack to address T51243 - Proper thing to do here would be to nuke most of all this
+                * custom scene/object/base handling, and use generic lib remap/query for that.
+                * But this is for later (aka 2.8, once layers & co are settled and working).
+                */
+               if (use_global && base->object->id.lib == NULL) {
+                       /* We want to nuke the object, let's nuke it the easy way (not for linked data though)... */
+                       BKE_libblock_delete(bmain, &base->object->id);
+                       changed = true;
+                       continue;
+               }
+
                /* remove from Grease Pencil parent */
+               /* XXX This is likely not correct? Will also remove parent from grease pencil from other scenes,
+                *     even when use_global is false... */
                for (bGPdata *gpd = bmain->gpencil.first; gpd; gpd = gpd->id.next) {
                        for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
                                if (gpl->parent != NULL) {