Page MenuHome

frame-select-left-right2.patch

Authored By
Torsten Rupp (rupp)
Nov 13 2013, 2:34 PM
Size
16 KB
Subscribers
None

frame-select-left-right2.patch

Index: release/scripts/ui/space_dopesheet.py
===================================================================
--- release/scripts/ui/space_dopesheet.py (revision 31785)
+++ release/scripts/ui/space_dopesheet.py (working copy)
@@ -169,6 +169,10 @@
layout.operator("action.select_column", text="Between Selected Markers").mode = 'MARKERS_BETWEEN'
layout.separator()
+ layout.operator("action.select_column", text="Columns Before Current Frame").mode = 'LEFT'
+ layout.operator("action.select_column", text="Columns After Current Frame").mode = 'RIGHT'
+
+ layout.separator()
layout.operator("action.select_more")
layout.operator("action.select_less")
Index: source/blender/editors/space_action/action_ops.c
===================================================================
--- source/blender/editors/space_action/action_ops.c (revision 31785)
+++ source/blender/editors/space_action/action_ops.c (working copy)
@@ -113,6 +113,10 @@
RNA_enum_set(WM_keymap_add_item(keymap, "ACTION_OT_select_column", KKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_MARKERS_COLUMN);
RNA_enum_set(WM_keymap_add_item(keymap, "ACTION_OT_select_column", KKEY, KM_PRESS, KM_ALT, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_MARKERS_BETWEEN);
+ /* column select left/right to current frame */
+ RNA_enum_set(WM_keymap_add_item(keymap, "ACTION_OT_select_column", RIGHTBRACKETKEY, KM_PRESS, 0, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_LEFT);
+ RNA_enum_set(WM_keymap_add_item(keymap, "ACTION_OT_select_column", LEFTBRACKETKEY, KM_PRESS, 0, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_RIGHT);
+
/* select more/less */
WM_keymap_add_item(keymap, "ACTION_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "ACTION_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
Index: source/blender/editors/space_action/action_intern.h
===================================================================
--- source/blender/editors/space_action/action_intern.h (revision 31785)
+++ source/blender/editors/space_action/action_intern.h (working copy)
@@ -73,6 +73,8 @@
enum {
ACTKEYS_COLUMNSEL_KEYS = 0,
ACTKEYS_COLUMNSEL_CFRA,
+ ACTKEYS_COLUMNSEL_LEFT,
+ ACTKEYS_COLUMNSEL_RIGHT,
ACTKEYS_COLUMNSEL_MARKERS_COLUMN,
ACTKEYS_COLUMNSEL_MARKERS_BETWEEN,
} eActKeys_ColumnSelect_Mode;
Index: source/blender/editors/space_action/action_select.c
===================================================================
--- source/blender/editors/space_action/action_select.c (revision 31785)
+++ source/blender/editors/space_action/action_select.c (working copy)
@@ -53,6 +53,7 @@
#include "ED_keyframes_edit.h"
#include "ED_markers.h"
#include "ED_screen.h"
+#include "ED_types.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -340,215 +341,6 @@
ot->prop= RNA_def_boolean(ot->srna, "axis_range", 0, "Axis Range", "");
}
-/* ******************** Column Select Operator **************************** */
-/* This operator works in one of four ways:
- * - 1) select all keyframes in the same frame as a selected one (KKEY)
- * - 2) select all keyframes in the same frame as the current frame marker (CTRL-KKEY)
- * - 3) select all keyframes in the same frame as a selected markers (SHIFT-KKEY)
- * - 4) select all keyframes that occur between selected markers (ALT-KKEY)
- */
-
-/* defines for column-select mode */
-static EnumPropertyItem prop_column_select_types[] = {
- {ACTKEYS_COLUMNSEL_KEYS, "KEYS", 0, "On Selected Keyframes", ""},
- {ACTKEYS_COLUMNSEL_CFRA, "CFRA", 0, "On Current Frame", ""},
- {ACTKEYS_COLUMNSEL_MARKERS_COLUMN, "MARKERS_COLUMN", 0, "On Selected Markers", ""},
- {ACTKEYS_COLUMNSEL_MARKERS_BETWEEN, "MARKERS_BETWEEN", 0, "Between Min/Max Selected Markers", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
-/* ------------------- */
-
-/* Selects all visible keyframes between the specified markers */
-static void markers_selectkeys_between (bAnimContext *ac)
-{
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- KeyframeEditFunc ok_cb, select_cb;
- KeyframeEditData ked;
- float min, max;
-
- /* get extreme markers */
- ED_markers_get_minmax(ac->markers, 1, &min, &max);
- min -= 0.5f;
- max += 0.5f;
-
- /* get editing funcs + data */
- ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);
- select_cb= ANIM_editkeyframes_select(SELECT_ADD);
-
- memset(&ked, 0, sizeof(KeyframeEditData));
- ked.f1= min;
- ked.f2= max;
-
- /* filter data */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
- ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
-
- /* select keys in-between */
- 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_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
- ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
- }
- else {
- ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
- }
- }
-
- /* Cleanup */
- BLI_freelistN(&anim_data);
-}
-
-
-/* Selects all visible keyframes in the same frames as the specified elements */
-static void columnselect_action_keys (bAnimContext *ac, short mode)
-{
- ListBase anim_data= {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- Scene *scene= ac->scene;
- CfraElem *ce;
- KeyframeEditFunc select_cb, ok_cb;
- KeyframeEditData ked;
-
- /* initialise keyframe editing data */
- memset(&ked, 0, sizeof(KeyframeEditData));
-
- /* build list of columns */
- switch (mode) {
- case ACTKEYS_COLUMNSEL_KEYS: /* list of selected keys */
- if (ac->datatype == ANIMCONT_GPENCIL) {
- filter= (ANIMFILTER_VISIBLE);
- ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
-
- //for (ale= anim_data.first; ale; ale= ale->next)
- // gplayer_make_cfra_list(ale->data, &elems, 1);
- }
- else {
- 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_keyframes_loop(&ked, ale->key_data, NULL, bezt_to_cfraelem, NULL);
- }
- BLI_freelistN(&anim_data);
- break;
-
- case ACTKEYS_COLUMNSEL_CFRA: /* current frame */
- /* make a single CfraElem for storing this */
- ce= MEM_callocN(sizeof(CfraElem), "cfraElem");
- BLI_addtail(&ked.list, ce);
-
- ce->cfra= (float)CFRA;
- break;
-
- case ACTKEYS_COLUMNSEL_MARKERS_COLUMN: /* list of selected markers */
- ED_markers_make_cfra_list(ac->markers, &ked.list, 1);
- break;
-
- default: /* invalid option */
- return;
- }
-
- /* set up BezTriple edit callbacks */
- select_cb= ANIM_editkeyframes_select(SELECT_ADD);
- ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAME);
-
- /* loop through all of the keys and select additional keyframes
- * based on the keys found to be selected above
- */
- if (ac->datatype == ANIMCONT_GPENCIL)
- filter= (ANIMFILTER_VISIBLE);
- else
- 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) {
- AnimData *adt= ANIM_nla_mapping_get(ac, ale);
-
- /* loop over cfraelems (stored in the KeyframeEditData->list)
- * - we need to do this here, as we can apply fewer NLA-mapping conversions
- */
- for (ce= ked.list.first; ce; ce= ce->next) {
- /* set frame for validation callback to refer to */
- if (adt)
- ked.f1= BKE_nla_tweakedit_remap(adt, ce->cfra, NLATIME_CONVERT_UNMAP);
- else
- ked.f1= ce->cfra;
-
- /* select elements with frame number matching cfraelem */
- ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
-
-#if 0 // XXX reenable when Grease Pencil stuff is back
- if (ale->type == ANIMTYPE_GPLAYER) {
- bGPDlayer *gpl= (bGPDlayer *)ale->data;
- bGPDframe *gpf;
-
- for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
- if (ecfra == gpf->framenum)
- gpf->flag |= GP_FRAME_SELECT;
- }
- }
- //else...
-#endif // XXX reenable when Grease Pencil stuff is back
- }
- }
-
- /* free elements */
- BLI_freelistN(&ked.list);
- BLI_freelistN(&anim_data);
-}
-
-/* ------------------- */
-
-static int actkeys_columnselect_exec(bContext *C, wmOperator *op)
-{
- bAnimContext ac;
- short mode;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* action to take depends on the mode */
- mode= RNA_enum_get(op->ptr, "mode");
-
- if (mode == ACTKEYS_COLUMNSEL_MARKERS_BETWEEN)
- markers_selectkeys_between(&ac);
- else
- columnselect_action_keys(&ac, mode);
-
- /* set notifier that keyframe selection have changed */
- WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL);
-
- return OPERATOR_FINISHED;
-}
-
-void ACTION_OT_select_column (wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Select All";
- ot->idname= "ACTION_OT_select_column";
- ot->description= "Select all keyframes on the specified frame(s)";
-
- /* api callbacks */
- ot->exec= actkeys_columnselect_exec;
- ot->poll= ED_operator_action_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- /* props */
- ot->prop= RNA_def_enum(ot->srna, "mode", prop_column_select_types, 0, "Mode", "");
-}
-
/* ******************** Select Linked Operator *********************** */
static int actkeys_select_linked_exec (bContext *C, wmOperator *op)
@@ -1160,4 +952,218 @@
RNA_def_boolean(ot->srna, "column", 0, "Column Select", ""); // ALTKEY
}
+/* ******************** Column Select Operator **************************** */
+/* This operator works in one of four ways:
+ * - 1) select all keyframes in the same frame as a selected one (KKEY)
+ * - 2) select all keyframes in the same frame as the current frame marker (CTRL-KKEY)
+ * - 3) select all keyframes in the same frame as a selected markers (SHIFT-KKEY)
+ * - 4) select all keyframes that occur between selected markers (ALT-KKEY)
+ */
+
+/* defines for column-select mode */
+static EnumPropertyItem prop_column_select_types[] = {
+ {ACTKEYS_COLUMNSEL_KEYS, "KEYS", 0, "On Selected Keyframes", ""},
+ {ACTKEYS_COLUMNSEL_CFRA, "CFRA", 0, "On Current Frame", ""},
+ {ACTKEYS_COLUMNSEL_LEFT, "LEFT", 0, "Before current frame", ""},
+ {ACTKEYS_COLUMNSEL_RIGHT, "RIGHT", 0, "After current frame", ""},
+ {ACTKEYS_COLUMNSEL_MARKERS_COLUMN, "MARKERS_COLUMN", 0, "On Selected Markers", ""},
+ {ACTKEYS_COLUMNSEL_MARKERS_BETWEEN, "MARKERS_BETWEEN", 0, "Between Min/Max Selected Markers", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+/* ------------------- */
+
+/* Selects all visible keyframes between the specified markers */
+static void markers_selectkeys_between (bAnimContext *ac)
+{
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ KeyframeEditFunc ok_cb, select_cb;
+ KeyframeEditData ked;
+ float min, max;
+
+ /* get extreme markers */
+ ED_markers_get_minmax(ac->markers, 1, &min, &max);
+ min -= 0.5f;
+ max += 0.5f;
+
+ /* get editing funcs + data */
+ ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);
+ select_cb= ANIM_editkeyframes_select(SELECT_ADD);
+
+ memset(&ked, 0, sizeof(KeyframeEditData));
+ ked.f1= min;
+ ked.f2= max;
+
+ /* filter data */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
+ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* select keys in-between */
+ 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_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
+ }
+ else {
+ ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
+ }
+ }
+
+ /* Cleanup */
+ BLI_freelistN(&anim_data);
+}
+
+/* Selects all visible keyframes in the same frames as the specified elements */
+static void columnselect_action_keys (bAnimContext *ac, short mode)
+{
+ ListBase anim_data= {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ Scene *scene= ac->scene;
+ CfraElem *ce;
+ KeyframeEditFunc select_cb, ok_cb;
+ KeyframeEditData ked;
+
+ /* initialise keyframe editing data */
+ memset(&ked, 0, sizeof(KeyframeEditData));
+
+ /* build list of columns */
+ switch (mode) {
+ case ACTKEYS_COLUMNSEL_KEYS: /* list of selected keys */
+ if (ac->datatype == ANIMCONT_GPENCIL) {
+ filter= (ANIMFILTER_VISIBLE);
+ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ //for (ale= anim_data.first; ale; ale= ale->next)
+ // gplayer_make_cfra_list(ale->data, &elems, 1);
+ }
+ else {
+ 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_keyframes_loop(&ked, ale->key_data, NULL, bezt_to_cfraelem, NULL);
+ }
+ BLI_freelistN(&anim_data);
+ break;
+
+ case ACTKEYS_COLUMNSEL_CFRA: /* current frame */
+ /* make a single CfraElem for storing this */
+ ce= MEM_callocN(sizeof(CfraElem), "cfraElem");
+ BLI_addtail(&ked.list, ce);
+
+ ce->cfra= (float)CFRA;
+ break;
+
+ case ACTKEYS_COLUMNSEL_MARKERS_COLUMN: /* list of selected markers */
+ ED_markers_make_cfra_list(ac->markers, &ked.list, 1);
+ break;
+
+ default: /* invalid option */
+ return;
+ }
+
+ /* set up BezTriple edit callbacks */
+ select_cb= ANIM_editkeyframes_select(SELECT_ADD);
+ ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAME);
+
+ /* loop through all of the keys and select additional keyframes
+ * based on the keys found to be selected above
+ */
+ if (ac->datatype == ANIMCONT_GPENCIL)
+ filter= (ANIMFILTER_VISIBLE);
+ else
+ 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) {
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
+
+ /* loop over cfraelems (stored in the KeyframeEditData->list)
+ * - we need to do this here, as we can apply fewer NLA-mapping conversions
+ */
+ for (ce= ked.list.first; ce; ce= ce->next) {
+ /* set frame for validation callback to refer to */
+ if (adt)
+ ked.f1= BKE_nla_tweakedit_remap(adt, ce->cfra, NLATIME_CONVERT_UNMAP);
+ else
+ ked.f1= ce->cfra;
+
+ /* select elements with frame number matching cfraelem */
+ ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
+
+#if 0 // XXX reenable when Grease Pencil stuff is back
+ if (ale->type == ANIMTYPE_GPLAYER) {
+ bGPDlayer *gpl= (bGPDlayer *)ale->data;
+ bGPDframe *gpf;
+
+ for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
+ if (ecfra == gpf->framenum)
+ gpf->flag |= GP_FRAME_SELECT;
+ }
+ }
+ //else...
+#endif // XXX reenable when Grease Pencil stuff is back
+ }
+ }
+
+ /* free elements */
+ BLI_freelistN(&ked.list);
+ BLI_freelistN(&anim_data);
+}
+
+/* ------------------- */
+
+static int actkeys_columnselect_exec(bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+ short mode;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* action to take depends on the mode */
+ mode= RNA_enum_get(op->ptr, "mode");
+
+ if (mode == ACTKEYS_COLUMNSEL_MARKERS_BETWEEN)
+ markers_selectkeys_between(&ac);
+ else if (mode == ACTKEYS_COLUMNSEL_LEFT)
+ actkeys_mselect_leftright(&ac,ACTKEYS_LRSEL_LEFT,SELECT_ADD); //columnselect_action_left_right(&ac, mode);
+ else if (mode == ACTKEYS_COLUMNSEL_RIGHT)
+ actkeys_mselect_leftright(&ac,ACTKEYS_LRSEL_RIGHT,SELECT_ADD); //columnselect_action_left_right(&ac, mode);
+ else
+ columnselect_action_keys(&ac, mode);
+
+ /* set notifier that keyframe selection have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void ACTION_OT_select_column (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select All";
+ ot->idname= "ACTION_OT_select_column";
+ ot->description= "Select all keyframes on the specified frame(s)";
+
+ /* api callbacks */
+ ot->exec= actkeys_columnselect_exec;
+ ot->poll= ED_operator_action_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ ot->prop= RNA_def_enum(ot->srna, "mode", prop_column_select_types, 0, "Mode", "");
+}
+
/* ************************************************************************** */

File Metadata

Mime Type
text/x-diff
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
a0/e6/ad314301d15602f089c5637ea0c5

Event Timeline