2
* header_action.c oct-2003
4
* Functions to draw the "Action Editor" window header
5
* and handle user events sent to it.
7
* $Id: header_action.c 16931 2008-10-05 11:49:09Z aligorith $
9
* ***** BEGIN GPL LICENSE BLOCK *****
11
* This program is free software; you can redistribute it and/or
12
* modify it under the terms of the GNU General Public License
13
* as published by the Free Software Foundation; either version 2
14
* of the License, or (at your option) any later version.
16
* This program is distributed in the hope that it will be useful,
17
* but WITHOUT ANY WARRANTY; without even the implied warranty of
18
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
* GNU General Public License for more details.
21
* You should have received a copy of the GNU General Public License
22
* along with this program; if not, write to the Free Software Foundation,
23
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
26
* All rights reserved.
28
* The Original Code is: all of this file.
30
* Contributor(s): 2007, Joshua Leung (Action Editor recode)
32
* ***** END GPL LICENSE BLOCK *****
43
#include "DNA_action_types.h"
44
#include "DNA_curve_types.h"
46
#include "DNA_ipo_types.h"
47
#include "DNA_key_types.h"
48
#include "DNA_object_types.h"
49
#include "DNA_scene_types.h"
50
#include "DNA_screen_types.h"
51
#include "DNA_space_types.h"
54
#include "BIF_glutil.h"
55
#include "BIF_editaction.h"
56
#include "BIF_interface.h"
57
#include "BIF_language.h"
58
#include "BIF_poseobject.h"
59
#include "BIF_resources.h"
60
#include "BIF_screen.h"
61
#include "BIF_space.h"
62
#include "BIF_toolbox.h"
64
#include "BKE_action.h"
65
#include "BKE_armature.h"
66
#include "BKE_constraint.h"
67
#include "BKE_depsgraph.h"
68
#include "BKE_global.h"
70
#include "BKE_utildefines.h"
72
#include "BDR_drawaction.h"
73
#include "BSE_drawipo.h"
74
#include "BSE_headerbuttons.h"
82
/* ------------------------------- */
83
/* enums declaring constants that are used as menu event codes */
86
ACTMENU_VIEW_CENTERVIEW= 0,
87
ACTMENU_VIEW_AUTOUPDATE,
91
ACTMENU_VIEW_MAXIMIZE,
94
ACTMENU_VIEW_NEXTMARKER,
95
ACTMENU_VIEW_PREVMARKER,
96
ACTMENU_VIEW_NEXTKEYFRAME,
97
ACTMENU_VIEW_PREVKEYFRAME,
100
ACTMENU_VIEW_TRANSDELDUPS,
101
ACTMENU_VIEW_HORIZOPTIMISE,
102
ACTMENU_VIEW_GCOLORS,
103
ACTMENU_VIEW_PREVRANGESET,
104
ACTMENU_VIEW_PREVRANGECLEAR,
105
ACTMENU_VIEW_PREVRANGEAUTO
109
ACTMENU_SEL_BORDER = 0,
112
ACTMENU_SEL_ALL_KEYS,
113
ACTMENU_SEL_ALL_CHAN,
114
ACTMENU_SEL_ALL_MARKERS,
115
ACTMENU_SEL_INVERSE_KEYS,
116
ACTMENU_SEL_INVERSE_MARKERS,
117
ACTMENU_SEL_INVERSE_CHANNELS,
118
ACTMENU_SEL_LEFTKEYS,
119
ACTMENU_SEL_RIGHTKEYS
123
ACTMENU_SEL_COLUMN_KEYS = 1,
124
ACTMENU_SEL_COLUMN_CFRA,
125
ACTMENU_SEL_COLUMN_MARKERSCOLUMN,
126
ACTMENU_SEL_COLUMN_MARKERSBETWEEN
130
ACTMENU_CHANNELS_OPENLEVELS = 0,
131
ACTMENU_CHANNELS_CLOSELEVELS,
132
ACTMENU_CHANNELS_EXPANDALL,
133
ACTMENU_CHANNELS_SHOWACHANS,
134
ACTMENU_CHANNELS_DELETE
138
ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_UP = 0,
139
ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_DOWN,
140
ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_TOP,
141
ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_BOTTOM
145
ACTMENU_CHANNELS_GROUP_ADD_TOACTIVE = 0,
146
ACTMENU_CHANNELS_GROUP_ADD_TONEW,
147
ACTMENU_CHANNELS_GROUP_REMOVE,
148
ACTMENU_CHANNELS_GROUP_SYNCPOSE
152
ACTMENU_CHANNELS_SETTINGS_TOGGLE = 0,
153
ACTMENU_CHANNELS_SETTINGS_ENABLE,
154
ACTMENU_CHANNELS_SETTINGS_DISABLE,
158
ACTMENU_KEY_DUPLICATE = 0,
161
ACTMENU_KEY_SAMPLEKEYS,
162
ACTMENU_KEY_INSERTKEY
166
ACTMENU_KEY_TRANSFORM_MOVE = 0,
167
ACTMENU_KEY_TRANSFORM_SCALE,
168
ACTMENU_KEY_TRANSFORM_SLIDE,
169
ACTMENU_KEY_TRANSFORM_EXTEND
173
ACTMENU_KEY_HANDLE_AUTO = 0,
174
ACTMENU_KEY_HANDLE_ALIGN,
175
ACTMENU_KEY_HANDLE_FREE,
176
ACTMENU_KEY_HANDLE_VECTOR
180
ACTMENU_KEY_INTERP_CONST = 0,
181
ACTMENU_KEY_INTERP_LINEAR,
182
ACTMENU_KEY_INTERP_BEZIER
186
ACTMENU_KEY_EXTEND_CONST = 0,
187
ACTMENU_KEY_EXTEND_EXTRAPOLATION,
188
ACTMENU_KEY_EXTEND_CYCLIC,
189
ACTMENU_KEY_EXTEND_CYCLICEXTRAPOLATION
193
ACTMENU_KEY_SNAP_NEARFRAME = 1,
194
ACTMENU_KEY_SNAP_CURFRAME,
195
ACTMENU_KEY_SNAP_NEARMARK,
196
ACTMENU_KEY_SNAP_NEARTIME,
197
ACTMENU_KEY_SNAP_CFRA2KEY,
201
ACTMENU_KEY_MIRROR_CURFRAME = 1,
202
ACTMENU_KEY_MIRROR_YAXIS,
203
ACTMENU_KEY_MIRROR_XAXIS,
204
ACTMENU_KEY_MIRROR_MARKER
208
ACTMENU_MARKERS_ADD = 0,
209
ACTMENU_MARKERS_DUPLICATE,
210
ACTMENU_MARKERS_DELETE,
211
ACTMENU_MARKERS_NAME,
212
ACTMENU_MARKERS_MOVE,
213
ACTMENU_MARKERS_LOCALADD,
214
ACTMENU_MARKERS_LOCALRENAME,
215
ACTMENU_MARKERS_LOCALDELETE,
216
ACTMENU_MARKERS_LOCALMOVE
219
/* ------------------------------- */
220
/* macros for easier state testing (only for use here) */
222
/* test if active action editor is showing any markers */
223
#define G_SACTION_HASMARKERS \
224
((G.saction->action && G.saction->action->markers.first) \
225
|| (G.scene->markers.first))
227
/* ------------------------------- */
229
void do_action_buttons(unsigned short event)
234
case B_ACTHOME: /* HOMEKEY in Action Editor */
237
G.v2d->cur.ymin=-SCROLLB;
239
if (G.saction->action) {
242
calc_action_range(G.saction->action, &G.v2d->cur.xmin, &G.v2d->cur.xmax, 0);
243
if (G.saction->pin==0 && ob) {
244
G.v2d->cur.xmin= get_action_frame_inv(ob, G.v2d->cur.xmin);
245
G.v2d->cur.xmax= get_action_frame_inv(ob, G.v2d->cur.xmax);
247
extra= 0.05*(G.v2d->cur.xmax - G.v2d->cur.xmin);
248
G.v2d->cur.xmin-= extra;
249
G.v2d->cur.xmax+= extra;
251
if (G.v2d->cur.xmin==G.v2d->cur.xmax) {
253
G.v2d->cur.xmax= 100;
256
else { /* shapekeys and/or no action */
257
G.v2d->cur.xmin= -5.0;
258
G.v2d->cur.xmax= 65.0;
261
G.v2d->cur.ymin= -75.0;
262
G.v2d->cur.ymax= 5.0;
264
G.v2d->tot= G.v2d->cur;
265
test_view2d(G.v2d, curarea->winx, curarea->winy);
266
view2d_do_locks(curarea, V2D_LOCK_COPY);
268
addqueue (curarea->win, REDRAW, 1);
272
/* copy/paste/paste-flip buttons in 3d-view header in PoseMode */
275
allqueue(REDRAWVIEW3D, 1);
279
allqueue(REDRAWVIEW3D, 1);
283
allqueue(REDRAWVIEW3D, 1);
286
/* copy/paste buttons in Action Editor header */
288
if (G.saction->mode == SACTCONT_GPENCIL)
294
if (G.saction->mode == SACTCONT_GPENCIL)
300
case B_ACTPIN: /* __PINFAKE */
301
/* if (G.saction->flag & SACTION_PIN) {
302
if (G.saction->action)
303
G.saction->action->id.us ++;
306
if (G.saction->action)
307
G.saction->action->id.us --;
310
allqueue(REDRAWACTION, 1);
315
static void do_action_viewmenu(void *arg, int event)
317
extern int play_anim(int mode);
320
case ACTMENU_VIEW_CENTERVIEW: /* Center View to Current Frame */
323
case ACTMENU_VIEW_AUTOUPDATE: /* Update Automatically */
324
if (BTST(G.saction->lock, 0))
325
G.saction->lock = BCLR(G.saction->lock, 0);
327
G.saction->lock = BSET(G.saction->lock, 0);
329
case ACTMENU_VIEW_PLAY3D: /* Play Back Animation */
332
case ACTMENU_VIEW_PLAYALL: /* Play Back Animation in All */
335
case ACTMENU_VIEW_ALL: /* View All */
336
do_action_buttons(B_ACTHOME);
338
case ACTMENU_VIEW_LOCK:
339
G.v2d->flag ^= V2D_VIEWLOCK;
340
if (G.v2d->flag & V2D_VIEWLOCK)
341
view2d_do_locks(curarea, 0);
343
case ACTMENU_VIEW_SLIDERS: /* Show sliders (when applicable) */
344
G.saction->flag ^= SACTION_SLIDERS;
346
case ACTMENU_VIEW_MAXIMIZE: /* Maximize Window */
347
/* using event B_FULL */
349
case ACTMENU_VIEW_NEXTMARKER: /* Jump to next marker */
352
case ACTMENU_VIEW_PREVMARKER: /* Jump to previous marker */
355
case ACTMENU_VIEW_TIME: /* switch between frames and seconds display */
356
G.saction->flag ^= SACTION_DRAWTIME;
358
case ACTMENU_VIEW_NOHIDE: /* Show hidden channels */
359
G.saction->flag ^= SACTION_NOHIDE;
361
case ACTMENU_VIEW_NEXTKEYFRAME: /* Jump to next keyframe */
362
nextprev_action_keyframe(1);
364
case ACTMENU_VIEW_PREVKEYFRAME: /* Jump to previous keyframe */
365
nextprev_action_keyframe(-1);
367
case ACTMENU_VIEW_TRANSDELDUPS: /* Don't delete duplicate/overlapping keyframes after transform */
368
G.saction->flag ^= SACTION_NOTRANSKEYCULL;
370
case ACTMENU_VIEW_HORIZOPTIMISE: /* Include keyframes not in view (horizontally) when preparing to draw */
371
G.saction->flag ^= SACTION_HORIZOPTIMISEON;
373
case ACTMENU_VIEW_GCOLORS: /* Draw grouped-action channels using its group's color */
374
G.saction->flag ^= SACTION_NODRAWGCOLORS;
376
case ACTMENU_VIEW_PREVRANGESET: /* Set preview range */
377
anim_previewrange_set();
379
case ACTMENU_VIEW_PREVRANGECLEAR: /* Clear preview range */
380
anim_previewrange_clear();
382
case ACTMENU_VIEW_PREVRANGEAUTO: /* Auto preview-range length */
383
action_previewrange_set(G.saction->action);
386
allqueue(REDRAWVIEW3D, 0);
389
static uiBlock *action_viewmenu(void *arg_unused)
392
short yco= 0, menuwidth=120;
394
block= uiNewBlock(&curarea->uiblocks, "action_viewmenu",
395
UI_EMBOSSP, UI_HELV, curarea->headwin);
396
uiBlockSetButmFunc(block, do_action_viewmenu, NULL);
398
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
399
"Center View to Current Frame|C", 0, yco-=20,
400
menuwidth, 19, NULL, 0.0, 0.0, 1,
401
ACTMENU_VIEW_CENTERVIEW, "");
403
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
404
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
406
if (G.saction->flag & SACTION_DRAWTIME) {
407
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
408
"Show Frames|Ctrl T", 0, yco-=20,
409
menuwidth, 19, NULL, 0.0, 0.0, 1,
410
ACTMENU_VIEW_TIME, "");
413
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
414
"Show Seconds|Ctrl T", 0, yco-=20,
415
menuwidth, 19, NULL, 0.0, 0.0, 1,
416
ACTMENU_VIEW_TIME, "");
419
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
421
if (G.saction->mode == SACTCONT_GPENCIL) {
422
// this option may get removed in future
423
uiDefIconTextBut(block, BUTM, 1, (G.saction->flag & SACTION_HORIZOPTIMISEON)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
424
"Cull Out-of-View Keys (Time)|", 0, yco-=20,
425
menuwidth, 19, NULL, 0.0, 0.0, 1,
426
ACTMENU_VIEW_HORIZOPTIMISE, "");
429
uiDefIconTextBut(block, BUTM, 1, (G.saction->flag & SACTION_SLIDERS)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
430
"Show Sliders|", 0, yco-=20,
431
menuwidth, 19, NULL, 0.0, 0.0, 1,
432
ACTMENU_VIEW_SLIDERS, "");
434
uiDefIconTextBut(block, BUTM, 1, (G.saction->flag & SACTION_NOHIDE)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
435
"Show Hidden Channels|", 0, yco-=20,
436
menuwidth, 19, NULL, 0.0, 0.0, 1,
437
ACTMENU_VIEW_NOHIDE, "");
439
uiDefIconTextBut(block, BUTM, 1, (G.saction->flag & SACTION_NODRAWGCOLORS)?ICON_CHECKBOX_DEHLT:ICON_CHECKBOX_HLT,
440
"Use Group Colors|", 0, yco-=20,
441
menuwidth, 19, NULL, 0.0, 0.0, 1,
442
ACTMENU_VIEW_GCOLORS, "");
444
// this option may get removed in future
445
uiDefIconTextBut(block, BUTM, 1, (G.saction->flag & SACTION_HORIZOPTIMISEON)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
446
"Cull Out-of-View Keys (Time)|", 0, yco-=20,
447
menuwidth, 19, NULL, 0.0, 0.0, 1,
448
ACTMENU_VIEW_HORIZOPTIMISE, "");
450
uiDefIconTextBut(block, BUTM, 1, (G.saction->flag & SACTION_NOTRANSKEYCULL)?ICON_CHECKBOX_DEHLT:ICON_CHECKBOX_HLT,
451
"AutoMerge Keyframes|", 0, yco-=20,
452
menuwidth, 19, NULL, 0.0, 0.0, 1,
453
ACTMENU_VIEW_TRANSDELDUPS, "");
457
uiDefIconTextBut(block, BUTM, 1, (G.v2d->flag & V2D_VIEWLOCK)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
458
"Lock Time to Other Windows|", 0, yco-=20,
459
menuwidth, 19, NULL, 0.0, 0.0, 1,
460
ACTMENU_VIEW_LOCK, "");
462
uiDefIconTextBut(block, BUTM, 1, BTST(G.saction->lock, 0)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
463
"Update Automatically|", 0, yco-=20,
464
menuwidth, 19, NULL, 0.0, 0.0, 1,
465
ACTMENU_VIEW_AUTOUPDATE, "");
467
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
468
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
470
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
471
"Jump To Next Marker|PageUp", 0, yco-=20,
472
menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_NEXTMARKER, "");
473
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
474
"Jump To Prev Marker|PageDown", 0, yco-=20,
475
menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_PREVMARKER, "");
477
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
478
"Jump To Next Keyframe|Ctrl PageUp", 0, yco-=20,
479
menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_NEXTKEYFRAME, "");
480
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
481
"Jump To Prev Keyframe|Ctrl PageDown", 0, yco-=20,
482
menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_PREVKEYFRAME, "");
484
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
485
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
487
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
488
"Play Back Animation|Alt A", 0, yco-=20,
489
menuwidth, 19, NULL, 0.0, 0.0, 1,
490
ACTMENU_VIEW_PLAY3D, "");
491
//uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
492
// "Play Back Animation in 3D View|Alt Shift A", 0, yco-=20,
493
// menuwidth, 19, NULL, 0.0, 0.0, 1,
494
// ACTMENU_VIEW_PLAYALL, "");
496
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
497
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
499
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
500
"Set Preview Range|Ctrl P", 0, yco-=20,
501
menuwidth, 19, NULL, 0.0, 0.0, 1,
502
ACTMENU_VIEW_PREVRANGESET, "");
503
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
504
"Clear Preview Range|Alt P", 0, yco-=20,
505
menuwidth, 19, NULL, 0.0, 0.0, 1,
506
ACTMENU_VIEW_PREVRANGECLEAR, "");
508
if ((G.saction->mode == SACTCONT_ACTION) && (G.saction->action)) {
509
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
510
"Preview Range from Action Length|Ctrl Alt P", 0, yco-=20,
511
menuwidth, 19, NULL, 0.0, 0.0, 1,
512
ACTMENU_VIEW_PREVRANGEAUTO, "");
515
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
516
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
518
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
519
"View All|Home", 0, yco-=20,
520
menuwidth, 19, NULL, 0.0, 0.0, 1,
521
ACTMENU_VIEW_ALL, "");
524
uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1,
525
"Maximize Window|Ctrl UpArrow", 0, yco-=20,
526
menuwidth, 19, NULL, 0.0, 0.0, 0,
527
ACTMENU_VIEW_MAXIMIZE, "");
529
uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1,
530
"Tile Window|Ctrl DownArrow", 0, yco-=20,
531
menuwidth, 19, NULL, 0.0, 0.0, 0,
532
ACTMENU_VIEW_MAXIMIZE, "");
534
if(curarea->headertype==HEADERTOP) {
535
uiBlockSetDirection(block, UI_DOWN);
538
uiBlockSetDirection(block, UI_TOP);
539
uiBlockFlipOrder(block);
542
uiTextBoundsBlock(block, 50);
547
static void do_action_selectmenu_columnmenu(void *arg, int event)
550
case ACTMENU_SEL_COLUMN_MARKERSBETWEEN:
551
markers_selectkeys_between();
553
case ACTMENU_SEL_COLUMN_KEYS:
554
column_select_action_keys(1);
556
case ACTMENU_SEL_COLUMN_MARKERSCOLUMN:
557
column_select_action_keys(2);
559
case ACTMENU_SEL_COLUMN_CFRA:
560
column_select_action_keys(3);
564
allqueue(REDRAWMARKER, 0);
567
static uiBlock *action_selectmenu_columnmenu(void *arg_unused)
570
short yco= 0, menuwidth=120;
572
block= uiNewBlock(&curarea->uiblocks, "action_selectmenu_columnmenu",
573
UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
574
uiBlockSetButmFunc(block, do_action_selectmenu_columnmenu, NULL);
576
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
577
"On Selected Keys|K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
578
ACTMENU_SEL_COLUMN_KEYS, "");
579
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
580
"On Current Frame|Ctrl K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
581
ACTMENU_SEL_COLUMN_CFRA, "");
583
if (G_SACTION_HASMARKERS) {
584
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
585
"On Selected Markers|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
586
ACTMENU_SEL_COLUMN_MARKERSCOLUMN, "");
587
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
588
"Between Selected Markers|Alt K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
589
ACTMENU_SEL_COLUMN_MARKERSBETWEEN, "");
592
uiBlockSetDirection(block, UI_RIGHT);
593
uiTextBoundsBlock(block, 60);
598
static void do_action_selectmenu(void *arg, int event)
600
SpaceAction *saction;
604
saction = curarea->spacedata.first;
605
if (saction == NULL) return;
607
act = saction->action;
608
key = get_action_mesh_key();
612
case ACTMENU_SEL_BORDER: /* Border Select */
613
borderselect_action();
616
case ACTMENU_SEL_BORDERC: /* Border Select */
617
borderselect_actionchannels();
620
case ACTMENU_SEL_BORDERM: /* Border Select */
621
borderselect_markers();
624
case ACTMENU_SEL_ALL_KEYS: /* Select/Deselect All Keys */
625
deselect_action_keys(1, 1);
626
BIF_undo_push("(De)Select Keys");
627
allqueue(REDRAWACTION, 0);
628
allqueue(REDRAWNLA, 0);
629
allqueue(REDRAWIPO, 0);
632
case ACTMENU_SEL_ALL_CHAN: /* Select/Deselect All Channels */
633
deselect_action_channels(1);
634
BIF_undo_push("(De)Select Action Channels");
635
allqueue(REDRAWVIEW3D, 0);
636
allqueue(REDRAWACTION, 0);
637
allqueue(REDRAWNLA, 0);
638
allqueue(REDRAWIPO, 0);
641
case ACTMENU_SEL_ALL_MARKERS: /* select/deselect all markers */
642
deselect_markers(1, 0);
643
BIF_undo_push("(De)Select Markers");
644
allqueue(REDRAWMARKER, 0);
647
case ACTMENU_SEL_INVERSE_KEYS: /* invert selection status of keys */
648
deselect_action_keys(0, 2);
649
BIF_undo_push("Inverse Keys");
650
allqueue(REDRAWACTION, 0);
651
allqueue(REDRAWNLA, 0);
652
allqueue(REDRAWIPO, 0);
655
case ACTMENU_SEL_INVERSE_CHANNELS: /* invert selection status of channels */
656
deselect_action_channels(2);
657
BIF_undo_push("Inverse Action Channels");
658
allqueue(REDRAWVIEW3D, 0);
659
allqueue(REDRAWACTION, 0);
660
allqueue(REDRAWNLA, 0);
661
allqueue(REDRAWIPO, 0);
664
case ACTMENU_SEL_INVERSE_MARKERS: /* invert selection of markers */
665
deselect_markers(0, 2);
666
BIF_undo_push("Inverse Action Channels");
667
allqueue(REDRAWMARKER, 0);
670
case ACTMENU_SEL_LEFTKEYS:
671
selectkeys_leftright(1, SELECT_REPLACE);
674
case ACTMENU_SEL_RIGHTKEYS:
675
selectkeys_leftright(0, SELECT_REPLACE);
680
static uiBlock *action_selectmenu(void *arg_unused)
683
short yco= 0, menuwidth=120;
685
block= uiNewBlock(&curarea->uiblocks, "action_selectmenu",
686
UI_EMBOSSP, UI_HELV, curarea->headwin);
687
uiBlockSetButmFunc(block, do_action_selectmenu, NULL);
689
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
690
"Border Select Keys|B", 0, yco-=20,
691
menuwidth, 19, NULL, 0.0, 0.0, 0,
692
ACTMENU_SEL_BORDER, "");
693
if (G_SACTION_HASMARKERS) {
694
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
695
"Border Select Markers|Ctrl B", 0, yco-=20,
696
menuwidth, 19, NULL, 0.0, 0.0, 0,
697
ACTMENU_SEL_BORDERM, "");
699
if (G.saction->mode != SACTCONT_SHAPEKEY) {
700
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
701
"Border Select Channels|B", 0, yco-=20,
702
menuwidth, 19, NULL, 0.0, 0.0, 0,
703
ACTMENU_SEL_BORDERC, "");
706
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
707
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
709
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
710
"Select/Deselect All Keys|A", 0, yco-=20,
711
menuwidth, 19, NULL, 0.0, 0.0, 0,
712
ACTMENU_SEL_ALL_KEYS, "");
713
if (G_SACTION_HASMARKERS) {
714
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
715
"Select/Deselect All Markers|Ctrl A", 0, yco-=20,
716
menuwidth, 19, NULL, 0.0, 0.0, 0,
717
ACTMENU_SEL_ALL_MARKERS, "");
719
if (G.saction->mode != SACTCONT_SHAPEKEY) {
720
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
721
"Select/Deselect All Channels|A", 0, yco-=20,
722
menuwidth, 19, NULL, 0.0, 0.0, 0,
723
ACTMENU_SEL_ALL_CHAN, "");
726
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
727
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
729
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
730
"Inverse Keys|Ctrl I", 0, yco-=20,
731
menuwidth, 19, NULL, 0.0, 0.0, 0,
732
ACTMENU_SEL_INVERSE_KEYS, "");
733
if (G_SACTION_HASMARKERS) {
734
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
735
"Inverse Markers|Ctrl Shift I", 0, yco-=20,
736
menuwidth, 19, NULL, 0.0, 0.0, 0,
737
ACTMENU_SEL_INVERSE_MARKERS, "");
739
if (G.saction->mode != SACTCONT_SHAPEKEY) {
740
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
741
"Inverse All Channels|Ctrl I", 0, yco-=20,
742
menuwidth, 19, NULL, 0.0, 0.0, 0,
743
ACTMENU_SEL_INVERSE_CHANNELS, "");
746
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
747
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
749
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
750
"Back In Time|Alt RMB", 0, yco-=20,
751
menuwidth, 19, NULL, 0.0, 0.0, 0,
752
ACTMENU_SEL_LEFTKEYS, "");
754
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
755
"Ahead In Time|Alt RMB", 0, yco-=20,
756
menuwidth, 19, NULL, 0.0, 0.0, 0,
757
ACTMENU_SEL_RIGHTKEYS, "");
759
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
760
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
762
uiDefIconTextBlockBut(block, action_selectmenu_columnmenu,
763
NULL, ICON_RIGHTARROW_THIN, "Column Select Keys", 0, yco-=20, 120, 20, "");
765
if (curarea->headertype==HEADERTOP) {
766
uiBlockSetDirection(block, UI_DOWN);
769
uiBlockSetDirection(block, UI_TOP);
770
uiBlockFlipOrder(block);
773
uiTextBoundsBlock(block, 50);
779
static void do_action_channelmenu_posmenu(void *arg, int event)
783
case ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_DOWN:
784
rearrange_action_channels(REARRANGE_ACTCHAN_DOWN);
786
case ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_UP:
787
rearrange_action_channels(REARRANGE_ACTCHAN_UP);
789
case ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_TOP:
790
rearrange_action_channels(REARRANGE_ACTCHAN_TOP);
792
case ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_BOTTOM:
793
rearrange_action_channels(REARRANGE_ACTCHAN_BOTTOM);
797
scrarea_queue_winredraw(curarea);
800
static uiBlock *action_channelmenu_posmenu(void *arg_unused)
803
short yco= 0, menuwidth=120;
805
block= uiNewBlock(&curarea->uiblocks, "action_channelmenu_posmenu",
806
UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
807
uiBlockSetButmFunc(block, do_action_channelmenu_posmenu, NULL);
809
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
810
"Move Up|Shift Page Up", 0, yco-=20,
811
menuwidth, 19, NULL, 0.0, 0.0, 0,
812
ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_UP, "");
813
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
814
"Move Down|Shift Page Down", 0, yco-=20,
815
menuwidth, 19, NULL, 0.0, 0.0, 0,
816
ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_DOWN, "");
818
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
819
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
821
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
822
"Move to Top|Ctrl Shift Page Up", 0, yco-=20,
823
menuwidth, 19, NULL, 0.0, 0.0, 0,
824
ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_TOP, "");
825
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
826
"Move to Bottom|Ctrl Shift Page Down", 0, yco-=20,
827
menuwidth, 19, NULL, 0.0, 0.0, 0,
828
ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_BOTTOM, "");
830
uiBlockSetDirection(block, UI_RIGHT);
831
uiTextBoundsBlock(block, 60);
836
static void do_action_channelmenu_groupmenu(void *arg, int event)
840
case ACTMENU_CHANNELS_GROUP_ADD_TOACTIVE:
841
action_groups_group(0);
843
case ACTMENU_CHANNELS_GROUP_ADD_TONEW:
844
action_groups_group(1);
846
case ACTMENU_CHANNELS_GROUP_REMOVE:
847
action_groups_ungroup();
849
case ACTMENU_CHANNELS_GROUP_SYNCPOSE: /* Syncronise Pose-data and Action-data */
850
sync_pchan2achan_grouping();
855
static uiBlock *action_channelmenu_groupmenu(void *arg_unused)
858
short yco= 0, menuwidth=120;
860
block= uiNewBlock(&curarea->uiblocks, "action_channelmenu_groupmenu",
861
UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
862
uiBlockSetButmFunc(block, do_action_channelmenu_groupmenu, NULL);
864
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
865
"Add to Active Group|Shift G", 0, yco-=20,
866
menuwidth, 19, NULL, 0.0, 0.0, 0,
867
ACTMENU_CHANNELS_GROUP_ADD_TOACTIVE, "");
868
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
869
"Add to New Group|Ctrl Shift G", 0, yco-=20,
870
menuwidth, 19, NULL, 0.0, 0.0, 0,
871
ACTMENU_CHANNELS_GROUP_ADD_TONEW, "");
873
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
874
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
876
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
877
"Remove From Group|Alt G", 0, yco-=20,
878
menuwidth, 19, NULL, 0.0, 0.0, 0,
879
ACTMENU_CHANNELS_GROUP_REMOVE, "");
881
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
882
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
884
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
885
"Synchronise with Armature", 0, yco-=20,
886
menuwidth, 19, NULL, 0.0, 0.0, 0,
887
ACTMENU_CHANNELS_GROUP_SYNCPOSE, "");
889
uiBlockSetDirection(block, UI_RIGHT);
890
uiTextBoundsBlock(block, 60);
895
static void do_action_channelmenu_settingsmenu(void *arg, int event)
897
setflag_action_channels(event);
900
static uiBlock *action_channelmenu_settingsmenu(void *arg_unused)
903
short yco= 0, menuwidth=120;
905
block= uiNewBlock(&curarea->uiblocks, "action_channelmenu_settingsmenu",
906
UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
907
uiBlockSetButmFunc(block, do_action_channelmenu_settingsmenu, NULL);
909
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
910
"Toggle a Setting|Shift W", 0, yco-=20,
911
menuwidth, 19, NULL, 0.0, 0.0, 0,
912
ACTMENU_CHANNELS_SETTINGS_TOGGLE, "");
914
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
915
"Enable a Setting|Ctrl Shift W", 0, yco-=20,
916
menuwidth, 19, NULL, 0.0, 0.0, 0,
917
ACTMENU_CHANNELS_SETTINGS_ENABLE, "");
919
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
920
"Disable a Setting|Alt W", 0, yco-=20,
921
menuwidth, 19, NULL, 0.0, 0.0, 0,
922
ACTMENU_CHANNELS_SETTINGS_DISABLE, "");
924
uiBlockSetDirection(block, UI_RIGHT);
925
uiTextBoundsBlock(block, 60);
930
static void do_action_channelmenu(void *arg, int event)
932
SpaceAction *saction;
934
saction = curarea->spacedata.first;
935
if (saction == NULL) return;
939
case ACTMENU_CHANNELS_OPENLEVELS: /* Unfold selected channels one step */
940
openclose_level_action(1);
942
case ACTMENU_CHANNELS_CLOSELEVELS: /* Fold selected channels one step */
943
openclose_level_action(-1);
945
case ACTMENU_CHANNELS_EXPANDALL: /* Expands all channels */
948
case ACTMENU_CHANNELS_SHOWACHANS: /* Unfold groups that are hiding selected achans */
949
expand_obscuregroups_action();
951
case ACTMENU_CHANNELS_DELETE: /* Deletes selected channels */
952
delete_action_channels();
957
static uiBlock *action_channelmenu(void *arg_unused)
960
short yco= 0, menuwidth=120;
962
block= uiNewBlock(&curarea->uiblocks, "action_channelmenu",
963
UI_EMBOSSP, UI_HELV, curarea->headwin);
964
uiBlockSetButmFunc(block, do_action_channelmenu, NULL);
966
uiDefIconTextBlockBut(block, action_channelmenu_groupmenu,
967
NULL, ICON_RIGHTARROW_THIN,
968
"Grouping", 0, yco-=20, 120, 20, "");
970
uiDefIconTextBlockBut(block, action_channelmenu_posmenu,
971
NULL, ICON_RIGHTARROW_THIN,
972
"Ordering", 0, yco-=20, 120, 20, "");
974
uiDefIconTextBlockBut(block, action_channelmenu_settingsmenu,
975
NULL, ICON_RIGHTARROW_THIN,
976
"Settings", 0, yco-=20, 120, 20, "");
978
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
979
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
981
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
982
"Delete|X", 0, yco-=20,
983
menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_CHANNELS_DELETE, "");
985
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
986
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
988
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
989
"Toggle Show Hierachy|~", 0, yco-=20,
990
menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_CHANNELS_EXPANDALL, "");
992
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
993
"Show Group-Hidden Channels|Shift ~", 0, yco-=20,
994
menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_CHANNELS_SHOWACHANS, "");
996
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
997
"Expand One Level|Ctrl NumPad+", 0, yco-=20,
998
menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_CHANNELS_OPENLEVELS, "");
1000
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1001
"Collapse One Level|Ctrl NumPad-", 0, yco-=20,
1002
menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_CHANNELS_CLOSELEVELS, "");
1004
if (curarea->headertype==HEADERTOP) {
1005
uiBlockSetDirection(block, UI_DOWN);
1008
uiBlockSetDirection(block, UI_TOP);
1009
uiBlockFlipOrder(block);
1012
uiTextBoundsBlock(block, 50);
1017
/* note: uses do_action_channelmenu too... */
1018
static uiBlock *action_gplayermenu(void *arg_unused)
1021
short yco= 0, menuwidth=120;
1023
block= uiNewBlock(&curarea->uiblocks, "action_gplayermenu",
1024
UI_EMBOSSP, UI_HELV, curarea->headwin);
1025
uiBlockSetButmFunc(block, do_action_channelmenu, NULL);
1027
uiDefIconTextBlockBut(block, action_channelmenu_settingsmenu,
1028
NULL, ICON_RIGHTARROW_THIN,
1029
"Settings", 0, yco-=20, 120, 20, "");
1031
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
1032
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1034
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1035
"Delete|X", 0, yco-=20,
1036
menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_CHANNELS_DELETE, "");
1038
if (curarea->headertype==HEADERTOP) {
1039
uiBlockSetDirection(block, UI_DOWN);
1042
uiBlockSetDirection(block, UI_TOP);
1043
uiBlockFlipOrder(block);
1046
uiTextBoundsBlock(block, 50);
1051
static void do_action_keymenu_transformmenu(void *arg, int event)
1055
case ACTMENU_KEY_TRANSFORM_MOVE:
1056
transform_action_keys('g', 0);
1058
case ACTMENU_KEY_TRANSFORM_SCALE:
1059
transform_action_keys('s', 0);
1061
case ACTMENU_KEY_TRANSFORM_SLIDE:
1062
transform_action_keys('t', 0);
1064
case ACTMENU_KEY_TRANSFORM_EXTEND:
1065
transform_action_keys('e', 0);
1069
scrarea_queue_winredraw(curarea);
1072
static uiBlock *action_keymenu_transformmenu(void *arg_unused)
1075
short yco= 0, menuwidth=120;
1077
block= uiNewBlock(&curarea->uiblocks, "action_keymenu_transformmenu",
1078
UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1079
uiBlockSetButmFunc(block, do_action_keymenu_transformmenu, NULL);
1081
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1082
"Grab/Move|G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
1083
ACTMENU_KEY_TRANSFORM_MOVE, "");
1084
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1085
"Grab/Extend from Frame|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
1086
ACTMENU_KEY_TRANSFORM_EXTEND, "");
1087
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1088
"Scale|S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
1089
ACTMENU_KEY_TRANSFORM_SCALE, "");
1090
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1091
"Time Slide|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
1092
ACTMENU_KEY_TRANSFORM_SLIDE, "");
1095
uiBlockSetDirection(block, UI_RIGHT);
1096
uiTextBoundsBlock(block, 60);
1101
static void do_action_keymenu_handlemenu(void *arg, int event)
1104
case ACTMENU_KEY_HANDLE_AUTO:
1105
sethandles_action_keys(HD_AUTO);
1108
case ACTMENU_KEY_HANDLE_ALIGN:
1109
case ACTMENU_KEY_HANDLE_FREE:
1110
/* OK, this is kinda dumb, need to fix the
1111
* toggle crap in sethandles_ipo_keys()
1113
sethandles_action_keys(HD_ALIGN);
1116
case ACTMENU_KEY_HANDLE_VECTOR:
1117
sethandles_action_keys(HD_VECT);
1122
static uiBlock *action_keymenu_handlemenu(void *arg_unused)
1125
short yco= 0, menuwidth=120;
1127
block= uiNewBlock(&curarea->uiblocks, "action_keymenu_handlemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1128
uiBlockSetButmFunc(block, do_action_keymenu_handlemenu, NULL);
1130
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1131
"Auto|Shift H", 0, yco-=20,
1132
menuwidth, 19, NULL, 0.0, 0.0, 0,
1133
ACTMENU_KEY_HANDLE_AUTO, "");
1134
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1135
"Aligned|H", 0, yco-=20,
1136
menuwidth, 19, NULL, 0.0, 0.0, 0,
1137
ACTMENU_KEY_HANDLE_ALIGN, "");
1138
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1139
"Free|H", 0, yco-=20, menuwidth,
1140
19, NULL, 0.0, 0.0, 0,
1141
ACTMENU_KEY_HANDLE_FREE, "");
1142
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1143
"Vector|V", 0, yco-=20,
1144
menuwidth, 19, NULL, 0.0, 0.0, 0,
1145
ACTMENU_KEY_HANDLE_VECTOR, "");
1147
uiBlockSetDirection(block, UI_RIGHT);
1148
uiTextBoundsBlock(block, 60);
1153
static void do_action_keymenu_intpolmenu(void *arg, int event)
1157
case ACTMENU_KEY_INTERP_CONST:
1158
action_set_ipo_flags(SET_IPO_MENU, SET_IPO_CONSTANT);
1160
case ACTMENU_KEY_INTERP_LINEAR:
1161
action_set_ipo_flags(SET_IPO_MENU, SET_IPO_LINEAR);
1163
case ACTMENU_KEY_INTERP_BEZIER:
1164
action_set_ipo_flags(SET_IPO_MENU, SET_IPO_BEZIER);
1168
scrarea_queue_winredraw(curarea);
1171
static uiBlock *action_keymenu_intpolmenu(void *arg_unused)
1174
short yco= 0, menuwidth=120;
1176
block= uiNewBlock(&curarea->uiblocks, "action_keymenu_intpolmenu",
1177
UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1178
uiBlockSetButmFunc(block, do_action_keymenu_intpolmenu, NULL);
1180
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1181
"Constant|Shift T, 1", 0, yco-=20,
1182
menuwidth, 19, NULL, 0.0, 0.0, 0,
1183
ACTMENU_KEY_INTERP_CONST, "");
1184
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1185
"Linear|Shift T, 2", 0, yco-=20,
1186
menuwidth, 19, NULL, 0.0, 0.0, 0,
1187
ACTMENU_KEY_INTERP_LINEAR, "");
1188
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1189
"Bezier|Shift T, 3", 0, yco-=20,
1190
menuwidth, 19, NULL, 0.0, 0.0, 0,
1191
ACTMENU_KEY_INTERP_BEZIER, "");
1193
uiBlockSetDirection(block, UI_RIGHT);
1194
uiTextBoundsBlock(block, 60);
1199
static void do_action_keymenu_extendmenu(void *arg, int event)
1203
case ACTMENU_KEY_EXTEND_CONST:
1204
action_set_ipo_flags(SET_EXTEND_MENU, SET_EXTEND_CONSTANT);
1206
case ACTMENU_KEY_EXTEND_EXTRAPOLATION:
1207
action_set_ipo_flags(SET_EXTEND_MENU, SET_EXTEND_EXTRAPOLATION);
1209
case ACTMENU_KEY_EXTEND_CYCLIC:
1210
action_set_ipo_flags(SET_EXTEND_MENU, SET_EXTEND_CYCLIC);
1212
case ACTMENU_KEY_EXTEND_CYCLICEXTRAPOLATION:
1213
action_set_ipo_flags(SET_EXTEND_MENU, SET_EXTEND_CYCLICEXTRAPOLATION);
1217
scrarea_queue_winredraw(curarea);
1220
static uiBlock *action_keymenu_extendmenu(void *arg_unused)
1223
short yco= 0, menuwidth=120;
1225
block= uiNewBlock(&curarea->uiblocks, "action_keymenu_extendmenu",
1226
UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1227
uiBlockSetButmFunc(block, do_action_keymenu_extendmenu, NULL);
1229
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1230
"Constant", 0, yco-=20,
1231
menuwidth, 19, NULL, 0.0, 0.0, 0,
1232
ACTMENU_KEY_EXTEND_CONST, "");
1233
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1234
"Extrapolation", 0, yco-=20,
1235
menuwidth, 19, NULL, 0.0, 0.0, 0,
1236
ACTMENU_KEY_EXTEND_EXTRAPOLATION, "");
1237
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1238
"Cyclic", 0, yco-=20,
1239
menuwidth, 19, NULL, 0.0, 0.0, 0,
1240
ACTMENU_KEY_EXTEND_CYCLIC, "");
1241
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1242
"Cyclic Extrapolation", 0, yco-=20,
1243
menuwidth, 19, NULL, 0.0, 0.0, 0,
1244
ACTMENU_KEY_EXTEND_CYCLICEXTRAPOLATION, "");
1246
uiBlockSetDirection(block, UI_RIGHT);
1247
uiTextBoundsBlock(block, 60);
1252
static void do_action_keymenu_snapmenu(void *arg, int event)
1256
case ACTMENU_KEY_SNAP_NEARFRAME:
1257
case ACTMENU_KEY_SNAP_CURFRAME:
1258
case ACTMENU_KEY_SNAP_NEARMARK:
1259
case ACTMENU_KEY_SNAP_NEARTIME:
1260
snap_action_keys(event);
1263
case ACTMENU_KEY_SNAP_CFRA2KEY:
1268
scrarea_queue_winredraw(curarea);
1271
static uiBlock *action_keymenu_snapmenu(void *arg_unused)
1274
short yco= 0, menuwidth=120;
1276
block= uiNewBlock(&curarea->uiblocks, "action_keymenu_snapmenu",
1277
UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1278
uiBlockSetButmFunc(block, do_action_keymenu_snapmenu, NULL);
1280
if (G.saction->flag & SACTION_DRAWTIME) {
1281
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1282
"Key -> Nearest Second|Shift S, 1", 0, yco-=20,
1283
menuwidth, 19, NULL, 0.0, 0.0, 0,
1284
ACTMENU_KEY_SNAP_NEARTIME, "");
1285
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1286
"Key -> Current Time|Shift S, 2", 0, yco-=20,
1287
menuwidth, 19, NULL, 0.0, 0.0, 0,
1288
ACTMENU_KEY_SNAP_CURFRAME, "");
1292
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1293
"Key -> Nearest Frame|Shift S, 1", 0, yco-=20,
1294
menuwidth, 19, NULL, 0.0, 0.0, 0,
1295
ACTMENU_KEY_SNAP_NEARFRAME, "");
1296
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1297
"Key -> Current Frame|Shift S, 2", 0, yco-=20,
1298
menuwidth, 19, NULL, 0.0, 0.0, 0,
1299
ACTMENU_KEY_SNAP_CURFRAME, "");
1301
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1302
"Key -> Nearest Marker|Shift S, 3", 0, yco-=20,
1303
menuwidth, 19, NULL, 0.0, 0.0, 0,
1304
ACTMENU_KEY_SNAP_NEARMARK, "");
1306
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
1307
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1309
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1310
"Current Frame -> Key|Ctrl Shift S", 0, yco-=20,
1311
menuwidth, 19, NULL, 0.0, 0.0, 0,
1312
ACTMENU_KEY_SNAP_NEARMARK, "");
1314
uiBlockSetDirection(block, UI_RIGHT);
1315
uiTextBoundsBlock(block, 60);
1320
static void do_action_keymenu_mirrormenu(void *arg, int event)
1324
case ACTMENU_KEY_MIRROR_CURFRAME:
1325
case ACTMENU_KEY_MIRROR_YAXIS:
1326
mirror_action_keys(event);
1330
scrarea_queue_winredraw(curarea);
1333
static uiBlock *action_keymenu_mirrormenu(void *arg_unused)
1336
short yco= 0, menuwidth=120;
1338
block= uiNewBlock(&curarea->uiblocks, "action_keymenu_mirrormenu",
1339
UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1340
uiBlockSetButmFunc(block, do_action_keymenu_mirrormenu, NULL);
1342
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1343
"Current Frame|Shift M, 1", 0, yco-=20,
1344
menuwidth, 19, NULL, 0.0, 0.0, 0,
1345
ACTMENU_KEY_MIRROR_CURFRAME, "");
1346
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1347
"Vertical Axis|Shift M, 2", 0, yco-=20,
1348
menuwidth, 19, NULL, 0.0, 0.0, 0,
1349
ACTMENU_KEY_MIRROR_YAXIS, "");
1350
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1351
"Horizontal Axis|Shift M, 3", 0, yco-=20,
1352
menuwidth, 19, NULL, 0.0, 0.0, 0,
1353
ACTMENU_KEY_MIRROR_XAXIS, "");
1354
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1355
"Selected Marker|Shift M, 4", 0, yco-=20,
1356
menuwidth, 19, NULL, 0.0, 0.0, 0,
1357
ACTMENU_KEY_MIRROR_MARKER, "");
1359
uiBlockSetDirection(block, UI_RIGHT);
1360
uiTextBoundsBlock(block, 60);
1365
static void do_action_keymenu(void *arg, int event)
1367
SpaceAction *saction;
1371
saction = curarea->spacedata.first;
1372
if (!saction) return;
1374
act = saction->action;
1375
key = get_action_mesh_key();
1379
case ACTMENU_KEY_DUPLICATE:
1380
duplicate_action_keys();
1382
case ACTMENU_KEY_DELETE:
1383
delete_action_keys();
1385
case ACTMENU_KEY_CLEAN:
1388
case ACTMENU_KEY_SAMPLEKEYS:
1389
sample_action_keys();
1391
case ACTMENU_KEY_INSERTKEY:
1397
static uiBlock *action_keymenu(void *arg_unused)
1400
short yco= 0, menuwidth=120;
1402
block= uiNewBlock(&curarea->uiblocks, "action_keymenu",
1403
UI_EMBOSSP, UI_HELV, curarea->headwin);
1404
uiBlockSetButmFunc(block, do_action_keymenu, NULL);
1406
uiDefIconTextBlockBut(block, action_keymenu_transformmenu,
1407
NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 20, "");
1409
uiDefIconTextBlockBut(block, action_keymenu_snapmenu,
1410
NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 20, "");
1412
uiDefIconTextBlockBut(block, action_keymenu_mirrormenu,
1413
NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, 120, 20, "");
1415
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
1416
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1418
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1419
"Insert Key|I", 0, yco-=20,
1420
menuwidth, 19, NULL, 0.0, 0.0, 0,
1421
ACTMENU_KEY_INSERTKEY, "");
1423
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
1424
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1426
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1427
"Duplicate|Shift D", 0, yco-=20,
1428
menuwidth, 19, NULL, 0.0, 0.0, 0,
1429
ACTMENU_KEY_DUPLICATE, "");
1431
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1432
"Delete|X", 0, yco-=20,
1433
menuwidth, 19, NULL, 0.0, 0.0, 0,
1434
ACTMENU_KEY_DELETE, "");
1436
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
1437
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1439
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1440
"Clean Action|O", 0, yco-=20,
1441
menuwidth, 19, NULL, 0.0, 0.0, 0,
1442
ACTMENU_KEY_CLEAN, "");
1444
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1445
"Sample Keys|Alt O", 0, yco-=20,
1446
menuwidth, 19, NULL, 0.0, 0.0, 0,
1447
ACTMENU_KEY_SAMPLEKEYS, "");
1449
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
1450
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1452
uiDefIconTextBlockBut(block, action_keymenu_handlemenu,
1453
NULL, ICON_RIGHTARROW_THIN,
1454
"Handle Type", 0, yco-=20, 120, 20, "");
1456
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
1457
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1459
uiDefIconTextBlockBut(block, action_keymenu_extendmenu,
1460
NULL, ICON_RIGHTARROW_THIN,
1461
"Extend Mode", 0, yco-=20, 120, 20, "");
1462
uiDefIconTextBlockBut(block, action_keymenu_intpolmenu,
1463
NULL, ICON_RIGHTARROW_THIN,
1464
"Interpolation Mode", 0, yco-=20, 120, 20, "");
1467
if(curarea->headertype==HEADERTOP) {
1468
uiBlockSetDirection(block, UI_DOWN);
1471
uiBlockSetDirection(block, UI_TOP);
1472
uiBlockFlipOrder(block);
1475
uiTextBoundsBlock(block, 50);
1480
/* note: uses do_action_keymenu too! */
1481
static uiBlock *action_framemenu(void *arg_unused)
1484
short yco= 0, menuwidth=120;
1486
block= uiNewBlock(&curarea->uiblocks, "action_framemenu",
1487
UI_EMBOSSP, UI_HELV, curarea->headwin);
1488
uiBlockSetButmFunc(block, do_action_keymenu, NULL);
1490
uiDefIconTextBlockBut(block, action_keymenu_transformmenu,
1491
NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 20, "");
1493
uiDefIconTextBlockBut(block, action_keymenu_snapmenu,
1494
NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 20, "");
1496
uiDefIconTextBlockBut(block, action_keymenu_mirrormenu,
1497
NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, 120, 20, "");
1499
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
1500
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1502
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1503
"Duplicate|Shift D", 0, yco-=20,
1504
menuwidth, 19, NULL, 0.0, 0.0, 0,
1505
ACTMENU_KEY_DUPLICATE, "");
1507
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
1508
"Delete|X", 0, yco-=20,
1509
menuwidth, 19, NULL, 0.0, 0.0, 0,
1510
ACTMENU_KEY_DELETE, "");
1512
if(curarea->headertype==HEADERTOP) {
1513
uiBlockSetDirection(block, UI_DOWN);
1516
uiBlockSetDirection(block, UI_TOP);
1517
uiBlockFlipOrder(block);
1520
uiTextBoundsBlock(block, 50);
1525
static void do_action_markermenu(void *arg, int event)
1529
case ACTMENU_MARKERS_ADD:
1532
case ACTMENU_MARKERS_DUPLICATE:
1535
case ACTMENU_MARKERS_DELETE:
1538
case ACTMENU_MARKERS_NAME:
1541
case ACTMENU_MARKERS_MOVE:
1542
transform_markers('g', 0);
1545
case ACTMENU_MARKERS_LOCALADD:
1546
action_add_localmarker(G.saction->action, CFRA);
1548
case ACTMENU_MARKERS_LOCALDELETE:
1549
action_remove_localmarkers(G.saction->action);
1551
case ACTMENU_MARKERS_LOCALRENAME:
1552
action_rename_localmarker(G.saction->action);
1554
case ACTMENU_MARKERS_LOCALMOVE:
1555
G.saction->flag |= SACTION_POSEMARKERS_MOVE;
1556
transform_markers('g', 0);
1557
G.saction->flag &= ~SACTION_POSEMARKERS_MOVE;
1561
allqueue(REDRAWMARKER, 0);
1564
static uiBlock *action_markermenu(void *arg_unused)
1567
short yco= 0, menuwidth=120;
1569
block= uiNewBlock(&curarea->uiblocks, "action_markermenu",
1570
UI_EMBOSSP, UI_HELV, curarea->headwin);
1571
uiBlockSetButmFunc(block, do_action_markermenu, NULL);
1573
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Marker|M", 0, yco-=20,
1574
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_ADD, "");
1575
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Marker|Ctrl Shift D", 0, yco-=20,
1576
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_DUPLICATE, "");
1577
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker|Shift X", 0, yco-=20,
1578
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_DELETE, "");
1580
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1582
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "(Re)Name Marker|Ctrl M", 0, yco-=20,
1583
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_NAME, "");
1584
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Marker|Ctrl G", 0, yco-=20,
1585
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_MOVE, "");
1587
if (G.saction->mode == SACTCONT_ACTION) {
1588
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1590
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Pose Marker|Shift L", 0, yco-=20,
1591
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_LOCALADD, "");
1592
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rename Pose Marker|Ctrl Shift L", 0, yco-=20,
1593
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_LOCALRENAME, "");
1594
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Pose Marker|Alt L", 0, yco-=20,
1595
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_LOCALDELETE, "");
1596
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Pose Marker|Ctrl L", 0, yco-=20,
1597
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_LOCALMOVE, "");
1600
if(curarea->headertype==HEADERTOP) {
1601
uiBlockSetDirection(block, UI_DOWN);
1604
uiBlockSetDirection(block, UI_TOP);
1605
uiBlockFlipOrder(block);
1608
uiTextBoundsBlock(block, 50);
1613
void action_buttons(void)
1621
if (G.saction == NULL)
1624
/* copied from drawactionspace.... */
1625
// FIXME: do for gpencil too?
1626
if (!G.saction->pin) {
1628
G.saction->action = OBACT->action;
1630
G.saction->action= NULL;
1633
sprintf(name, "header %d", curarea->headwin);
1634
block= uiNewBlock(&curarea->uiblocks, name,
1635
UI_EMBOSS, UI_HELV, curarea->headwin);
1637
if (area_is_active_area(curarea))
1638
uiBlockSetCol(block, TH_HEADER);
1640
uiBlockSetCol(block, TH_HEADERDESEL);
1642
curarea->butspacetype= SPACE_ACTION;
1646
uiDefIconTextButC(block, ICONTEXTROW,B_NEWSPACE, ICON_VIEW3D,
1647
windowtype_pup(), xco, 0, XIC+10, YIC,
1648
&(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0,
1649
"Displays Current Window Type. "
1650
"Click for menu of available types.");
1654
uiBlockSetEmboss(block, UI_EMBOSSN);
1655
if (curarea->flag & HEADER_NO_PULLDOWN) {
1656
uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU,
1657
ICON_DISCLOSURE_TRI_RIGHT,
1659
&(curarea->flag), 0, 0, 0, 0,
1660
"Show pulldown menus");
1663
uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU,
1664
ICON_DISCLOSURE_TRI_DOWN,
1666
&(curarea->flag), 0, 0, 0, 0,
1667
"Hide pulldown menus");
1669
uiBlockSetEmboss(block, UI_EMBOSS);
1672
if ((curarea->flag & HEADER_NO_PULLDOWN)==0) {
1673
/* pull down menus */
1674
uiBlockSetEmboss(block, UI_EMBOSSP);
1676
xmax= GetButStringLength("View");
1677
uiDefPulldownBut(block, action_viewmenu, NULL,
1678
"View", xco, -2, xmax-3, 24, "");
1681
xmax= GetButStringLength("Select");
1682
uiDefPulldownBut(block, action_selectmenu, NULL,
1683
"Select", xco, -2, xmax-3, 24, "");
1686
if ((G.saction->action) && (G.saction->mode==SACTCONT_ACTION)) {
1687
xmax= GetButStringLength("Channel");
1688
uiDefPulldownBut(block, action_channelmenu, NULL,
1689
"Channel", xco, -2, xmax-3, 24, "");
1692
else if (G.saction->mode==SACTCONT_GPENCIL) {
1693
xmax= GetButStringLength("Channel");
1694
uiDefPulldownBut(block, action_gplayermenu, NULL,
1695
"Channel", xco, -2, xmax-3, 24, "");
1699
xmax= GetButStringLength("Marker");
1700
uiDefPulldownBut(block, action_markermenu, NULL,
1701
"Marker", xco, -2, xmax-3, 24, "");
1704
if (G.saction->mode == SACTCONT_GPENCIL) {
1705
xmax= GetButStringLength("Frame");
1706
uiDefPulldownBut(block, action_framemenu, NULL,
1707
"Frame", xco, -2, xmax-3, 24, "");
1712
xmax= GetButStringLength("Key");
1713
uiDefPulldownBut(block, action_keymenu, NULL,
1714
"Key", xco, -2, xmax-3, 24, "");
1719
uiBlockSetEmboss(block, UI_EMBOSS);
1722
uiDefButC(block, MENU, B_REDR,
1723
"Editor Mode %t|Action Editor %x0|ShapeKey Editor %x1|Grease Pencil %x2",
1724
xco,0,90,YIC, &(G.saction->mode), 0, 1, 0, 0,
1725
"Editing modes for this editor");
1730
/* MODE-DEPENDENT DRAWING */
1731
if (G.saction->mode != SACTCONT_GPENCIL) {
1736
xco= std_libbuttons(block, xco, 0, B_ACTPIN, &G.saction->pin,
1737
B_ACTIONBROWSE, ID_AC, 0, (ID*)G.saction->action,
1738
from, &(G.saction->actnr), B_ACTALONE,
1739
B_ACTLOCAL, B_ACTIONDELETE, 0, B_KEEPDATA);
1748
uiBlockBeginAlign(block);
1749
if (curarea->headertype==HEADERTOP) {
1750
uiDefIconBut(block, BUT, B_ACTCOPYKEYS, ICON_COPYUP, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected keyframes from the selected channel(s) to the buffer");
1751
uiDefIconBut(block, BUT, B_ACTPASTEKEYS, ICON_PASTEUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the keyframes from the buffer");
1754
uiDefIconBut(block, BUT, B_ACTCOPYKEYS, ICON_COPYDOWN, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected keyframes from the selected channel(s) to the buffer");
1755
uiDefIconBut(block, BUT, B_ACTPASTEKEYS, ICON_PASTEDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the keyframes from the buffer");
1757
uiBlockEndAlign(block);
1761
if (G.saction->mode != SACTCONT_GPENCIL) {
1763
if (G.saction->flag & SACTION_DRAWTIME) {
1764
uiDefButC(block, MENU, B_REDR,
1765
"Auto-Snap Keyframes %t|No Snap %x0|Second Step %x1|Nearest Second %x2|Nearest Marker %x3",
1766
xco,0,70,YIC, &(G.saction->autosnap), 0, 1, 0, 0,
1767
"Auto-snapping mode for keyframes when transforming");
1770
uiDefButC(block, MENU, B_REDR,
1771
"Auto-Snap Keyframes %t|No Snap %x0|Frame Step %x1|Nearest Frame %x2|Nearest Marker %x3",
1772
xco,0,70,YIC, &(G.saction->autosnap), 0, 1, 0, 0,
1773
"Auto-snapping mode for keyframes when transforming");
1780
uiDefIconButS(block, ICONTOG, 1, ICON_UNLOCKED, xco, 0, XIC, YIC,
1781
&(G.saction->lock), 0, 0, 0, 0,
1782
"Updates other affected window spaces automatically "
1783
"to reflect changes in real time");
1785
/* always as last */
1786
curarea->headbutlen = xco + 2*XIC;