Commit: 04bac387315ce09822c36bc20e0fe4e7d533fec8 Author: Jacques Lucke Date: Tue Jun 4 11:35:57 2019 +0200 Branches: master https://developer.blender.org/rB04bac387315ce09822c36bc20e0fe4e7d533fec8
Graph Editor: drag to box select keyframes There is a keymap conflict with ctrl+tweak. Therefore, I did not include this yet. Reviewers: brecht Differential Revision: https://developer.blender.org/D4999 =================================================================== M release/scripts/presets/keyconfig/keymap_data/blender_default.py M source/blender/editors/space_graph/graph_select.c =================================================================== diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py index 64b4f7b1cac..ef466c2f3c5 100644 --- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -1369,6 +1369,10 @@ def km_graph_editor(params): {"properties": [("axis_range", False), ("include_handles", True)]}), ("graph.select_box", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, {"properties": [("axis_range", True), ("include_handles", True)]}), + ("graph.select_box", {"type": params.select_tweak, "value": 'ANY'}, + {"properties": [("tweak", True), ("mode", 'SET')]}), + ("graph.select_box", {"type": params.select_tweak, "value": 'ANY', "shift": True}, + {"properties": [("tweak", True), ("mode", 'ADD')]}), ("graph.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True}, {"properties": [("mode", 'ADD')]}), ("graph.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True}, diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c index 5ea07c56286..4bd738fca95 100644 --- a/source/blender/editors/space_graph/graph_select.c +++ b/source/blender/editors/space_graph/graph_select.c @@ -59,904 +59,859 @@ /* ************************************************************************** */ /* KEYFRAMES STUFF */ -/* ******************** Deselect All Operator ***************************** */ -/* This operator works in one of three ways: - * 1) (de)select all (AKEY) - test if select all or deselect all - * 2) invert all (CTRL-IKEY) - invert selection of all keyframes - * 3) (de)select all - no testing is done; only for use internal tools as normal function... - */ - -/* Deselects keyframes in the Graph Editor - * - This is called by the deselect all operator, as well as other ones! - * - * - test: check if select or deselect all - * - sel: how to select keyframes - * 0 = deselect - * 1 = select - * 2 = invert - * - do_channels: whether to affect selection status of channels - */ -void deselect_graph_keys(bAnimContext *ac, bool test, short sel, bool do_channels) -{ - ListBase anim_data = {NULL, NULL}; - bAnimListElem *ale; - int filter; - - SpaceGraph *sipo = (SpaceGraph *)ac->sl; - KeyframeEditData ked = {{NULL}}; - KeyframeEditFunc test_cb, sel_cb; - - /* determine type-based settings */ - filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_CURVE_VISIBLE | ANIMFILTER_NODUPLIS); - - /* filter data */ - ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - - /* init BezTriple looping data */ - test_cb = ANIM_editkeyframes_ok(BEZT_OK_SELECTED); +/* temp info for caching handle vertices close */ +typedef struct tNearestVertInfo { + struct tNearestVertInfo *next, *prev; - /* See if we should be selecting or deselecting */ - if (test) { - for (ale = anim_data.first; ale; ale = ale->next) { - if (ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, test_cb, NULL)) { - sel = SELECT_SUBTRACT; - break; - } - } - } + FCurve *fcu; /* F-Curve that keyframe comes from */ - /* convert sel to selectmode, and use that to get editor */ - sel_cb = ANIM_editkeyframes_select(sel); + BezTriple *bezt; /* keyframe to consider */ + FPoint *fpt; /* sample point to consider */ - /* Now set the flags */ - for (ale = anim_data.first; ale; ale = ale->next) { - FCurve *fcu = (FCurve *)ale->key_data; + short hpoint; /* the handle index that we hit (eHandleIndex) */ + short sel; /* whether the handle is selected or not */ + int dist; /* distance from mouse to vert */ - /* Keyframes First */ - ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, sel_cb, NULL); + eAnim_ChannelType ctype; /* type of animation channel this FCurve comes from */ - /* affect channel selection status? */ - if (do_channels) { - /* Only change selection of channel when the visibility of keyframes - * doesn't depend on this. */ - if ((sipo->flag & SIPO_SELCUVERTSONLY) == 0) { - /* deactivate the F-Curve, and deselect if deselecting keyframes. - * otherwise select the F-Curve too since we've selected all the keyframes - */ - if (sel == SELECT_SUBTRACT) { - fcu->flag &= ~FCURVE_SELECTED; - } - else { - fcu->flag |= FCURVE_SELECTED; - } - } + float frame; /* frame that point was on when it matched (global time) */ +} tNearestVertInfo; - /* always deactivate all F-Curves if we perform batch ops for selection */ - fcu->flag &= ~FCURVE_ACTIVE; - } - } +/* Tags for the type of graph vert that we have */ +typedef enum eGraphVertIndex { + NEAREST_HANDLE_LEFT = -1, + NEAREST_HANDLE_KEY, + NEAREST_HANDLE_RIGHT, +} eGraphVertIndex; - /* Cleanup */ - ANIM_animdata_freelist(&anim_data); -} +/* Tolerance for absolute radius (in pixels) of the vert from the cursor to use */ +// TODO: perhaps this should depend a bit on the size that the user set the vertices to be? +#define GVERTSEL_TOL (10 * U.pixelsize) -/* ------------------- */ +/* ....... */ -static int graphkeys_deselectall_exec(bContext *C, wmOperator *op) +/* check if its ok to select a handle */ +// XXX also need to check for int-values only? +static bool fcurve_handle_sel_check(SpaceGraph *sipo, BezTriple *bezt) { - bAnimContext ac; - bAnimListElem *ale_active = NULL; - - /* get editor data */ - if (ANIM_animdata_get_context(C, &ac) == 0) { - return OPERATOR_CANCELLED; + if (sipo->flag & SIPO_NOHANDLES) { + return 0; } - - /* find active F-Curve, and preserve this for later - * or else it becomes annoying with the current active - * curve keeps fading out even while you're editing it - */ - ale_active = get_active_fcurve_channel(&ac); - - /* 'standard' behavior - check if selected, then apply relevant selection */ - const int action = RNA_enum_get(op->ptr, "action"); - switch (action) { - case SEL_TOGGLE: - deselect_graph_keys(&ac, 1, SELECT_ADD, true); - break; - case SEL_SELECT: - deselect_graph_keys(&ac, 0, SELECT_ADD, true); - break; - case SEL_DESELECT: - deselect_graph_keys(&ac, 0, SELECT_SUBTRACT, true); - break; - case SEL_INVERT: - deselect_graph_keys(&ac, 0, SELECT_INVERT, true); - break; - default: - BLI_assert(0); - break; + if ((sipo->flag & SIPO_SELVHANDLESONLY) && BEZT_ISSEL_ANY(bezt) == 0) { + return 0; } + return 1; +} - /* restore active F-Curve... */ - if (ale_active) { - FCurve *fcu = (FCurve *)ale_active->data; +/* check if the given vertex is within bounds or not */ +// TODO: should we return if we hit something? +static void nearest_fcurve_vert_store(ListBase *matches, + View2D *v2d, + FCurve *fcu, + eAnim_ChannelType ctype, + BezTriple *bezt, + FPoint *fpt, + short hpoint, + const int mval[2], + float unit_scale, + float offset) +{ + /* Keyframes or Samples? */ + if (bezt) { + int screen_co[2], dist; - /* all others should not be disabled, so we should be able to just set this directly... - * - selection needs to be set too, or else this won't work... + /* convert from data-space to screen coordinates + * NOTE: hpoint+1 gives us 0,1,2 respectively for each handle, + * needed to access the relevant vertex coordinates in the 3x3 + * 'vec' matrix */ - fcu->flag |= (FCURVE_SELECTED | FCURVE_ACTIVE); - - MEM_freeN(ale_active); - ale_active = NULL; - } + if (UI_view2d_view_to_region_clip(v2d, + bezt->vec[hpoint + 1][0], + (bezt->vec[hpoint + 1][1] + offset) * unit_scale, + &screen_co[0], + &screen_co[1]) && + /* check if distance from mouse cursor to vert in screen space is within tolerance */ + ((dist = len_v2v2_int(mval, screen_co)) <= GVERTSEL_TOL)) { + tNearestVertInfo *nvi = (tNearestVertInfo *)matches->last; + bool replace = false; - /* set notifier that things have changed */ - WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, NULL); + /* If there is already a point for the F-Curve, + * check if this point is closer than that was. */ + if ((nvi) && (nvi->fcu == fcu)) { + /* replace if we are closer, or if equal and that one wasn't selected but we are... */ + if ((nvi->dist > dist) || ((nvi->sel == 0) && BEZT_ISSEL_ANY(bezt))) { + replace = 1; + } + } + /* add new if not replacing... */ + if (replace == 0) { + nvi = MEM_callocN(sizeof(tNearestVertInfo), "Nearest Graph Vert Info - Bezt"); + } - return OPERATOR_FINISHED; -} + /* store values */ + nvi->fcu = fcu; + nvi->ctype = ctype; -void GRAPH_OT_select_all(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Select All"; - ot->idname = "GRAPH_OT_select_all"; - ot->description = "Toggle selection of all keyframes"; + nvi->bezt = bezt; + nvi->hpoint = hpoint; + nvi->dist = dist; - /* api callbacks */ - ot->exec = graphkeys_deselectall_exec; - ot->poll = graphop_visible_keyframes_poll; + nvi->frame = bezt->vec[1][0]; /* currently in global time... */ - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + nvi->sel = BEZT_ISSEL_ANY(bezt); // XXX... should this use the individual verts instead? - /* properties */ - WM_operator_properties_select_all(ot); + /* add to list of matches if appropriate... */ + if (replace == 0) { + BLI_addtail(matches, nvi); + } + } + } + else if (fpt) { + /* TODO... */ + } @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-blender-cvs
