add bluray support, add dialog close fixes, scale fix
[goodguy/history.git] / cinelerra-5.0 / cinelerra / mainmenu.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 1997-2014 Adam Williams <broadcast at earthling dot net>
5  * 
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  * 
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  * 
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  * 
20  */
21
22 #include "assets.h"
23 #include "auto.h"
24 #include "batchrender.h"
25 #include "bcdisplayinfo.h"
26 #include "bchash.h"
27 #include "bcsignals.h"
28 #include "bdcreate.h"
29 #include "cache.h"
30 #include "channelinfo.h"
31 #include "cplayback.h"
32 #include "cropvideo.h"
33 #include "cwindow.h"
34 #include "cwindowgui.h"
35 #include "dbwindow.h"
36 #include "dvdcreate.h"
37 #include "edl.h"
38 #include "edlsession.h"
39 #include "featheredits.h"
40 #include "filesystem.h"
41 #include "filexml.h"
42 #include "keys.h"
43 #include "language.h"
44 #include "levelwindow.h"
45 #include "loadfile.h"
46 #include "localsession.h"
47 #include "mainclock.h"
48 #include "mainmenu.h"
49 #include "mainsession.h"
50 #include "mainundo.h"
51 #include "menuattacheffect.h"
52 #include "menuattachtransition.h"
53 #include "menuaeffects.h"
54 #include "menueditlength.h"
55 #include "menutransitionlength.h"
56 #include "menuveffects.h"
57 #include "mwindowgui.h"
58 #include "mwindow.h"
59 #include "new.h"
60 #include "patchbay.h"
61 #include "playbackengine.h"
62 #include "preferences.h"
63 #include "preferencesthread.h"
64 #include "quit.h"
65 #include "record.h"
66 #include "render.h"
67 #include "savefile.h"
68 #include "setformat.h"
69 #include "swindow.h"
70 #include "timebar.h"
71 #include "trackcanvas.h"
72 #include "tracks.h"
73 #include "transition.h"
74 #include "transportque.h"
75 #include "viewmenu.h"
76 #include "zoombar.h"
77
78 #include <string.h>
79
80
81 MainMenu::MainMenu(MWindow *mwindow, MWindowGUI *gui, int w)
82  : BC_MenuBar(0, 0, w)
83 {
84         this->gui = gui;
85         this->mwindow = mwindow; 
86 }
87
88 MainMenu::~MainMenu()
89 {
90 }
91
92 void MainMenu::create_objects()
93 {
94         BC_Menu *viewmenu, *windowmenu, *settingsmenu, *trackmenu;
95         PreferencesMenuitem *preferences;
96         total_loads = 0; 
97
98         add_menu(filemenu = new BC_Menu(_("File")));
99         filemenu->add_item(new_project = new New(mwindow));
100         new_project->create_objects();
101
102 // file loaders
103         filemenu->add_item(load_file = new Load(mwindow, this));
104         load_file->create_objects();
105
106 // new and load can be undone so no need to prompt save
107         Save *save;                   //  affected by saveas
108         filemenu->add_item(save = new Save(mwindow));
109         SaveAs *saveas;
110         filemenu->add_item(saveas = new SaveAs(mwindow));
111         save->create_objects(saveas);
112         saveas->set_mainmenu(this);
113         filemenu->add_item(record_menu_item = new RecordMenuItem(mwindow));
114         filemenu->add_item(new ChannelScan(mwindow));
115         if( mwindow->has_commercials() )
116                 filemenu->add_item(new DbWindowScan(mwindow));
117         filemenu->add_item(new SubttlSWin(mwindow));
118
119         filemenu->add_item(render = new RenderItem(mwindow));
120         filemenu->add_item(new BatchRenderMenuItem(mwindow));
121         filemenu->add_item(new CreateBD_MenuItem(mwindow));
122         filemenu->add_item(new CreateDVD_MenuItem(mwindow));
123         filemenu->add_item(new BC_MenuItem("-"));
124         filemenu->add_item(quit_program = new Quit(mwindow));
125         quit_program->create_objects(save);
126         filemenu->add_item(new DumpEDL(mwindow));
127         filemenu->add_item(new DumpPlugins(mwindow));
128         filemenu->add_item(new LoadBackup(mwindow));
129         filemenu->add_item(new SaveBackup(mwindow));
130
131         BC_Menu *editmenu;
132         add_menu(editmenu = new BC_Menu(_("Edit")));
133         editmenu->add_item(undo = new Undo(mwindow));
134         editmenu->add_item(redo = new Redo(mwindow));
135         editmenu->add_item(new BC_MenuItem("-"));
136         editmenu->add_item(new Cut(mwindow));
137         editmenu->add_item(new Copy(mwindow));
138         editmenu->add_item(new Paste(mwindow));
139         editmenu->add_item(new Clear(mwindow));
140         editmenu->add_item(new PasteSilence(mwindow));
141         editmenu->add_item(new MuteSelection(mwindow));
142         editmenu->add_item(new TrimSelection(mwindow));
143         editmenu->add_item(new SelectAll(mwindow));
144         editmenu->add_item(new BC_MenuItem("-"));
145         editmenu->add_item(new MenuEditShuffle(mwindow));
146         editmenu->add_item(new MenuEditLength(mwindow));
147         editmenu->add_item(new MenuEditAlign(mwindow));
148         editmenu->add_item(new MenuTransitionLength(mwindow));
149         editmenu->add_item(new DetachTransitions(mwindow));
150         editmenu->add_item(new BC_MenuItem("-"));
151         editmenu->add_item(new ClearLabels(mwindow));
152         editmenu->add_item(new CutCommercials(mwindow));
153         editmenu->add_item(new PasteSubttl(mwindow));
154
155         BC_Menu *keyframemenu;
156         add_menu(keyframemenu = new BC_Menu(_("Keyframes")));
157         keyframemenu->add_item(new CutKeyframes(mwindow));
158         keyframemenu->add_item(new CopyKeyframes(mwindow));
159         keyframemenu->add_item(new PasteKeyframes(mwindow));
160         keyframemenu->add_item(new ClearKeyframes(mwindow));
161         keyframemenu->add_item(new StraightenKeyframes(mwindow));
162         keyframemenu->add_item(new BendKeyframes(mwindow));
163         keyframemenu->add_item(keyframe_type = new KeyframeType(mwindow, 
164                 mwindow->edl->local_session->floatauto_type));
165         keyframemenu->add_item(new BC_MenuItem("-"));
166         keyframemenu->add_item(new CopyDefaultKeyframe(mwindow));
167         keyframemenu->add_item(new PasteDefaultKeyframe(mwindow));
168
169
170
171
172         add_menu(audiomenu = new BC_Menu(_("Audio")));
173         audiomenu->add_item(new AddAudioTrack(mwindow));
174         audiomenu->add_item(new DefaultATransition(mwindow));
175         audiomenu->add_item(new MapAudio1(mwindow));
176         audiomenu->add_item(new MapAudio2(mwindow));
177         audiomenu->add_item(new MenuAttachTransition(mwindow, TRACK_AUDIO));
178         audiomenu->add_item(new MenuAttachEffect(mwindow, TRACK_AUDIO));
179         audiomenu->add_item(aeffects = new MenuAEffects(mwindow));
180
181         add_menu(videomenu = new BC_Menu(_("Video")));
182         videomenu->add_item(new AddVideoTrack(mwindow));
183         videomenu->add_item(new DefaultVTransition(mwindow));
184         videomenu->add_item(new MenuAttachTransition(mwindow, TRACK_VIDEO));
185         videomenu->add_item(new MenuAttachEffect(mwindow, TRACK_VIDEO));
186         videomenu->add_item(veffects = new MenuVEffects(mwindow));
187
188         add_menu(trackmenu = new BC_Menu(_("Tracks")));
189         trackmenu->add_item(new MoveTracksUp(mwindow));
190         trackmenu->add_item(new MoveTracksDown(mwindow));
191         trackmenu->add_item(new DeleteTracks(mwindow));
192         trackmenu->add_item(new DeleteTrack(mwindow));
193         trackmenu->add_item(new ConcatenateTracks(mwindow));
194         trackmenu->add_item(new AddSubttlTrack(mwindow));
195
196         add_menu(settingsmenu = new BC_Menu(_("Settings")));
197
198         settingsmenu->add_item(new SetFormat(mwindow));
199         settingsmenu->add_item(preferences = new PreferencesMenuitem(mwindow));
200         mwindow->preferences_thread = preferences->thread;
201         settingsmenu->add_item(labels_follow_edits = new LabelsFollowEdits(mwindow));
202         settingsmenu->add_item(plugins_follow_edits = new PluginsFollowEdits(mwindow));
203         settingsmenu->add_item(keyframes_follow_edits = new KeyframesFollowEdits(mwindow));
204         settingsmenu->add_item(cursor_on_frames = new CursorOnFrames(mwindow));
205         settingsmenu->add_item(typeless_keyframes = new TypelessKeyframes(mwindow));
206         settingsmenu->add_item(new SaveSettingsNow(mwindow));
207         settingsmenu->add_item(loop_playback = new LoopPlayback(mwindow));
208         settingsmenu->add_item(new SetBRenderStart(mwindow));
209 // set scrubbing speed
210 //      ScrubSpeed *scrub_speed;
211 //      settingsmenu->add_item(scrub_speed = new ScrubSpeed(mwindow));
212 //      if(mwindow->edl->session->scrub_speed == .5) 
213 //              scrub_speed->set_text(_("Fast Shuttle"));
214
215
216
217
218
219
220         add_menu(viewmenu = new BC_Menu(_("View")));
221         viewmenu->add_item(show_assets = new ShowAssets(mwindow, "0"));
222         viewmenu->add_item(show_titles = new ShowTitles(mwindow, "1"));
223         viewmenu->add_item(show_transitions = new ShowTransitions(mwindow, "2"));
224         viewmenu->add_item(fade_automation = new ShowAutomation(mwindow, _("Fade"), "3", AUTOMATION_FADE));
225         viewmenu->add_item(mute_automation = new ShowAutomation(mwindow, _("Mute"), "4", AUTOMATION_MUTE));
226         viewmenu->add_item(mode_automation = new ShowAutomation(mwindow, _("Mode"), "5", AUTOMATION_MODE));
227         viewmenu->add_item(pan_automation = new ShowAutomation(mwindow, _("Pan"), "6", AUTOMATION_PAN));
228         viewmenu->add_item(plugin_automation = new PluginAutomation(mwindow, "7"));
229         viewmenu->add_item(mask_automation = new ShowAutomation(mwindow, _("Mask"), "8", AUTOMATION_MASK));
230         viewmenu->add_item(speed_automation = new ShowAutomation(mwindow, _("Speed"), "9", AUTOMATION_SPEED));
231         viewmenu->add_item(camera_x = new ShowAutomation(mwindow, _("Camera X"), "", AUTOMATION_CAMERA_X));
232         viewmenu->add_item(camera_y = new ShowAutomation(mwindow, _("Camera Y"), "", AUTOMATION_CAMERA_Y));
233         viewmenu->add_item(camera_z = new ShowAutomation(mwindow, _("Camera Z"), "", AUTOMATION_CAMERA_Z));
234         viewmenu->add_item(project_x = new ShowAutomation(mwindow, _("Projector X"), "", AUTOMATION_PROJECTOR_X));
235         viewmenu->add_item(project_y = new ShowAutomation(mwindow, _("Projector Y"), "", AUTOMATION_PROJECTOR_Y));
236         viewmenu->add_item(project_z = new ShowAutomation(mwindow, _("Projector Z"), "", AUTOMATION_PROJECTOR_Z));
237
238
239         add_menu(windowmenu = new BC_Menu(_("Window")));
240         windowmenu->add_item(show_vwindow = new ShowVWindow(mwindow));
241         windowmenu->add_item(show_awindow = new ShowAWindow(mwindow));
242         windowmenu->add_item(show_cwindow = new ShowCWindow(mwindow));
243         windowmenu->add_item(show_gwindow = new ShowGWindow(mwindow));
244         windowmenu->add_item(show_lwindow = new ShowLWindow(mwindow));
245         windowmenu->add_item(split_x = new SplitX(mwindow));
246         windowmenu->add_item(split_y = new SplitY(mwindow));
247         windowmenu->add_item(new TileWindows(mwindow,_("Default positions"),-1,_("Ctrl+P"),'p'));
248         windowmenu->add_item(new TileWindows(mwindow,_("Tile left"),0));
249         windowmenu->add_item(new TileWindows(mwindow,_("Tile right"),1));
250 }
251
252 int MainMenu::load_defaults(BC_Hash *defaults)
253 {
254         init_loads(defaults);
255         init_aeffects(defaults);
256         init_veffects(defaults);
257         return 0;
258 }
259
260 void MainMenu::update_toggles(int use_lock)
261 {
262         if(use_lock) lock_window("MainMenu::update_toggles");
263         keyframe_type->set_checked(mwindow->edl->local_session->floatauto_type == Auto::BEZIER);
264         labels_follow_edits->set_checked(mwindow->edl->session->labels_follow_edits);
265         plugins_follow_edits->set_checked(mwindow->edl->session->plugins_follow_edits);
266         keyframes_follow_edits->set_checked(mwindow->edl->session->autos_follow_edits);
267         typeless_keyframes->set_checked(mwindow->edl->session->typeless_keyframes);
268         cursor_on_frames->set_checked(mwindow->edl->session->cursor_on_frames);
269         loop_playback->set_checked(mwindow->edl->local_session->loop_playback);
270
271         show_assets->set_checked(mwindow->edl->session->show_assets);
272         show_titles->set_checked(mwindow->edl->session->show_titles);
273         show_transitions->set_checked(mwindow->edl->session->auto_conf->transitions);
274         fade_automation->update_toggle();
275         mute_automation->update_toggle();
276         pan_automation->update_toggle();
277         camera_x->update_toggle();
278         camera_y->update_toggle();
279         camera_z->update_toggle();
280         project_x->update_toggle();
281         project_y->update_toggle();
282         project_z->update_toggle();
283         plugin_automation->set_checked(mwindow->edl->session->auto_conf->plugins);
284         mode_automation->update_toggle();
285         mask_automation->update_toggle();
286         speed_automation->update_toggle();
287         split_x->set_checked(mwindow->gui->pane[TOP_RIGHT_PANE] != 0);
288         split_y->set_checked(mwindow->gui->pane[BOTTOM_LEFT_PANE] != 0);
289
290         if(use_lock) mwindow->gui->unlock_window();
291 }
292
293 int MainMenu::save_defaults(BC_Hash *defaults)
294 {
295         save_loads(defaults);
296         save_aeffects(defaults);
297         save_veffects(defaults);
298         return 0;
299 }
300
301
302
303
304
305 int MainMenu::quit()
306 {
307         quit_program->handle_event();
308         return 0;
309 }
310
311
312
313
314
315 // ================================== load most recent
316
317 int MainMenu::init_aeffects(BC_Hash *defaults)
318 {
319         total_aeffects = defaults->get((char*)"TOTAL_AEFFECTS", 0);
320         
321         char string[BCTEXTLEN], title[BCTEXTLEN];
322         if(total_aeffects) audiomenu->add_item(new BC_MenuItem("-"));
323         
324         for(int i = 0; i < total_aeffects; i++)
325         {
326                 sprintf(string, "AEFFECTRECENT%d", i);
327                 defaults->get(string, title);
328                 audiomenu->add_item(aeffect[i] = new MenuAEffectItem(aeffects, title));
329         }
330         return 0;
331 }
332
333 int MainMenu::init_veffects(BC_Hash *defaults)
334 {
335         total_veffects = defaults->get((char*)"TOTAL_VEFFECTS", 0);
336         
337         char string[BCTEXTLEN], title[BCTEXTLEN];
338         if(total_veffects) videomenu->add_item(new BC_MenuItem("-"));
339         
340         for(int i = 0; i < total_veffects; i++)
341         {
342                 sprintf(string, "VEFFECTRECENT%d", i);
343                 defaults->get(string, title);
344                 videomenu->add_item(veffect[i] = new MenuVEffectItem(veffects, title));
345         }
346         return 0;
347 }
348
349 int MainMenu::init_loads(BC_Hash *defaults)
350 {
351 //printf("MainMenu::init_loads 1\n");
352         total_loads = defaults->get((char*)"TOTAL_LOADS", 0);
353 //printf("MainMenu::init_loads 1\n");
354         char string[BCTEXTLEN], path[BCTEXTLEN], filename[BCTEXTLEN];
355 //printf("MainMenu::init_loads 1\n");
356         FileSystem dir;
357 //printf("MainMenu::init_loads 2\n");
358         if(total_loads > 0) filemenu->add_item(new BC_MenuItem("-"));
359
360         for(int i = 0; i < total_loads; i++)
361         {
362                 sprintf(string, "LOADPREVIOUS%d", i);
363 //printf("MainMenu::init_loads 3\n");
364                 defaults->get(string, path);
365 //printf("MainMenu::init_loads 4\n");
366
367                 filemenu->add_item(load[i] = new LoadPrevious(mwindow, load_file));
368 //printf("MainMenu::init_loads 5\n");
369                 dir.extract_name(filename, path, 0);
370 //printf("MainMenu::init_loads 6\n");
371                 load[i]->set_text(filename);
372 //printf("MainMenu::init_loads 7\n");
373                 load[i]->set_path(path);
374 //printf("MainMenu::init_loads 8\n");
375         }
376 //printf("MainMenu::init_loads 9\n");
377         return 0;
378 }
379
380 // ============================ save most recent
381
382 int MainMenu::save_aeffects(BC_Hash *defaults)
383 {
384         defaults->update((char*)"TOTAL_AEFFECTS", total_aeffects);
385         char string[BCTEXTLEN];
386         for(int i = 0; i < total_aeffects; i++)
387         {
388                 sprintf(string, "AEFFECTRECENT%d", i);
389                 defaults->update(string, aeffect[i]->get_text());
390         }
391         return 0;
392 }
393
394 int MainMenu::save_veffects(BC_Hash *defaults)
395 {
396         defaults->update((char*)"TOTAL_VEFFECTS", total_veffects);
397         char string[BCTEXTLEN];
398         for(int i = 0; i < total_veffects; i++)
399         {
400                 sprintf(string, "VEFFECTRECENT%d", i);
401                 defaults->update(string, veffect[i]->get_text());
402         }
403         return 0;
404 }
405
406 int MainMenu::save_loads(BC_Hash *defaults)
407 {
408         defaults->update((char*)"TOTAL_LOADS", total_loads);
409         char string[BCTEXTLEN];
410         for(int i = 0; i < total_loads; i++)
411         {
412                 sprintf(string, "LOADPREVIOUS%d", i);
413                 defaults->update(string, load[i]->path);
414         }
415         return 0;
416 }
417
418 // =================================== add most recent
419
420 int MainMenu::add_aeffect(char *title)
421 {
422 // add bar for first effect
423         if(total_aeffects == 0)
424         {
425                 audiomenu->add_item(new BC_MenuItem("-"));
426         }
427
428 // test for existing copy of effect
429         for(int i = 0; i < total_aeffects; i++)
430         {
431                 if(!strcmp(aeffect[i]->get_text(), title))     // already exists
432                 {                                // swap for top effect
433                         for(int j = i; j > 0; j--)   // move preceeding effects down
434                         {
435                                 aeffect[j]->set_text(aeffect[j - 1]->get_text());
436                         }
437                         aeffect[0]->set_text(title);
438                         return 1;
439                 }
440         }
441
442 // add another blank effect
443         if(total_aeffects < TOTAL_EFFECTS)
444         {
445                 audiomenu->add_item(
446                         aeffect[total_aeffects] = new MenuAEffectItem(aeffects, (char*)""));
447                 total_aeffects++;
448         }
449
450 // cycle effect down
451         for(int i = total_aeffects - 1; i > 0; i--)
452         {
453         // set menu item text
454                 aeffect[i]->set_text(aeffect[i - 1]->get_text());
455         }
456
457 // set up the new effect
458         aeffect[0]->set_text(title);
459         return 0;
460 }
461
462 int MainMenu::add_veffect(char *title)
463 {
464 // add bar for first effect
465         if(total_veffects == 0)
466         {
467                 videomenu->add_item(new BC_MenuItem("-"));
468         }
469
470 // test for existing copy of effect
471         for(int i = 0; i < total_veffects; i++)
472         {
473                 if(!strcmp(veffect[i]->get_text(), title))     // already exists
474                 {                                // swap for top effect
475                         for(int j = i; j > 0; j--)   // move preceeding effects down
476                         {
477                                 veffect[j]->set_text(veffect[j - 1]->get_text());
478                         }
479                         veffect[0]->set_text(title);
480                         return 1;
481                 }
482         }
483
484 // add another blank effect
485         if(total_veffects < TOTAL_EFFECTS)
486         {
487                 videomenu->add_item(veffect[total_veffects] = 
488                         new MenuVEffectItem(veffects, (char*)""));
489                 total_veffects++;
490         }
491
492 // cycle effect down
493         for(int i = total_veffects - 1; i > 0; i--)
494         {
495 // set menu item text
496                 veffect[i]->set_text(veffect[i - 1]->get_text());
497         }
498
499 // set up the new effect
500         veffect[0]->set_text(title);
501         return 0;
502 }
503
504 int MainMenu::add_load(char *path)
505 {
506         if(total_loads == 0)
507         {
508                 filemenu->add_item(new BC_MenuItem("-"));
509         }
510
511 // test for existing copy
512         FileSystem fs;
513         char text[BCTEXTLEN], new_path[BCTEXTLEN];      // get text and path
514         fs.extract_name(text, path);
515         strcpy(new_path, path);
516
517         for(int i = 0; i < total_loads; i++)
518         {
519                 if(!strcmp(load[i]->get_text(), text))     // already exists
520                 {                                // swap for top load
521                         for(int j = i; j > 0; j--)   // move preceeding loads down
522                         {
523                                 load[j]->set_text(load[j - 1]->get_text());
524                                 load[j]->set_path(load[j - 1]->path);
525                         }
526                         load[0]->set_text(text);
527                         load[0]->set_path(new_path);
528                         
529                         return 1;
530                 }
531         }
532         
533 // add another load
534         if(total_loads < TOTAL_LOADS)
535         {
536                 filemenu->add_item(load[total_loads] = new LoadPrevious(mwindow, load_file));
537                 total_loads++;
538         }
539         
540 // cycle loads down
541         for(int i = total_loads - 1; i > 0; i--)
542         {
543         // set menu item text
544                 load[i]->set_text(load[i - 1]->get_text());
545         // set filename
546                 load[i]->set_path(load[i - 1]->path);
547         }
548
549 // set up the new load
550         load[0]->set_text(text);
551         load[0]->set_path(new_path);
552         return 0;
553 }
554
555
556
557
558
559
560
561
562 // ================================== menu items
563
564
565 DumpCICache::DumpCICache(MWindow *mwindow)
566  : BC_MenuItem(_("Dump CICache"))
567 { this->mwindow = mwindow; }
568
569 int DumpCICache::handle_event()
570 {
571 //      mwindow->cache->dump();
572         return 1;
573 }
574
575 DumpEDL::DumpEDL(MWindow *mwindow)
576  : BC_MenuItem(_("Dump EDL"))
577
578         this->mwindow = mwindow;
579 }
580
581 int DumpEDL::handle_event()
582 {
583 //printf("DumpEDL::handle_event 1\n");
584         mwindow->dump_edl();
585 //printf("DumpEDL::handle_event 2\n");
586         return 1;
587 }
588
589 DumpPlugins::DumpPlugins(MWindow *mwindow)
590  : BC_MenuItem(_("Dump Plugins"))
591
592         this->mwindow = mwindow;
593 }
594
595 int DumpPlugins::handle_event()
596 {
597 //printf("DumpEDL::handle_event 1\n");
598         mwindow->dump_plugins();
599 //printf("DumpEDL::handle_event 2\n");
600         return 1;
601 }
602
603
604 DumpAssets::DumpAssets(MWindow *mwindow)
605  : BC_MenuItem(_("Dump Assets"))
606 { this->mwindow = mwindow; }
607
608 int DumpAssets::handle_event()
609 {
610         mwindow->assets->dump();
611         return 1;
612 }
613
614 // ================================================= edit
615
616 Undo::Undo(MWindow *mwindow) : BC_MenuItem(_("Undo"), "z", 'z') 
617
618         this->mwindow = mwindow; 
619 }
620 int Undo::handle_event()
621
622         mwindow->undo_entry(mwindow->gui);
623         return 1;
624 }
625 int Undo::update_caption(const char *new_caption)
626 {
627         char string[BCTEXTLEN];
628         sprintf(string, _("Undo %s"), new_caption);
629         set_text(string);
630         return 0;
631 }
632
633
634 Redo::Redo(MWindow *mwindow) : BC_MenuItem(_("Redo"), _("Shift+Z"), 'Z') 
635
636         set_shift(1); 
637         this->mwindow = mwindow; 
638 }
639
640 int Redo::handle_event()
641
642         mwindow->redo_entry(mwindow->gui);
643
644         return 1;
645 }
646 int Redo::update_caption(const char *new_caption)
647 {
648         char string[BCTEXTLEN];
649         sprintf(string, _("Redo %s"), new_caption);
650         set_text(string);
651         return 0;
652 }
653
654 CutKeyframes::CutKeyframes(MWindow *mwindow)
655  : BC_MenuItem(_("Cut keyframes"), _("Shift-X"), 'X')
656
657         set_shift(); 
658         this->mwindow = mwindow; 
659 }
660
661 int CutKeyframes::handle_event()
662 {
663         mwindow->cut_automation(); 
664         return 1;
665 }
666
667 CopyKeyframes::CopyKeyframes(MWindow *mwindow)
668  : BC_MenuItem(_("Copy keyframes"), _("Shift-C"), 'C')
669
670         set_shift(); 
671         this->mwindow = mwindow; 
672 }
673
674 int CopyKeyframes::handle_event()
675 {
676         mwindow->copy_automation();
677         return 1;
678 }
679
680 PasteKeyframes::PasteKeyframes(MWindow *mwindow)
681  : BC_MenuItem(_("Paste keyframes"), _("Shift-V"), 'V')
682 {
683         set_shift(); 
684         this->mwindow = mwindow; 
685 }
686
687 int PasteKeyframes::handle_event()
688 {
689         mwindow->paste_automation(); 
690         return 1;
691 }
692
693 ClearKeyframes::ClearKeyframes(MWindow *mwindow)
694  : BC_MenuItem(_("Clear keyframes"), _("Shift-Del"), DELETE)
695 {
696         set_shift(); 
697         this->mwindow = mwindow; 
698 }
699
700 int ClearKeyframes::handle_event()
701 {
702         mwindow->clear_automation();
703         return 1;
704 }
705
706
707
708 StraightenKeyframes::StraightenKeyframes(MWindow *mwindow)
709  : BC_MenuItem(_("Change to linear"))
710 {
711         this->mwindow = mwindow; 
712 }
713
714 int StraightenKeyframes::handle_event()
715 {
716         mwindow->set_automation_mode(Auto::LINEAR);
717         return 1;
718 }
719
720
721
722
723 BendKeyframes::BendKeyframes(MWindow *mwindow)
724  : BC_MenuItem(_("Change to bezier"))
725 {
726         this->mwindow = mwindow; 
727 }
728
729 int BendKeyframes::handle_event()
730 {
731         mwindow->set_automation_mode(Auto::BEZIER);
732         return 1;
733 }
734
735
736
737 KeyframeType::KeyframeType(MWindow *mwindow, int type)
738  : BC_MenuItem(_("Create bezier"))
739 {
740         this->mwindow = mwindow;
741         set_checked(type == Auto::BEZIER);
742 }
743
744 int KeyframeType::handle_event()
745 {
746         if(get_checked())
747                 mwindow->set_keyframe_type(Auto::LINEAR);
748         else
749                 mwindow->set_keyframe_type(Auto::BEZIER);
750         return 1;
751 }
752
753
754
755
756
757
758
759 CutDefaultKeyframe::CutDefaultKeyframe(MWindow *mwindow)
760  : BC_MenuItem(_("Cut default keyframe"), _("Alt-X"), 'X')
761
762         set_alt(); 
763         this->mwindow = mwindow; 
764 }
765
766 int CutDefaultKeyframe::handle_event()
767 {
768         mwindow->cut_default_keyframe(); 
769         return 1;
770 }
771
772 CopyDefaultKeyframe::CopyDefaultKeyframe(MWindow *mwindow)
773  : BC_MenuItem(_("Copy default keyframe"), _("Alt-c"), 'c')
774
775         set_alt(); 
776         this->mwindow = mwindow; 
777 }
778
779 int CopyDefaultKeyframe::handle_event()
780 {
781         mwindow->copy_default_keyframe();
782         return 1;
783 }
784
785 PasteDefaultKeyframe::PasteDefaultKeyframe(MWindow *mwindow)
786  : BC_MenuItem(_("Paste default keyframe"), _("Alt-v"), 'v')
787 {
788         set_alt(); 
789         this->mwindow = mwindow; 
790 }
791
792 int PasteDefaultKeyframe::handle_event()
793 {
794         mwindow->paste_default_keyframe(); 
795         return 1;
796 }
797
798 ClearDefaultKeyframe::ClearDefaultKeyframe(MWindow *mwindow)
799  : BC_MenuItem(_("Clear default keyframe"), _("Alt-Del"), BACKSPACE)
800 {
801         set_alt(); 
802         this->mwindow = mwindow; 
803 }
804
805 int ClearDefaultKeyframe::handle_event()
806 {
807         mwindow->clear_default_keyframe();
808         return 1;
809 }
810
811 Cut::Cut(MWindow *mwindow)
812  : BC_MenuItem(_("Cut"), "x", 'x') 
813 {
814         this->mwindow = mwindow; 
815 }
816
817 int Cut::handle_event()
818 {
819         mwindow->cut();
820         return 1;
821 }
822
823 Copy::Copy(MWindow *mwindow)
824  : BC_MenuItem(_("Copy"), "c", 'c') 
825 {
826         this->mwindow = mwindow; 
827 }
828
829 int Copy::handle_event()
830 {
831         mwindow->copy();
832         return 1;
833 }
834
835 Paste::Paste(MWindow *mwindow)
836  : BC_MenuItem(_("Paste"), "v", 'v') 
837 {
838         this->mwindow = mwindow; 
839 }
840
841 int Paste::handle_event()
842 {
843         mwindow->paste();
844         return 1;
845 }
846
847 Clear::Clear(MWindow *mwindow)
848  : BC_MenuItem(_("Clear"), _("Del"), BACKSPACE) 
849 {
850         this->mwindow = mwindow; 
851 }
852
853 int Clear::handle_event()
854 {
855         mwindow->cwindow->gui->lock_window("Clear::handle_event");
856         mwindow->clear_entry();
857         mwindow->cwindow->gui->unlock_window();
858         return 1;
859 }
860
861 PasteSilence::PasteSilence(MWindow *mwindow)
862  : BC_MenuItem(_("Paste silence"), _("Shift+Space"), ' ')
863
864         this->mwindow = mwindow; 
865         set_shift(); 
866 }
867
868 int PasteSilence::handle_event()
869
870         mwindow->paste_silence();
871         return 1;
872 }
873
874 SelectAll::SelectAll(MWindow *mwindow)
875  : BC_MenuItem(_("Select All"), "a", 'a')
876
877         this->mwindow = mwindow; 
878 }
879
880 int SelectAll::handle_event()
881 {
882         mwindow->select_all();
883         return 1;
884 }
885
886 ClearLabels::ClearLabels(MWindow *mwindow) : BC_MenuItem(_("Clear labels")) 
887
888         this->mwindow = mwindow; 
889 }
890
891 int ClearLabels::handle_event()
892 {
893         mwindow->clear_labels();
894         return 1;
895 }
896
897 CutCommercials::CutCommercials(MWindow *mwindow) : BC_MenuItem(_("Cut ads")) 
898
899         this->mwindow = mwindow; 
900 }
901
902 int CutCommercials::handle_event()
903 {
904         mwindow->cut_commercials();
905         return 1;
906 }
907
908 DetachTransitions::DetachTransitions(MWindow *mwindow)
909  : BC_MenuItem(_("Detach transitions")) 
910
911         this->mwindow = mwindow; 
912 }
913
914 int DetachTransitions::handle_event()
915 {
916         mwindow->detach_transitions();
917         return 1;
918 }
919
920 MuteSelection::MuteSelection(MWindow *mwindow)
921  : BC_MenuItem(_("Mute Region"), "m", 'm')
922 {
923         this->mwindow = mwindow;
924 }
925
926 int MuteSelection::handle_event()
927 {
928         mwindow->mute_selection();
929         return 1;
930 }
931
932
933 TrimSelection::TrimSelection(MWindow *mwindow)
934  : BC_MenuItem(_("Trim Selection"))
935 {
936         this->mwindow = mwindow;
937 }
938
939 int TrimSelection::handle_event()
940 {
941         mwindow->trim_selection();
942         return 1;
943 }
944
945
946
947
948
949
950
951
952
953
954
955
956 // ============================================= audio
957
958 AddAudioTrack::AddAudioTrack(MWindow *mwindow)
959  : BC_MenuItem(_("Add track"), "t", 't')
960 {
961         this->mwindow = mwindow;
962 }
963
964 int AddAudioTrack::handle_event()
965 {
966         mwindow->add_audio_track_entry(0, 0);
967         return 1;
968 }
969
970 DeleteAudioTrack::DeleteAudioTrack(MWindow *mwindow)
971  : BC_MenuItem(_("Delete track"))
972 {
973         this->mwindow = mwindow;
974 }
975
976 int DeleteAudioTrack::handle_event()
977 {
978         return 1;
979 }
980
981 DefaultATransition::DefaultATransition(MWindow *mwindow)
982  : BC_MenuItem(_("Default Transition"), "u", 'u')
983 {
984         this->mwindow = mwindow;
985 }
986
987 int DefaultATransition::handle_event()
988 {
989         mwindow->paste_audio_transition();
990         return 1;
991 }
992
993
994 MapAudio1::MapAudio1(MWindow *mwindow)
995  : BC_MenuItem(_("Map 1:1"))
996 {
997         this->mwindow = mwindow;
998 }
999
1000 int MapAudio1::handle_event()
1001 {
1002         mwindow->map_audio(MWindow::AUDIO_1_TO_1);
1003         return 1;
1004 }
1005
1006 MapAudio2::MapAudio2(MWindow *mwindow)
1007  : BC_MenuItem(_("Map 5.1:2"))
1008 {
1009         this->mwindow = mwindow;
1010 }
1011
1012 int MapAudio2::handle_event()
1013 {
1014         mwindow->map_audio(MWindow::AUDIO_5_1_TO_2);
1015         return 1;
1016 }
1017
1018
1019
1020
1021 // ============================================= video
1022
1023
1024 AddVideoTrack::AddVideoTrack(MWindow *mwindow)
1025  : BC_MenuItem(_("Add track"), _("Shift-T"), 'T')
1026 {
1027         set_shift();
1028         this->mwindow = mwindow;
1029 }
1030
1031 int AddVideoTrack::handle_event()
1032 {
1033         mwindow->add_video_track_entry();
1034         return 1;
1035 }
1036
1037
1038 DeleteVideoTrack::DeleteVideoTrack(MWindow *mwindow)
1039  : BC_MenuItem(_("Delete track"))
1040 {
1041         this->mwindow = mwindow;
1042 }
1043
1044 int DeleteVideoTrack::handle_event()
1045 {
1046         return 1;
1047 }
1048
1049
1050
1051 ResetTranslation::ResetTranslation(MWindow *mwindow)
1052  : BC_MenuItem(_("Reset Translation"))
1053 {
1054         this->mwindow = mwindow;
1055 }
1056
1057 int ResetTranslation::handle_event()
1058 {
1059         return 1;
1060 }
1061
1062
1063
1064 DefaultVTransition::DefaultVTransition(MWindow *mwindow)
1065  : BC_MenuItem(_("Default Transition"), _("Shift-U"), 'U')
1066 {
1067         set_shift();
1068         this->mwindow = mwindow;
1069 }
1070
1071 int DefaultVTransition::handle_event()
1072 {
1073         mwindow->paste_video_transition();
1074         return 1;
1075 }
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090 // ============================================ settings
1091
1092 DeleteTracks::DeleteTracks(MWindow *mwindow)
1093  : BC_MenuItem(_("Delete tracks"))
1094 {
1095         this->mwindow = mwindow;
1096 }
1097
1098 int DeleteTracks::handle_event()
1099 {
1100         mwindow->delete_tracks();
1101         return 1;
1102 }
1103
1104 DeleteTrack::DeleteTrack(MWindow *mwindow)
1105  : BC_MenuItem(_("Delete last track"), "d", 'd')
1106 {
1107         this->mwindow = mwindow;
1108 }
1109
1110 int DeleteTrack::handle_event()
1111 {
1112         mwindow->delete_track();
1113         return 1;
1114 }
1115
1116 MoveTracksUp::MoveTracksUp(MWindow *mwindow)
1117  : BC_MenuItem(_("Move tracks up"))
1118 {
1119         set_shift(); this->mwindow = mwindow;
1120 }
1121
1122 int MoveTracksUp::handle_event()
1123 {
1124         mwindow->move_tracks_up();
1125         return 1;
1126 }
1127
1128 MoveTracksDown::MoveTracksDown(MWindow *mwindow)
1129  : BC_MenuItem(_("Move tracks down"))
1130 {
1131         set_shift(); this->mwindow = mwindow;
1132 }
1133
1134 int MoveTracksDown::handle_event()
1135 {
1136         mwindow->move_tracks_down();
1137         return 1;
1138 }
1139
1140
1141
1142
1143 ConcatenateTracks::ConcatenateTracks(MWindow *mwindow)
1144  : BC_MenuItem(_("Concatenate tracks"))
1145 {
1146         set_shift(); 
1147         this->mwindow = mwindow;
1148 }
1149
1150 int ConcatenateTracks::handle_event()
1151 {
1152         mwindow->concatenate_tracks();
1153         return 1;
1154 }
1155
1156
1157
1158
1159
1160 LoopPlayback::LoopPlayback(MWindow *mwindow)
1161  : BC_MenuItem(_("Loop Playback"), _("Shift+L"), 'L')
1162 {
1163         this->mwindow = mwindow;
1164         set_checked(mwindow->edl->local_session->loop_playback);
1165         set_shift();
1166 }
1167
1168 int LoopPlayback::handle_event()
1169 {
1170         mwindow->toggle_loop_playback();
1171         set_checked(mwindow->edl->local_session->loop_playback);
1172         return 1;
1173 }
1174
1175
1176
1177 // ============================================= subtitle
1178
1179
1180 AddSubttlTrack::AddSubttlTrack(MWindow *mwindow)
1181  : BC_MenuItem(_("Add subttl"), _("Shift-Y"), 'Y')
1182 {
1183         set_shift();
1184         this->mwindow = mwindow;
1185 }
1186
1187 int AddSubttlTrack::handle_event()
1188 {
1189         mwindow->add_subttl_track_entry();
1190         return 1;
1191 }
1192
1193 PasteSubttl::PasteSubttl(MWindow *mwindow)
1194  : BC_MenuItem(_("paste subttl"), "y", 'y')
1195 {
1196         this->mwindow = mwindow;
1197 }
1198
1199 int PasteSubttl::handle_event()
1200 {
1201         mwindow->gui->swindow->paste_subttl();
1202         return 1;
1203 }
1204
1205
1206
1207
1208
1209
1210 SetBRenderStart::SetBRenderStart(MWindow *mwindow)
1211  : BC_MenuItem(_("Set background render"))
1212 {
1213         this->mwindow = mwindow;
1214 }
1215
1216 int SetBRenderStart::handle_event()
1217 {
1218         mwindow->set_brender_start();
1219         return 1;
1220 }
1221
1222
1223
1224
1225
1226
1227
1228 LabelsFollowEdits::LabelsFollowEdits(MWindow *mwindow)
1229  : BC_MenuItem(_("Edit labels")) 
1230
1231         this->mwindow = mwindow; 
1232         set_checked(mwindow->edl->session->labels_follow_edits);
1233 }
1234
1235 int LabelsFollowEdits::handle_event()
1236 {
1237         set_checked(get_checked() ^ 1);
1238         mwindow->edl->session->labels_follow_edits = get_checked(); 
1239         return 0;
1240 }
1241
1242
1243
1244
1245 PluginsFollowEdits::PluginsFollowEdits(MWindow *mwindow)
1246  : BC_MenuItem(_("Edit effects")) 
1247
1248         this->mwindow = mwindow; 
1249         set_checked(mwindow->edl->session->plugins_follow_edits);
1250 }
1251
1252 int PluginsFollowEdits::handle_event()
1253 {
1254         set_checked(get_checked() ^ 1);
1255         mwindow->edl->session->plugins_follow_edits = get_checked(); 
1256         return 1;
1257 }
1258
1259
1260
1261
1262 KeyframesFollowEdits::KeyframesFollowEdits(MWindow *mwindow)
1263  : BC_MenuItem(_("Keyframes follow edits")) 
1264
1265         this->mwindow = mwindow; 
1266         set_checked(mwindow->edl->session->autos_follow_edits);
1267 }
1268
1269 int KeyframesFollowEdits::handle_event()
1270
1271         mwindow->edl->session->autos_follow_edits ^= 1; 
1272         set_checked(!get_checked());
1273         return 1;
1274 }
1275
1276
1277 CursorOnFrames::CursorOnFrames(MWindow *mwindow)
1278  : BC_MenuItem(_("Align cursor on frames")) 
1279
1280         this->mwindow = mwindow; 
1281         set_checked(mwindow->edl->session->cursor_on_frames);
1282 }
1283
1284 int CursorOnFrames::handle_event()
1285 {
1286         mwindow->edl->session->cursor_on_frames = !mwindow->edl->session->cursor_on_frames; 
1287         set_checked(mwindow->edl->session->cursor_on_frames);
1288         return 1;
1289 }
1290
1291
1292 TypelessKeyframes::TypelessKeyframes(MWindow *mwindow)
1293  : BC_MenuItem(_("Typeless keyframes")) 
1294
1295         this->mwindow = mwindow; 
1296         set_checked(mwindow->edl->session->typeless_keyframes);
1297 }
1298
1299 int TypelessKeyframes::handle_event()
1300 {
1301         mwindow->edl->session->typeless_keyframes = !mwindow->edl->session->typeless_keyframes; 
1302         set_checked(mwindow->edl->session->typeless_keyframes);
1303         return 1;
1304 }
1305
1306
1307 ScrubSpeed::ScrubSpeed(MWindow *mwindow) : BC_MenuItem(_("Slow Shuttle"))
1308 {
1309         this->mwindow = mwindow;
1310 }
1311
1312 int ScrubSpeed::handle_event()
1313 {
1314         if(mwindow->edl->session->scrub_speed == .5)
1315         {
1316                 mwindow->edl->session->scrub_speed = 2;
1317                 set_text(_("Slow Shuttle"));
1318         }
1319         else
1320         {
1321                 mwindow->edl->session->scrub_speed = .5;
1322                 set_text(_("Fast Shuttle"));
1323         }
1324         return 1;
1325 }
1326
1327 SaveSettingsNow::SaveSettingsNow(MWindow *mwindow) : BC_MenuItem(_("Save settings now")) 
1328
1329         this->mwindow = mwindow; 
1330 }
1331
1332 int SaveSettingsNow::handle_event()
1333 {
1334         mwindow->save_defaults();
1335         mwindow->save_backup();
1336         mwindow->gui->show_message(_("Saved settings."));
1337         return 1;
1338 }
1339
1340
1341
1342 // ============================================ window
1343
1344
1345
1346
1347
1348 ShowVWindow::ShowVWindow(MWindow *mwindow)
1349  : BC_MenuItem(_("Show Viewer"))
1350 {
1351         this->mwindow = mwindow;
1352         set_checked(mwindow->session->show_vwindow);
1353 }
1354 int ShowVWindow::handle_event()
1355 {
1356         mwindow->show_vwindow();
1357         return 1;
1358 }
1359
1360 ShowAWindow::ShowAWindow(MWindow *mwindow)
1361  : BC_MenuItem(_("Show Resources"))
1362 {
1363         this->mwindow = mwindow;
1364         set_checked(mwindow->session->show_awindow);
1365 }
1366 int ShowAWindow::handle_event()
1367 {
1368         mwindow->show_awindow();
1369         return 1;
1370 }
1371
1372 ShowCWindow::ShowCWindow(MWindow *mwindow)
1373  : BC_MenuItem(_("Show Compositor"))
1374 {
1375         this->mwindow = mwindow;
1376         set_checked(mwindow->session->show_cwindow);
1377 }
1378 int ShowCWindow::handle_event()
1379 {
1380         mwindow->show_cwindow();
1381         return 1;
1382 }
1383
1384
1385 ShowGWindow::ShowGWindow(MWindow *mwindow)
1386  : BC_MenuItem(_("Show Overlays"))
1387 {
1388         this->mwindow = mwindow;
1389         set_checked(mwindow->session->show_gwindow);
1390 }
1391 int ShowGWindow::handle_event()
1392 {
1393         mwindow->show_gwindow();
1394         return 1;
1395 }
1396
1397
1398 ShowLWindow::ShowLWindow(MWindow *mwindow)
1399  : BC_MenuItem(_("Show Levels"))
1400 {
1401         this->mwindow = mwindow;
1402         set_checked(mwindow->session->show_lwindow);
1403 }
1404 int ShowLWindow::handle_event()
1405 {
1406         mwindow->show_lwindow();
1407         return 1;
1408 }
1409
1410 TileWindows::TileWindows(MWindow *mwindow, const char *item_title, int config,
1411                 const char *hot_keytext, int hot_key)
1412  : BC_MenuItem(item_title, hot_keytext, hot_key)
1413 {
1414         this->mwindow = mwindow;
1415         this->config = config;
1416         if( hot_key ) set_ctrl(1);
1417 }
1418 int TileWindows::handle_event()
1419 {
1420         int window_config = config >= 0 ? config :
1421                 mwindow->session->window_config;
1422         if( mwindow->tile_windows(window_config) ) {
1423                 mwindow->reload_status = 1;
1424                 mwindow->quit(1);
1425         }
1426         return 1;
1427 }
1428
1429 SplitX::SplitX(MWindow *mwindow)
1430  : BC_MenuItem(_("Split X pane"), _("Ctrl+1"), '1')
1431 {
1432         this->mwindow = mwindow;
1433         set_ctrl(1);
1434         set_checked(mwindow->gui->pane[TOP_RIGHT_PANE] != 0);
1435 }
1436 int SplitX::handle_event()
1437 {
1438         mwindow->split_x();
1439         return 1;
1440 }
1441
1442 SplitY::SplitY(MWindow *mwindow)
1443  : BC_MenuItem(_("Split Y pane"), _("Ctrl+2"), '2')
1444 {
1445         this->mwindow = mwindow;
1446         set_ctrl(1);
1447         set_checked(mwindow->gui->pane[BOTTOM_LEFT_PANE] != 0);
1448 }
1449 int SplitY::handle_event()
1450 {
1451         mwindow->split_y();
1452         return 1;
1453 }
1454
1455