soc-2008-mxcurioni: foundations for Freestyle as a render layer - new UI buttons...
[blender.git] / source / blender / src / header_nla.c
1 /**
2  * header_nla.c oct-2003
3  *
4  * Functions to draw the "NLA Editor" window header
5  * and handle user events sent to it.
6  * 
7  * $Id$
8  *
9  * ***** BEGIN GPL LICENSE BLOCK *****
10  *
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.
15  *
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.
20  *
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.
24  *
25  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
26  * All rights reserved.
27  *
28  * The Original Code is: all of this file.
29  *
30  * Contributor(s): none yet.
31  *
32  * ***** END GPL LICENSE BLOCK *****
33  */
34
35 #include <stdlib.h>
36 #include <string.h>
37 #include <stdio.h>
38
39 #ifdef HAVE_CONFIG_H
40 #include <config.h>
41 #endif
42
43 #include "DNA_ID.h"
44 #include "DNA_nla_types.h"
45 #include "DNA_scene_types.h"
46 #include "DNA_screen_types.h"
47 #include "DNA_space_types.h"
48
49 #include "BKE_global.h"
50 #include "BKE_main.h"
51 #include "BKE_utildefines.h"
52
53 #include "BIF_interface.h"
54 #include "BIF_resources.h"
55 #include "BIF_screen.h"
56 #include "BIF_space.h"
57 #include "BIF_editnla.h"
58 #include "BIF_editaction.h"
59 #include "BIF_toolbox.h"
60
61 #include "BSE_drawipo.h"
62 #include "BSE_headerbuttons.h"
63 #include "BSE_time.h"
64
65 //#include "nla.h"
66
67 #include "blendef.h"
68 #include "mydevice.h"
69
70 void do_nla_buttons(unsigned short event)
71 {
72         View2D *v2d;
73
74         switch(event){
75         case B_NLAHOME:
76                 //      Find X extents
77                 v2d= &(G.snla->v2d);
78                 
79                 /* i tried to understand nla/action drawing to reveil a 'tot' rect, impossible code! (ton) */
80                 v2d->cur.xmin = G.scene->r.sfra-5;
81                 v2d->cur.xmax = G.scene->r.efra+5;
82                 v2d->cur.ymin= -SCROLLB;
83                 v2d->cur.ymax= 5; // at least stuff is visiable then?
84                 
85                 test_view2d(G.v2d, curarea->winx, curarea->winy);
86                 view2d_do_locks(curarea, V2D_LOCK_COPY);
87                 addqueue (curarea->win, REDRAW, 1);
88                 break;
89         }
90 }
91
92
93 static void do_nla_viewmenu(void *arg, int event)
94 {
95         extern int play_anim(int mode);
96         
97         switch(event) {
98         case 0: /* Update Automatically */
99                 if(BTST(G.snla->lock, 0)) G.snla->lock = BCLR(G.snla->lock, 0);
100                 else G.snla->lock = BSET(G.snla->lock, 0);
101                 break;
102         case 1: /* Play Back Animation */
103                 play_anim(0);
104                 break;
105         case 2: /* Play Back Animation in 3D View */
106                 play_anim(1);
107                 break;
108         case 3: /* View All */
109                 do_nla_buttons(B_NLAHOME);
110                 break;
111         case 4: /* Maximize Window */
112                 /* using event B_FULL */
113                 break;
114         case 5: /* Update automatically */
115                 G.v2d->flag ^= V2D_VIEWLOCK;
116                 if(G.v2d->flag & V2D_VIEWLOCK)
117                         view2d_do_locks(curarea, 0);
118                 break;  
119         case 6: /* Show all objects that have keyframes? */
120                 G.snla->flag ^= SNLA_ALLKEYED;
121                 break;
122         case 7: /* Show timing in Frames or Seconds */
123                 G.snla->flag ^= SNLA_DRAWTIME;
124                 break;
125         case 8: /* Set Preview Range */
126                 anim_previewrange_set();
127                 break;
128         case 9: /* Clear Preview Range */
129                 anim_previewrange_clear();
130                 break;
131         case 10: /* AutoMerge Keyframes */
132                 G.snla->flag ^= SNLA_NOTRANSKEYCULL;
133                 break;
134         }
135 }
136
137 static uiBlock *nla_viewmenu(void *arg_unused)
138 {
139 /*      static short tog=0; */
140         uiBlock *block;
141         short yco= 0, menuwidth=120;
142         
143         block= uiNewBlock(&curarea->uiblocks, "nla_viewmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
144         uiBlockSetButmFunc(block, do_nla_viewmenu, NULL);
145                 
146         uiDefIconTextBut(block, BUTM, 1, (G.snla->flag & SNLA_ALLKEYED)?ICON_CHECKBOX_DEHLT:ICON_CHECKBOX_HLT, 
147                                          "Only Objects On Visible Layers|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
148                 
149         if (G.snla->flag & SNLA_DRAWTIME) {
150                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Frames|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
151         } else {
152                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Seconds|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
153         }
154         
155         uiDefIconTextBut(block, BUTM, 1, (G.snla->flag & SNLA_NOTRANSKEYCULL)?ICON_CHECKBOX_DEHLT:ICON_CHECKBOX_HLT, 
156                                          "AutoMerge Keyframes|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
157                 
158         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
159                 
160         if(BTST(G.snla->lock, 0)) {
161                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Update Automatically|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
162         } else {
163                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Update Automatically|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
164         }
165
166         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
167         
168         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation|Alt A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
169         //uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation in 3D View|Alt Shift A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
170         
171         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
172         
173         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Preview Range|Ctrl P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
174         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Preview Range|Alt P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
175         
176         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
177         
178         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
179         uiDefIconTextBut(block, BUTM, 1, (G.v2d->flag & V2D_VIEWLOCK)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT, 
180                                          "Lock Time to Other Windows|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
181         
182         if(!curarea->full) uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Maximize Window|Ctrl UpArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
183         else uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Tile Window|Ctrl DownArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
184         
185         if(curarea->headertype==HEADERTOP) {
186                 uiBlockSetDirection(block, UI_DOWN);
187         }
188         else {
189                 uiBlockSetDirection(block, UI_TOP);
190                 uiBlockFlipOrder(block);
191         }
192
193         uiTextBoundsBlock(block, 50);
194         
195         return block;
196 }
197
198 static void do_nla_selectmenu(void *arg, int event)
199 {       
200
201         switch(event)
202         {
203         case 0: /* Border Select */
204                 borderselect_nla();
205                 break;
206         case 1: /* Select/Deselect All Keys */
207                 deselect_nlachannel_keys(1);
208                 allqueue (REDRAWNLA, 0);
209                 allqueue (REDRAWIPO, 0);
210                 break;
211         case 2: /* Select/Deselect All Channel */
212                 deselect_nlachannels(1);
213                 allqueue (REDRAWVIEW3D, 0);
214                 allqueue (REDRAWNLA, 0);
215                 allqueue (REDRAWIPO, 0);
216                 break;
217         case 3: /* Select/Deselect All Markers */
218                 deselect_markers(1, 0);
219                 allqueue(REDRAWMARKER, 0);
220                 break;
221         case 4: /* Borderselect markers */
222                 borderselect_markers();
223                 break;
224         }
225 }
226
227 static uiBlock *nla_selectmenu(void *arg_unused)
228 {
229         uiBlock *block;
230         short yco= 0, menuwidth=120;
231
232         block= uiNewBlock(&curarea->uiblocks, "nla_selectmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
233         uiBlockSetButmFunc(block, do_nla_selectmenu, NULL);
234
235         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
236         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select Markers|Ctrl B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
237         
238         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
239         
240         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All Keys|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
241         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All Channels", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
242         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All Markers|Ctrl A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
243
244         if(curarea->headertype==HEADERTOP) {
245                 uiBlockSetDirection(block, UI_DOWN);
246         }
247         else {
248                 uiBlockSetDirection(block, UI_TOP);
249                 uiBlockFlipOrder(block);
250         }
251
252         uiTextBoundsBlock(block, 50);
253
254         return block;
255 }
256
257 static void do_nla_strip_snapmenu(void *arg, int event)
258 {
259         snap_action_strips(event);
260         
261         allqueue(REDRAWIPO, 0);
262         allqueue(REDRAWACTION, 0);
263         allqueue(REDRAWNLA, 0); 
264 }
265
266 static uiBlock *nla_strip_snapmenu(void *arg_unused)
267 {
268         uiBlock *block;
269         short yco = 20, menuwidth = 120;
270
271         block= uiNewBlock(&curarea->uiblocks, "nla_strip_snapmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
272         uiBlockSetButmFunc(block, do_nla_strip_snapmenu, NULL);
273         
274         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Nearest Frame|Shift S, 1",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
275         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Current Frame|Shift S, 2",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
276
277         uiBlockSetDirection(block, UI_RIGHT);
278         uiTextBoundsBlock(block, 60);
279         return block;
280 }
281
282 static void do_nla_strip_transformmenu(void *arg, int event)
283 {
284         switch(event) {
285         case 0: /* grab/move */
286                 transform_nlachannel_keys('g', 0);
287                 update_for_newframe_muted();
288                 break;
289         case 1: /* scale */
290                 transform_nlachannel_keys('s', 0);
291                 update_for_newframe_muted();
292                 break;
293         case 2: /* extend */
294                 transform_nlachannel_keys('e', 0);
295                 update_for_newframe_muted();
296                 break;
297         }
298         allqueue(REDRAWVIEW3D, 0);
299 }
300
301 static uiBlock *nla_strip_transformmenu(void *arg_unused)
302 {
303         uiBlock *block;
304         short yco = 20, menuwidth = 120;
305
306         block= uiNewBlock(&curarea->uiblocks, "nla_strip_transformmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
307         uiBlockSetButmFunc(block, do_nla_strip_transformmenu, NULL);
308         
309         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move|G",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
310         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Extend from Frame|E",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
311         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale|S",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
312         
313         
314         uiBlockSetDirection(block, UI_RIGHT);
315         uiTextBoundsBlock(block, 60);
316         return block;
317 }
318
319 static void do_nla_stripmenu(void *arg, int event)
320 {       
321         switch(event)
322         {
323         case 0: /* Strip Properties */
324                 add_blockhandler(curarea, NLA_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
325                 break;
326         case 1: /* Add Action Strip */
327                 add_nlablock();
328                 break;
329         case 2: /* Duplicate */
330                 duplicate_nlachannel_keys();
331                 update_for_newframe_muted();
332                 break;
333         case 3: /* Delete Strips */
334                 if (okee("Erase selected strips and/or keys")) {
335                         delete_nlachannel_keys ();
336                         update_for_newframe_muted();
337                 }
338                 break;
339         case 5: /* Convert Action to NLA Strip */
340                 convert_nla();
341                 break;
342         case 6: /* Move Up */
343                 shift_nlastrips_up();
344                 break;
345         case 7: /* Move Down */
346                 shift_nlastrips_down();
347                 break;
348         case 8: /* reset scale */
349                 reset_action_strips(1);
350                 break;
351         case 9: /* reset start/end of action */
352                 reset_action_strips(2);
353                 break;
354         case 10: /* add new action as new action strip */
355                 add_empty_nlablock();
356                 break;
357         case 11: /* apply scale */
358                 reset_action_strips(3);
359                 break;
360         }
361 }
362
363 static uiBlock *nla_stripmenu(void *arg_unused)
364 {
365         uiBlock *block;
366         short yco= 0, menuwidth=120;
367
368         block= uiNewBlock(&curarea->uiblocks, "nla_stripmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
369         uiBlockSetButmFunc(block, do_nla_stripmenu, NULL);
370
371         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Strip Properties...|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
372         uiDefIconTextBlockBut(block, nla_strip_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 20, "");
373         uiDefIconTextBlockBut(block, nla_strip_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 20, "");
374         
375         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Strip Scale|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
376         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Action Start/End|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
377         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Strip Scaling|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
378         
379         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
380         
381         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Action Strip|Shift A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
382         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Blank Action Strip|Shift N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
383         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Action to NLA Strip|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
384         
385         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
386         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
387         
388         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
389
390         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Down|Ctrl Page Down", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
391         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Up|Ctrl Page Up", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
392         
393
394         if(curarea->headertype==HEADERTOP) {
395                 uiBlockSetDirection(block, UI_DOWN);
396         }
397         else {
398                 uiBlockSetDirection(block, UI_TOP);
399                 uiBlockFlipOrder(block);
400         }
401
402         uiTextBoundsBlock(block, 50);
403
404         return block;
405 }
406
407 static void do_nla_markermenu(void *arg, int event)
408 {       
409         switch(event)
410         {
411                 case 1:
412                         add_marker(CFRA);
413                         break;
414                 case 2:
415                         duplicate_marker();
416                         break;
417                 case 3:
418                         remove_marker();
419                         break;
420                 case 4:
421                         rename_marker();
422                         break;
423                 case 5:
424                         transform_markers('g', 0);
425                         break;
426         }
427         
428         allqueue(REDRAWMARKER, 0);
429 }
430
431 static uiBlock *nla_markermenu(void *arg_unused)
432 {
433         uiBlock *block;
434         short yco= 0, menuwidth=120;
435
436         block= uiNewBlock(&curarea->uiblocks, "nla_markermenu", 
437                                           UI_EMBOSSP, UI_HELV, curarea->headwin);
438         uiBlockSetButmFunc(block, do_nla_markermenu, NULL);
439
440         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Marker|M", 0, yco-=20, 
441                                          menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
442         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Marker|Ctrl Shift D", 0, yco-=20, 
443                                          menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
444         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker|X", 0, yco-=20,
445                                          menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
446                                          
447         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
448
449         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "(Re)Name Marker|Ctrl M", 0, yco-=20,
450                                          menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
451         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Marker|Ctrl G", 0, yco-=20,
452                                          menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
453         
454         if(curarea->headertype==HEADERTOP) {
455                 uiBlockSetDirection(block, UI_DOWN);
456         }
457         else {
458                 uiBlockSetDirection(block, UI_TOP);
459                 uiBlockFlipOrder(block);
460         }
461
462         uiTextBoundsBlock(block, 50);
463
464         return block;
465 }
466
467 void nla_buttons(void)
468 {
469         SpaceNla *snla;
470         short xco, xmax;
471         char naam[20];
472         uiBlock *block;
473         
474         snla= curarea->spacedata.first;
475         
476         sprintf(naam, "header %d", curarea->headwin);
477         block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSS, UI_HELV, curarea->headwin);
478
479         if(area_is_active_area(curarea)) uiBlockSetCol(block, TH_HEADER);
480         else uiBlockSetCol(block, TH_HEADERDESEL);
481
482         curarea->butspacetype= SPACE_NLA;
483         
484         xco = 8;
485         
486         uiDefIconTextButC(block, ICONTEXTROW,B_NEWSPACE, ICON_VIEW3D, windowtype_pup(), xco,0,XIC+10,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Displays Current Window Type. Click for menu of available types.");
487
488         xco+= XIC+14;
489
490         uiBlockSetEmboss(block, UI_EMBOSSN);
491         if(curarea->flag & HEADER_NO_PULLDOWN) {
492                 uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_RIGHT,
493                                 xco,2,XIC,YIC-2,
494                                 &(curarea->flag), 0, 0, 0, 0, "Show pulldown menus");
495         } else {
496                 uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_DOWN,
497                                 xco,2,XIC,YIC-2,
498                                 &(curarea->flag), 0, 0, 0, 0, "Hide pulldown menus");
499         }
500         uiBlockSetEmboss(block, UI_EMBOSS);
501         xco+=XIC;
502
503         if((curarea->flag & HEADER_NO_PULLDOWN)==0) {
504                 /* pull down menus */
505                 uiBlockSetEmboss(block, UI_EMBOSSP);
506         
507                 xmax= GetButStringLength("View");
508                 uiDefPulldownBut(block, nla_viewmenu, NULL, "View", xco, -2, xmax-3, 24, "");
509                 xco+= xmax;
510                 
511                 xmax= GetButStringLength("Select");
512                 uiDefPulldownBut(block, nla_selectmenu, NULL, "Select", xco, -2, xmax-3, 24, "");
513                 xco+= xmax;
514         
515                 xmax= GetButStringLength("Marker");
516                 uiDefPulldownBut(block, nla_markermenu, NULL, "Marker", xco, -2, xmax-3, 24, "");
517                 xco+= xmax;
518                 
519                 xmax= GetButStringLength("Strip");
520                 uiDefPulldownBut(block, nla_stripmenu, NULL, "Strip", xco, -2, xmax-3, 24, "");
521                 xco+= xmax;
522         
523                 
524         }
525
526         uiBlockSetEmboss(block, UI_EMBOSS);
527
528
529         /* draw AUTOSNAP */
530         xco += 8;
531         
532         if (G.snla->flag & SNLA_DRAWTIME) {
533                 uiDefButS(block, MENU, B_REDR,
534                                 "Auto-Snap Strips/Keyframes %t|No Snap %x0|Second Step %x1|Nearest Second %x2|Nearest Marker %x3", 
535                                 xco,0,70,YIC, &(G.snla->autosnap), 0, 1, 0, 0, 
536                                 "Auto-snapping mode for strips and keyframes when transforming");
537         }
538         else {
539                 uiDefButS(block, MENU, B_REDR, 
540                                 "Auto-Snap Strips/Keyframes %t|No Snap %x0|Frame Step %x1|Nearest Frame %x2|Nearest Marker %x3", 
541                                 xco,0,70,YIC, &(G.snla->autosnap), 0, 1, 0, 0, 
542                                 "Auto-snapping mode for strips and keyframes when transforming");
543         }
544         
545         xco += (70 + 8);
546         
547         xco += 8;
548
549         uiDefIconButS(block, ICONTOG, 1, ICON_UNLOCKED, xco,0,XIC,YIC, &(snla->lock), 0, 0, 0, 0, "Toggles forced redraw of other windows to reflect changes in real time");
550
551         uiDrawBlock(block);
552 }