2.5 Action Editor - Brought back Select All (AKEY)
authorJoshua Leung <aligorith@gmail.com>
Tue, 23 Dec 2008 11:58:02 +0000 (11:58 +0000)
committerJoshua Leung <aligorith@gmail.com>
Tue, 23 Dec 2008 11:58:02 +0000 (11:58 +0000)
Now, selecting keyframes with mouse behaves more like before.

Note: this still mostly uses old code, since other parts of code also call this. For later, it'd be nice to store as RNA prop, method of selecting.

source/blender/editors/include/ED_keyframes_edit.h
source/blender/editors/space_action/action_intern.h
source/blender/editors/space_action/action_ops.c
source/blender/editors/space_action/action_select.c

index ed3c09c8a9880bdfc6732ebf7a8ab9b583c68828..d312289ca2a29327947f55628cfb31d8f649c26e 100644 (file)
@@ -98,6 +98,9 @@ BeztEditFunc ANIM_editkeyframes_ipo(short mode);
 void select_ipo_key(struct Scene *scene, struct Ipo *ipo, float selx, short selectmode);
 void select_icu_key(struct Scene *scene, struct IpoCurve *icu, float selx, short selectmode);
 
+short is_ipo_key_selected(struct Ipo *ipo);
+void set_ipo_key_selection(struct Ipo *ipo, short sel);
+
 
 /* ************************************************ */
 
index ef9ab5a9d66a877deb7997f3be62cbc4887d0e0e..3ea3e179a80d6b0b9de28322f31006c6bfc38ef8 100644 (file)
@@ -45,6 +45,7 @@ void draw_channel_strips(struct bAnimContext *ac, struct SpaceAction *saction, s
 void action_header_buttons(const struct bContext *C, struct ARegion *ar);
 
 /* action_select.c */
+void ED_ACT_OT_keyframes_deselectall(struct wmOperatorType *ot);
 void ED_ACT_OT_keyframes_clickselect(struct wmOperatorType *ot);
 
 /* action_ops.c */
index 9a64a026f81372daf552ce746dd81a0198b2c2d3..4fafb176a92884509d117f81e6bf187bd3ded215 100644 (file)
@@ -63,6 +63,7 @@ void action_operatortypes(void)
        
        /* keyframes */
        WM_operatortype_append(ED_ACT_OT_keyframes_clickselect);
+       WM_operatortype_append(ED_ACT_OT_keyframes_deselectall);
 }
 
 /* ************************** registration - keymaps **********************************/
@@ -73,6 +74,9 @@ static void action_keymap_keyframes (ListBase *keymap)
        WM_keymap_add_item(keymap, "ED_ACT_OT_keyframes_clickselect", SELECTMOUSE, KM_PRESS, 0, 0);
        RNA_boolean_set(WM_keymap_add_item(keymap, "ED_ACT_OT_keyframes_clickselect", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend_select", 1);
        RNA_boolean_set(WM_keymap_add_item(keymap, "ED_ACT_OT_keyframes_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "left_right", 1);
+       
+               /* deselect all */
+       WM_keymap_add_item(keymap, "ED_ACT_OT_keyframes_deselectall", AKEY, KM_PRESS, 0, 0);
 }
 
 /* --------------- */
index fac55963a7fe7284573ec006b9b1460c42090f56..887de081de87b7f5afb22fd2f8ee6eecfe685e23 100644 (file)
@@ -316,6 +316,86 @@ static void *get_nearest_action_key (bAnimContext *ac, int mval[2], float *selx,
 /* ************************************************************************** */
 /* KEYFRAMES STUFF */
 
+/* ******************** Deselect All Operator ***************************** */
+
+/* Deselects keyframes in the action editor
+ *     - This is called by the deselect all operator, as well as other ones!
+ */
+static void deselect_action_keys (bAnimContext *ac, short test, short sel)
+{
+       ListBase anim_data = {NULL, NULL};
+       bAnimListElem *ale;
+       int filter;
+       
+       /* determine type-based settings */
+       if (ac->datatype == ANIMCONT_GPENCIL)
+               filter= (ANIMFILTER_VISIBLE);
+       else
+               filter= (ANIMFILTER_VISIBLE | ANIMFILTER_IPOKEYS);
+       
+       /* filter data */
+       ANIM_animdata_filter(&anim_data, filter, ac->data, ac->datatype);
+       
+       /* See if we should be selecting or deselecting */
+       if (test) {
+               for (ale= anim_data.first; ale; ale= ale->next) {
+                       if (ale->type == ANIMTYPE_GPLAYER) {
+                               //if (is_gplayer_frame_selected(ale->data)) {
+                               //      sel= 0;
+                               //      break;
+                               //}
+                       }
+                       else {
+                               if (is_ipo_key_selected(ale->key_data)) {
+                                       sel= 0;
+                                       break;
+                               }
+                       }
+               }
+       }
+               
+       /* Now set the flags */
+       for (ale= anim_data.first; ale; ale= ale->next) {
+               //if (ale->type == ACTTYPE_GPLAYER)
+               //      set_gplayer_frame_selection(ale->data, sel);
+               //else
+                       set_ipo_key_selection(ale->key_data, sel);
+       }
+       
+       /* Cleanup */
+       BLI_freelistN(&anim_data);
+}
+
+/* ------------------- */
+
+static int actkeys_deselectall_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+       bAnimContext ac;
+       
+       /* get editor data */
+       if ((ANIM_animdata_get_context(C, &ac) == 0) || (ac.data == NULL))
+               return OPERATOR_CANCELLED;
+               
+       /* 'standard' behaviour - check if selected, then apply relevant selection */
+       deselect_action_keys(&ac, 1, 1);
+       
+       /* set notifier tha things have changed */
+       ED_area_tag_redraw(CTX_wm_area(C)); // FIXME... should be updating 'keyframes' data context or so instead!
+       
+       return OPERATOR_FINISHED;
+}
+void ED_ACT_OT_keyframes_deselectall (wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Deselect All";
+       ot->idname= "ED_ACT_OT_keyframes_deselectall";
+       
+       /* api callbacks */
+       ot->invoke= actkeys_deselectall_invoke;
+       //ot->poll= ED_operator_areaactive;
+}
+
 /* ******************** Column Select Operator **************************** */
 
 /* ******************** Mouse-Click Select Operator *********************** */
@@ -343,8 +423,8 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short selectmode)
        bGPdata *gpd = NULL;
        bGPDlayer *gpl = NULL;
        
-       void *act_channel;
-       short sel, act_type = 0;
+       void *anim_channel;
+       short sel, chan_type = 0;
        float selx = 0.0f, selxa;
        
        /* determine what type of data we are operating on */
@@ -355,48 +435,48 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short selectmode)
        else if (ac->datatype == ANIMCONT_GPENCIL) 
                gpd= (bGPdata *)ac->data;
 
-       act_channel= get_nearest_action_key(ac, mval, &selx, &sel, &act_type, &achan);
-       if (act_channel) {
+       anim_channel= get_nearest_action_key(ac, mval, &selx, &sel, &chan_type, &achan);
+       if (anim_channel) {
                /* must have been a channel */
-               switch (act_type) {
+               switch (chan_type) {
                        case ANIMTYPE_ICU:
-                               icu= (IpoCurve *)act_channel;
+                               icu= (IpoCurve *)anim_channel;
                                break;
                        case ANIMTYPE_CONCHAN:
-                               conchan= (bConstraintChannel *)act_channel;
+                               conchan= (bConstraintChannel *)anim_channel;
                                break;
                        case ANIMTYPE_ACHAN:
-                               achan= (bActionChannel *)act_channel;
+                               achan= (bActionChannel *)anim_channel;
                                break;
                        case ANIMTYPE_GROUP:
-                               agrp= (bActionGroup *)act_channel;
+                               agrp= (bActionGroup *)anim_channel;
                                break;
                        case ANIMTYPE_DSMAT:
-                               ipo= ((Material *)act_channel)->ipo;
+                               ipo= ((Material *)anim_channel)->ipo;
                                break;
                        case ANIMTYPE_DSLAM:
-                               ipo= ((Lamp *)act_channel)->ipo;
+                               ipo= ((Lamp *)anim_channel)->ipo;
                                break;
                        case ANIMTYPE_DSCAM:
-                               ipo= ((Camera *)act_channel)->ipo;
+                               ipo= ((Camera *)anim_channel)->ipo;
                                break;
                        case ANIMTYPE_DSCUR:
-                               ipo= ((Curve *)act_channel)->ipo;
+                               ipo= ((Curve *)anim_channel)->ipo;
                                break;
                        case ANIMTYPE_DSSKEY:
-                               ipo= ((Key *)act_channel)->ipo;
+                               ipo= ((Key *)anim_channel)->ipo;
                                break;
                        case ANIMTYPE_FILLACTD:
-                               act= (bAction *)act_channel;
+                               act= (bAction *)anim_channel;
                                break;
                        case ANIMTYPE_FILLIPOD:
-                               ipo= ((Object *)act_channel)->ipo;
+                               ipo= ((Object *)anim_channel)->ipo;
                                break;
                        case ANIMTYPE_OBJECT:
-                               ob= ((Base *)act_channel)->object;
+                               ob= ((Base *)anim_channel)->object;
                                break;
                        case ANIMTYPE_GPLAYER:
-                               gpl= (bGPDlayer *)act_channel;
+                               gpl= (bGPDlayer *)anim_channel;
                                break;
                        default:
                                return;
@@ -405,7 +485,7 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short selectmode)
                if (selectmode == SELECT_REPLACE) {
                        selectmode = SELECT_ADD;
                        
-                       //deselect_action_keys(0, 0); // XXX fixme
+                       deselect_action_keys(ac, 0, 0);
                        
                        if (ELEM(ac->datatype, ANIMCONT_ACTION, ANIMCONT_DOPESHEET)) {
                                //deselect_action_channels(0);
@@ -486,8 +566,6 @@ static int actkeys_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *even
        short in_scroller, selectmode;
        int mval[2];
        
-       puts("Action click select invoke");
-       
        /* get editor data */
        if ((ANIM_animdata_get_context(C, &ac) == 0) || (ac.data == NULL))
                return OPERATOR_CANCELLED;