Fix T39902: Keyframe insertion by a Keying Set fails in the edit mode when keyframing...
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>
Fri, 25 Apr 2014 16:44:55 +0000 (01:44 +0900)
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>
Mon, 28 Apr 2014 07:46:06 +0000 (16:46 +0900)
Reviewers: aligorith

Reviewed By: aligorith

Differential Revision: https://developer.blender.org/D484

source/blender/editors/animation/keyframing.c
source/blender/editors/animation/keyingsets.c
source/blender/editors/include/ED_keyframing.h

index a17fec52a1c249c64224fd808e0256d75ec24cc1..9008d330c2134901a67b3659bf50a66cde9b14a1 100644 (file)
@@ -72,6 +72,7 @@
 #include "ED_keyframing.h"
 #include "ED_keyframes_edit.h"
 #include "ED_screen.h"
+#include "ED_object.h"
 
 #include "UI_interface.h"
 #include "UI_resources.h"
@@ -1265,6 +1266,8 @@ static int modify_key_op_poll(bContext *C)
 static int insert_key_exec(bContext *C, wmOperator *op)
 {
        Scene *scene = CTX_data_scene(C);
+       Object *ob = CTX_data_active_object(C);
+       bool ob_edit_mode = false;
        KeyingSet *ks = NULL;
        int type = RNA_enum_get(op->ptr, "type");
        float cfra = (float)CFRA; // XXX for now, don't bother about all the yucky offset crap
@@ -1287,12 +1290,25 @@ static int insert_key_exec(bContext *C, wmOperator *op)
                BKE_report(op->reports, RPT_ERROR, "No active keying set");
                return OPERATOR_CANCELLED;
        }
+
+       /* exit the edit mode to make sure that those object data properties that have been
+        * updated since the last switching to the edit mode will be keyframed correctly
+        */
+       if (ob && (ob->mode & OB_MODE_EDIT) != 0 && ANIM_keyingset_find_id(ks, (ID *)ob->data)) {
+               ED_object_toggle_modes(C, OB_MODE_EDIT);
+               ob_edit_mode = true;
+       }
        
        /* try to insert keyframes for the channels specified by KeyingSet */
        success = ANIM_apply_keyingset(C, NULL, NULL, ks, MODIFYKEY_MODE_INSERT, cfra);
        if (G.debug & G_DEBUG)
                BKE_reportf(op->reports, RPT_INFO, "Keying set '%s' - successfully added %d keyframes", ks->name, success);
        
+       /* restore the edit mode if necessary */
+       if (ob_edit_mode) {
+               ED_object_toggle_modes(C, OB_MODE_EDIT);
+       }
+
        /* report failure or do updates? */
        if (success == MODIFYKEY_INVALID_CONTEXT) {
                BKE_report(op->reports, RPT_ERROR, "No suitable context info for active keying set");
index dd8433f7770b1c5b9a7349355b0b8b3d671720a3..28b2d26e59b70a5069116a639b3fc984c12cba49 100644 (file)
@@ -641,6 +641,16 @@ void ANIM_keyingset_infos_exit(void)
        BKE_keyingsets_free(&builtin_keyingsets);
 }
 
+/* Check if the ID appears in the paths specified by the KeyingSet */
+bool ANIM_keyingset_find_id(KeyingSet *ks, ID *id)
+{
+       /* sanity checks */
+       if (ELEM(NULL, ks, id))
+               return false;
+
+       return BLI_findptr(&ks->paths, id, offsetof(KS_Path, id)) != NULL;
+}
+
 /* ******************************************* */
 /* KEYING SETS API (for UI) */
 
index 7543e170c9dbf33572f45196491765915d725f12..5c7b3c531be532b914e3c731703c4ecb969b6328 100644 (file)
@@ -202,6 +202,9 @@ struct KeyingSet *ANIM_builtin_keyingset_get_named(struct KeyingSet *prevKS, con
 /* Find KeyingSet type info given a name */
 KeyingSetInfo *ANIM_keyingset_info_find_name(const char name[]);
 
+/* Find a given ID in the KeyingSet */
+bool ANIM_keyingset_find_id(struct KeyingSet *ks, ID *id);
+
 /* for RNA type registrations... */
 void ANIM_keyingset_info_register(KeyingSetInfo *ksi);
 void ANIM_keyingset_info_unregister(struct Main *bmain, KeyingSetInfo *ksi);