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