Commit: 15f08697e752102ecbe8d1a14cae298577196c56
Author: Bastien Montagne
Date:   Fri Sep 11 16:27:42 2015 +0200
Branches: id-remap
https://developer.blender.org/rB15f08697e752102ecbe8d1a14cae298577196c56

Rework our 'space id remapping' code by adding a new 'id_remap' callback to 
SpaceType, and add one for View3D.

Think it's much cleaner this way.

View3D new id_remap only handles camera/ob_center pointers for now, images will 
need some more work I think...

===================================================================

M       source/blender/blenkernel/BKE_screen.h
M       source/blender/editors/include/ED_buttons.h
M       source/blender/editors/include/ED_node.h
M       source/blender/editors/include/ED_outliner.h
M       source/blender/editors/include/ED_view3d.h
M       source/blender/editors/space_buttons/buttons_context.c
M       source/blender/editors/space_buttons/space_buttons.c
M       source/blender/editors/space_node/node_edit.c
M       source/blender/editors/space_node/space_node.c
M       source/blender/editors/space_outliner/outliner_edit.c
M       source/blender/editors/space_outliner/space_outliner.c
M       source/blender/editors/space_view3d/space_view3d.c
M       source/blender/editors/util/ed_util.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_screen.h 
b/source/blender/blenkernel/BKE_screen.h
index 6eb19be..1ee3a23 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -98,6 +98,9 @@ typedef struct SpaceType {
        /* return context data */
        int (*context)(const struct bContext *, const char *, struct 
bContextDataResult *);
 
+       /* Used when we want to replace an ID by another (or NULL). */
+       void (*id_remap)(struct SpaceLink *, const struct ID *, struct ID *);
+
        /* region type definitions */
        ListBase regiontypes;
        
diff --git a/source/blender/editors/include/ED_buttons.h 
b/source/blender/editors/include/ED_buttons.h
index 52ca00d..64c1660 100644
--- a/source/blender/editors/include/ED_buttons.h
+++ b/source/blender/editors/include/ED_buttons.h
@@ -37,6 +37,4 @@ bool ED_texture_context_check_particles(const struct bContext 
*C);
 bool ED_texture_context_check_linestyle(const struct bContext *C);
 bool ED_texture_context_check_others(const struct bContext *C);
 
-void ED_buttons_id_remap(struct SpaceButs *sbuts, const struct ID *old_id, 
struct ID *new_id);
-
 #endif /*  __ED_BUTTONS_H__ */
diff --git a/source/blender/editors/include/ED_node.h 
b/source/blender/editors/include/ED_node.h
index ec72fb4..b02ebeb 100644
--- a/source/blender/editors/include/ED_node.h
+++ b/source/blender/editors/include/ED_node.h
@@ -103,8 +103,6 @@ void ED_node_set_active(struct Main *bmain, struct 
bNodeTree *ntree, struct bNod
 
 void ED_node_composite_job(const struct bContext *C, struct bNodeTree 
*nodetree, struct Scene *scene_owner);
 
-void ED_node_id_remap(struct SpaceNode *snode, const ID *old_id, ID *new_id);
-
 /* node_ops.c */
 void ED_operatormacros_node(void);
 
diff --git a/source/blender/editors/include/ED_outliner.h 
b/source/blender/editors/include/ED_outliner.h
index cdab233..73ee254 100644
--- a/source/blender/editors/include/ED_outliner.h
+++ b/source/blender/editors/include/ED_outliner.h
@@ -27,10 +27,4 @@
 #ifndef __ED_OUTLINER_H__
 #define __ED_OUTLINER_H__
 
-struct ID;
-struct SpaceOops;
-
-/* Used to check whether a given texture context is valid in current context. 
*/
-void ED_outliner_id_remap(struct SpaceOops *so, const struct ID *old_id, 
struct ID *new_id);
-
 #endif /*  __ED_OUTLINER_H__ */
diff --git a/source/blender/editors/include/ED_view3d.h 
b/source/blender/editors/include/ED_view3d.h
index 416e821..74bc2de 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -394,4 +394,6 @@ void ED_view3d_shade_update(struct Main *bmain, struct 
Scene *scene, struct View
 #define V3D_IS_ZBUF(v3d) \
        (((v3d)->flag & V3D_ZBUF_SELECT) && ((v3d)->drawtype > OB_WIRE))
 
+void ED_view3d_id_remap(struct View3D *v3d, const struct ID *old_id, struct ID 
*new_id);
+
 #endif /* __ED_VIEW3D_H__ */
diff --git a/source/blender/editors/space_buttons/buttons_context.c 
b/source/blender/editors/space_buttons/buttons_context.c
index 05316ba..5b03bdd 100644
--- a/source/blender/editors/space_buttons/buttons_context.c
+++ b/source/blender/editors/space_buttons/buttons_context.c
@@ -1180,41 +1180,3 @@ ID *buttons_context_id_path(const bContext *C)
 
        return NULL;
 }
-
-void ED_buttons_id_remap(SpaceButs *sbuts, const ID *old_id, ID *new_id)
-{
-       if (sbuts->pinid == old_id) {
-               sbuts->pinid = new_id;
-               if (new_id == NULL) {
-                       sbuts->flag &= ~SB_PIN_CONTEXT;
-               }
-       }
-
-       if (sbuts->path) {
-               ButsContextPath *path = sbuts->path;
-               int i;
-
-               for (i = 0; i < path->len; i++) {
-                       if (path->ptr[i].id.data == old_id) {
-                               break;
-                       }
-               }
-
-               if (i == path->len) {
-                       /* pass */
-               }
-               else if (new_id == NULL) {
-                       if (i == 0) {
-                               MEM_SAFE_FREE(sbuts->path);
-                       }
-                       else {
-                               memset(&path->ptr[i], 0, sizeof(path->ptr[i]) * 
(path->len - i));
-                               path->len = i;
-                       }
-               }
-               else {
-                       RNA_id_pointer_create(new_id, &path->ptr[i]);
-                       /* TODO: Check path further down remains valid? Or 
nullify it systematically? */
-               }
-       }
-}
diff --git a/source/blender/editors/space_buttons/space_buttons.c 
b/source/blender/editors/space_buttons/space_buttons.c
index e28ad68..cd0cc70 100644
--- a/source/blender/editors/space_buttons/space_buttons.c
+++ b/source/blender/editors/space_buttons/space_buttons.c
@@ -45,6 +45,8 @@
 #include "WM_api.h"
 #include "WM_types.h"
 
+#include "RNA_access.h"
+
 #include "buttons_intern.h"  /* own include */
 
 /* ******************** default callbacks for buttons space ***************** 
*/
@@ -389,6 +391,46 @@ static void buttons_area_listener(bScreen *UNUSED(sc), 
ScrArea *sa, wmNotifier *
                ED_area_tag_redraw(sa);
 }
 
+static void buttons_id_remap(SpaceLink *slink, const ID *old_id, ID *new_id)
+{
+       SpaceButs *sbuts = (SpaceButs *)slink;
+
+       if (sbuts->pinid == old_id) {
+               sbuts->pinid = new_id;
+               if (new_id == NULL) {
+                       sbuts->flag &= ~SB_PIN_CONTEXT;
+               }
+       }
+
+       if (sbuts->path) {
+               ButsContextPath *path = sbuts->path;
+               int i;
+
+               for (i = 0; i < path->len; i++) {
+                       if (path->ptr[i].id.data == old_id) {
+                               break;
+                       }
+               }
+
+               if (i == path->len) {
+                       /* pass */
+               }
+               else if (new_id == NULL) {
+                       if (i == 0) {
+                               MEM_SAFE_FREE(sbuts->path);
+                       }
+                       else {
+                               memset(&path->ptr[i], 0, sizeof(path->ptr[i]) * 
(path->len - i));
+                               path->len = i;
+                       }
+               }
+               else {
+                       RNA_id_pointer_create(new_id, &path->ptr[i]);
+                       /* TODO_REMAP: Check path further down remains valid? 
Or nullify it systematically? */
+               }
+       }
+}
+
 /* only called once, from space/spacetypes.c */
 void ED_spacetype_buttons(void)
 {
@@ -406,7 +448,8 @@ void ED_spacetype_buttons(void)
        st->keymap = buttons_keymap;
        st->listener = buttons_area_listener;
        st->context = buttons_context;
-       
+       st->id_remap = buttons_id_remap;
+
        /* regions: main window */
        art = MEM_callocN(sizeof(ARegionType), "spacetype buttons region");
        art->regionid = RGN_TYPE_WINDOW;
diff --git a/source/blender/editors/space_node/node_edit.c 
b/source/blender/editors/space_node/node_edit.c
index eeacfb5..360087d 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -740,42 +740,6 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, 
bNode *node)
        }
 }
 
-void ED_node_id_remap(SpaceNode *snode, const ID *old_id, ID *new_id)
-{
-       if (GS(old_id->name) == ID_SCE) {
-               if (snode->id == old_id) {
-                       if (new_id == NULL) {
-                               /* nasty DNA logic for SpaceNode:
-                                * ideally should be handled by editor code, 
but would be bad level call
-                                */
-                               bNodeTreePath *path, *path_next;
-                               for (path = snode->treepath.first; path; path = 
path_next) {
-                                       path_next = path->next;
-                                       MEM_freeN(path);
-                               }
-                               BLI_listbase_clear(&snode->treepath);
-
-                               snode->id = NULL;
-                               snode->from = NULL;
-                               snode->nodetree = NULL;
-                               snode->edittree = NULL;
-                       }
-                       else {
-                               /* XXX ????????????? */
-                               printf("WARNING TODO! remapping scene ID in 
node editor has to be written!\n");
-                       }
-               }
-       }
-       else if (GS(old_id->name) == ID_OB) {
-               if (snode->from == old_id) {
-                       if (new_id == NULL) {
-                               snode->flag &= ~SNODE_PIN;
-                       }
-                       snode->from = new_id;
-               }
-       }
-}
-
 void ED_node_post_apply_transform(bContext *UNUSED(C), bNodeTree 
*UNUSED(ntree))
 {
        /* XXX This does not work due to layout functions relying on 
node->block,
diff --git a/source/blender/editors/space_node/space_node.c 
b/source/blender/editors/space_node/space_node.c
index b9b925f..9fdbd2fa 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -821,6 +821,44 @@ static int node_context(const bContext *C, const char 
*member, bContextDataResul
        return 0;
 }
 
+static void node_id_remap(SpaceLink *slink, const ID *old_id, ID *new_id)
+{
+       SpaceNode *snode = (SpaceNode *)slink;
+
+       if (GS(old_id->name) == ID_SCE) {
+               if (snode->id == old_id) {
+                       if (new_id == NULL) {
+                               /* nasty DNA logic for SpaceNode:
+                                * ideally should be handled by editor code, 
but would be bad level call
+                                */
+                               bNodeTreePath *path, *path_next;
+                               for (path = snode->treepath.first; path; path = 
path_next) {
+                                       path_next = path->next;
+                                       MEM_freeN(path);
+                               }
+                               BLI_listbase_clear(&snode->treepath);
+
+                               snode->id = NULL;
+                               snode->from = NULL;
+                               snode->nodetree = NULL;
+                               snode->edittree = NULL;
+                       }
+                       else {
+                               /* TODO_REMAP ????????????? */
+                               printf("WARNING TODO! remapping scene ID in 
node editor has to be written!\n");
+                       }
+               }
+       }
+       else if (GS(old_id->name) == ID_OB) {
+               if (snode->from == old_id) {
+                       if (new_id == NULL) {
+                               snode->flag &= ~SNODE_PIN;
+                       }
+                       snode->from = new_id;
+               }
+       }
+}
+
 /* only called once, from space/spacetypes.c */
 void ED_spacetype_node(void)
 {
@@ -840,6 +878,7 @@ void ED_spacetype_node(void)
        st->refresh = node_area_refresh;
        st->context = node_context;
        st->dropboxes = node_dropboxes;
+       st->id_remap = node_id_remap;
 
        /* regions: main window */
        art = MEM_callocN(sizeof(ARegionType), "spacetype node region");
diff --git a/source/blender/editors/space_outliner/outliner_edit.c 
b/source/blender/editors/space_outliner/outliner_edit.c
index 94b5a18..8742a7c 100644
--- a/source/blender/editors/space_outliner/outliner_edit.c
+++ b/source/blender/editors/space_outliner/outliner_edit.c
@@ -1956,36 +1956,3 @@ void OUTLINER_OT_group_link(wmOperatorType *ot)
        /* properties */
        RNA_def_string(ot->srna, "object", "Object", MAX_ID_NAME, "Object", 
"Target Object");
 }
-
-/******** Utils to clear any ref to freed ID, or update ref to reloaded ID... 
**********/
-
-void ED_outliner_id_remap(SpaceOops *so, const ID *old_id, ID *new_id)
-{
-       /* Some early out checks. */
-       if (!TREESTORE_ID_TYPE(old_id)) {
-               return;  /* ID type is not used by outilner... */
-       }
-
-       if (so->search_tse.id == old_id) {
-               so->search_tse.id = new_id;
-       }
-
-       if (so->treestore) {
-               TreeStoreElem *tselem;
-               BLI_mempool_iter iter;
-               bool changed = false;
-
-               BLI_mempool_iternew(so->treestore, &iter);
-               while ((tselem = BLI_mempool_iterstep(&iter))) {
-                       if (tselem->id == old_id) {
-                               tselem->id = new_id;
-                               changed = true;
-                       }
-               }
-               if (so->treehash && changed) {
-                       /* rebuild hash table, because it depends on ids too */
-                       /* postpone a full re

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to