[Bf-blender-cvs] [07578be] master: Fix T39383: Blender crash when renaming bone in outliner (weight paint mode).

Bastien Montagne noreply at git.blender.org
Mon Mar 24 13:15:53 CET 2014


Commit: 07578bed4dec4a63e904fe3f20ca2107a76021fe
Author: Bastien Montagne
Date:   Mon Mar 24 13:08:29 2014 +0100
https://developer.blender.org/rB07578bed4dec4a63e904fe3f20ca2107a76021fe

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.

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

M	source/blender/editors/space_outliner/outliner_draw.c
M	source/blender/editors/space_outliner/outliner_intern.h
M	source/blender/editors/space_outliner/outliner_select.c

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

diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c
index d44a3e6..4db63a4 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 b1278c7..317d33d 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 89f17bc..d5b4665 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);
 				}
 
 			}




More information about the Bf-blender-cvs mailing list