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

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

Reply via email to