[Bf-blender-cvs] [15f0869] id-remap: Rework our 'space id remapping' code by adding a new 'id_remap' callback to SpaceType, and add one for View3D.

Bastien Montagne noreply at git.blender.org
Fri Sep 11 16:30:02 CEST 2015


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. @@




More information about the Bf-blender-cvs mailing list