[Bf-blender-cvs] [5c029b1] id-remap: Add support id-remap for 3Dview bgpic and Image space.

Bastien Montagne noreply at git.blender.org
Fri Sep 11 17:23:30 CEST 2015


Commit: 5c029b1628c10afb4eb46bc76e34ea487ebc0620
Author: Bastien Montagne
Date:   Fri Sep 11 17:22:40 2015 +0200
Branches: id-remap
https://developer.blender.org/rB5c029b1628c10afb4eb46bc76e34ea487ebc0620

Add support id-remap for 3Dview bgpic and Image space.

SpaceImage seems to have a weird handling of image ID user count :/

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

M	source/blender/blenkernel/BKE_library.h
M	source/blender/blenkernel/BKE_screen.h
M	source/blender/blenkernel/intern/library.c
M	source/blender/blenkernel/intern/screen.c
M	source/blender/editors/include/ED_util.h
M	source/blender/editors/space_buttons/space_buttons.c
M	source/blender/editors/space_image/space_image.c
M	source/blender/editors/space_node/space_node.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
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_event_system.c

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

diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index 5b96aa2..38fce75 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -118,7 +118,7 @@ struct ID *BKE_libblock_find_name(const short type, const char *name) ATTR_WARN_
 
 void BKE_library_callback_free_window_manager_set(void (*func)(struct bContext *, struct wmWindowManager *));
 void BKE_library_callback_free_notifier_reference_set(void (*func)(const void *));
-void BKE_library_callback_remap_editor_id_reference_set(void (*func)(const struct ID *, struct ID *));
+void BKE_library_callback_remap_editor_id_reference_set(void (*func)(struct ID *, struct ID *));
 
 /* use when "" is given to new_id() */
 #define ID_FALLBACK_NAME N_("Untitled")
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index 1ee3a23..e1a9c54 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -99,7 +99,7 @@ typedef struct SpaceType {
 	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 *);
+	void (*id_remap)(struct SpaceLink *, struct ID *, struct ID *);
 
 	/* region type definitions */
 	ListBase regiontypes;
@@ -276,8 +276,8 @@ void BKE_spacedata_freelist(ListBase *lb);
 void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2);
 void BKE_spacedata_draw_locks(int set);
 
-void BKE_spacedata_callback_id_remap_set(void (*func)(struct SpaceLink *sl, const struct ID *, struct ID *));
-void BKE_spacedata_id_unref(struct SpaceLink *sl, const struct ID *id);
+void BKE_spacedata_callback_id_remap_set(void (*func)(struct SpaceLink *sl, struct ID *, struct ID *));
+void BKE_spacedata_id_unref(struct SpaceLink *sl, struct ID *id);
 
 /* area/regions */
 struct ARegion *BKE_area_region_copy(struct SpaceType *st, struct ARegion *ar);
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 8b463c4..5aaeb42 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -885,9 +885,9 @@ void BKE_library_callback_free_notifier_reference_set(void (*func)(const void *)
 	free_notifier_reference_cb = func;
 }
 
-static void (*remap_editor_id_reference_cb)(const ID *, ID *) = NULL;
+static void (*remap_editor_id_reference_cb)(ID *, ID *) = NULL;
 
-void BKE_library_callback_remap_editor_id_reference_set(void (*func)(const ID *, ID *))
+void BKE_library_callback_remap_editor_id_reference_set(void (*func)(ID *, ID *))
 {
 	remap_editor_id_reference_cb = func;
 }
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index d64a57f..90f89b9 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -272,15 +272,15 @@ void BKE_spacedata_draw_locks(int set)
 	}
 }
 
-static void (*spacedata_id_remap_cb)(struct SpaceLink *sl, const ID *old_id, ID *new_id) = NULL;
+static void (*spacedata_id_remap_cb)(struct SpaceLink *sl, ID *old_id, ID *new_id) = NULL;
 
-void BKE_spacedata_callback_id_remap_set(void (*func)(struct SpaceLink *sl, const ID *, ID *))
+void BKE_spacedata_callback_id_remap_set(void (*func)(struct SpaceLink *sl, ID *, ID *))
 {
 	spacedata_id_remap_cb = func;
 }
 
 /* UNUSED!!! */
-void BKE_spacedata_id_unref(struct SpaceLink *sl, const struct ID *id)
+void BKE_spacedata_id_unref(struct SpaceLink *sl, struct ID *id)
 {
 	if (spacedata_id_remap_cb) {
 		spacedata_id_remap_cb(sl, id, NULL);
diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h
index 24d05b3..de2e44b 100644
--- a/source/blender/editors/include/ED_util.h
+++ b/source/blender/editors/include/ED_util.h
@@ -42,7 +42,7 @@ void    ED_editors_exit(struct bContext *C);
 
 bool    ED_editors_flush_edits(const struct bContext *C, bool for_render);
 
-void ED_spacedata_id_remap(struct SpaceLink *sl, const struct ID *old_id, ID *new_id);
+void ED_spacedata_id_remap(struct SpaceLink *sl, struct ID *old_id, struct ID *new_id);
 
 /* ************** Undo ************************ */
 
diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c
index cd0cc70..83c9663 100644
--- a/source/blender/editors/space_buttons/space_buttons.c
+++ b/source/blender/editors/space_buttons/space_buttons.c
@@ -391,7 +391,7 @@ 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)
+static void buttons_id_remap(SpaceLink *slink, ID *old_id, ID *new_id)
 {
 	SpaceButs *sbuts = (SpaceButs *)slink;
 
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index 98a0752..930a626 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -44,6 +44,7 @@
 #include "BKE_colortools.h"
 #include "BKE_context.h"
 #include "BKE_image.h"
+#include "BKE_library.h"
 #include "BKE_scene.h"
 #include "BKE_screen.h"
 
@@ -978,6 +979,17 @@ static void image_header_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa),
 	}
 }
 
+static void image_id_remap(SpaceLink *slink, ID *old_id, ID *new_id)
+{
+	SpaceImage *simg = (SpaceImage *)slink;
+
+	if ((ID *)simg->image == old_id) {
+		simg->image = (Image *)new_id;
+		id_us_min(old_id);
+		id_us_plus(new_id);
+	}
+}
+
 /**************************** spacetype *****************************/
 
 /* only called once, from space/spacetypes.c */
@@ -999,7 +1011,8 @@ void ED_spacetype_image(void)
 	st->refresh = image_refresh;
 	st->listener = image_listener;
 	st->context = image_context;
-	
+	st->id_remap = image_id_remap;
+
 	/* regions: main window */
 	art = MEM_callocN(sizeof(ARegionType), "spacetype image 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 9fdbd2fa..4031933 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -821,7 +821,7 @@ 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)
+static void node_id_remap(SpaceLink *slink, ID *old_id, ID *new_id)
 {
 	SpaceNode *snode = (SpaceNode *)slink;
 
diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c
index 7d523ba..3cfc49b 100644
--- a/source/blender/editors/space_outliner/space_outliner.c
+++ b/source/blender/editors/space_outliner/space_outliner.c
@@ -486,7 +486,7 @@ static SpaceLink *outliner_duplicate(SpaceLink *sl)
 	return (SpaceLink *)soutlinern;
 }
 
-static void outliner_id_remap(SpaceLink *slink, const ID *old_id, ID *new_id)
+static void outliner_id_remap(SpaceLink *slink, ID *old_id, ID *new_id)
 {
 	SpaceOops *so = (SpaceOops *)slink;
 
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 7f93be1..dc843bd 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -1400,9 +1400,10 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
 	return -1; /* found but not available */
 }
 
-static void view3d_id_remap(SpaceLink *slink, const ID *old_id, ID *new_id)
+static void view3d_id_remap(SpaceLink *slink, ID *old_id, ID *new_id)
 {
 	View3D *v3d = (View3D *)slink;
+	BGpic *bgpic;
 
 	if ((ID *)v3d->camera == old_id) {
 		v3d->camera = (Object *)new_id;
@@ -1411,7 +1412,18 @@ static void view3d_id_remap(SpaceLink *slink, const ID *old_id, ID *new_id)
 		v3d->ob_centre = (Object *)new_id;
 	}
 
-	/* TODO_REMAP: bgpic (images ID need special care I think, due to ImageUser... */
+	for (bgpic = v3d->bgpicbase.first; bgpic; bgpic = bgpic->next) {
+		if ((ID *)bgpic->ima == old_id) {
+			bgpic->ima = (Image *)new_id;
+			id_us_min(old_id);
+			id_us_plus(new_id);
+		}
+		if ((ID *)bgpic->clip == old_id) {
+			bgpic->clip = (MovieClip *)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/util/ed_util.c b/source/blender/editors/util/ed_util.c
index 3ebc06a..4dbb6c8 100644
--- a/source/blender/editors/util/ed_util.c
+++ b/source/blender/editors/util/ed_util.c
@@ -332,7 +332,7 @@ void ED_region_draw_mouse_line_cb(const bContext *C, ARegion *ar, void *arg_info
  * \note Typically notifiers take care of this,
  * but there are times we have to free references immediately, see: T44376
  */
-void ED_spacedata_id_remap(struct SpaceLink *sl, const ID *old_id, ID *new_id)
+void ED_spacedata_id_remap(struct SpaceLink *sl, ID *old_id, ID *new_id)
 {
 	SpaceType *st = BKE_spacetype_from_id(sl->spacetype);
 
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 7fc145a..3a190b7 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -189,7 +189,7 @@ void		WM_ndof_deadzone_set(float deadzone);
 void		WM_event_add_notifier(const struct bContext *C, unsigned int type, void *reference);
 void		WM_main_add_notifier(unsigned int type, void *reference);
 void		WM_main_remove_notifier_reference(const void *reference);
-void		WM_main_remap_editor_id_reference(const struct ID *old_id, struct ID *new_id);
+void		WM_main_remap_editor_id_reference(struct ID *old_id, struct ID *new_id);
 
 			/* reports */
 void        WM_report_banner_show(const struct bContext *C);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 482cc09..f7c5702 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -241,7 +241,7 @@ void W

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list