At last... this merge should finally do the trick!
[blender.git] / source / blender / editors / space_action / action_edit.c
index adb5d749f71ca29fc33d40970df9502cb59c88b0..61dbc41e7c8c2fd4cb8a1d70b2f7982bb7289215 100644 (file)
@@ -1,5 +1,5 @@
 /**
 /**
- * $Id: editaction.c 17746 2008-12-08 11:19:44Z aligorith $
+ * $Id$
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
 
 #include "RNA_access.h"
 #include "RNA_define.h"
 
 #include "RNA_access.h"
 #include "RNA_define.h"
+#include "RNA_enum_types.h"
 
 #include "BKE_action.h"
 #include "BKE_depsgraph.h"
 #include "BKE_fcurve.h"
 #include "BKE_key.h"
 #include "BKE_material.h"
 
 #include "BKE_action.h"
 #include "BKE_depsgraph.h"
 #include "BKE_fcurve.h"
 #include "BKE_key.h"
 #include "BKE_material.h"
+#include "BKE_nla.h"
 #include "BKE_object.h"
 #include "BKE_context.h"
 #include "BKE_report.h"
 #include "BKE_object.h"
 #include "BKE_context.h"
 #include "BKE_report.h"
@@ -111,16 +113,16 @@ static void get_keyframe_extents (bAnimContext *ac, float *min, float *max)
        if (anim_data.first) {
                /* go through channels, finding max extents */
                for (ale= anim_data.first; ale; ale= ale->next) {
        if (anim_data.first) {
                /* go through channels, finding max extents */
                for (ale= anim_data.first; ale; ale= ale->next) {
-                       Object *nob= ANIM_nla_mapping_get(ac, ale);
+                       AnimData *adt= ANIM_nla_mapping_get(ac, ale);
                        FCurve *fcu= (FCurve *)ale->key_data;
                        float tmin, tmax;
                        
                        /* get range and apply necessary scaling before */
                        calc_fcurve_range(fcu, &tmin, &tmax);
                        
                        FCurve *fcu= (FCurve *)ale->key_data;
                        float tmin, tmax;
                        
                        /* get range and apply necessary scaling before */
                        calc_fcurve_range(fcu, &tmin, &tmax);
                        
-                       if (nob) {
-                               tmin= get_action_frame_inv(nob, tmin);
-                               tmax= get_action_frame_inv(nob, tmax);
+                       if (adt) {
+                               tmin= BKE_nla_tweakedit_remap(adt, tmin, 1);
+                               tmax= BKE_nla_tweakedit_remap(adt, tmax, 1);
                        }
                        
                        /* try to set cur using these values, if they're more extreme than previously set values */
                        }
                        
                        /* try to set cur using these values, if they're more extreme than previously set values */
@@ -180,7 +182,7 @@ void ACT_OT_previewrange_set (wmOperatorType *ot)
        
        /* api callbacks */
        ot->exec= actkeys_previewrange_exec;
        
        /* api callbacks */
        ot->exec= actkeys_previewrange_exec;
-       ot->poll= ED_operator_areaactive;
+       ot->poll= ED_operator_action_active;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -227,7 +229,7 @@ void ACT_OT_view_all (wmOperatorType *ot)
        
        /* api callbacks */
        ot->exec= actkeys_viewall_exec;
        
        /* api callbacks */
        ot->exec= actkeys_viewall_exec;
-       ot->poll= ED_operator_areaactive;
+       ot->poll= ED_operator_action_active;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -300,21 +302,21 @@ static int actkeys_copy_exec(bContext *C, wmOperator *op)
                }
        }
        
                }
        }
        
-       /* set notifier tha things have changed */
+       /* set notifier that things have changed */
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
-void ACT_OT_keyframes_copy (wmOperatorType *ot)
+void ACT_OT_copy (wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Copy Keyframes";
 {
        /* identifiers */
        ot->name= "Copy Keyframes";
-       ot->idname= "ACT_OT_keyframes_copy";
+       ot->idname= "ACT_OT_copy";
        
        /* api callbacks */
        ot->exec= actkeys_copy_exec;
        
        /* api callbacks */
        ot->exec= actkeys_copy_exec;
-       ot->poll= ED_operator_areaactive;
+       ot->poll= ED_operator_action_active;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -344,21 +346,21 @@ static int actkeys_paste_exec(bContext *C, wmOperator *op)
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
-       /* set notifier tha things have changed */
+       /* set notifier that things have changed */
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
-void ACT_OT_keyframes_paste (wmOperatorType *ot)
+void ACT_OT_paste (wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Paste Keyframes";
 {
        /* identifiers */
        ot->name= "Paste Keyframes";
-       ot->idname= "ACT_OT_keyframes_paste";
+       ot->idname= "ACT_OT_paste";
        
        /* api callbacks */
        ot->exec= actkeys_paste_exec;
        
        /* api callbacks */
        ot->exec= actkeys_paste_exec;
-       ot->poll= ED_operator_areaactive;
+       ot->poll= ED_operator_action_active;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -368,10 +370,10 @@ void ACT_OT_keyframes_paste (wmOperatorType *ot)
 
 /* defines for insert keyframes tool */
 EnumPropertyItem prop_actkeys_insertkey_types[] = {
 
 /* defines for insert keyframes tool */
 EnumPropertyItem prop_actkeys_insertkey_types[] = {
-       {1, "ALL", "All Channels", ""},
-       {2, "SEL", "Only Selected Channels", ""},
-       {3, "GROUP", "In Active Group", ""}, // xxx not in all cases
-       {0, NULL, NULL, NULL}
+       {1, "ALL", 0, "All Channels", ""},
+       {2, "SEL", 0, "Only Selected Channels", ""},
+       {3, "GROUP", 0, "In Active Group", ""}, // xxx not in all cases
+       {0, NULL, 0, NULL, NULL}
 };
 
 /* this function is responsible for snapping keyframes to frame-times */
 };
 
 /* this function is responsible for snapping keyframes to frame-times */
@@ -399,18 +401,18 @@ static void insert_action_keys(bAnimContext *ac, short mode)
        
        /* insert keyframes */
        for (ale= anim_data.first; ale; ale= ale->next) {
        
        /* insert keyframes */
        for (ale= anim_data.first; ale; ale= ale->next) {
-               //Object *nob= ANIM_nla_mapping_get(ac, ale);
+               AnimData *adt= ANIM_nla_mapping_get(ac, ale);
                FCurve *fcu= (FCurve *)ale->key_data;
                
                /* adjust current frame for NLA-scaling */
                FCurve *fcu= (FCurve *)ale->key_data;
                
                /* adjust current frame for NLA-scaling */
-               //if (nob)
-               //      cfra= get_action_frame(nob, CFRA);
-               //else 
-               //      cfra= (float)CFRA;
+               if (adt)
+                       cfra= BKE_nla_tweakedit_remap(adt, (float)CFRA, 0);
+               else 
+                       cfra= (float)CFRA;
                        
                /* if there's an id */
                if (ale->id)
                        
                /* if there's an id */
                if (ale->id)
-                       insertkey(ale->id, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
+                       insert_keyframe(ale->id, NULL, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
                else
                        insert_vert_fcurve(fcu, cfra, fcu->curval, 0);
        }
                else
                        insert_vert_fcurve(fcu, cfra, fcu->curval, 0);
        }
@@ -440,22 +442,22 @@ static int actkeys_insertkey_exec(bContext *C, wmOperator *op)
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
-       /* set notifier tha things have changed */
+       /* set notifier that things have changed */
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
 
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
 
-void ACT_OT_keyframes_insert (wmOperatorType *ot)
+void ACT_OT_insert (wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Insert Keyframes";
 {
        /* identifiers */
        ot->name= "Insert Keyframes";
-       ot->idname= "ACT_OT_keyframes_insert";
+       ot->idname= "ACT_OT_insert";
        
        /* api callbacks */
        ot->invoke= WM_menu_invoke;
        ot->exec= actkeys_insertkey_exec;
        
        /* api callbacks */
        ot->invoke= WM_menu_invoke;
        ot->exec= actkeys_insertkey_exec;
-       ot->poll= ED_operator_areaactive;
+       ot->poll= ED_operator_action_active;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -507,7 +509,7 @@ static int actkeys_duplicate_exec(bContext *C, wmOperator *op)
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
-       /* set notifier tha things have changed */
+       /* set notifier that things have changed */
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED; // xxx - start transform
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED; // xxx - start transform
@@ -523,16 +525,16 @@ static int actkeys_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
        return OPERATOR_FINISHED;
 }
  
        return OPERATOR_FINISHED;
 }
  
-void ACT_OT_keyframes_duplicate (wmOperatorType *ot)
+void ACT_OT_duplicate (wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Duplicate Keyframes";
 {
        /* identifiers */
        ot->name= "Duplicate Keyframes";
-       ot->idname= "ACT_OT_keyframes_duplicate";
+       ot->idname= "ACT_OT_duplicate";
        
        /* api callbacks */
        ot->invoke= actkeys_duplicate_invoke;
        ot->exec= actkeys_duplicate_exec;
        
        /* api callbacks */
        ot->invoke= actkeys_duplicate_invoke;
        ot->exec= actkeys_duplicate_exec;
-       ot->poll= ED_operator_areaactive;
+       ot->poll= ED_operator_action_active;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -584,22 +586,22 @@ static int actkeys_delete_exec(bContext *C, wmOperator *op)
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
-       /* set notifier tha things have changed */
+       /* set notifier that things have changed */
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
-void ACT_OT_keyframes_delete (wmOperatorType *ot)
+void ACT_OT_delete (wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Delete Keyframes";
 {
        /* identifiers */
        ot->name= "Delete Keyframes";
-       ot->idname= "ACT_OT_keyframes_delete";
+       ot->idname= "ACT_OT_delete";
        
        /* api callbacks */
        ot->invoke= WM_operator_confirm;
        ot->exec= actkeys_delete_exec;
        
        /* api callbacks */
        ot->invoke= WM_operator_confirm;
        ot->exec= actkeys_delete_exec;
-       ot->poll= ED_operator_areaactive;
+       ot->poll= ED_operator_action_active;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -647,22 +649,22 @@ static int actkeys_clean_exec(bContext *C, wmOperator *op)
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
-       /* set notifier tha things have changed */
+       /* set notifier that things have changed */
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
-void ACT_OT_keyframes_clean (wmOperatorType *ot)
+void ACT_OT_clean (wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Clean Keyframes";
 {
        /* identifiers */
        ot->name= "Clean Keyframes";
-       ot->idname= "ACT_OT_keyframes_clean";
+       ot->idname= "ACT_OT_clean";
        
        /* api callbacks */
        //ot->invoke=  // XXX we need that number popup for this! 
        ot->exec= actkeys_clean_exec;
        
        /* api callbacks */
        //ot->invoke=  // XXX we need that number popup for this! 
        ot->exec= actkeys_clean_exec;
-       ot->poll= ED_operator_areaactive;
+       ot->poll= ED_operator_action_active;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -771,21 +773,21 @@ static int actkeys_sample_exec(bContext *C, wmOperator *op)
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
-       /* set notifier tha things have changed */
+       /* set notifier that things have changed */
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
-void ACT_OT_keyframes_sample (wmOperatorType *ot)
+void ACT_OT_sample (wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Sample Keyframes";
 {
        /* identifiers */
        ot->name= "Sample Keyframes";
-       ot->idname= "ACT_OT_keyframes_sample";
+       ot->idname= "ACT_OT_sample";
        
        /* api callbacks */
        ot->exec= actkeys_sample_exec;
        
        /* api callbacks */
        ot->exec= actkeys_sample_exec;
-       ot->poll= ED_operator_areaactive;
+       ot->poll= ED_operator_action_active;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -798,9 +800,9 @@ void ACT_OT_keyframes_sample (wmOperatorType *ot)
 
 /* defines for set extrapolation-type for selected keyframes tool */
 EnumPropertyItem prop_actkeys_expo_types[] = {
 
 /* defines for set extrapolation-type for selected keyframes tool */
 EnumPropertyItem prop_actkeys_expo_types[] = {
-       {FCURVE_EXTRAPOLATE_CONSTANT, "CONSTANT", "Constant Extrapolation", ""},
-       {FCURVE_EXTRAPOLATE_LINEAR, "LINEAR", "Linear Extrapolation", ""},
-       {0, NULL, NULL, NULL}
+       {FCURVE_EXTRAPOLATE_CONSTANT, "CONSTANT", 0, "Constant Extrapolation", ""},
+       {FCURVE_EXTRAPOLATE_LINEAR, "LINEAR", 0, "Linear Extrapolation", ""},
+       {0, NULL, 0, NULL, NULL}
 };
 
 /* this function is responsible for setting extrapolation mode for keyframes */
 };
 
 /* this function is responsible for setting extrapolation mode for keyframes */
@@ -846,22 +848,22 @@ static int actkeys_expo_exec(bContext *C, wmOperator *op)
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
-       /* set notifier tha things have changed */
+       /* set notifier that things have changed */
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
-void ACT_OT_keyframes_extrapolation_type_set (wmOperatorType *ot)
+void ACT_OT_extrapolation_type (wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Set Keyframe Extrapolation";
 {
        /* identifiers */
        ot->name= "Set Keyframe Extrapolation";
-       ot->idname= "ACT_OT_keyframes_extrapolation_type_set";
+       ot->idname= "ACT_OT_extrapolation_type";
        
        /* api callbacks */
        ot->invoke= WM_menu_invoke;
        ot->exec= actkeys_expo_exec;
        
        /* api callbacks */
        ot->invoke= WM_menu_invoke;
        ot->exec= actkeys_expo_exec;
-       ot->poll= ED_operator_areaactive;
+       ot->poll= ED_operator_action_active;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -872,14 +874,6 @@ void ACT_OT_keyframes_extrapolation_type_set (wmOperatorType *ot)
 
 /* ******************** Set Interpolation-Type Operator *********************** */
 
 
 /* ******************** Set Interpolation-Type Operator *********************** */
 
-/* defines for set ipo-type for selected keyframes tool */
-EnumPropertyItem prop_actkeys_ipo_types[] = {
-       {BEZT_IPO_CONST, "CONSTANT", "Constant Interpolation", ""},
-       {BEZT_IPO_LIN, "LINEAR", "Linear Interpolation", ""},
-       {BEZT_IPO_BEZ, "BEZIER", "Bezier Interpolation", ""},
-       {0, NULL, NULL, NULL}
-};
-
 /* this function is responsible for setting interpolation mode for keyframes */
 static void setipo_action_keys(bAnimContext *ac, short mode) 
 {
 /* this function is responsible for setting interpolation mode for keyframes */
 static void setipo_action_keys(bAnimContext *ac, short mode) 
 {
@@ -924,42 +918,32 @@ static int actkeys_ipo_exec(bContext *C, wmOperator *op)
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
-       /* set notifier tha things have changed */
+       /* set notifier that things have changed */
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
-void ACT_OT_keyframes_interpolation_type (wmOperatorType *ot)
+void ACT_OT_interpolation_type (wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Set Keyframe Interpolation";
 {
        /* identifiers */
        ot->name= "Set Keyframe Interpolation";
-       ot->idname= "ACT_OT_keyframes_interpolation_type";
+       ot->idname= "ACT_OT_interpolation_type";
        
        /* api callbacks */
        ot->invoke= WM_menu_invoke;
        ot->exec= actkeys_ipo_exec;
        
        /* api callbacks */
        ot->invoke= WM_menu_invoke;
        ot->exec= actkeys_ipo_exec;
-       ot->poll= ED_operator_areaactive;
+       ot->poll= ED_operator_action_active;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* id-props */
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* id-props */
-       RNA_def_enum(ot->srna, "type", prop_actkeys_ipo_types, 0, "Type", "");
+       RNA_def_enum(ot->srna, "type", beztriple_interpolation_mode_items, 0, "Type", "");
 }
 
 /* ******************** Set Handle-Type Operator *********************** */
 
 }
 
 /* ******************** Set Handle-Type Operator *********************** */
 
-/* defines for set handle-type for selected keyframes tool */
-EnumPropertyItem prop_actkeys_handletype_types[] = {
-       {HD_AUTO, "AUTO", "Auto Handles", ""},
-       {HD_VECT, "VECTOR", "Vector Handles", ""},
-       {HD_FREE, "FREE", "Free Handles", ""},
-       {HD_ALIGN, "ALIGN", "Aligned Handles", ""},
-//     {-1, "TOGGLE", "Toggle between Free and Aligned Handles", ""},
-       {0, NULL, NULL, NULL}
-};
-
 /* this function is responsible for setting handle-type of selected keyframes */
 static void sethandles_action_keys(bAnimContext *ac, short mode) 
 {
 /* this function is responsible for setting handle-type of selected keyframes */
 static void sethandles_action_keys(bAnimContext *ac, short mode) 
 {
@@ -1022,53 +1006,37 @@ static int actkeys_handletype_exec(bContext *C, wmOperator *op)
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
-       /* set notifier tha things have changed */
+       /* set notifier that things have changed */
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
-void ACT_OT_keyframes_handle_type_set (wmOperatorType *ot)
+void ACT_OT_handle_type (wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Set Keyframe Handle Type";
 {
        /* identifiers */
        ot->name= "Set Keyframe Handle Type";
-       ot->idname= "ACT_OT_keyframes_handle_type_set";
+       ot->idname= "ACT_OT_handle_type";
        
        /* api callbacks */
        ot->invoke= WM_menu_invoke;
        ot->exec= actkeys_handletype_exec;
        
        /* api callbacks */
        ot->invoke= WM_menu_invoke;
        ot->exec= actkeys_handletype_exec;
-       ot->poll= ED_operator_areaactive;
+       ot->poll= ED_operator_action_active;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* id-props */
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* id-props */
-       RNA_def_enum(ot->srna, "type", prop_actkeys_handletype_types, 0, "Type", "");
+       RNA_def_enum(ot->srna, "type", beztriple_handle_type_items, 0, "Type", "");
 }
 
 /* ************************************************************************** */
 /* TRANSFORM STUFF */
 
 }
 
 /* ************************************************************************** */
 /* TRANSFORM STUFF */
 
-/* ***************** Snap Current Frame Operator *********************** */
-
-/* helper callback for actkeys_cfrasnap_exec() -> used to help get the average time of all selected beztriples */
-// TODO: if some other code somewhere needs this, it'll be time to port this over to keyframes_edit.c!!!
-static short bezt_calc_average(BeztEditData *bed, BezTriple *bezt)
-{
-       /* only if selected */
-       if (bezt->f2 & SELECT) {
-               /* store average time in float (only do rounding at last step */
-               bed->f1 += bezt->vec[1][0];
-               
-               /* increment number of items */
-               bed->i1++;
-       }
-       
-       return 0;
-}
+/* ***************** Jump to Selected Frames Operator *********************** */
 
 /* snap current-frame indicator to 'average time' of selected keyframe */
 
 /* snap current-frame indicator to 'average time' of selected keyframe */
-static int actkeys_cfrasnap_exec(bContext *C, wmOperator *op)
+static int actkeys_framejump_exec(bContext *C, wmOperator *op)
 {
        bAnimContext ac;
        ListBase anim_data= {NULL, NULL};
 {
        bAnimContext ac;
        ListBase anim_data= {NULL, NULL};
@@ -1087,8 +1055,17 @@ static int actkeys_cfrasnap_exec(bContext *C, wmOperator *op)
        filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY);
        ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
        
        filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY);
        ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
        
-       for (ale= anim_data.first; ale; ale= ale->next)
-               ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL);
+       for (ale= anim_data.first; ale; ale= ale->next) {
+               AnimData *adt= ANIM_nla_mapping_get(&ac, ale);
+               
+               if (adt) {
+                       ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); 
+                       ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL);
+                       ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
+               }
+               else
+                       ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL);
+       }
        
        BLI_freelistN(&anim_data);
        
        
        BLI_freelistN(&anim_data);
        
@@ -1098,21 +1075,21 @@ static int actkeys_cfrasnap_exec(bContext *C, wmOperator *op)
                CFRA= (int)floor((bed.f1 / bed.i1) + 0.5f);
        }
        
                CFRA= (int)floor((bed.f1 / bed.i1) + 0.5f);
        }
        
-       /* set notifier tha things have changed */
+       /* set notifier that things have changed */
        WM_event_add_notifier(C, NC_SCENE|ND_FRAME, ac.scene);
        
        return OPERATOR_FINISHED;
 }
 
        WM_event_add_notifier(C, NC_SCENE|ND_FRAME, ac.scene);
        
        return OPERATOR_FINISHED;
 }
 
-void ACT_OT_keyframes_cfrasnap (wmOperatorType *ot)
+void ACT_OT_frame_jump (wmOperatorType *ot)
 {
        /* identifiers */
 {
        /* identifiers */
-       ot->name= "Snap Current Frame to Keys";
-       ot->idname= "ACT_OT_keyframes_cfrasnap";
+       ot->name= "Jump to Frame";
+       ot->idname= "ACT_OT_frame_jump";
        
        /* api callbacks */
        
        /* api callbacks */
-       ot->exec= actkeys_cfrasnap_exec;
-       ot->poll= ED_operator_areaactive;
+       ot->exec= actkeys_framejump_exec;
+       ot->poll= ED_operator_action_active;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1122,11 +1099,11 @@ void ACT_OT_keyframes_cfrasnap (wmOperatorType *ot)
 
 /* defines for snap keyframes tool */
 EnumPropertyItem prop_actkeys_snap_types[] = {
 
 /* defines for snap keyframes tool */
 EnumPropertyItem prop_actkeys_snap_types[] = {
-       {ACTKEYS_SNAP_CFRA, "CFRA", "Current frame", ""},
-       {ACTKEYS_SNAP_NEAREST_FRAME, "NEAREST_FRAME", "Nearest Frame", ""}, // XXX as single entry?
-       {ACTKEYS_SNAP_NEAREST_SECOND, "NEAREST_SECOND", "Nearest Second", ""}, // XXX as single entry?
-       {ACTKEYS_SNAP_NEAREST_MARKER, "NEAREST_MARKER", "Nearest Marker", ""},
-       {0, NULL, NULL, NULL}
+       {ACTKEYS_SNAP_CFRA, "CFRA", 0, "Current frame", ""},
+       {ACTKEYS_SNAP_NEAREST_FRAME, "NEAREST_FRAME", 0, "Nearest Frame", ""}, // XXX as single entry?
+       {ACTKEYS_SNAP_NEAREST_SECOND, "NEAREST_SECOND", 0, "Nearest Second", ""}, // XXX as single entry?
+       {ACTKEYS_SNAP_NEAREST_MARKER, "NEAREST_MARKER", 0, "Nearest Marker", ""},
+       {0, NULL, 0, NULL, NULL}
 };
 
 /* this function is responsible for snapping keyframes to frame-times */
 };
 
 /* this function is responsible for snapping keyframes to frame-times */
@@ -1151,15 +1128,19 @@ static void snap_action_keys(bAnimContext *ac, short mode)
        
        memset(&bed, 0, sizeof(BeztEditData)); 
        bed.scene= ac->scene;
        
        memset(&bed, 0, sizeof(BeztEditData)); 
        bed.scene= ac->scene;
+       if (mode == ACTKEYS_SNAP_NEAREST_MARKER) {
+               bed.list.first= (ac->markers) ? ac->markers->first : NULL;
+               bed.list.last= (ac->markers) ? ac->markers->last : NULL;
+       }
        
        /* snap keyframes */
        for (ale= anim_data.first; ale; ale= ale->next) {
        
        /* snap keyframes */
        for (ale= anim_data.first; ale; ale= ale->next) {
-               Object *nob= ANIM_nla_mapping_get(ac, ale);
+               AnimData *adt= ANIM_nla_mapping_get(ac, ale);
                
                
-               if (nob) {
-                       ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 0, 1); 
+               if (adt) {
+                       ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); 
                        ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve);
                        ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve);
-                       ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 1, 1);
+                       ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
                }
                //else if (ale->type == ACTTYPE_GPLAYER)
                //      snap_gplayer_frames(ale->data, mode);
                }
                //else if (ale->type == ACTTYPE_GPLAYER)
                //      snap_gplayer_frames(ale->data, mode);
@@ -1189,22 +1170,22 @@ static int actkeys_snap_exec(bContext *C, wmOperator *op)
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
-       /* set notifier tha things have changed */
+       /* set notifier that things have changed */
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
-void ACT_OT_keyframes_snap (wmOperatorType *ot)
+void ACT_OT_snap (wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Snap Keys";
 {
        /* identifiers */
        ot->name= "Snap Keys";
-       ot->idname= "ACT_OT_keyframes_snap";
+       ot->idname= "ACT_OT_snap";
        
        /* api callbacks */
        ot->invoke= WM_menu_invoke;
        ot->exec= actkeys_snap_exec;
        
        /* api callbacks */
        ot->invoke= WM_menu_invoke;
        ot->exec= actkeys_snap_exec;
-       ot->poll= ED_operator_areaactive;
+       ot->poll= ED_operator_action_active;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1217,11 +1198,11 @@ void ACT_OT_keyframes_snap (wmOperatorType *ot)
 
 /* defines for mirror keyframes tool */
 EnumPropertyItem prop_actkeys_mirror_types[] = {
 
 /* defines for mirror keyframes tool */
 EnumPropertyItem prop_actkeys_mirror_types[] = {
-       {ACTKEYS_MIRROR_CFRA, "CFRA", "Current frame", ""},
-       {ACTKEYS_MIRROR_YAXIS, "YAXIS", "Vertical Axis", ""},
-       {ACTKEYS_MIRROR_XAXIS, "XAXIS", "Horizontal Axis", ""},
-       {ACTKEYS_MIRROR_MARKER, "MARKER", "First Selected Marker", ""},
-       {0, NULL, NULL, NULL}
+       {ACTKEYS_MIRROR_CFRA, "CFRA", 0, "Current frame", ""},
+       {ACTKEYS_MIRROR_YAXIS, "YAXIS", 0, "Vertical Axis", ""},
+       {ACTKEYS_MIRROR_XAXIS, "XAXIS", 0, "Horizontal Axis", ""},
+       {ACTKEYS_MIRROR_MARKER, "MARKER", 0, "First Selected Marker", ""},
+       {0, NULL, 0, NULL, NULL}
 };
 
 /* this function is responsible for mirroring keyframes */
 };
 
 /* this function is responsible for mirroring keyframes */
@@ -1243,13 +1224,14 @@ static void mirror_action_keys(bAnimContext *ac, short mode)
        /* for 'first selected marker' mode, need to find first selected marker first! */
        // XXX should this be made into a helper func in the API?
        if (mode == ACTKEYS_MIRROR_MARKER) {
        /* for 'first selected marker' mode, need to find first selected marker first! */
        // XXX should this be made into a helper func in the API?
        if (mode == ACTKEYS_MIRROR_MARKER) {
-               Scene *scene= ac->scene;
                TimeMarker *marker= NULL;
                
                /* find first selected marker */
                TimeMarker *marker= NULL;
                
                /* find first selected marker */
-               for (marker= scene->markers.first; marker; marker=marker->next) {
-                       if (marker->flag & SELECT) {
-                               break;
+               if (ac->markers) {
+                       for (marker= ac->markers->first; marker; marker=marker->next) {
+                               if (marker->flag & SELECT) {
+                                       break;
+                               }
                        }
                }
                
                        }
                }
                
@@ -1269,12 +1251,12 @@ static void mirror_action_keys(bAnimContext *ac, short mode)
        
        /* mirror keyframes */
        for (ale= anim_data.first; ale; ale= ale->next) {
        
        /* mirror keyframes */
        for (ale= anim_data.first; ale; ale= ale->next) {
-               Object *nob= ANIM_nla_mapping_get(ac, ale);
+               AnimData *adt= ANIM_nla_mapping_get(ac, ale);
                
                
-               if (nob) {
-                       ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 0, 1); 
+               if (adt) {
+                       ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); 
                        ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve);
                        ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve);
-                       ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 1, 1);
+                       ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
                }
                //else if (ale->type == ACTTYPE_GPLAYER)
                //      snap_gplayer_frames(ale->data, mode);
                }
                //else if (ale->type == ACTTYPE_GPLAYER)
                //      snap_gplayer_frames(ale->data, mode);
@@ -1304,22 +1286,22 @@ static int actkeys_mirror_exec(bContext *C, wmOperator *op)
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
        
-       /* set notifier tha things have changed */
+       /* set notifier that things have changed */
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
        ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
        
        return OPERATOR_FINISHED;
 }
  
-void ACT_OT_keyframes_mirror (wmOperatorType *ot)
+void ACT_OT_mirror (wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Mirror Keys";
 {
        /* identifiers */
        ot->name= "Mirror Keys";
-       ot->idname= "ACT_OT_keyframes_mirror";
+       ot->idname= "ACT_OT_mirror";
        
        /* api callbacks */
        ot->invoke= WM_menu_invoke;
        ot->exec= actkeys_mirror_exec;
        
        /* api callbacks */
        ot->invoke= WM_menu_invoke;
        ot->exec= actkeys_mirror_exec;
-       ot->poll= ED_operator_areaactive;
+       ot->poll= ED_operator_action_active;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;