[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19670] branches/blender2.5/blender/source /blender/editors: Action Editor: Selection tools cleanup
Joshua Leung
aligorith at gmail.com
Sun Apr 12 08:47:26 CEST 2009
Revision: 19670
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19670
Author: aligorith
Date: 2009-04-12 08:47:25 +0200 (Sun, 12 Apr 2009)
Log Message:
-----------
Action Editor: Selection tools cleanup
* Cleaned up the code for selecting keyframes
* Click-column-select (Alt-RMB) now works
* Also, moved a function used in both Action/DopeSheet and Graph editors to the Animation module
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c
branches/blender2.5/blender/source/blender/editors/include/ED_keyframes_edit.h
branches/blender2.5/blender/source/blender/editors/space_action/action_edit.c
branches/blender2.5/blender/source/blender/editors/space_action/action_select.c
branches/blender2.5/blender/source/blender/editors/space_graph/graph_edit.c
Modified: branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c 2009-04-12 06:41:01 UTC (rev 19669)
+++ branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c 2009-04-12 06:47:25 UTC (rev 19670)
@@ -335,6 +335,24 @@
}
/* ******************************************* */
+/* Assorted Utility Functions */
+
+/* helper callback for <animeditor>_cfrasnap_exec() -> used to help get the average time of all selected beztriples */
+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;
+}
+
+/* ******************************************* */
/* Transform */
static short snap_bezier_nearest(BeztEditData *bed, BezTriple *bezt)
Modified: branches/blender2.5/blender/source/blender/editors/include/ED_keyframes_edit.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_keyframes_edit.h 2009-04-12 06:41:01 UTC (rev 19669)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_keyframes_edit.h 2009-04-12 06:47:25 UTC (rev 19670)
@@ -131,6 +131,10 @@
BeztEditFunc ANIM_editkeyframes_handles(short mode);
BeztEditFunc ANIM_editkeyframes_ipo(short mode);
+/* ----------- BezTriple Callback (Assorted Utilities) ---------- */
+
+short bezt_calc_average(BeztEditData *bed, struct BezTriple *bezt);
+
/* ************************************************ */
/* Destructive Editing API (keyframes_general.c) */
Modified: branches/blender2.5/blender/source/blender/editors/space_action/action_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_action/action_edit.c 2009-04-12 06:41:01 UTC (rev 19669)
+++ branches/blender2.5/blender/source/blender/editors/space_action/action_edit.c 2009-04-12 06:47:25 UTC (rev 19670)
@@ -1051,22 +1051,6 @@
/* ***************** 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;
-}
-
/* snap current-frame indicator to 'average time' of selected keyframe */
static int actkeys_cfrasnap_exec(bContext *C, wmOperator *op)
{
Modified: branches/blender2.5/blender/source/blender/editors/space_action/action_select.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_action/action_select.c 2009-04-12 06:41:01 UTC (rev 19669)
+++ branches/blender2.5/blender/source/blender/editors/space_action/action_select.c 2009-04-12 06:47:25 UTC (rev 19670)
@@ -83,154 +83,6 @@
#include "action_intern.h"
/* ************************************************************************** */
-/* GENERAL STUFF */
-
-/* used only by mouse_action. It is used to find the location of the nearest
- * keyframe to where the mouse clicked,
- */
-// XXX just merge this into the existing code!
-static void *get_nearest_action_key (bAnimContext *ac, int mval[2], float *selx, short *sel, short *ret_type, bActionGroup **par)
-{
- ListBase anim_data = {NULL, NULL};
- ListBase anim_keys = {NULL, NULL};
- bAnimListElem *ale;
- ActKeyColumn *ak;
- View2D *v2d= &ac->ar->v2d;
- int filter;
-
- rctf rectf;
- void *data = NULL;
- float xmin, xmax, x, y;
- int channel_index;
- short found = 0;
-
- /* action-group */
- *par= NULL;
-
-
- UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
- UI_view2d_listview_view_to_cell(v2d, 0, ACHANNEL_STEP, 0, (float)ACHANNEL_HEIGHT_HALF, x, y, NULL, &channel_index);
-
- /* x-range to check is +/- 7 on either side of mouse click (size of keyframe icon) */
- UI_view2d_region_to_view(v2d, mval[0]-7, mval[1], &rectf.xmin, &rectf.ymin);
- UI_view2d_region_to_view(v2d, mval[0]+7, mval[1], &rectf.xmax, &rectf.ymax);
-
- /* filter data */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS);
- ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
-
- /* get channel */
- ale= BLI_findlink(&anim_data, channel_index);
- if (ale == NULL) {
- /* channel not found */
- printf("Error: animation channel (index = %d) not found in mouse_action_keys() \n", channel_index);
-
- BLI_freelistN(&anim_data);
- return NULL;
- }
- else {
- /* found match - must return here... */
- Object *nob= ANIM_nla_mapping_get(ac, ale);
- ActKeysInc *aki= init_aki_data(ac, ale);
-
- /* apply NLA-scaling correction? */
- if (nob) {
- xmin= get_action_frame(nob, rectf.xmin);
- xmax= get_action_frame(nob, rectf.xmax);
- }
- else {
- xmin= rectf.xmin;
- xmax= rectf.xmax;
- }
-
- /* make list of keyframes */
- if (ale->key_data) {
- switch (ale->datatype) {
- case ALE_OB:
- {
- Object *ob= (Object *)ale->key_data;
- ob_to_keylist(ob, &anim_keys, NULL, aki);
- }
- break;
- case ALE_ACT:
- {
- bAction *act= (bAction *)ale->key_data;
- action_to_keylist(act, &anim_keys, NULL, aki);
- }
- break;
- case ALE_FCURVE:
- {
- FCurve *fcu= (FCurve *)ale->key_data;
- fcurve_to_keylist(fcu, &anim_keys, NULL, aki);
- }
- break;
- }
- }
- else if (ale->type == ANIMTYPE_GROUP) {
- bActionGroup *agrp= (bActionGroup *)ale->data;
- agroup_to_keylist(agrp, &anim_keys, NULL, aki);
- }
- else if (ale->type == ANIMTYPE_GPDATABLOCK) {
- /* cleanup */
- BLI_freelistN(&anim_data);
-
- /* this channel currently doens't have any keyframes... must ignore! */
- *ret_type= ANIMTYPE_NONE;
- return NULL;
- }
- else if (ale->type == ANIMTYPE_GPLAYER) {
- bGPDlayer *gpl= (bGPDlayer *)ale->data;
- gpl_to_keylist(gpl, &anim_keys, NULL, aki);
- }
-
- /* loop through keyframes, finding one that was clicked on */
- for (ak= anim_keys.first; ak; ak= ak->next) {
- if (IN_RANGE(ak->cfra, xmin, xmax)) {
- *selx= ak->cfra;
- found= 1;
- break;
- }
- }
- /* no matching keyframe found - set to mean frame value so it doesn't actually select anything */
- if (found == 0)
- *selx= ((xmax+xmin) / 2);
-
- /* figure out what to return */
- if (ac->datatype == ANIMCONT_ACTION) {
- *par= ale->owner; /* assume that this is an action group */
- *ret_type= ale->type;
- data = ale->data;
- }
- else if (ac->datatype == ANIMCONT_SHAPEKEY) {
- data = ale->key_data;
- *ret_type= ANIMTYPE_FCURVE;
- }
- else if (ac->datatype == ANIMCONT_DOPESHEET) {
- data = ale->data;
- *ret_type= ale->type;
- }
- else if (ac->datatype == ANIMCONT_GPENCIL) {
- data = ale->data;
- *ret_type= ANIMTYPE_GPLAYER;
- }
-
- /* cleanup tempolary lists */
- BLI_freelistN(&anim_keys);
- anim_keys.first = anim_keys.last = NULL;
-
- BLI_freelistN(&anim_data);
-
- return data;
- }
-
- /* cleanup */
- BLI_freelistN(&anim_data);
-
- *ret_type= ANIMTYPE_NONE;
- return NULL;
-}
-
-/* ************************************************************************** */
/* KEYFRAMES STUFF */
/* ******************** Deselect All Operator ***************************** */
@@ -763,140 +615,26 @@
/* ------------------- */
/* option 1) select keyframe directly under mouse */
-static void mouse_action_keys (bAnimContext *ac, int mval[2], short selectmode)
+static void actkeys_select_single (bAnimContext *ac, bAnimListElem *ale, short select_mode, float selx)
{
- Scene *sce= NULL;
- Object *ob= NULL;
- bDopeSheet *ads= NULL;
- bAction *act= NULL;
- bActionGroup *agrp= NULL;
- FCurve *fcu= NULL;
- bGPdata *gpd = NULL;
- bGPDlayer *gpl = NULL;
+ bDopeSheet *ads= (ac->datatype == ANIMCONT_DOPESHEET) ? ac->data : NULL;
+ int ds_filter = ((ads) ? (ads->filterflag) : (0));
BeztEditData bed;
BeztEditFunc select_cb, ok_cb;
- void *anim_channel;
- short sel, chan_type = 0, key_type = 0;
- float selx = 0.0f;
- /* determine what type of data we are operating on */
- if (ac->datatype == ANIMCONT_ACTION)
- act= (bAction *)ac->data;
- else if (ac->datatype == ANIMCONT_DOPESHEET)
- ads= (bDopeSheet *)ac->data;
- else if (ac->datatype == ANIMCONT_GPENCIL)
- gpd= (bGPdata *)ac->data;
-
- /* get channel and selection info */
- anim_channel= get_nearest_action_key(ac, mval, &selx, &sel, &chan_type, &agrp); // xxx...
- if (anim_channel == NULL)
- return;
-
- switch (chan_type) {
- case ANIMTYPE_FCURVE:
- fcu= (FCurve *)anim_channel;
- key_type= ALE_FCURVE;
- break;
- case ANIMTYPE_GROUP:
- agrp= (bActionGroup *)anim_channel;
- key_type= ALE_GROUP;
- break;
-#if 0 // XXX fixme
- case ANIMTYPE_DSMAT:
- ipo= ((Material *)anim_channel)->ipo;
- break;
- case ANIMTYPE_DSLAM:
- ipo= ((Lamp *)anim_channel)->ipo;
- break;
- case ANIMTYPE_DSCAM:
- ipo= ((Camera *)anim_channel)->ipo;
- break;
- case ANIMTYPE_DSCUR:
- ipo= ((Curve *)anim_channel)->ipo;
- break;
- case ANIMTYPE_DSSKEY:
- ipo= ((Key *)anim_channel)->ipo;
- break;
-#endif // XXX fixme
- case ANIMTYPE_FILLACTD:
- act= (bAction *)anim_channel;
- key_type= ALE_ACT;
- break;
- case ANIMTYPE_OBJECT:
- ob= ((Base *)anim_channel)->object;
- key_type= ALE_OB;
- break;
- case ANIMTYPE_SCENE:
- sce= (Scene *)anim_channel;
- key_type= ALE_SCE;
- break;
- case ANIMTYPE_GPLAYER:
- gpl= (bGPDlayer *)anim_channel;
- break;
- default:
- return;
- }
-
- /* for replacing selection, firstly need to clear existing selection */
- if (selectmode == SELECT_REPLACE) {
- selectmode = SELECT_ADD;
-
- deselect_action_keys(ac, 0, SELECT_SUBTRACT);
-
- if (ELEM(ac->datatype, ANIMCONT_ACTION, ANIMCONT_DOPESHEET)) {
- int filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS); /* this should suffice for now */
-
- /* deselect all other channels first */
- ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
-
- /* Highlight Action-Group or F-Curve? */
- if (agrp) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list