[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26666] trunk/blender: DopeSheet and Graph Editors: Select More/Less Operators
Joshua Leung
aligorith at gmail.com
Sun Feb 7 12:50:03 CET 2010
Revision: 26666
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26666
Author: aligorith
Date: 2010-02-07 12:50:03 +0100 (Sun, 07 Feb 2010)
Log Message:
-----------
DopeSheet and Graph Editors: Select More/Less Operators
This commit introduces the Select More/Less Operators (Ctrl +/-) for keyframes. This works like the ones for curves, by only selecting/deselecting keyframes lying in the same F-Curve. Inter F-Curve selection is not done by this operator. That is the job for another one.
This is especially useful for F-Curves set in the 0-1-0 pattern (i.e. 3 keyframes forming localised peaks), where the peaks can be selected by clicking on them individually, and immediately surrounding '0' values are selected too using "Select More".
Modified Paths:
--------------
trunk/blender/release/scripts/ui/space_dopesheet.py
trunk/blender/release/scripts/ui/space_graph.py
trunk/blender/source/blender/editors/animation/keyframes_edit.c
trunk/blender/source/blender/editors/include/ED_keyframes_edit.h
trunk/blender/source/blender/editors/space_action/action_intern.h
trunk/blender/source/blender/editors/space_action/action_ops.c
trunk/blender/source/blender/editors/space_action/action_select.c
trunk/blender/source/blender/editors/space_graph/graph_intern.h
trunk/blender/source/blender/editors/space_graph/graph_ops.c
trunk/blender/source/blender/editors/space_graph/graph_select.c
Modified: trunk/blender/release/scripts/ui/space_dopesheet.py
===================================================================
--- trunk/blender/release/scripts/ui/space_dopesheet.py 2010-02-07 11:17:19 UTC (rev 26665)
+++ trunk/blender/release/scripts/ui/space_dopesheet.py 2010-02-07 11:50:03 UTC (rev 26666)
@@ -119,7 +119,11 @@
layout.operator("action.select_column", text="Columns on Selected Markers").mode = 'MARKERS_COLUMN'
layout.operator("action.select_column", text="Between Selected Markers").mode = 'MARKERS_BETWEEN'
+ layout.separator()
+ layout.operator("action.select_more")
+ layout.operator("action.select_less")
+
class DOPESHEET_MT_channel(bpy.types.Menu):
bl_label = "Channel"
Modified: trunk/blender/release/scripts/ui/space_graph.py
===================================================================
--- trunk/blender/release/scripts/ui/space_graph.py 2010-02-07 11:17:19 UTC (rev 26665)
+++ trunk/blender/release/scripts/ui/space_graph.py 2010-02-07 11:50:03 UTC (rev 26666)
@@ -122,7 +122,11 @@
layout.operator("graph.select_column", text="Columns on Selected Markers").mode = 'MARKERS_COLUMN'
layout.operator("graph.select_column", text="Between Selected Markers").mode = 'MARKERS_BETWEEN'
+ layout.separator()
+ layout.operator("graph.select_more")
+ layout.operator("graph.select_less")
+
class GRAPH_MT_channel(bpy.types.Menu):
bl_label = "Channel"
Modified: trunk/blender/source/blender/editors/animation/keyframes_edit.c
===================================================================
--- trunk/blender/source/blender/editors/animation/keyframes_edit.c 2010-02-07 11:17:19 UTC (rev 26665)
+++ trunk/blender/source/blender/editors/animation/keyframes_edit.c 2010-02-07 11:50:03 UTC (rev 26666)
@@ -90,19 +90,22 @@
short ANIM_fcurve_keys_bezier_loop(BeztEditData *bed, FCurve *fcu, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb)
{
BezTriple *bezt;
- int b;
/* sanity check */
if (ELEM(NULL, fcu, fcu->bezt))
return 0;
+ /* set the F-Curve into the editdata so that it can be accessed */
+ bed->fcu= fcu;
+ bed->curIndex= 0;
+
/* if function to apply to bezier curves is set, then loop through executing it on beztriples */
if (bezt_cb) {
/* if there's a validation func, include that check in the loop
* (this is should be more efficient than checking for it in every loop)
*/
if (bezt_ok) {
- for (b=0, bezt=fcu->bezt; b < fcu->totvert; b++, bezt++) {
+ for (bed->curIndex=0, bezt=fcu->bezt; bed->curIndex < fcu->totvert; bed->curIndex++, bezt++) {
/* Only operate on this BezTriple if it fullfills the criteria of the validation func */
if (bezt_ok(bed, bezt)) {
/* Exit with return-code '1' if function returns positive
@@ -113,7 +116,7 @@
}
}
else {
- for (b=0, bezt=fcu->bezt; b < fcu->totvert; b++, bezt++) {
+ for (bed->curIndex=0, bezt=fcu->bezt; bed->curIndex < fcu->totvert; bed->curIndex++, bezt++) {
/* Exit with return-code '1' if function returns positive
* This is useful if finding if some BezTriple satisfies a condition.
*/
@@ -121,6 +124,10 @@
}
}
}
+
+ /* unset the F-Curve from the editdata now that it's done */
+ bed->fcu= NULL;
+ bed->curIndex= 0;
/* if fcu_cb (F-Curve post-editing callback) has been specified then execute it */
if (fcu_cb)
@@ -786,6 +793,8 @@
}
/* Queries if the handle should be set to 'free' or 'align' */
+// NOTE: this was used for the 'toggle free/align' option
+// currently this isn't used, but may be restored later
static short bezier_isfree(BeztEditData *bed, BezTriple *bezt)
{
if ((bezt->f1 & SELECT) && (bezt->h1)) return 1;
@@ -951,3 +960,123 @@
return select_bezier_add;
}
}
+
+/* ******************************************* */
+/* Selection Maps */
+
+/* Selection maps are simply fancy names for char arrays that store on/off
+ * info for whether the selection status. The main purpose for these is to
+ * allow extra info to be tagged to the keyframes without influencing their
+ * values or having to be removed later.
+ */
+
+/* ----------- */
+
+static short selmap_build_bezier_more(BeztEditData *bed, BezTriple *bezt)
+{
+ FCurve *fcu= bed->fcu;
+ char *map= bed->data;
+ int i= bed->curIndex;
+
+ /* if current is selected, just make sure it stays this way */
+ if (BEZSELECTED(bezt)) {
+ map[i]= 1;
+ return 0;
+ }
+
+ /* if previous is selected, that means that selection should extend across */
+ if (i > 0) {
+ BezTriple *prev= bezt - 1;
+
+ if (BEZSELECTED(prev)) {
+ map[i]= 1;
+ return 0;
+ }
+ }
+
+ /* if next is selected, that means that selection should extend across */
+ if (i < (fcu->totvert-1)) {
+ BezTriple *next= bezt + 1;
+
+ if (BEZSELECTED(next)) {
+ map[i]= 1;
+ return 0;
+ }
+ }
+
+ return 0;
+}
+
+static short selmap_build_bezier_less(BeztEditData *bed, BezTriple *bezt)
+{
+ FCurve *fcu= bed->fcu;
+ char *map= bed->data;
+ int i= bed->curIndex;
+
+ /* if current is selected, check the left/right keyframes
+ * since it might need to be deselected (but otherwise no)
+ */
+ if (BEZSELECTED(bezt)) {
+ /* if previous is not selected, we're on the tip of an iceberg */
+ if (i > 0) {
+ BezTriple *prev= bezt - 1;
+
+ if (BEZSELECTED(prev) == 0)
+ return 0;
+ }
+ else if (i == 0) {
+ /* current keyframe is selected at an endpoint, so should get deselected */
+ return 0;
+ }
+
+ /* if next is not selected, we're on the tip of an iceberg */
+ if (i < (fcu->totvert-1)) {
+ BezTriple *next= bezt + 1;
+
+ if (BEZSELECTED(next) == 0)
+ return 0;
+ }
+ else if (i == (fcu->totvert-1)) {
+ /* current keyframe is selected at an endpoint, so should get deselected */
+ return 0;
+ }
+
+ /* if we're still here, that means that keyframe should remain untouched */
+ map[i]= 1;
+ }
+
+ return 0;
+}
+
+/* Get callback for building selection map */
+BeztEditFunc ANIM_editkeyframes_buildselmap(short mode)
+{
+ switch (mode) {
+ case SELMAP_LESS: /* less */
+ return selmap_build_bezier_less;
+
+ case SELMAP_MORE: /* more */
+ default:
+ return selmap_build_bezier_more;
+ }
+}
+
+/* ----------- */
+
+/* flush selection map values to the given beztriple */
+short bezt_selmap_flush(BeztEditData *bed, BezTriple *bezt)
+{
+ char *map= bed->data;
+ short on= map[bed->curIndex];
+
+ /* select or deselect based on whether the map allows it or not */
+ if (on) {
+ BEZ_SEL(bezt);
+ }
+ else {
+ BEZ_DESEL(bezt);
+ }
+
+ return 0;
+}
+
Modified: trunk/blender/source/blender/editors/include/ED_keyframes_edit.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_keyframes_edit.h 2010-02-07 11:17:19 UTC (rev 26665)
+++ trunk/blender/source/blender/editors/include/ED_keyframes_edit.h 2010-02-07 11:50:03 UTC (rev 26666)
@@ -58,7 +58,7 @@
/* ------------ */
-/* select tools */
+/* select modes */
typedef enum eEditKeyframes_Select {
SELECT_REPLACE = (1<<0),
SELECT_ADD = (1<<1),
@@ -66,6 +66,12 @@
SELECT_INVERT = (1<<4),
} eEditKeyframes_Select;
+/* "selection map" building modes */
+typedef enum eEditKeyframes_SelMap {
+ SELMAP_MORE = 0,
+ SELMAP_LESS,
+} eEditKeyframes_SelMap;
+
/* snapping tools */
typedef enum eEditKeyframes_Snap {
SNAP_KEYS_CURFRAME = 1,
@@ -91,11 +97,16 @@
/* --- Generic Properties for Bezier Edit Tools ----- */
typedef struct BeztEditData {
+ /* generic properties/data access */
ListBase list; /* temp list for storing custom list of data to check */
struct Scene *scene; /* pointer to current scene - many tools need access to cfra/etc. */
void *data; /* pointer to custom data - usually 'Object' but also 'rectf', but could be other types too */
float f1, f2; /* storage of times/values as 'decimals' */
int i1, i2; /* storage of times/values/flags as 'whole' numbers */
+
+ /* current iteration data */
+ struct FCurve *fcu; /* F-Curve that is being iterated over */
+ int curIndex; /* index of current keyframe being iterated over */
} BeztEditData;
/* ------- Function Pointer Typedefs ---------------- */
@@ -143,6 +154,18 @@
BeztEditFunc ANIM_editkeyframes_ipo(short mode);
BeztEditFunc ANIM_editkeyframes_keytype(short mode);
+/* -------- BezTriple Callbacks (Selection Map) ---------- */
+
+/* Get a callback to populate the selection settings map
+ * requires: bed->custom = char[] of length fcurve->totvert
+ */
+BeztEditFunc ANIM_editkeyframes_buildselmap(short mode);
+
+/* Change the selection status of the keyframe based on the map entry for this vert
+ * requires: bed->custom = char[] of length fcurve->totvert
+ */
+short bezt_selmap_flush(BeztEditData *bed, struct BezTriple *bezt);
+
/* ----------- BezTriple Callback (Assorted Utilities) ---------- */
/* used to calculate the the average location of all relevant BezTriples by summing their locations */
Modified: trunk/blender/source/blender/editors/space_action/action_intern.h
===================================================================
--- trunk/blender/source/blender/editors/space_action/action_intern.h 2010-02-07 11:17:19 UTC (rev 26665)
+++ trunk/blender/source/blender/editors/space_action/action_intern.h 2010-02-07 11:50:03 UTC (rev 26666)
@@ -56,6 +56,8 @@
void ACTION_OT_select_all_toggle(struct wmOperatorType *ot);
void ACTION_OT_select_border(struct wmOperatorType *ot);
void ACTION_OT_select_column(struct wmOperatorType *ot);
+void ACTION_OT_select_more(struct wmOperatorType *ot);
+void ACTION_OT_select_less(struct wmOperatorType *ot);
void ACTION_OT_clickselect(struct wmOperatorType *ot);
/* defines for left-right select tool */
Modified: trunk/blender/source/blender/editors/space_action/action_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_action/action_ops.c 2010-02-07 11:17:19 UTC (rev 26665)
+++ trunk/blender/source/blender/editors/space_action/action_ops.c 2010-02-07 11:50:03 UTC (rev 26666)
@@ -67,6 +67,8 @@
WM_operatortype_append(ACTION_OT_select_all_toggle);
WM_operatortype_append(ACTION_OT_select_border);
WM_operatortype_append(ACTION_OT_select_column);
+ WM_operatortype_append(ACTION_OT_select_more);
+ WM_operatortype_append(ACTION_OT_select_less);
/* editing */
WM_operatortype_append(ACTION_OT_snap);
@@ -122,6 +124,11 @@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list