diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2014-03-24 16:08:29 +0400 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2014-03-24 16:08:29 +0400 |
commit | 07578bed4dec4a63e904fe3f20ca2107a76021fe (patch) | |
tree | ac2e905fb52b582274ca729af31ab146c8a72cc3 /source/blender/editors/space_outliner | |
parent | f8c247f21b8e489750e3847a4a2270c1146cbbc2 (diff) |
Fix T39383: Blender crash when renaming bone in outliner (weight paint mode).
Outliner rename callback is supposed to activate affected element before actually renaming,
but for bones this was not working because the function used to activate the object explicitely
ignored ID_OB case! Added a bool flag to allow handing this case without (possibly) breaking
the other usecases.
Diffstat (limited to 'source/blender/editors/space_outliner')
3 files changed, 17 insertions, 13 deletions
diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c index d44a3e60a3f..4db63a462e7 100644 --- a/source/blender/editors/space_outliner/outliner_draw.c +++ b/source/blender/editors/space_outliner/outliner_draw.c @@ -481,7 +481,7 @@ static void namebutton_cb(bContext *C, void *tsep, char *oldname) char newname[sizeof(bone->name)]; /* always make current object active */ - tree_element_active(C, scene, soops, te, OL_SETSEL_NORMAL); + tree_element_active(C, scene, soops, te, OL_SETSEL_NORMAL, true); ob = OBACT; /* restore bone name */ @@ -498,8 +498,10 @@ static void namebutton_cb(bContext *C, void *tsep, char *oldname) char newname[sizeof(pchan->name)]; /* always make current pose-bone active */ - tree_element_active(C, scene, soops, te, OL_SETSEL_NORMAL); + tree_element_active(C, scene, soops, te, OL_SETSEL_NORMAL, true); ob = OBACT; + + BLI_assert(ob->type == OB_ARMATURE); /* restore bone name */ BLI_strncpy(newname, pchan->name, sizeof(pchan->name)); @@ -1154,7 +1156,7 @@ static void outliner_draw_iconrow(bContext *C, uiBlock *block, Scene *scene, Spa active = OL_DRAWSEL_NORMAL; } else { - active = tree_element_active(C, scene, soops, te, OL_SETSEL_NONE); + active = tree_element_active(C, scene, soops, te, OL_SETSEL_NONE, false); } } else { @@ -1295,7 +1297,7 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene active = OL_DRAWSEL_ACTIVE; } else { - if (tree_element_active(C, scene, soops, te, OL_SETSEL_NONE)) { + if (tree_element_active(C, scene, soops, te, OL_SETSEL_NONE, false)) { glColor4ub(220, 220, 255, alpha); active = OL_DRAWSEL_ACTIVE; } diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h index b1278c7cc07..317d33dd3e2 100644 --- a/source/blender/editors/space_outliner/outliner_intern.h +++ b/source/blender/editors/space_outliner/outliner_intern.h @@ -180,9 +180,8 @@ void restrictbutton_gr_restrict_flag(void *poin, void *poin2, int flag); eOLDrawState tree_element_type_active( struct bContext *C, struct Scene *scene, struct SpaceOops *soops, TreeElement *te, TreeStoreElem *tselem, const eOLSetState set, bool recursive); -eOLDrawState tree_element_active( - struct bContext *C, struct Scene *scene, SpaceOops *soops, - TreeElement *te, const eOLSetState set); +eOLDrawState tree_element_active(struct bContext *C, struct Scene *scene, SpaceOops *soops, + TreeElement *te, const eOLSetState set, const bool handle_all_types); int outliner_item_do_activate(struct bContext *C, int x, int y, bool extend, bool recursive); /* outliner_edit.c ---------------------------------------------- */ diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c index 89f17bc611b..d5b46655b82 100644 --- a/source/blender/editors/space_outliner/outliner_select.c +++ b/source/blender/editors/space_outliner/outliner_select.c @@ -801,14 +801,17 @@ static eOLDrawState tree_element_active_keymap_item( /* ---------------------------------------------- */ /* generic call for ID data check or make/check active in UI */ -eOLDrawState tree_element_active( - bContext *C, Scene *scene, SpaceOops *soops, - TreeElement *te, const eOLSetState set) +eOLDrawState tree_element_active(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, + const eOLSetState set, const bool handle_all_types) { - switch (te->idcode) { - /* Note: no ID_OB: objects are handled specially to allow multiple + /* Note: ID_OB only if handle_all_type is true, else objects are handled specially to allow multiple * selection. See do_outliner_item_activate. */ + case ID_OB: + if (handle_all_types) { + return tree_element_set_active_object(C, scene, soops, te, set, false); + } + break; case ID_MA: return tree_element_active_material(C, scene, soops, te, set); case ID_WO: @@ -952,7 +955,7 @@ static bool do_outliner_item_activate(bContext *C, Scene *scene, ARegion *ar, Sp WM_operator_name_call(C, "OBJECT_OT_editmode_toggle", WM_OP_INVOKE_REGION_WIN, NULL); } else { // rest of types - tree_element_active(C, scene, soops, te, OL_SETSEL_NORMAL); + tree_element_active(C, scene, soops, te, OL_SETSEL_NORMAL, false); } } |