566606c22d38d1ee21beb4af0bafbad72cb829a5
[blender-staging.git] / source / blender / src / header_seq.c
1 /**
2  * header_seq.c oct-2003
3  *
4  * Functions to draw the "Video Sequence Editor" window header
5  * and handle user events sent to it.
6  *
7  * $Id$
8  *
9  * ***** BEGIN GPL/BL DUAL 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. The Blender
15  * Foundation also sells licenses for use in proprietary software under
16  * the Blender License.  See http://www.blender.org/BL/ for information
17  * about this.
18  *
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License
25  * along with this program; if not, write to the Free Software Foundation,
26  * Inc., 59 Temple Place - Suite 330, Boston, MA        02111-1307, USA.
27  *
28  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
29  * All rights reserved.
30  *
31  * The Original Code is: all of this file.
32  *
33  * Contributor(s): none yet.
34  *
35  * ***** END GPL/BL DUAL LICENSE BLOCK *****
36  */
37
38 #include <stdlib.h>
39 #include <string.h>
40 #include <stdio.h>
41
42 #ifdef HAVE_CONFIG_H
43 #include <config.h>
44 #endif
45
46 #include "BMF_Api.h"
47 #include "BIF_language.h"
48
49 #include "DNA_ID.h"
50 #include "DNA_scene_types.h"
51 #include "DNA_screen_types.h"
52 #include "DNA_sequence_types.h"
53 #include "DNA_space_types.h"
54 #include "BLI_blenlib.h"
55 #include "BKE_global.h"
56 #include "BKE_main.h"
57 #include "BIF_drawseq.h"
58 #include "BIF_interface.h"
59 #include "BIF_resources.h"
60 #include "BIF_screen.h"
61 #include "BIF_space.h"
62 #include "BIF_editseq.h"
63 #include "BSE_drawipo.h"
64 #include "BSE_headerbuttons.h"
65 #include "BSE_sequence.h"
66
67 #include "blendef.h"
68 #include "mydevice.h"
69
70 static int viewmovetemp = 0;
71
72 static void do_seq_viewmenu(void *arg, int event)
73 {
74         extern int play_anim(int mode);
75         Sequence * last_seq = get_last_seq();
76         SpaceSeq * sseq = curarea->spacedata.first;
77
78         switch(event)
79         {
80         case 1: /* Play Back Animation */
81                         play_anim(0);
82                         break;
83         case 2: /* Play Back Animation in All */
84                         play_anim(1);
85                         break;
86         case 3:
87                 do_seq_buttons(B_SEQHOME);
88                 break;
89         case 4:
90                 if(last_seq) {
91                                 CFRA= last_seq->startdisp;
92                                 G.v2d->cur.xmin= last_seq->startdisp- (last_seq->len/20);
93                                 G.v2d->cur.xmax= last_seq->enddisp+ (last_seq->len/20);
94                                 update_for_newframe();
95                 }
96                 break;
97         case 5: /* Lock time */
98                 G.v2d->flag ^= V2D_VIEWLOCK;
99                 if (G.v2d->flag & V2D_VIEWLOCK) {
100                         view2d_do_locks(curarea, 0);
101                 }
102                 break;
103         case 6: /* Draw time/frames */
104                 sseq->flag ^= SEQ_DRAWFRAMES;
105                 break;
106         }
107 }
108
109 static uiBlock *seq_viewmenu(void *arg_unused)
110 {
111         uiBlock *block;
112         short yco= 0, menuwidth=120;
113         SpaceSeq * sseq = curarea->spacedata.first;
114
115         block= uiNewBlock(&curarea->uiblocks, "seq_viewmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
116         uiBlockSetButmFunc(block, do_seq_viewmenu, NULL);
117
118         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation|Alt A", 0, yco-=20,
119                                          menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
120         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation in 3D View|Alt Shift A", 0, yco-=20,
121                                          menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
122
123         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
124
125         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
126         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View Selected|NumPad .", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
127         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
128
129
130        /* Lock Time */
131        uiDefIconTextBut(block, BUTM, 1, (G.v2d->flag & V2D_VIEWLOCK)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
132                         "Lock Time to Other Windows|", 0, yco-=20, 
133                         menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
134
135        /* Draw time or frames.*/
136        uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
137
138        if(sseq->flag & SEQ_DRAWFRAMES)
139                uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Seconds|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
140        else
141                uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Frames|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
142
143
144         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,0, "");
145         else uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Tile Window|Ctrl DownArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
146
147         if(curarea->headertype==HEADERTOP) {
148                 uiBlockSetDirection(block, UI_DOWN);
149         }
150         else {
151                 uiBlockSetDirection(block, UI_TOP);
152                 uiBlockFlipOrder(block);
153         }
154
155         uiTextBoundsBlock(block, 50);
156
157         return block;
158 }
159
160 static void do_seq_selectmenu(void *arg, int event)
161 {
162         switch(event)
163         {
164         case 0:
165                 borderselect_seq();
166                 break;
167         case 1:
168                 swap_select_seq();
169                 break;
170         }
171 }
172
173 static uiBlock *seq_selectmenu(void *arg_unused)
174 {
175         uiBlock *block;
176         short yco= 0, menuwidth=120;
177
178         block= uiNewBlock(&curarea->uiblocks, "seq_selectmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
179         uiBlockSetButmFunc(block, do_seq_selectmenu, NULL);
180
181         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
182         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
183         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
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_seq_addmenu_effectmenu(void *arg, int event)
199 {
200         switch(event)
201         {
202         case 0:
203                 add_sequence(SEQ_ADD);
204                 break;
205         case 1:
206                 add_sequence(SEQ_SUB);
207                 break;
208         case 2:
209                 add_sequence(SEQ_MUL);
210                 break;
211         case 3:
212                 add_sequence(SEQ_CROSS);
213                 break;
214         case 4:
215                 add_sequence(SEQ_GAMCROSS);
216                 break;
217         case 5:
218                 add_sequence(SEQ_ALPHAOVER);
219                 break;
220         case 6:
221                 add_sequence(SEQ_ALPHAUNDER);
222                 break;
223         case 7:
224                 add_sequence(SEQ_OVERDROP);
225                 break;
226         case 8:
227                 add_sequence(SEQ_PLUGIN);
228                 break;
229         case 9:
230                 add_sequence(SEQ_WIPE);
231                 break;
232         case 10:
233                 add_sequence(SEQ_GLOW);
234                 break;
235         case 11:
236                 add_sequence(SEQ_TRANSFORM);
237                 break;
238         case 12:
239                 add_sequence(SEQ_COLOR);
240                 break;
241         case 13:
242                 add_sequence(SEQ_SPEED);
243                 break;
244         }
245 }
246
247 static uiBlock *seq_addmenu_effectmenu(void *arg_unused)
248 {
249         uiBlock *block;
250         short yco = 20, menuwidth = 120;
251
252         block= uiNewBlock(&curarea->uiblocks, "seq_addmenu_effectmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
253         uiBlockSetButmFunc(block, do_seq_addmenu_effectmenu, NULL);
254
255         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
256         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subtract", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
257         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Multiply", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
258         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cross", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
259         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Gamma Cross", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
260         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Alpha Over", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
261         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Alpha Under", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
262         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Alpha Over Drop", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
263         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Wipe", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
264         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Glow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
265         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Transform", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
266         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Color Generator", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 12, "");
267         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Speed Control", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 13, "");
268         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
269         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Plugin...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
270
271
272         uiBlockSetDirection(block, UI_RIGHT);
273         uiTextBoundsBlock(block, 60);
274
275         return block;
276 }
277
278
279 static void do_seq_addmenu(void *arg, int event)
280 {
281         switch(event)
282         {
283         case 0:
284                 add_sequence(SEQ_IMAGE);
285                 break;
286         case 1:
287                 add_sequence(SEQ_MOVIE);
288                 break;
289         case 2:
290                 add_sequence(SEQ_RAM_SOUND);
291                 break;
292         case 3:
293                 add_sequence(SEQ_HD_SOUND);
294                 break;
295         case 4:
296                 add_sequence(SEQ_SCENE);
297                 break;
298         case 5:
299                 add_sequence(SEQ_MOVIE_AND_HD_SOUND);
300                 break;
301         }
302 }
303
304 static uiBlock *seq_addmenu(void *arg_unused)
305 {
306         uiBlock *block;
307         short yco = 20, menuwidth = 120;
308
309         block= uiNewBlock(&curarea->uiblocks, "seq_addmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
310         uiBlockSetButmFunc(block, do_seq_addmenu, NULL);
311
312         uiDefIconTextBlockBut(block, seq_addmenu_effectmenu, NULL, ICON_RIGHTARROW_THIN, "Effect", 0, yco-=20, 120, 19, "");
313
314         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
315
316 #ifdef WITH_FFMPEG
317         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Audio (RAM)", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
318         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Audio (HD)", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
319 #else
320         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Audio (Wav)", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
321 #endif
322         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scene", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
323         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Images", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
324         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Movie", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
325 #ifdef WITH_FFMPEG
326         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Movie + Audio (HD)", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
327 #endif
328         
329         if(curarea->headertype==HEADERTOP) {
330                 uiBlockSetDirection(block, UI_DOWN);
331         }
332         else {
333                 uiBlockSetDirection(block, UI_TOP);
334         }
335
336         uiTextBoundsBlock(block, 50);
337
338         return block;
339 }
340
341 static void do_seq_editmenu(void *arg, int event)
342 {
343         SpaceSeq *sseq;
344
345         sseq= curarea->spacedata.first;
346
347         switch(event)
348         {
349         case 1: /* Change Strip... */
350                 change_sequence();
351                 break;
352         case 2: /* Make Meta Strip */
353                 make_meta();
354                 break;
355         case 3: /* Separate Meta Strip */
356                 un_meta();
357                 break;
358         case 4: /* Properties... */
359                 add_blockhandler(curarea, SEQ_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
360                 break;
361         case 5: /* Duplicate */
362                 add_duplicate_seq();
363                 break;
364         case 6: /* Delete */
365                 del_seq();
366                 break;
367         case 8:
368                 set_filter_seq();
369                 break;
370         case 9:
371                 enter_meta();
372                 break;
373         case 10:
374                 exit_meta();
375                 break;
376         case 11: /* grab/move */
377                 transform_seq('g', 0);
378                 break;
379         case 12: /* Snap to Current Frame */
380                 seq_snap(event);
381                 break;
382         case 13: /* Cut at Current Frame */
383                 seq_cut(CFRA);
384                 break;
385         case 14:
386                 reassign_inputs_seq_effect();
387                 break;
388         case 15:
389                 seq_remap_paths();
390                 break;
391         }
392 }
393
394 static uiBlock *seq_editmenu(void *arg_unused)
395 {
396         uiBlock *block;
397         Editing *ed;
398         short yco= 0, menuwidth=120;
399         Sequence * last_seq = get_last_seq();
400
401         ed = G.scene->ed;
402
403         block= uiNewBlock(&curarea->uiblocks, "seq_editmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
404         uiBlockSetButmFunc(block, do_seq_editmenu, NULL);
405         
406         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Strip Properties...|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
407
408         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move|G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
409         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Snap to Current Frame|Shift S, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
410
411         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
412         
413         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cut at Current Frame|K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
414         
415         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
416
417         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
418         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
419
420         if (last_seq != NULL && last_seq->type != SEQ_MOVIE) {
421                 uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
422
423                 if(last_seq->type >= SEQ_EFFECT) {
424                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Change Effect...|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
425                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reassign Inputs|R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 14, "");
426                 }
427                 else if(last_seq->type == SEQ_IMAGE) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Change Image...|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
428                 else uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Change Scene...|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
429                 
430                 if(last_seq->type==SEQ_IMAGE)
431                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remap Paths...|Shift R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
432                         
433         }
434
435 /*      if (last_seq != NULL && last_seq->type == SEQ_MOVIE) {
436                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Filter Y|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
437         }
438 */
439
440         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
441         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Meta Strip...|M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
442         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate Meta Strip...|Alt M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
443         if ((ed != NULL) && (ed->metastack.first > 0)){
444                 uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
445                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Enter/Exit Meta Strip|Tab", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
446         }
447         else {
448                 if (last_seq != NULL && last_seq->type == SEQ_META) {
449                         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
450                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Enter/Exit Meta Strip|Tab", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
451                 }
452         }
453         
454
455         if(curarea->headertype==HEADERTOP) {
456                 uiBlockSetDirection(block, UI_DOWN);
457         }
458         else {
459                 uiBlockSetDirection(block, UI_TOP);
460                 uiBlockFlipOrder(block);
461         }
462
463         uiTextBoundsBlock(block, 50);
464
465         return block;
466 }
467
468
469 void do_seq_buttons(short event)
470 {
471         Editing *ed;
472         SpaceSeq *sseq= curarea->spacedata.first;
473         
474         ed= G.scene->ed;
475         if(ed==0) return;
476         
477         switch(event) {
478         case B_SEQHOME:
479                 if(sseq->mainb)
480                         seq_reset_imageofs(sseq);
481                 else {
482                         G.v2d->cur= G.v2d->tot;
483                         test_view2d(G.v2d, curarea->winx, curarea->winy);
484                         view2d_do_locks(curarea, V2D_LOCK_COPY);
485                 }
486                 scrarea_queue_winredraw(curarea);
487                 break;
488         case B_SEQCLEAR:
489                 free_imbuf_seq();
490                 allqueue(REDRAWSEQ, 1);
491                 break;
492         }
493 }
494
495 void seq_buttons()
496 {
497         SpaceSeq *sseq;
498         short xco;
499         char naam[20];
500         uiBlock *block;
501         short xmax;
502
503         sseq= curarea->spacedata.first;
504
505         sprintf(naam, "header %d", curarea->headwin);
506         block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSS, UI_HELV, curarea->headwin);
507
508         if(area_is_active_area(curarea)) uiBlockSetCol(block, TH_HEADER);
509         else uiBlockSetCol(block, TH_HEADERDESEL);
510
511         curarea->butspacetype= SPACE_SEQ;
512
513         xco = 8;
514         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.");
515         xco+= XIC+14;
516
517         uiBlockSetEmboss(block, UI_EMBOSSN);
518         if(curarea->flag & HEADER_NO_PULLDOWN) {
519                 uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_RIGHT,
520                                 xco,2,XIC,YIC-2,
521                                 &(curarea->flag), 0, 0, 0, 0, "Enables display of pulldown menus");
522         } else {
523                 uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_DOWN,
524                                 xco,2,XIC,YIC-2,
525                                 &(curarea->flag), 0, 0, 0, 0, "Hides pulldown menus");
526         }
527         uiBlockSetEmboss(block, UI_EMBOSS);
528         xco+=XIC;
529
530
531         /* pull down menus */
532         if((curarea->flag & HEADER_NO_PULLDOWN)==0) {
533                 uiBlockSetEmboss(block, UI_EMBOSSP);
534
535                 xmax= GetButStringLength("View");
536                 uiDefPulldownBut(block,seq_viewmenu, NULL, "View", xco, -2, xmax-3, 24, "");
537                 xco+=xmax;
538
539                 xmax= GetButStringLength("Select");
540                 uiDefPulldownBut(block,seq_selectmenu, NULL, "Select", xco, -2, xmax-3, 24, "");
541                 xco+=xmax;
542
543                 xmax= GetButStringLength("Add");
544                 uiDefPulldownBut(block, seq_addmenu, NULL, "Add", xco, -2, xmax-3, 24, "");
545                 xco+= xmax;
546
547                 xmax= GetButStringLength("Strip");
548                 uiDefPulldownBut(block, seq_editmenu, NULL, "Strip", xco, -2, xmax-3, 24, "");
549                 xco+= xmax;
550
551                 /* end of pull down menus */
552                 uiBlockSetEmboss(block, UI_EMBOSS);
553         }
554
555         /* IMAGE */
556         uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_SEQ_SEQUENCER, 
557                           "Image Preview: %t" 
558                           "|Sequence %x0"
559                           "|Image Preview %x1"
560                           "|Luma Waveform %x2"
561                           "|Chroma Vectorscope %x3",
562                           xco,0,XIC+10,YIC, &sseq->mainb, 0.0, 3.0, 
563                           0, 0, 
564                           "Shows the sequence output image preview");
565         
566         xco+= 8 + XIC+10;
567         
568         /* CHANNEL shown in 3D preview */
569         if(sseq->mainb) {
570                 int minchan = 0;
571
572                 if (G.scene->ed && ((Editing*)G.scene->ed)->metastack.first)
573                         minchan = -BLI_countlist(&((Editing*)G.scene->ed)->metastack);
574
575                 uiDefButS(block, NUM, B_REDR, "Chan:",
576                 xco, 0, 3.5 * XIC,YIC,
577                 &sseq->chanshown, minchan, MAXSEQ, 0, 0,
578                 "The channel number shown in the image preview. 0 is the result of all strips combined.");
579                 
580                 xco+= 8 + XIC*3.5;
581         }
582
583         
584         /* ZOOM and BORDER */
585         xco+= 8;
586         uiBlockBeginAlign(block);
587         uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM,  xco,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zooms view in and out (Ctrl MiddleMouse)");
588         uiDefIconBut(block, BUT, B_IPOBORDER, ICON_BORDERMOVE,  xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Zooms view to fit area");
589         uiBlockEndAlign(block);
590
591
592         /* CLEAR MEM */
593         xco+= 8;
594         uiDefBut(block, BUT, B_SEQCLEAR, "Refresh",     xco+=XIC,0,3*XIC,YIC, 0, 0, 0, 0, 0, "Clears all buffered images in memory");
595
596         uiDrawBlock(block);
597 }