soc-2008-mxcurioni: merged changes to revision 15705
[blender.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 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 "BMF_Api.h"
44 #include "BIF_language.h"
45
46 #include "DNA_ID.h"
47 #include "DNA_scene_types.h"
48 #include "DNA_screen_types.h"
49 #include "DNA_sequence_types.h"
50 #include "DNA_space_types.h"
51 #include "BLI_blenlib.h"
52 #include "BKE_global.h"
53 #include "BKE_main.h"
54 #include "BIF_drawseq.h"
55 #include "BIF_interface.h"
56 #include "BIF_resources.h"
57 #include "BIF_screen.h"
58 #include "BIF_space.h"
59 #include "BIF_editseq.h"
60 #include "BSE_drawipo.h"
61 #include "BSE_headerbuttons.h"
62 #include "BSE_sequence.h"
63 #include "BSE_time.h"
64 #include "blendef.h"
65 #include "mydevice.h"
66
67 static int viewmovetemp = 0;
68
69 static void do_seq_viewmenu(void *arg, int event)
70 {
71         extern int play_anim(int mode);
72         Sequence * last_seq = get_last_seq();
73         SpaceSeq * sseq = curarea->spacedata.first;
74
75         switch(event)
76         {
77         case 1: /* Play Back Animation */
78                 play_anim(0);
79                 break;
80         case 2: /* Play Back Animation in All */
81                 play_anim(1);
82                 break;
83         case 3:
84                 seq_home();
85                 break;
86         case 4:
87                 if(last_seq) {
88                                 CFRA= last_seq->startdisp;
89                                 G.v2d->cur.xmin= last_seq->startdisp- (last_seq->len/20);
90                                 G.v2d->cur.xmax= last_seq->enddisp+ (last_seq->len/20);
91                                 update_for_newframe();
92                 }
93                 break;
94         case 5: /* Lock time */
95                 G.v2d->flag ^= V2D_VIEWLOCK;
96                 if (G.v2d->flag & V2D_VIEWLOCK) {
97                         view2d_do_locks(curarea, 0);
98                 }
99                 break;
100         case 6: /* Draw time/frames */
101                 sseq->flag ^= SEQ_DRAWFRAMES;
102                 break;
103         case 7: /* Grease Pencil */
104                 add_blockhandler(curarea, SEQ_HANDLER_GREASEPENCIL, UI_PNL_UNSTOW);
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         if (sseq->mainb) {
119                 uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, 
120                                  "Grease Pencil...", 0, yco-=20,
121                                  menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
122                                  
123                 uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
124         }
125         
126         if (sseq->mainb == 0) {
127                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, 
128                                  "Play Back Animation "
129                                  "in all Sequence Areas|Alt A", 0, yco-=20,
130                                  menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
131         } else {
132                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, 
133                                  "Play Back Animation "
134                                  "in this window|Alt A", 0, yco-=20,
135                                  menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
136         }
137         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, 
138                          "Play Back Animation in all "
139                          "3D Views and Sequence Areas|Alt Shift A", 
140                          0, yco-=20,
141                          menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
142
143         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
144
145         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
146         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View Selected|NumPad .", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
147         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
148
149         
150        /* Lock Time */
151        uiDefIconTextBut(block, BUTM, 1, (G.v2d->flag & V2D_VIEWLOCK)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
152                         "Lock Time to Other Windows|", 0, yco-=20, 
153                         menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
154         
155        /* Draw time or frames.*/
156        uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
157
158        if(sseq->flag & SEQ_DRAWFRAMES)
159                uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Seconds|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
160        else
161                uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Frames|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
162
163
164         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, "");
165         else uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Tile Window|Ctrl DownArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
166
167         if(curarea->headertype==HEADERTOP) {
168                 uiBlockSetDirection(block, UI_DOWN);
169         }
170         else {
171                 uiBlockSetDirection(block, UI_TOP);
172                 uiBlockFlipOrder(block);
173         }
174
175         uiTextBoundsBlock(block, 50);
176
177         return block;
178 }
179
180 static void do_seq_selectmenu(void *arg, int event)
181 {
182         switch(event)
183         {
184         case 0:
185                 borderselect_seq();
186                 break;
187         case 1:
188                 swap_select_seq();
189                 break;
190         case 2:
191                 select_dir_from_last(1);
192                 break;
193         case 3:
194                 select_dir_from_last(2);
195                 break;
196         case 4:
197                 select_surround_from_last();
198                 break;
199         case 5:
200                 select_neighbor_from_last(1);
201                 break;
202         case 6:
203                 select_neighbor_from_last(2);
204                 break;
205         case 7:
206                 select_linked_seq(2);
207                 break;
208         case 8:
209                 deselect_markers(1, 0);
210                 allqueue(REDRAWMARKER, 0);
211                 break;
212         }
213 }
214
215 static uiBlock *seq_selectmenu(void *arg_unused)
216 {
217         uiBlock *block;
218         short yco= 0, menuwidth=120;
219
220         block= uiNewBlock(&curarea->uiblocks, "seq_selectmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
221         uiBlockSetButmFunc(block, do_seq_selectmenu, NULL);
222         
223         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Strips to the Left", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
224         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Strips to the Right", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
225         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
226         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Surrounding Handles", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
227         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Left Handles", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
228         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Right Handles", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
229         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
230         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
231         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
232         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked|Ctrl L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
233         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All Strips|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
234         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All Markers|Ctrl A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
235         
236
237         if(curarea->headertype==HEADERTOP) {
238                 uiBlockSetDirection(block, UI_DOWN);
239         }
240         else {
241                 uiBlockSetDirection(block, UI_TOP);
242                 uiBlockFlipOrder(block);
243         }
244
245         uiTextBoundsBlock(block, 50);
246
247         return block;
248 }
249
250 static void do_seq_addmenu_effectmenu(void *arg, int event)
251 {
252         switch(event)
253         {
254         case 0:
255                 add_sequence(SEQ_ADD);
256                 break;
257         case 1:
258                 add_sequence(SEQ_SUB);
259                 break;
260         case 2:
261                 add_sequence(SEQ_MUL);
262                 break;
263         case 3:
264                 add_sequence(SEQ_CROSS);
265                 break;
266         case 4:
267                 add_sequence(SEQ_GAMCROSS);
268                 break;
269         case 5:
270                 add_sequence(SEQ_ALPHAOVER);
271                 break;
272         case 6:
273                 add_sequence(SEQ_ALPHAUNDER);
274                 break;
275         case 7:
276                 add_sequence(SEQ_OVERDROP);
277                 break;
278         case 8:
279                 add_sequence(SEQ_PLUGIN);
280                 break;
281         case 9:
282                 add_sequence(SEQ_WIPE);
283                 break;
284         case 10:
285                 add_sequence(SEQ_GLOW);
286                 break;
287         case 11:
288                 add_sequence(SEQ_TRANSFORM);
289                 break;
290         case 12:
291                 add_sequence(SEQ_COLOR);
292                 break;
293         case 13:
294                 add_sequence(SEQ_SPEED);
295                 break;
296         }
297 }
298
299 static uiBlock *seq_addmenu_effectmenu(void *arg_unused)
300 {
301         uiBlock *block;
302         short yco = 20, menuwidth = 120;
303
304         block= uiNewBlock(&curarea->uiblocks, "seq_addmenu_effectmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
305         uiBlockSetButmFunc(block, do_seq_addmenu_effectmenu, NULL);
306
307         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
308         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subtract", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
309         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Multiply", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
310         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cross", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
311         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Gamma Cross", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
312         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Alpha Over", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
313         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Alpha Under", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
314         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Alpha Over Drop", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
315         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Wipe", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
316         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Glow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
317         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Transform", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
318         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Color Generator", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 12, "");
319         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Speed Control", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 13, "");
320         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
321         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Plugin...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
322
323
324         uiBlockSetDirection(block, UI_RIGHT);
325         uiTextBoundsBlock(block, 60);
326
327         return block;
328 }
329
330
331 static void do_seq_addmenu(void *arg, int event)
332 {
333         switch(event)
334         {
335         case 0:
336                 add_sequence(SEQ_IMAGE);
337                 break;
338         case 1:
339                 add_sequence(SEQ_MOVIE);
340                 break;
341         case 2:
342                 add_sequence(SEQ_RAM_SOUND);
343                 break;
344         case 3:
345                 add_sequence(SEQ_HD_SOUND);
346                 break;
347         case 4:
348                 add_sequence(SEQ_SCENE);
349                 break;
350         case 5:
351                 add_sequence(SEQ_MOVIE_AND_HD_SOUND);
352                 break;
353         }
354 }
355
356 static uiBlock *seq_addmenu(void *arg_unused)
357 {
358         uiBlock *block;
359         short yco = 20, menuwidth = 120;
360
361         block= uiNewBlock(&curarea->uiblocks, "seq_addmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
362         uiBlockSetButmFunc(block, do_seq_addmenu, NULL);
363
364         uiDefIconTextBlockBut(block, seq_addmenu_effectmenu, NULL, ICON_RIGHTARROW_THIN, "Effect", 0, yco-=20, 120, 19, "");
365
366         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
367
368 #ifdef WITH_FFMPEG
369         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Audio (RAM)", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
370         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Audio (HD)", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
371 #else
372         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Audio (Wav)", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
373 #endif
374         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scene", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
375         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Images", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
376         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Movie", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
377 #ifdef WITH_FFMPEG
378         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Movie + Audio (HD)", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
379 #endif
380         
381         if(curarea->headertype==HEADERTOP) {
382                 uiBlockSetDirection(block, UI_DOWN);
383         }
384         else {
385                 uiBlockSetDirection(block, UI_TOP);
386         }
387
388         uiTextBoundsBlock(block, 50);
389
390         return block;
391 }
392
393 static void do_seq_editmenu(void *arg, int event)
394 {
395         SpaceSeq *sseq;
396
397         sseq= curarea->spacedata.first;
398
399         switch(event)
400         {
401         case 1: /* Change Strip... */
402                 change_sequence();
403                 break;
404         case 2: /* Make Meta Strip */
405                 make_meta();
406                 break;
407         case 3: /* Separate Meta Strip */
408                 un_meta();
409                 break;
410         case 4: /* former Properties... */
411                 break;
412         case 5: /* Duplicate */
413                 add_duplicate_seq();
414                 break;
415         case 6: /* Delete */
416                 del_seq();
417                 break;
418         case 7: /* Grab/Extend */
419                 transform_seq('e', 0);
420                 break;
421         case 8:
422                 set_filter_seq();
423                 break;
424         case 9:
425                 enter_meta();
426                 break;
427         case 10:
428                 exit_meta();
429                 break;
430         case 11: /* grab/move */
431                 transform_seq('g', 0);
432                 break;
433         case 12: /* Snap to Current Frame */
434                 seq_snap(event);
435                 break;
436         case 13: /* Cut at Current Frame */
437                 seq_cut(CFRA, 1);
438                 break;
439         case 14:
440                 reassign_inputs_seq_effect();
441                 break;
442         case 15:
443                 seq_remap_paths();
444                 break;
445         case 16:
446                 seq_separate_images();
447                 break;
448         case 17:
449                 reload_sequence();
450                 break;
451         case 18:
452                 seq_lock_sel(1);
453                 break;
454         case 19:
455                 seq_lock_sel(0);
456                 break;
457         case 20:
458                 seq_mute_sel(1);
459                 break;
460         case 21:
461                 seq_mute_sel(0);
462                 break;
463         case 22:
464                 seq_mute_sel(0);
465                 break;
466         case 23:
467                 seq_cut(CFRA, 0);
468                 break;
469         }
470 }
471
472 static uiBlock *seq_editmenu(void *arg_unused)
473 {
474         uiBlock *block;
475         Editing *ed;
476         short yco= 0, menuwidth=120;
477         Sequence * last_seq = get_last_seq();
478
479         ed = G.scene->ed;
480
481         block= uiNewBlock(&curarea->uiblocks, "seq_editmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
482         uiBlockSetButmFunc(block, do_seq_editmenu, NULL);
483         
484         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move|G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
485         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Extend from frame|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
486         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, "");
487
488         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
489         
490         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cut (hard) at Current Frame|K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
491         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cut (soft) at Current Frame|Shift-K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 23, "");
492         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate Images to Strips|Y", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
493         
494         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
495
496         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
497         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
498
499         if (last_seq != NULL && last_seq->type != SEQ_MOVIE) {
500                 uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
501
502                 if(last_seq->type >= SEQ_EFFECT) {
503                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Change Effect...|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
504                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reassign Inputs|R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 14, "");
505                 }
506                 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, "");
507                 else uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Change Scene...|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
508                 
509                 if(last_seq->type==SEQ_IMAGE)
510                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remap Paths...|Shift R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
511                         
512         }
513
514         if (last_seq != NULL && last_seq->type == SEQ_MOVIE) {
515 /*              uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Filter Y|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, ""); */
516                 uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
517                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remap Paths...|Shift R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
518         }
519
520
521         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
522         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Meta Strip...|M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
523         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate Meta Strip...|Alt M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
524         if ((ed != NULL) && (ed->metastack.first > 0)){
525                 uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
526                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Enter/Exit Meta Strip|Tab", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
527         }
528         else {
529                 if (last_seq != NULL && last_seq->type == SEQ_META) {
530                         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
531                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Enter/Exit Meta Strip|Tab", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
532                 }
533         }
534         
535         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
536         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reload Strip Data...|Alt R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 17, "");
537         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
538         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lock Strips...|Shift L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 18, "");
539         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Unlock Strips...|Alt-Shift L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 19, "");
540         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mute Strips...|H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 20, "");
541         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Unmute Strips...|Alt H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 21, "");
542         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mute Deselected Strips...|Shift H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 22, "");
543         
544
545         if(curarea->headertype==HEADERTOP) {
546                 uiBlockSetDirection(block, UI_DOWN);
547         }
548         else {
549                 uiBlockSetDirection(block, UI_TOP);
550                 uiBlockFlipOrder(block);
551         }
552
553         uiTextBoundsBlock(block, 50);
554
555         return block;
556 }
557
558 static void do_seq_markermenu(void *arg, int event)
559 {       
560         SpaceSeq *sseq= curarea->spacedata.first;
561         
562         switch(event)
563         {
564                 case 1:
565                         add_marker(CFRA);
566                         break;
567                 case 2:
568                         duplicate_marker();
569                         break;
570                 case 3:
571                         remove_marker();
572                         break;
573                 case 4:
574                         rename_marker();
575                         break;
576                 case 5:
577                         transform_markers('g', 0);
578                         break;
579                 case 6:
580                         sseq->flag ^= SEQ_MARKER_TRANS;
581                         break;
582
583         }
584         
585         allqueue(REDRAWMARKER, 0);
586 }
587
588 static uiBlock *seq_markermenu(void *arg_unused)
589 {
590         uiBlock *block;
591         short yco= 0, menuwidth=120;
592         
593         SpaceSeq *sseq= curarea->spacedata.first;
594
595         block= uiNewBlock(&curarea->uiblocks, "ipo_markermenu", 
596                                            UI_EMBOSSP, UI_HELV, curarea->headwin);
597         uiBlockSetButmFunc(block, do_seq_markermenu, NULL);
598
599         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Marker|Ctrl Alt M", 0, yco-=20, 
600                                          menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
601         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Marker|Ctrl Shift D", 0, yco-=20, 
602                                          menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
603         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker", 0, yco-=20,
604                                          menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
605                                          
606         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
607
608         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "(Re)Name Marker|Ctrl M", 0, yco-=20,
609                                          menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
610         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Marker|Ctrl G", 0, yco-=20,
611                                          menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
612         
613         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
614         
615         uiDefIconTextBut(block, BUTM, 1, (sseq->flag & SEQ_MARKER_TRANS)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
616                                          "Transform Markers", 0, yco-=20, 
617                                         menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
618         
619         if(curarea->headertype==HEADERTOP) {
620                 uiBlockSetDirection(block, UI_DOWN);
621         } else {
622                 uiBlockSetDirection(block, UI_TOP);
623                 uiBlockFlipOrder(block);
624         }
625
626         uiTextBoundsBlock(block, 50);
627
628         return block;
629 }
630
631 void do_seq_buttons(short event)
632 {
633         Editing *ed;
634         
635         ed= G.scene->ed;
636         if(ed==0) return;
637         
638         switch(event) {
639         case B_HOME:
640                 seq_home();
641                 break;
642         case B_SEQCLEAR:
643                 free_imbuf_seq();
644                 allqueue(REDRAWSEQ, 1);
645                 break;
646         }
647 }
648
649 void seq_buttons()
650 {
651         SpaceSeq *sseq;
652         short xco;
653         char naam[20];
654         uiBlock *block;
655         short xmax;
656
657         sseq= curarea->spacedata.first;
658
659         sprintf(naam, "header %d", curarea->headwin);
660         block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSS, UI_HELV, curarea->headwin);
661
662         if(area_is_active_area(curarea)) uiBlockSetCol(block, TH_HEADER);
663         else uiBlockSetCol(block, TH_HEADERDESEL);
664
665         curarea->butspacetype= SPACE_SEQ;
666
667         xco = 8;
668         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.");
669         xco+= XIC+14;
670
671         uiBlockSetEmboss(block, UI_EMBOSSN);
672         if(curarea->flag & HEADER_NO_PULLDOWN) {
673                 uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_RIGHT,
674                                 xco,2,XIC,YIC-2,
675                                 &(curarea->flag), 0, 0, 0, 0, "Enables display of pulldown menus");
676         } else {
677                 uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_DOWN,
678                                 xco,2,XIC,YIC-2,
679                                 &(curarea->flag), 0, 0, 0, 0, "Hides pulldown menus");
680         }
681         uiBlockSetEmboss(block, UI_EMBOSS);
682         xco+=XIC;
683
684
685         /* pull down menus */
686         if((curarea->flag & HEADER_NO_PULLDOWN)==0) {
687                 uiBlockSetEmboss(block, UI_EMBOSSP);
688
689                 xmax= GetButStringLength("View");
690                 uiDefPulldownBut(block,seq_viewmenu, NULL, "View", xco, -2, xmax-3, 24, "");
691                 xco+=xmax;
692                 if (sseq->mainb == 0) {
693                         xmax= GetButStringLength("Select");
694                         uiDefPulldownBut(block,seq_selectmenu, NULL, "Select", xco, -2, xmax-3, 24, "");
695                         xco+=xmax;
696
697                         xmax= GetButStringLength("Marker");
698                         uiDefPulldownBut(block,seq_markermenu, NULL, "Marker", xco, -2, xmax-3, 24, "");
699                         xco+=xmax;
700                 
701                         xmax= GetButStringLength("Add");
702                         uiDefPulldownBut(block, seq_addmenu, NULL, "Add", xco, -2, xmax-3, 24, "");
703                         xco+= xmax;
704
705                         xmax= GetButStringLength("Strip");
706                         uiDefPulldownBut(block, seq_editmenu, NULL, "Strip", xco, -2, xmax-3, 24, "");
707                         xco+= xmax;
708                 }
709
710                 /* end of pull down menus */
711                 uiBlockSetEmboss(block, UI_EMBOSS);
712         }
713
714         /* IMAGE */
715         uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_SEQ_SEQUENCER, 
716                           "Image Preview: %t" 
717                           "|Sequence %x0"
718                           "|Image Preview %x1"
719                           "|Luma Waveform %x2"
720                           "|Chroma Vectorscope %x3"
721                           "|Histogram %x4",
722                           xco,0,XIC+10,YIC, &sseq->mainb, 0.0, 3.0, 
723                           0, 0, 
724                           "Shows the sequence output image preview");
725         
726         xco+= 8 + XIC+10;
727         
728         if(sseq->mainb) {
729                 int minchan = 0;
730
731                 /* CHANNEL shown in image preview */
732
733                 if (G.scene->ed && ((Editing*)G.scene->ed)->metastack.first)
734                         minchan = -BLI_countlist(&((Editing*)G.scene->ed)->metastack);
735
736                 uiDefButS(block, NUM, B_REDR, "Chan:",
737                           xco, 0, 3.5 * XIC,YIC,
738                           &sseq->chanshown, minchan, MAXSEQ, 0, 0,
739                           "The channel number shown in the image preview. 0 is the result of all strips combined.");
740                 
741                 xco+= 8 + XIC*3.5;
742
743                 if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
744                         uiDefButS(block, MENU, B_REDR, 
745                                   "Show zebra: %t"
746                                   "|Z 110 %x110"
747                                   "|Z 100 %x100"
748                                   "|Z 95  %x95"
749                                   "|Z 90  %x90"
750                                   "|Z 70  %x70"
751                                   "|Z Off %x0", 
752                                   xco,0,3.0 * XIC, YIC, &sseq->zebra, 
753                                   0,0,0,0, 
754                                   "Show overexposed "
755                                   "areas with zebra stripes");
756
757                         xco+= 8 + XIC*3.0;
758
759                         uiDefButBitI(block, TOG, SEQ_DRAW_SAFE_MARGINS, 
760                                      B_REDR, "T",
761                                      xco,0,XIC,YIC, &sseq->flag, 
762                                      0, 0, 0, 0, 
763                                      "Draw title safe margins in preview");
764                         xco+= 8 + XIC;
765                 }
766                 
767                 if (sseq->mainb == SEQ_DRAW_IMG_WAVEFORM) {
768                         uiDefButBitI(block, TOG, SEQ_DRAW_COLOR_SEPERATED, 
769                                      B_REDR, "CS",
770                                      xco,0,XIC,YIC, &sseq->flag, 
771                                      0, 0, 0, 0, 
772                                      "Seperate color channels in preview");
773                         xco+= 8 + XIC;
774                 }
775         } else {
776                 /* ZOOM and BORDER */
777                 uiDefIconButI(block, TOG, B_VIEW2DZOOM, 
778                               ICON_VIEWZOOM,    
779                               xco,0,XIC,YIC, &viewmovetemp, 
780                               0, 0, 0, 0, 
781                               "Zooms view in and out (Ctrl MiddleMouse)");
782                 xco += XIC;
783                 uiDefIconBut(block, BUT, B_IPOBORDER, 
784                              ICON_BORDERMOVE,   
785                              xco,0,XIC,YIC, 0, 
786                              0, 0, 0, 0, 
787                              "Zooms view to fit area");
788                 xco += 8 + XIC;
789         }
790
791         uiDefBut(block, BUT, B_SEQCLEAR, "Refresh", xco,0,3*XIC,YIC, 0, 0, 0, 0, 0, "Clears all buffered images in memory");
792
793         uiDrawBlock(block);
794 }