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.
This commit is contained in:
Bastien Montagne 2014-03-24 13:08:29 +01:00
parent f8c247f21b
commit 07578bed4d
Notes: blender-bot 2023-02-14 10:55:37 +01:00
Referenced by issue #39383, Blender crash when renaming bone in outliner (weight paint mode)
3 changed files with 17 additions and 13 deletions

View File

@ -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;
}

View File

@ -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 ---------------------------------------------- */

View File

@ -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);
}
}