diff options
author | Joshua Leung <aligorith@gmail.com> | 2015-03-28 13:22:02 +0300 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2015-03-28 13:23:23 +0300 |
commit | b7afbaf8ccc315296d2dc824cc8d089108a38558 (patch) | |
tree | 4b581fdb34ac7da1c0e7a23ab554facbaefa5379 /source/blender | |
parent | 469ba8a30a8222fdc0adede1e214b17e9fd1fc4f (diff) |
Bugfix: Fix for crash when trying to create new action in Shape Key DopeSheet mode
When the active object had no shapekey data, trying to create a new action from the
Shape Keys mode of the DopeSheet would crash. The segfault here was a silly regression
caused by my earlier Action Stashing work.
However, the old (pre-Action Stashing) code here also wasn't that great either.
While it didn't crash, it would still silently create a new action, even if that
could not get assigned/used anywhere. To prevent both of these problems from
happening again, I've added additional null checks, as well as beefing up the poll
callback here to forbid keyframing
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/space_action/action_edit.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c index 76c955d8bca..95066b91725 100644 --- a/source/blender/editors/space_action/action_edit.c +++ b/source/blender/editors/space_action/action_edit.c @@ -93,11 +93,15 @@ static AnimData *actedit_animdata_from_context(bContext *C) /* Get AnimData block to use */ if (saction->mode == SACTCONT_ACTION) { /* Currently, "Action Editor" means object-level only... */ - adt = ob->adt; + if (ob) { + adt = ob->adt; + } } else if (saction->mode == SACTCONT_SHAPEKEY) { Key *key = BKE_key_from_object(ob); - adt = key->adt; + if (key) { + adt = key->adt; + } } return adt; @@ -180,9 +184,19 @@ static int action_new_poll(bContext *C) if (!(scene->flag & SCE_NLA_EDIT_ON)) { if (ED_operator_action_active(C)) { SpaceAction *saction = (SpaceAction *)CTX_wm_space_data(C); + Object *ob = CTX_data_active_object(C); /* For now, actions are only for the active object, and on object and shapekey levels... */ - return ELEM(saction->mode, SACTCONT_ACTION, SACTCONT_SHAPEKEY); + if (saction->mode == SACTCONT_ACTION) { + /* XXX: This assumes that actions are assigned to the active object */ + if (ob) + return true; + } + else if (saction->mode == SACTCONT_SHAPEKEY) { + Key *key = BKE_key_from_object(ob); + if (key) + return true; + } } else if (ED_operator_nla_active(C)) { return true; |