Commit: c4dc14b079d81fd012383b910291246e7ebf9a04
Author: Joshua Leung
Date:   Sat Feb 6 02:34:57 2016 +1300
Branches: master
https://developer.blender.org/rBc4dc14b079d81fd012383b910291246e7ebf9a04

Fix T45915: Cannot select keyframes in summary channels in Dope Sheet in 
TweakMode

When in TweakMode on NLA strips that had an offset, it was not possible to 
select
those keyframes in the Summary Channel in the Dope Sheet.

The main gist of it is that the current code is from before the summary track 
was
introduced, and so could assume that ANIM_nla_mapping_get() would work for all 
channels
present. Thus, simply converting the clicked frame to nla-mapped time once 
would be
enough. However, for summary channels, nla-mapping_get() doesn't do anything, 
since
we can potentially include keyframes from several different objects!

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

M       source/blender/editors/animation/keyframes_edit.c
M       source/blender/editors/include/ED_keyframes_edit.h
M       source/blender/editors/space_action/action_select.c

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

diff --git a/source/blender/editors/animation/keyframes_edit.c 
b/source/blender/editors/animation/keyframes_edit.c
index dd01e53..ba98702 100644
--- a/source/blender/editors/animation/keyframes_edit.c
+++ b/source/blender/editors/animation/keyframes_edit.c
@@ -44,6 +44,7 @@
 #include "DNA_scene_types.h"
 
 #include "BKE_fcurve.h"
+#include "BKE_nla.h"
 
 #include "ED_anim_api.h"
 #include "ED_keyframes_edit.h"
@@ -290,9 +291,39 @@ static short summary_keyframes_loop(KeyframeEditData *ked, 
bAnimContext *ac, Key
                        case ALE_MASKLAY:
                        case ALE_GPFRAME:
                                break;
+                               
+                       case ALE_FCURVE:
                        default:
-                               ret_code = ANIM_fcurve_keyframes_loop(ked, 
ale->data, key_ok, key_cb, fcu_cb);
+                       {
+                               if (ked->iterflags) {
+                                       /* make backups of the current values, 
so that a localised fix
+                                        * (e.g. NLA time remapping) can be 
applied to these values
+                                        */
+                                       float f1 = ked->f1;
+                                       float f2 = ked->f2;
+                                       
+                                       if (ked->iterflags & (KED_F1_NLA_UNMAP 
| KED_F2_NLA_UNMAP)) {
+                                               AnimData *adt = 
ANIM_nla_mapping_get(ac, ale);
+                                               
+                                               if (ked->iterflags & 
KED_F1_NLA_UNMAP)
+                                                       ked->f1 = 
BKE_nla_tweakedit_remap(adt, f1, NLATIME_CONVERT_UNMAP);
+                                               if (ked->iterflags & 
KED_F2_NLA_UNMAP)
+                                                       ked->f2 = 
BKE_nla_tweakedit_remap(adt, f2, NLATIME_CONVERT_UNMAP);
+                                       }
+                                       
+                                       /* now operate on the channel as per 
normal */
+                                       ret_code = 
ANIM_fcurve_keyframes_loop(ked, ale->data, key_ok, key_cb, fcu_cb);
+                                       
+                                       /* reset */
+                                       ked->f1 = f1;
+                                       ked->f2 = f2;
+                               }
+                               else {
+                                       /* no special handling required... */
+                                       ret_code = 
ANIM_fcurve_keyframes_loop(ked, ale->data, key_ok, key_cb, fcu_cb);
+                               }
                                break;
+                       }
                }
                
                if (ret_code)
diff --git a/source/blender/editors/include/ED_keyframes_edit.h 
b/source/blender/editors/include/ED_keyframes_edit.h
index 910b647..7528594 100644
--- a/source/blender/editors/include/ED_keyframes_edit.h
+++ b/source/blender/editors/include/ED_keyframes_edit.h
@@ -132,9 +132,20 @@ typedef struct KeyframeEditData {
 
        /* flags */
        short curflags;             /* current flags for the keyframe we're 
reached in the iteration process */
-       short iterflags; /* settings for iteration process */            // 
XXX: unused...
+       short iterflags;            /* settings for iteration process */
 } KeyframeEditData;
 
+/* Flags for controlling the iteration process (to supply additional 
capabilities, etc.) */
+typedef enum eKeyframeEditData_IterFlags {
+       /* Perform NLA time remapping (global -> strip) for the "f1" parameter
+        * (e.g. used for selection tools on summary tracks)
+        */
+       KED_F1_NLA_UNMAP = (1 << 0),
+       
+       /* Perform NLA time remapping (global -> strip) for the "f2" parameter 
*/
+       KED_F2_NLA_UNMAP = (1 << 1),
+} eKeyframeEditData_IterFlags;
+
 /* ------- Function Pointer Typedefs ---------------- */
 
 /* callback function that refreshes the F-Curve after use */
diff --git a/source/blender/editors/space_action/action_select.c 
b/source/blender/editors/space_action/action_select.c
index 3c9c88a..574d3f6 100644
--- a/source/blender/editors/space_action/action_select.c
+++ b/source/blender/editors/space_action/action_select.c
@@ -948,6 +948,7 @@ static void actkeys_mselect_single(bAnimContext *ac, 
bAnimListElem *ale, short s
        select_cb = ANIM_editkeyframes_select(select_mode);
        ok_cb = ANIM_editkeyframes_ok(BEZT_OK_FRAME);
        ked.f1 = selx;
+       ked.iterflags |= KED_F1_NLA_UNMAP;
        
        /* select the nominated keyframe on the given frame */
        if (ale->type == ANIMTYPE_GPLAYER) {

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to