[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