r793: Small API addon, so plugins can 'see' camera and projector automation
[cinelerra_cv/mob.git] / cinelerra / mainmenu.C
blobbaa88da7f87e62dc34f2691560d6331d0d296e90
1 #include "assets.h"
2 #include "batchrender.h"
3 #include "bcsignals.h"
4 #include "cache.h"
5 #include "cplayback.h"
6 #include "cropvideo.h"
7 #include "cwindow.h"
8 #include "cwindowgui.h"
9 #include "defaults.h"
10 #include "edl.h"
11 #include "edlsession.h"
12 #include "featheredits.h"
13 #include "filesystem.h"
14 #include "filexml.h"
15 #include "keys.h"
16 #include "language.h"
17 #include "levelwindow.h"
18 #include "loadfile.h"
19 #include "localsession.h"
20 #include "mainclock.h"
21 #include "mainmenu.h"
22 #include "mainsession.h"
23 #include "mainundo.h"
24 #include "menuaeffects.h"
25 #include "menuveffects.h"
26 #include "mwindowgui.h"
27 #include "mwindow.h"
28 #include "new.h"
29 #include "patchbay.h"
30 #include "playbackengine.h"
31 #include "preferences.h"
32 #include "preferencesthread.h"
33 #include "quit.h"
34 #include "record.h"
35 #include "render.h"
36 #include "savefile.h"
37 #include "setformat.h"
38 #include "timebar.h"
39 #include "trackcanvas.h"
40 #include "tracks.h"
41 #include "transition.h"
42 #include "transportque.h"
43 #include "viewmenu.h"
44 #include "zoombar.h"
45 #include "exportedl.h"
47 #include <string.h>
50 MainMenu::MainMenu(MWindow *mwindow, MWindowGUI *gui)
51  : BC_MenuBar(0, 0, gui->get_w())
53         this->gui = gui;
54         this->mwindow = mwindow; 
57 MainMenu::~MainMenu()
61 int MainMenu::create_objects()
63         BC_Menu *viewmenu, *windowmenu, *settingsmenu, *trackmenu;
64         PreferencesMenuitem *preferences;
66         recent_load = new BC_RecentList("PATH", mwindow->defaults);
67 SET_TRACE
69         add_menu(filemenu = new BC_Menu(_("File")));
70         filemenu->add_item(new_project = new New(mwindow));
71         new_project->create_objects();
73 SET_TRACE
74 // file loaders
75         filemenu->add_item(load_file = new Load(mwindow, this));
76         load_file->create_objects();
78 SET_TRACE
79 // new and load can be undone so no need to prompt save
80         Save *save;                   //  affected by saveas
81         filemenu->add_item(save = new Save(mwindow));
82         SaveAs *saveas;
83         filemenu->add_item(saveas = new SaveAs(mwindow));
84         save->create_objects(saveas);
85         saveas->set_mainmenu(this);
86         filemenu->add_item(record = new RecordMenuItem(mwindow));
88         filemenu->add_item(render = new RenderItem(mwindow));
89         filemenu->add_item(new ExportEDLItem(mwindow));
90         filemenu->add_item(new BatchRenderMenuItem(mwindow));
91         filemenu->add_item(new BC_MenuItem("-"));
92         filemenu->add_item(quit_program = new Quit(mwindow));
93         quit_program->create_objects(save);
94         filemenu->add_item(new DumpEDL(mwindow));
95         filemenu->add_item(new DumpPlugins(mwindow));
96         filemenu->add_item(new LoadBackup(mwindow));
97         filemenu->add_item(new SaveBackup(mwindow));
99         BC_Menu *editmenu;
100         add_menu(editmenu = new BC_Menu(_("Edit")));
101         editmenu->add_item(undo = new Undo(mwindow));
102         editmenu->add_item(redo = new Redo(mwindow));
103         editmenu->add_item(new BC_MenuItem("-"));
104         editmenu->add_item(new Cut(mwindow));
105         editmenu->add_item(new Copy(mwindow));
106         editmenu->add_item(new Paste(mwindow));
107         editmenu->add_item(new Clear(mwindow));
108         editmenu->add_item(new PasteSilence(mwindow));
109         editmenu->add_item(new MuteSelection(mwindow));
110         editmenu->add_item(new TrimSelection(mwindow));
111         editmenu->add_item(new SelectAll(mwindow));
112         editmenu->add_item(new BC_MenuItem("-"));
113         editmenu->add_item(new ClearLabels(mwindow));
115         BC_Menu *keyframemenu;
116         add_menu(keyframemenu = new BC_Menu(_("Keyframes")));
117         keyframemenu->add_item(new CutKeyframes(mwindow));
118         keyframemenu->add_item(new CopyKeyframes(mwindow));
119         keyframemenu->add_item(new PasteKeyframes(mwindow));
120         keyframemenu->add_item(new ClearKeyframes(mwindow));
121         keyframemenu->add_item(new BC_MenuItem("-"));
122         keyframemenu->add_item(new CopyDefaultKeyframe(mwindow));
123         keyframemenu->add_item(new PasteDefaultKeyframe(mwindow));
128         add_menu(audiomenu = new BC_Menu(_("Audio")));
129         audiomenu->add_item(new AddAudioTrack(mwindow));
130         audiomenu->add_item(new DefaultATransition(mwindow));
131         audiomenu->add_item(aeffects = new MenuAEffects(mwindow));
133         add_menu(videomenu = new BC_Menu(_("Video")));
134         videomenu->add_item(new AddVideoTrack(mwindow));
135         videomenu->add_item(new DefaultVTransition(mwindow));
136         videomenu->add_item(veffects = new MenuVEffects(mwindow));
138         add_menu(trackmenu = new BC_Menu(_("Tracks")));
139         trackmenu->add_item(new MoveTracksUp(mwindow));
140         trackmenu->add_item(new MoveTracksDown(mwindow));
141         trackmenu->add_item(new DeleteTracks(mwindow));
142         trackmenu->add_item(new DeleteTrack(mwindow));
143         trackmenu->add_item(new ConcatenateTracks(mwindow));
145         add_menu(settingsmenu = new BC_Menu(_("Settings")));
147         settingsmenu->add_item(new SetFormat(mwindow));
148         settingsmenu->add_item(preferences = new PreferencesMenuitem(mwindow));
149         mwindow->preferences_thread = preferences->thread;
150         settingsmenu->add_item(labels_follow_edits = new LabelsFollowEdits(mwindow));
151         settingsmenu->add_item(plugins_follow_edits = new PluginsFollowEdits(mwindow));
152         settingsmenu->add_item(cursor_on_frames = new CursorOnFrames(mwindow));
153         settingsmenu->add_item(new SaveSettingsNow(mwindow));
154         settingsmenu->add_item(loop_playback = new LoopPlayback(mwindow));
155         settingsmenu->add_item(new SetBRenderStart(mwindow));
156 // set scrubbing speed
157 //      ScrubSpeed *scrub_speed;
158 //      settingsmenu->add_item(scrub_speed = new ScrubSpeed(mwindow));
159 //      if(mwindow->edl->session->scrub_speed == .5) 
160 //              scrub_speed->set_text(_("Fast Shuttle"));
167         add_menu(viewmenu = new BC_Menu(_("View")));
168         viewmenu->add_item(show_assets = new ShowAssets(mwindow, "0"));
169         viewmenu->add_item(show_titles = new ShowTitles(mwindow, "1"));
170         viewmenu->add_item(show_transitions = new ShowTransitions(mwindow, "2"));
171         viewmenu->add_item(fade_automation = new ShowAutomation(mwindow, _("Fade"), "3", AUTOMATION_FADE));
172         viewmenu->add_item(mute_automation = new ShowAutomation(mwindow, _("Mute"), "4", AUTOMATION_MUTE));
173         viewmenu->add_item(mode_automation = new ShowAutomation(mwindow, _("Mode"), "5", AUTOMATION_MODE));
174         viewmenu->add_item(pan_automation = new ShowAutomation(mwindow, _("Pan"), "6", AUTOMATION_PAN));
175         viewmenu->add_item(plugin_automation = new PluginAutomation(mwindow, "7"));
176         viewmenu->add_item(mask_automation = new ShowAutomation(mwindow, _("Mask"), "8", AUTOMATION_MASK));
177         viewmenu->add_item(camera_x = new ShowAutomation(mwindow, _("Camera X"), "", AUTOMATION_CAMERA_X));
178         viewmenu->add_item(camera_y = new ShowAutomation(mwindow, _("Camera Y"), "", AUTOMATION_CAMERA_Y));
179         viewmenu->add_item(camera_z = new ShowAutomation(mwindow, _("Camera Z"), "", AUTOMATION_CAMERA_Z));
180         viewmenu->add_item(project_x = new ShowAutomation(mwindow, _("Projector X"), "", AUTOMATION_PROJECTOR_X));
181         viewmenu->add_item(project_y = new ShowAutomation(mwindow, _("Projector Y"), "", AUTOMATION_PROJECTOR_Y));
182         viewmenu->add_item(project_z = new ShowAutomation(mwindow, _("Projector Z"), "", AUTOMATION_PROJECTOR_Z));
185         add_menu(windowmenu = new BC_Menu(_("Window")));
186         windowmenu->add_item(show_vwindow = new ShowVWindow(mwindow));
187         windowmenu->add_item(show_awindow = new ShowAWindow(mwindow));
188         windowmenu->add_item(show_cwindow = new ShowCWindow(mwindow));
189         windowmenu->add_item(show_gwindow = new ShowGWindow(mwindow));
190         windowmenu->add_item(show_lwindow = new ShowLWindow(mwindow));
191         windowmenu->add_item(new TileWindows(mwindow));
193 SET_TRACE
194         return 0;
197 int MainMenu::load_defaults(Defaults *defaults)
199         init_loads(defaults);
200         init_aeffects(defaults);
201         init_veffects(defaults);
202         return 0;
205 void MainMenu::update_toggles(int use_lock)
207         if(use_lock) lock_window("MainMenu::update_toggles");
208         labels_follow_edits->set_checked(mwindow->edl->session->labels_follow_edits);
209         plugins_follow_edits->set_checked(mwindow->edl->session->plugins_follow_edits);
210         cursor_on_frames->set_checked(mwindow->edl->session->cursor_on_frames);
211         loop_playback->set_checked(mwindow->edl->local_session->loop_playback);
212         show_titles->set_checked(mwindow->edl->session->show_titles);
213         show_transitions->set_checked(mwindow->edl->session->auto_conf->transitions);
214         fade_automation->update_toggle();
215         mute_automation->update_toggle();
216         pan_automation->update_toggle();
217         camera_x->update_toggle();
218         camera_y->update_toggle();
219         camera_z->update_toggle();
220         project_x->update_toggle();
221         project_y->update_toggle();
222         project_z->update_toggle();
223         plugin_automation->set_checked(mwindow->edl->session->auto_conf->plugins);
224         mode_automation->update_toggle();
225         mask_automation->update_toggle();
226         if(use_lock) mwindow->gui->unlock_window();
229 int MainMenu::save_defaults(Defaults *defaults)
231         save_aeffects(defaults);
232         save_veffects(defaults);
233         return 0;
240 int MainMenu::quit()
242         quit_program->handle_event();
243         return 0;
250 // ================================== load most recent
252 int MainMenu::init_aeffects(Defaults *defaults)
254         total_aeffects = defaults->get("TOTAL_AEFFECTS", 0);
255         
256         char string[1024], title[1024];
257         if(total_aeffects) audiomenu->add_item(new BC_MenuItem("-"));
258         
259         for(int i = 0; i < total_aeffects; i++)
260         {
261                 sprintf(string, "AEFFECTRECENT%d", i);
262                 defaults->get(string, title);
263                 audiomenu->add_item(aeffect[i] = new MenuAEffectItem(aeffects, title));
264         }
265         return 0;
268 int MainMenu::init_veffects(Defaults *defaults)
270         total_veffects = defaults->get("TOTAL_VEFFECTS", 0);
271         
272         char string[1024], title[1024];
273         if(total_veffects) videomenu->add_item(new BC_MenuItem("-"));
274         
275         for(int i = 0; i < total_veffects; i++)
276         {
277                 sprintf(string, "VEFFECTRECENT%d", i);
278                 defaults->get(string, title);
279                 videomenu->add_item(veffect[i] = new MenuVEffectItem(veffects, title));
280         }
281         return 0;
284 int MainMenu::init_loads(Defaults *defaults)
286         char string[BCTEXTLEN], path[BCTEXTLEN], filename[BCTEXTLEN];
287         FileSystem dir;
288         
289         recent_load->load_items();
291         int total_loads = recent_load->items.total;
292         if(total_loads > 0) filemenu->add_item(new BC_MenuItem("-"));
294         for(int i = 0; i < total_loads; i++)
295         {
296                 char *path = recent_load->items.values[i]->get_text();
297                 filemenu->add_item(load[i] = new LoadPrevious(mwindow));
298                 dir.extract_name(filename, path, 0);
299                 load[i]->set_text(filename);
300                 load[i]->set_path(path);
301         }
302         return 0;
305 // ============================ save most recent
307 int MainMenu::save_aeffects(Defaults *defaults)
309         defaults->update("TOTAL_AEFFECTS", total_aeffects);
310         char string[1024];
311         for(int i = 0; i < total_aeffects; i++)
312         {
313                 sprintf(string, "AEFFECTRECENT%d", i);
314                 defaults->update(string, aeffect[i]->get_text());
315         }
316         return 0;
319 int MainMenu::save_veffects(Defaults *defaults)
321         defaults->update("TOTAL_VEFFECTS", total_veffects);
322         char string[1024];
323         for(int i = 0; i < total_veffects; i++)
324         {
325                 sprintf(string, "VEFFECTRECENT%d", i);
326                 defaults->update(string, veffect[i]->get_text());
327         }
328         return 0;
331 // =================================== add most recent
333 int MainMenu::add_aeffect(char *title)
335 // add bar for first effect
336         if(total_aeffects == 0)
337         {
338                 audiomenu->add_item(new BC_MenuItem("-"));
339         }
341 // test for existing copy of effect
342         for(int i = 0; i < total_aeffects; i++)
343         {
344                 if(!strcmp(aeffect[i]->get_text(), title))     // already exists
345                 {                                // swap for top effect
346                         for(int j = i; j > 0; j--)   // move preceeding effects down
347                         {
348                                 aeffect[j]->set_text(aeffect[j - 1]->get_text());
349                         }
350                         aeffect[0]->set_text(title);
351                         return 1;
352                 }
353         }
355 // add another blank effect
356         if(total_aeffects < TOTAL_EFFECTS)
357         {
358                 audiomenu->add_item(aeffect[total_aeffects] = new MenuAEffectItem(aeffects, ""));
359                 total_aeffects++;
360         }
362 // cycle effect down
363         for(int i = total_aeffects - 1; i > 0; i--)
364         {
365         // set menu item text
366                 aeffect[i]->set_text(aeffect[i - 1]->get_text());
367         }
369 // set up the new effect
370         aeffect[0]->set_text(title);
371         return 0;
374 int MainMenu::add_veffect(char *title)
376 // add bar for first effect
377         if(total_veffects == 0)
378         {
379                 videomenu->add_item(new BC_MenuItem("-"));
380         }
382 // test for existing copy of effect
383         for(int i = 0; i < total_veffects; i++)
384         {
385                 if(!strcmp(veffect[i]->get_text(), title))     // already exists
386                 {                                // swap for top effect
387                         for(int j = i; j > 0; j--)   // move preceeding effects down
388                         {
389                                 veffect[j]->set_text(veffect[j - 1]->get_text());
390                         }
391                         veffect[0]->set_text(title);
392                         return 1;
393                 }
394         }
396 // add another blank effect
397         if(total_veffects < TOTAL_EFFECTS)
398         {
399                 videomenu->add_item(veffect[total_veffects] = new MenuVEffectItem(veffects, ""));
400                 total_veffects++;
401         }
403 // cycle effect down
404         for(int i = total_veffects - 1; i > 0; i--)
405         {
406 // set menu item text
407                 veffect[i]->set_text(veffect[i - 1]->get_text());
408         }
410 // set up the new effect
411         veffect[0]->set_text(title);
412         return 0;
415 int MainMenu::add_load(char *new_path)
417         char filename[BCTEXTLEN];
418         FileSystem dir;
420         int total_loads = recent_load->items.total;
422         if(total_loads == 0)
423         {
424                 filemenu->add_item(new BC_MenuItem("-"));
425         }
427         int new_total = recent_load->add_item(NULL, new_path);
429         if (new_total > total_loads) {
430                 // just create a new item if there is room for it
431                 int i = new_total - 1;
432                 load[i] = new LoadPrevious(mwindow);
433                 dir.extract_name(filename, new_path, 0);
434                 load[i]->set_text(filename);
435                 load[i]->set_path(new_path);
436                 filemenu->add_item(load[i]);
437         }
439         // reassign the paths to adjust for the shift down
440         for(int i = 0; i < new_total; i++) {
441                 char *path = recent_load->items.values[i]->get_text();
442                 dir.extract_name(filename, path, 0);
443                 load[i]->set_text(filename);
444                 load[i]->set_path(path);
445         }
447         return 0;
457 // ================================== menu items
460 DumpCICache::DumpCICache(MWindow *mwindow)
461  : BC_MenuItem(_("Dump CICache"))
462 { this->mwindow = mwindow; }
464 int DumpCICache::handle_event()
466 //      mwindow->cache->dump();
469 DumpEDL::DumpEDL(MWindow *mwindow)
470  : BC_MenuItem(_("Dump EDL"))
472         this->mwindow = mwindow;
475 int DumpEDL::handle_event()
477 //printf("DumpEDL::handle_event 1\n");
478         mwindow->edl->dump();
479 //printf("DumpEDL::handle_event 2\n");
480         return 1;
483 DumpPlugins::DumpPlugins(MWindow *mwindow)
484  : BC_MenuItem(_("Dump Plugins"))
486         this->mwindow = mwindow;
489 int DumpPlugins::handle_event()
491 //printf("DumpEDL::handle_event 1\n");
492         mwindow->dump_plugins();
493 //printf("DumpEDL::handle_event 2\n");
494         return 1;
498 DumpAssets::DumpAssets(MWindow *mwindow)
499  : BC_MenuItem(_("Dump Assets"))
500 { this->mwindow = mwindow; }
502 int DumpAssets::handle_event()
504         mwindow->assets->dump();
507 // ================================================= edit
509 Undo::Undo(MWindow *mwindow) : BC_MenuItem(_("Undo"), "z", 'z') 
511         this->mwindow = mwindow; 
513 int Undo::handle_event()
515         mwindow->undo_entry(mwindow->gui);
516         return 1;
518 int Undo::update_caption(char *new_caption)
520         char string[1024];
521         sprintf(string, _("Undo %s"), new_caption);
522         set_text(string);
526 Redo::Redo(MWindow *mwindow) : BC_MenuItem(_("Redo"), "Shift+Z", 'Z') 
528         set_shift(1); 
529         this->mwindow = mwindow; 
532 int Redo::handle_event()
534         mwindow->redo_entry(mwindow->gui);
536         return 1;
538 int Redo::update_caption(char *new_caption)
540         char string[1024];
541         sprintf(string, _("Redo %s"), new_caption);
542         set_text(string);
545 CutKeyframes::CutKeyframes(MWindow *mwindow)
546  : BC_MenuItem(_("Cut keyframes"), "Shift-X", 'X')
548         set_shift(); 
549         this->mwindow = mwindow; 
552 int CutKeyframes::handle_event()
554         mwindow->cut_automation(); 
557 CopyKeyframes::CopyKeyframes(MWindow *mwindow)
558  : BC_MenuItem(_("Copy keyframes"), "Shift-C", 'C')
560         set_shift(); 
561         this->mwindow = mwindow; 
564 int CopyKeyframes::handle_event()
566         mwindow->copy_automation();
567         return 1;
570 PasteKeyframes::PasteKeyframes(MWindow *mwindow)
571  : BC_MenuItem(_("Paste keyframes"), "Shift-V", 'V')
573         set_shift(); 
574         this->mwindow = mwindow; 
577 int PasteKeyframes::handle_event()
579         mwindow->paste_automation(); 
582 ClearKeyframes::ClearKeyframes(MWindow *mwindow)
583  : BC_MenuItem(_("Clear keyframes"), "Shift-Del", DELETE)
585         set_shift(); 
586         this->mwindow = mwindow; 
589 int ClearKeyframes::handle_event()
591         mwindow->clear_automation();
592         return 1;
599 CutDefaultKeyframe::CutDefaultKeyframe(MWindow *mwindow)
600  : BC_MenuItem(_("Cut default keyframe"), "Alt-X", 'X')
602         set_alt(); 
603         this->mwindow = mwindow; 
606 int CutDefaultKeyframe::handle_event()
608         mwindow->cut_default_keyframe(); 
609         return 1;
612 CopyDefaultKeyframe::CopyDefaultKeyframe(MWindow *mwindow)
613  : BC_MenuItem(_("Copy default keyframe"), "Alt-c", 'c')
615         set_alt(); 
616         this->mwindow = mwindow; 
619 int CopyDefaultKeyframe::handle_event()
621         mwindow->copy_default_keyframe();
622         return 1;
625 PasteDefaultKeyframe::PasteDefaultKeyframe(MWindow *mwindow)
626  : BC_MenuItem(_("Paste default keyframe"), "Alt-v", 'v')
628         set_alt(); 
629         this->mwindow = mwindow; 
632 int PasteDefaultKeyframe::handle_event()
634         mwindow->paste_default_keyframe(); 
635         return 1;
638 ClearDefaultKeyframe::ClearDefaultKeyframe(MWindow *mwindow)
639  : BC_MenuItem(_("Clear default keyframe"), "Alt-Del", DELETE)
641         set_alt(); 
642         this->mwindow = mwindow; 
645 int ClearDefaultKeyframe::handle_event()
647         mwindow->clear_default_keyframe();
648         return 1;
651 Cut::Cut(MWindow *mwindow)
652  : BC_MenuItem(_("Cut"), "x", 'x') 
654         this->mwindow = mwindow; 
657 int Cut::handle_event()
659         mwindow->cut();
660         return 1;
663 Copy::Copy(MWindow *mwindow)
664  : BC_MenuItem(_("Copy"), "c", 'c') 
666         this->mwindow = mwindow; 
669 int Copy::handle_event()
671         mwindow->copy();
672         return 1;
675 Paste::Paste(MWindow *mwindow)
676  : BC_MenuItem(_("Paste"), "v", 'v') 
678         this->mwindow = mwindow; 
681 int Paste::handle_event()
683         mwindow->paste();
684         return 1;
687 Clear::Clear(MWindow *mwindow)
688  : BC_MenuItem(_("Clear"), "Del", DELETE) 
690         this->mwindow = mwindow; 
693 int Clear::handle_event()
695         mwindow->cwindow->gui->lock_window("Clear::handle_event");
696         mwindow->clear_entry();
697         mwindow->cwindow->gui->unlock_window();
698         return 1;
701 PasteSilence::PasteSilence(MWindow *mwindow)
702  : BC_MenuItem(_("Paste silence"), "Shift+Space", ' ')
704         this->mwindow = mwindow; 
705         set_shift(); 
708 int PasteSilence::handle_event()
710         mwindow->paste_silence();
711         return 1;
714 SelectAll::SelectAll(MWindow *mwindow)
715  : BC_MenuItem(_("Select All"), "a", 'a')
717         this->mwindow = mwindow; 
720 int SelectAll::handle_event()
722         mwindow->select_all();
723         return 1;
726 ClearLabels::ClearLabels(MWindow *mwindow) : BC_MenuItem(_("Clear labels")) 
728         this->mwindow = mwindow; 
731 int ClearLabels::handle_event()
733         mwindow->clear_labels();
734         return 1;
737 MuteSelection::MuteSelection(MWindow *mwindow)
738  : BC_MenuItem(_("Mute Region"), "m", 'm')
740         this->mwindow = mwindow;
743 int MuteSelection::handle_event()
745         mwindow->mute_selection();
746         return 1;
750 TrimSelection::TrimSelection(MWindow *mwindow)
751  : BC_MenuItem(_("Trim Selection"))
753         this->mwindow = mwindow;
756 int TrimSelection::handle_event()
758         mwindow->trim_selection();
759         return 1;
773 // ============================================= audio
775 AddAudioTrack::AddAudioTrack(MWindow *mwindow)
776  : BC_MenuItem(_("Add track"), "t", 't')
778         this->mwindow = mwindow;
781 int AddAudioTrack::handle_event()
783         mwindow->add_audio_track_entry(0, 0);
784         return 1;
787 DeleteAudioTrack::DeleteAudioTrack(MWindow *mwindow)
788  : BC_MenuItem(_("Delete track"))
790         this->mwindow = mwindow;
793 int DeleteAudioTrack::handle_event()
795         return 1;
798 DefaultATransition::DefaultATransition(MWindow *mwindow)
799  : BC_MenuItem(_("Default Transition"), "u", 'u')
801         this->mwindow = mwindow;
804 int DefaultATransition::handle_event()
806         mwindow->paste_audio_transition();
807         return 1;
813 // ============================================= video
816 AddVideoTrack::AddVideoTrack(MWindow *mwindow)
817  : BC_MenuItem(_("Add track"), "Shift-T", 'T')
819         set_shift();
820         this->mwindow = mwindow;
823 int AddVideoTrack::handle_event()
825         mwindow->add_video_track_entry();
826         return 1;
830 DeleteVideoTrack::DeleteVideoTrack(MWindow *mwindow)
831  : BC_MenuItem(_("Delete track"))
833         this->mwindow = mwindow;
836 int DeleteVideoTrack::handle_event()
838         return 1;
843 ResetTranslation::ResetTranslation(MWindow *mwindow)
844  : BC_MenuItem(_("Reset Translation"))
846         this->mwindow = mwindow;
849 int ResetTranslation::handle_event()
851         return 1;
856 DefaultVTransition::DefaultVTransition(MWindow *mwindow)
857  : BC_MenuItem(_("Default Transition"), "Shift-U", 'U')
859         set_shift();
860         this->mwindow = mwindow;
863 int DefaultVTransition::handle_event()
865         mwindow->paste_video_transition();
866         return 1;
882 // ============================================ settings
884 DeleteTracks::DeleteTracks(MWindow *mwindow)
885  : BC_MenuItem(_("Delete tracks"))
887         this->mwindow = mwindow;
890 int DeleteTracks::handle_event()
892         mwindow->delete_tracks();
893         return 1;
896 DeleteTrack::DeleteTrack(MWindow *mwindow)
897  : BC_MenuItem(_("Delete last track"), "d", 'd')
899         this->mwindow = mwindow;
902 int DeleteTrack::handle_event()
904         mwindow->delete_track();
905         return 1;
908 MoveTracksUp::MoveTracksUp(MWindow *mwindow)
909  : BC_MenuItem(_("Move tracks up"))
911         set_shift(); this->mwindow = mwindow;
914 int MoveTracksUp::handle_event()
916         mwindow->move_tracks_up();
917         return 1;
920 MoveTracksDown::MoveTracksDown(MWindow *mwindow)
921  : BC_MenuItem(_("Move tracks down"))
923         set_shift(); this->mwindow = mwindow;
926 int MoveTracksDown::handle_event()
928         mwindow->move_tracks_down();
929         return 1;
935 ConcatenateTracks::ConcatenateTracks(MWindow *mwindow)
936  : BC_MenuItem(_("Concatenate tracks"))
938         set_shift(); 
939         this->mwindow = mwindow;
942 int ConcatenateTracks::handle_event()
944         mwindow->concatenate_tracks();
945         return 1;
952 LoopPlayback::LoopPlayback(MWindow *mwindow)
953  : BC_MenuItem(_("Loop Playback"), "Shift+L", 'L')
955         this->mwindow = mwindow;
956         set_checked(mwindow->edl->local_session->loop_playback);
957         set_shift();
960 int LoopPlayback::handle_event()
962         mwindow->toggle_loop_playback();
963         set_checked(mwindow->edl->local_session->loop_playback);
964         return 1;
971 SetBRenderStart::SetBRenderStart(MWindow *mwindow)
972  : BC_MenuItem(_("Set background render"))
974         this->mwindow = mwindow;
977 int SetBRenderStart::handle_event()
979         mwindow->set_brender_start();
980         return 1;
989 LabelsFollowEdits::LabelsFollowEdits(MWindow *mwindow)
990  : BC_MenuItem(_("Edit labels")) 
992         this->mwindow = mwindow; 
993         set_checked(mwindow->edl->session->labels_follow_edits);
996 int LabelsFollowEdits::handle_event()
998         set_checked(get_checked() ^ 1);
999         mwindow->edl->session->labels_follow_edits = get_checked(); 
1005 PluginsFollowEdits::PluginsFollowEdits(MWindow *mwindow)
1006  : BC_MenuItem(_("Edit effects")) 
1008         this->mwindow = mwindow; 
1009         set_checked(mwindow->edl->session->plugins_follow_edits);
1012 int PluginsFollowEdits::handle_event()
1014         set_checked(get_checked() ^ 1);
1015         mwindow->edl->session->plugins_follow_edits = get_checked(); 
1021 AutosFollowEdits::AutosFollowEdits(MWindow *mwindow)
1022  : BC_MenuItem(_("Autos follow edits")) 
1024         this->mwindow = mwindow; 
1025         set_checked(mwindow->edl->session->autos_follow_edits);
1028 int AutosFollowEdits::handle_event()
1030         mwindow->edl->session->autos_follow_edits ^= 1; 
1031         set_checked(!get_checked());
1035 CursorOnFrames::CursorOnFrames(MWindow *mwindow)
1036  : BC_MenuItem(_("Align cursor on frames")) 
1038         this->mwindow = mwindow; 
1039         set_checked(mwindow->edl->session->cursor_on_frames);
1042 int CursorOnFrames::handle_event()
1044         mwindow->edl->session->cursor_on_frames = !mwindow->edl->session->cursor_on_frames; 
1045         set_checked(mwindow->edl->session->cursor_on_frames);
1049 ScrubSpeed::ScrubSpeed(MWindow *mwindow) : BC_MenuItem(_("Slow Shuttle"))
1051         this->mwindow = mwindow;
1054 int ScrubSpeed::handle_event()
1056         if(mwindow->edl->session->scrub_speed == .5)
1057         {
1058                 mwindow->edl->session->scrub_speed = 2;
1059                 set_text(_("Slow Shuttle"));
1060         }
1061         else
1062         {
1063                 mwindow->edl->session->scrub_speed = .5;
1064                 set_text(_("Fast Shuttle"));
1065         }
1068 SaveSettingsNow::SaveSettingsNow(MWindow *mwindow) : BC_MenuItem(_("Save settings now")) 
1070         this->mwindow = mwindow; 
1073 int SaveSettingsNow::handle_event()
1075         mwindow->save_defaults();
1076         mwindow->save_backup();
1077         mwindow->gui->show_message(_("Saved settings."));
1078         return 1;
1083 // ============================================ window
1089 ShowVWindow::ShowVWindow(MWindow *mwindow)
1090  : BC_MenuItem(_("Show Viewer"))
1092         this->mwindow = mwindow;
1093         set_checked(mwindow->session->show_vwindow);
1095 int ShowVWindow::handle_event()
1097         mwindow->show_vwindow();
1098         return 1;
1101 ShowAWindow::ShowAWindow(MWindow *mwindow)
1102  : BC_MenuItem(_("Show Resources"))
1104         this->mwindow = mwindow;
1105         set_checked(mwindow->session->show_awindow);
1107 int ShowAWindow::handle_event()
1109         mwindow->show_awindow();
1110         return 1;
1113 ShowCWindow::ShowCWindow(MWindow *mwindow)
1114  : BC_MenuItem(_("Show Compositor"))
1116         this->mwindow = mwindow;
1117         set_checked(mwindow->session->show_cwindow);
1119 int ShowCWindow::handle_event()
1121         mwindow->show_cwindow();
1122         return 1;
1126 ShowGWindow::ShowGWindow(MWindow *mwindow)
1127  : BC_MenuItem(_("Show Overlays"))
1129         this->mwindow = mwindow;
1130         set_checked(mwindow->session->show_gwindow);
1132 int ShowGWindow::handle_event()
1134         mwindow->show_gwindow();
1135         return 1;
1139 ShowLWindow::ShowLWindow(MWindow *mwindow)
1140  : BC_MenuItem(_("Show Levels"))
1142         this->mwindow = mwindow;
1143         set_checked(mwindow->session->show_lwindow);
1145 int ShowLWindow::handle_event()
1147         mwindow->show_lwindow();
1148         return 1;
1151 TileWindows::TileWindows(MWindow *mwindow)
1152  : BC_MenuItem(_("Default positions"))
1154         this->mwindow = mwindow;
1156 int TileWindows::handle_event()
1158         mwindow->tile_windows();
1159         return 1;