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