[Bf-blender-cvs] [8f496e7] id-remap: Add remaining missing id_remap editors' callbacks.

Bastien Montagne noreply at git.blender.org
Sat Sep 12 17:15:54 CEST 2015


Commit: 8f496e7ebf1c3b513565292ff6c4a674294f3a7d
Author: Bastien Montagne
Date:   Sat Sep 12 17:15:06 2015 +0200
Branches: id-remap
https://developer.blender.org/rB8f496e7ebf1c3b513565292ff6c4a674294f3a7d

Add remaining missing id_remap editors' callbacks.

This is far from being done though... :/

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

M	source/blender/blenkernel/intern/library.c
M	source/blender/editors/space_buttons/space_buttons.c
M	source/blender/editors/space_clip/space_clip.c
M	source/blender/editors/space_image/space_image.c
M	source/blender/editors/space_logic/space_logic.c
M	source/blender/editors/space_node/space_node.c
M	source/blender/editors/space_sequencer/space_sequencer.c
M	source/blender/editors/space_text/space_text.c
M	source/blender/makesrna/intern/rna_ID.c

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

diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 5aaeb42..5ec85d3 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -965,7 +965,8 @@ void BKE_libblock_remap(Main *bmain, ID *old_id, ID *new_id)
 		free_notifier_reference_cb(old_id);
 	}
 
-	/* We assume editors do not hold references to their IDs... */
+	/* We assume editors do not hold references to their IDs... This is false in some cases
+	 * (Image is especially tricky here), editors' code is to handle refcound (id->us) itself then. */
 	if (remap_editor_id_reference_cb) {
 		remap_editor_id_reference_cb(old_id, new_id);
 	}
diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c
index 83c9663..b546282 100644
--- a/source/blender/editors/space_buttons/space_buttons.c
+++ b/source/blender/editors/space_buttons/space_buttons.c
@@ -429,6 +429,8 @@ static void buttons_id_remap(SpaceLink *slink, ID *old_id, ID *new_id)
 			/* TODO_REMAP: Check path further down remains valid? Or nullify it systematically? */
 		}
 	}
+
+	/* TODO_REMAP: sbuts->texuser ? */
 }
 
 /* only called once, from space/spacetypes.c */
diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c
index f119fe2..90d6c73 100644
--- a/source/blender/editors/space_clip/space_clip.c
+++ b/source/blender/editors/space_clip/space_clip.c
@@ -45,6 +45,7 @@
 
 #include "BKE_context.h"
 #include "BKE_screen.h"
+#include "BKE_library.h"
 #include "BKE_movieclip.h"
 #include "BKE_tracking.h"
 
@@ -1512,6 +1513,18 @@ static void clip_properties_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(s
 
 /********************* registration ********************/
 
+static void clip_id_remap(SpaceLink *slink, ID *old_id, ID *new_id)
+{
+	SpaceClip *sclip = (SpaceClip *)slink;
+
+	if ((ID *)sclip->clip == old_id) {
+		sclip->clip = (MovieClip *)new_id;
+		id_us_min(old_id);
+		id_us_plus(new_id);
+	}
+}
+
+
 /* only called once, from space/spacetypes.c */
 void ED_spacetype_clip(void)
 {
@@ -1531,6 +1544,7 @@ void ED_spacetype_clip(void)
 	st->context = clip_context;
 	st->dropboxes = clip_dropboxes;
 	st->refresh = clip_refresh;
+	st->id_remap = clip_id_remap;
 
 	/* regions: main window */
 	art = MEM_callocN(sizeof(ARegionType), "spacetype clip region");
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index 930a626..b4055d4 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -28,6 +28,7 @@
  *  \ingroup spimage
  */
 
+#include "DNA_gpencil_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_mask_types.h"
 #include "DNA_meshdata_types.h"
@@ -985,6 +986,13 @@ static void image_id_remap(SpaceLink *slink, ID *old_id, ID *new_id)
 
 	if ((ID *)simg->image == old_id) {
 		simg->image = (Image *)new_id;
+		/* TODO_REMAP this does not work well. */
+		id_us_min(old_id);
+		id_us_plus(new_id);
+	}
+
+	if ((ID *)simg->gpd == old_id) {
+		simg->gpd = (bGPdata *)new_id;
 		id_us_min(old_id);
 		id_us_plus(new_id);
 	}
diff --git a/source/blender/editors/space_logic/space_logic.c b/source/blender/editors/space_logic/space_logic.c
index 34a5fee..2b63c5e 100644
--- a/source/blender/editors/space_logic/space_logic.c
+++ b/source/blender/editors/space_logic/space_logic.c
@@ -38,7 +38,10 @@
 #include "BLI_blenlib.h"
 #include "BLI_utildefines.h"
 
+#include "DNA_gpencil_types.h"
+
 #include "BKE_context.h"
+#include "BKE_library.h"
 #include "BKE_screen.h"
 
 #include "ED_space_api.h"
@@ -300,6 +303,17 @@ static void logic_header_area_draw(const bContext *C, ARegion *ar)
 
 /**************************** spacetype *****************************/
 
+static void logic_id_remap(SpaceLink *slink, ID *old_id, ID *new_id)
+{
+	SpaceLogic *slog = (SpaceLogic *)slink;
+
+	if ((ID *)slog->gpd == old_id) {
+		slog->gpd = (bGPdata *)new_id;
+		id_us_min(old_id);
+		id_us_plus(new_id);
+	}
+}
+
 /* only called once, from space/spacetypes.c */
 void ED_spacetype_logic(void)
 {
@@ -317,7 +331,8 @@ void ED_spacetype_logic(void)
 	st->keymap = logic_keymap;
 	st->refresh = logic_refresh;
 	st->context = logic_context;
-	
+	st->id_remap = logic_id_remap;
+
 	/* regions: main window */
 	art = MEM_callocN(sizeof(ARegionType), "spacetype logic region");
 	art->regionid = RGN_TYPE_WINDOW;
diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index 4031933..d120f17 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -28,6 +28,7 @@
  *  \ingroup spnode
  */
 
+#include "DNA_gpencil_types.h"
 #include "DNA_lamp_types.h"
 #include "DNA_material_types.h"
 #include "DNA_node_types.h"
@@ -857,6 +858,12 @@ static void node_id_remap(SpaceLink *slink, ID *old_id, ID *new_id)
 			snode->from = new_id;
 		}
 	}
+
+	if ((ID *)snode->gpd == old_id) {
+		snode->gpd = (bGPdata *)new_id;
+		id_us_min(old_id);
+		id_us_plus(new_id);
+	}
 }
 
 /* only called once, from space/spacetypes.c */
diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c
index 5b3061b..55674f0 100644
--- a/source/blender/editors/space_sequencer/space_sequencer.c
+++ b/source/blender/editors/space_sequencer/space_sequencer.c
@@ -32,6 +32,7 @@
 #include <string.h>
 #include <stdio.h>
 
+#include "DNA_gpencil_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_mask_types.h"
 
@@ -41,6 +42,7 @@
 #include "BLI_utildefines.h"
 
 #include "BKE_context.h"
+#include "BKE_library.h"
 #include "BKE_screen.h"
 #include "BKE_sequencer.h"
 #include "BKE_global.h"
@@ -687,6 +689,18 @@ static void sequencer_buttons_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED
 			break;
 	}
 }
+
+static void sequencer_id_remap(SpaceLink *slink, ID *old_id, ID *new_id)
+{
+	SpaceSeq *sseq = (SpaceSeq *)slink;
+
+	if ((ID *)sseq->gpd == old_id) {
+		sseq->gpd = (bGPdata *)new_id;
+		id_us_min(old_id);
+		id_us_plus(new_id);
+	}
+}
+
 /* ************************************* */
 
 /* only called once, from space/spacetypes.c */
@@ -708,6 +722,7 @@ void ED_spacetype_sequencer(void)
 	st->dropboxes = sequencer_dropboxes;
 	st->refresh = sequencer_refresh;
 	st->listener = sequencer_listener;
+	st->id_remap = sequencer_id_remap;
 
 	/* regions: main window */
 	art = MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c
index ff53d30..1ea4f0e 100644
--- a/source/blender/editors/space_text/space_text.c
+++ b/source/blender/editors/space_text/space_text.c
@@ -38,6 +38,7 @@
 #include "BLI_blenlib.h"
 
 #include "BKE_context.h"
+#include "BKE_library.h"
 #include "BKE_screen.h"
 #include "BKE_text.h"
 
@@ -554,6 +555,17 @@ static void text_properties_area_draw(const bContext *C, ARegion *ar)
 	}
 }
 
+static void text_id_remap(SpaceLink *slink, ID *old_id, ID *new_id)
+{
+	SpaceText *stext = (SpaceText *)slink;
+
+	if ((ID *)stext->text == old_id) {
+		stext->text = (Text *)new_id;
+		id_us_min(old_id);
+		id_us_plus(new_id);
+	}
+}
+
 /********************* registration ********************/
 
 /* only called once, from space/spacetypes.c */
@@ -574,7 +586,8 @@ void ED_spacetype_text(void)
 	st->listener = text_listener;
 	st->context = text_context;
 	st->dropboxes = text_dropboxes;
-	
+	st->id_remap = text_id_remap;
+
 	/* regions: main window */
 	art = MEM_callocN(sizeof(ARegionType), "spacetype text region");
 	art->regionid = RGN_TYPE_WINDOW;
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index 345175f..f74dfe2 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -335,7 +335,9 @@ static void rna_ID_user_clear(ID *id)
 
 static void rna_ID_user_remap(ID *id, Main *bmain, ID *new_id)
 {
-	BKE_libblock_remap(bmain, id, new_id);
+	if (GS(id->name) == GS(new_id->name)) {
+		BKE_libblock_remap(bmain, id, new_id);
+	}
 }
 
 static AnimData * rna_ID_animation_data_create(ID *id, Main *bmain)




More information about the Bf-blender-cvs mailing list