vwindow replay, append tracks to proj, multi asset info, subtitle bug
[goodguy/history.git] / cinelerra-5.1 / cinelerra / editpanel.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2008 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 "awindow.h"
23 #include "awindowgui.h"
24 #include "bcsignals.h"
25 #include "clipedit.h"
26 #include "cplayback.h"
27 #include "cwindow.h"
28 #include "cwindowgui.h"
29 #include "editpanel.h"
30 #include "edl.h"
31 #include "edlsession.h"
32 #include "filexml.h"
33 #include "keys.h"
34 #include "language.h"
35 #include "localsession.h"
36 #include "mainclock.h"
37 #include "mainundo.h"
38 #include "mbuttons.h"
39 #include "meterpanel.h"
40 #include "mwindow.h"
41 #include "mwindowgui.h"
42 #include "playbackengine.h"
43 #include "theme.h"
44 #include "timebar.h"
45 #include "trackcanvas.h"
46 #include "transportque.h"
47 #include "zoombar.h"
48 #include "manualgoto.h"
49
50
51
52 EditPanel::EditPanel(MWindow *mwindow,
53         BC_WindowBase *subwindow,
54         int x,
55         int y,
56         int editing_mode,
57         int use_editing_mode,
58         int use_keyframe,
59         int use_splice,   // Extra buttons
60         int use_overwrite,
61         int use_lift,
62         int use_extract,
63         int use_copy,
64         int use_paste,
65         int use_undo,
66         int use_fit,
67         int use_locklabels,
68         int use_labels,
69         int use_toclip,
70         int use_meters,
71         int is_mwindow,
72         int use_cut,
73         int use_commercial)
74 {
75         this->editing_mode = editing_mode;
76         this->use_editing_mode = use_editing_mode;
77         this->use_keyframe = use_keyframe;
78         this->use_splice = use_splice;
79         this->use_overwrite = use_overwrite;
80         this->use_lift = 0;
81         this->use_extract = 0;
82         this->use_copy = use_copy;
83         this->use_paste = use_paste;
84         this->use_undo = use_undo;
85         this->mwindow = mwindow;
86         this->subwindow = subwindow;
87         this->use_fit = use_fit;
88         this->use_labels = use_labels;
89         this->use_locklabels = use_locklabels;
90         this->use_toclip = use_toclip;
91         this->use_meters = use_meters;
92         this->is_mwindow = is_mwindow;
93         this->use_cut = use_cut;
94         this->use_commercial = use_commercial;
95
96         this->x = x;
97         this->y = y;
98         this->fit = 0;
99         this->fit_autos = 0;
100         this->inpoint = 0;
101         this->outpoint = 0;
102         this->splice = 0;
103         this->overwrite = 0;
104         this->lift = 0;
105         this->extract = 0;
106         this->clip = 0;
107         this->cut = 0;
108         this->commercial = 0;
109         this->copy = 0;
110         this->paste = 0;
111         this->labelbutton = 0;
112         this->prevlabel = 0;
113         this->nextlabel = 0;
114         this->prevedit = 0;
115         this->nextedit = 0;
116         this->undo = 0;
117         this->redo = 0;
118         this->meter_panel = 0;
119         this->meters = 0;
120         this->arrow = 0;
121         this->ibeam = 0;
122         this->keyframe = 0;
123         locklabels = 0;
124 }
125
126 EditPanel::~EditPanel()
127 {
128 }
129
130 void EditPanel::set_meters(MeterPanel *meter_panel)
131 {
132         this->meter_panel = meter_panel;
133 }
134
135
136 void EditPanel::update()
137 {
138         int new_editing_mode = mwindow->edl->session->editing_mode;
139         if(arrow) arrow->update(new_editing_mode == EDITING_ARROW);
140         if(ibeam) ibeam->update(new_editing_mode == EDITING_IBEAM);
141         if(keyframe) keyframe->update(mwindow->edl->session->auto_keyframes);
142         if(locklabels) locklabels->set_value(mwindow->edl->session->labels_follow_edits);
143         if(meters)
144         {
145 //printf("EditPanel::update %d %p %p\n", __LINE__, subwindow, (BC_WindowBase*)mwindow->cwindow->gui);
146                 if(subwindow == (BC_WindowBase*)mwindow->cwindow->gui)
147                 {
148 //printf("EditPanel::update %d %d\n", __LINE__, mwindow->edl->session->cwindow_meter);
149                         meters->update(mwindow->edl->session->cwindow_meter);
150                         mwindow->cwindow->gui->update_meters();
151                 }
152                 else
153                 {
154 //printf("EditPanel::update %d %d\n", __LINE__, mwindow->edl->session->vwindow_meter);
155                         meters->update(mwindow->edl->session->vwindow_meter);
156                 }
157         }
158         subwindow->flush();
159 }
160
161 int EditPanel::calculate_w(MWindow *mwindow, int use_keyframe, int total_buttons)
162 {
163         int result = 0;
164         int button_w = mwindow->theme->get_image_set("ibeam")[0]->get_w();
165         if(use_keyframe)
166         {
167                 result += button_w + mwindow->theme->toggle_margin;
168         }
169
170         result += button_w * total_buttons;
171         return result;
172 }
173
174 int EditPanel::calculate_h(MWindow *mwindow)
175 {
176         return mwindow->theme->get_image_set("ibeam")[0]->get_h();
177 }
178
179 void EditPanel::create_buttons()
180 {
181         x1 = x, y1 = y;
182
183
184 SET_TRACE
185         if(use_editing_mode)
186         {
187                 subwindow->add_subwindow(arrow = new ArrowButton(mwindow, this, x1, y1));
188                 x1 += arrow->get_w();
189                 subwindow->add_subwindow(ibeam = new IBeamButton(mwindow, this, x1, y1));
190                 x1 += ibeam->get_w();
191                 x1 += mwindow->theme->toggle_margin;
192         }
193
194         if(use_keyframe)
195         {
196                 subwindow->add_subwindow(keyframe = new KeyFrameButton(mwindow, this, x1, y1));
197                 x1 += keyframe->get_w();
198         }
199
200         if(use_locklabels)
201         {
202                 subwindow->add_subwindow(locklabels = new LockLabelsButton(mwindow,
203                         x1,
204                         y1));
205                 x1 += locklabels->get_w();
206         }
207         if(use_keyframe || use_locklabels)
208                 x1 += mwindow->theme->toggle_margin;
209
210 // Mandatory
211         subwindow->add_subwindow(inpoint = new EditInPoint(mwindow, this, x1, y1));
212         x1 += inpoint->get_w();
213         subwindow->add_subwindow(outpoint = new EditOutPoint(mwindow, this, x1, y1));
214         x1 += outpoint->get_w();
215         if(use_splice)
216         {
217                 subwindow->add_subwindow(splice = new EditSplice(mwindow, this, x1, y1));
218                 x1 += splice->get_w();
219         }
220         if(use_overwrite)
221         {
222                 subwindow->add_subwindow(overwrite = new EditOverwrite(mwindow, this, x1, y1));
223                 x1 += overwrite->get_w();
224         }
225         if(use_lift)
226         {
227                 subwindow->add_subwindow(lift = new EditLift(mwindow, this, x1, y1));
228                 x1 += lift->get_w();
229         }
230         if(use_extract)
231         {
232                 subwindow->add_subwindow(extract = new EditExtract(mwindow, this, x1, y1));
233                 x1 += extract->get_w();
234         }
235         if(use_toclip)
236         {
237                 subwindow->add_subwindow(clip = new EditToClip(mwindow, this, x1, y1));
238                 x1 += clip->get_w();
239         }
240
241         if(use_cut)
242         {
243                 subwindow->add_subwindow(cut = new EditCut(mwindow, this, x1, y1));
244                 x1 += cut->get_w();
245         }
246         if(use_copy)
247         {
248                 subwindow->add_subwindow(copy = new EditCopy(mwindow, this, x1, y1));
249                 x1 += copy->get_w();
250         }
251         if(use_paste)
252         {
253                 subwindow->add_subwindow(paste = new EditPaste(mwindow, this, x1, y1));
254                 x1 += paste->get_w();
255         }
256
257         if(use_meters)
258         {
259                 if(!meter_panel)
260                 {
261                         printf("EditPanel::create_objects: meter_panel == 0\n");
262                 }
263                 subwindow->add_subwindow(meters = new MeterShow(mwindow, meter_panel, x1, y1));
264                 x1 += meters->get_w();
265         }
266
267         if(use_labels)
268         {
269                 subwindow->add_subwindow(labelbutton = new EditLabelbutton(mwindow,
270                         this,
271                         x1,
272                         y1));
273                 x1 += labelbutton->get_w();
274                 subwindow->add_subwindow(prevlabel = new EditPrevLabel(mwindow,
275                         this,
276                         x1,
277                         y1,
278                         is_mwindow));
279                 x1 += prevlabel->get_w();
280                 subwindow->add_subwindow(nextlabel = new EditNextLabel(mwindow,
281                         this,
282                         x1,
283                         y1,
284                         is_mwindow));
285                 x1 += nextlabel->get_w();
286         }
287
288 // all windows except VWindow since it's only implemented in MWindow.
289         if(use_cut)
290         {
291                 subwindow->add_subwindow(prevedit = new EditPrevEdit(mwindow,
292                         this,
293                         x1,
294                         y1,
295                         is_mwindow));
296                 x1 += prevedit->get_w();
297                 subwindow->add_subwindow(nextedit = new EditNextEdit(mwindow,
298                         this,
299                         x1,
300                         y1,
301                         is_mwindow));
302                 x1 += nextedit->get_w();
303         }
304
305         if(use_fit)
306         {
307                 subwindow->add_subwindow(fit = new EditFit(mwindow, this, x1, y1));
308                 x1 += fit->get_w();
309                 subwindow->add_subwindow(fit_autos = new EditFitAutos(mwindow, this, x1, y1));
310                 x1 += fit_autos->get_w();
311         }
312
313         if(use_undo)
314         {
315                 subwindow->add_subwindow(undo = new EditUndo(mwindow, this, x1, y1));
316                 x1 += undo->get_w();
317                 subwindow->add_subwindow(redo = new EditRedo(mwindow, this, x1, y1));
318                 x1 += redo->get_w();
319         }
320
321         subwindow->add_subwindow(mangoto = new EditManualGoto(mwindow, this, x1, y1));
322         x1 += mangoto->get_w();
323
324         if(use_commercial)
325         {
326                 subwindow->add_subwindow(commercial = new EditCommercial(mwindow, this, x1, y1));
327                 x1 += commercial->get_w();
328         }
329 SET_TRACE
330 }
331
332
333
334 void EditPanel::toggle_label()
335 {
336         mwindow->toggle_label(is_mwindow);
337 }
338
339 void EditPanel::prev_label()
340 {
341         int shift_down = subwindow->shift_down();
342         int snap = subwindow->ctrl_down() && subwindow->alt_down();
343
344         int have_mwindow_lock = mwindow->gui->get_window_lock();
345         int have_subwindow_lock =
346                  subwindow->get_top_level() == mwindow->gui->get_top_level() ?
347                          0 : subwindow->get_window_lock();
348         if(have_mwindow_lock)
349                 mwindow->gui->unlock_window();
350         if(have_subwindow_lock)
351                 subwindow->unlock_window();
352
353         mwindow->gui->mbuttons->transport->handle_transport(STOP, 1, 0, 0);
354
355         if(have_subwindow_lock)
356                 subwindow->lock_window("EditPanel::prev_label 1");
357
358         mwindow->gui->lock_window("EditPanel::prev_label 2");
359
360         if( snap )
361                 mwindow->snap_left_label();
362         else
363                 mwindow->prev_label(shift_down);
364
365         if(!have_mwindow_lock)
366                 mwindow->gui->unlock_window();
367 }
368
369 void EditPanel::next_label()
370 {
371         int shift_down = subwindow->shift_down();
372         int snap = subwindow->ctrl_down() && subwindow->alt_down();
373
374         int have_mwindow_lock = mwindow->gui->get_window_lock();
375         int have_subwindow_lock =
376                  subwindow->get_top_level() == mwindow->gui->get_top_level() ?
377                          0 : subwindow->get_window_lock();
378         if(have_mwindow_lock)
379                 mwindow->gui->unlock_window();
380         if(have_subwindow_lock)
381                 subwindow->unlock_window();
382
383         mwindow->gui->mbuttons->transport->handle_transport(STOP, 1, 0, 0);
384
385         if(have_subwindow_lock)
386                 subwindow->lock_window("EditPanel::next_label 1");
387
388         mwindow->gui->lock_window("EditPanel::next_label 2");
389
390         if( snap )
391                 mwindow->snap_right_label();
392         else
393                 mwindow->next_label(shift_down);
394
395         if(!have_mwindow_lock)
396                 mwindow->gui->unlock_window();
397 }
398
399
400
401 void EditPanel::prev_edit()
402 {
403         int shift_down = subwindow->shift_down();
404         int snap = subwindow->ctrl_down() && subwindow->alt_down();
405
406         int have_mwindow_lock = mwindow->gui->get_window_lock();
407         int have_subwindow_lock =
408                  subwindow->get_top_level() == mwindow->gui->get_top_level() ?
409                          0 : subwindow->get_window_lock();
410         if(have_mwindow_lock)
411                 mwindow->gui->unlock_window();
412         if(have_subwindow_lock)
413                 subwindow->unlock_window();
414
415         mwindow->gui->mbuttons->transport->handle_transport(STOP, 1, 0, 0);
416
417         if(have_subwindow_lock)
418                 subwindow->lock_window("EditPanel::prev_edit 1");
419
420         mwindow->gui->lock_window("EditPanel::prev_edit 2");
421
422         if( snap )
423                 mwindow->snap_left_edit();
424         else
425                 mwindow->prev_edit_handle(shift_down);
426
427         if(!have_mwindow_lock)
428                 mwindow->gui->unlock_window();
429 }
430
431 void EditPanel::next_edit()
432 {
433         int shift_down = subwindow->shift_down();
434         int snap = subwindow->ctrl_down() && subwindow->alt_down();
435
436         int have_mwindow_lock = mwindow->gui->get_window_lock();
437         int have_subwindow_lock =
438                  subwindow->get_top_level() == mwindow->gui->get_top_level() ?
439                          0 : subwindow->get_window_lock();
440         if(have_mwindow_lock)
441                 mwindow->gui->unlock_window();
442         if(have_subwindow_lock)
443                 subwindow->unlock_window();
444
445         mwindow->gui->mbuttons->transport->handle_transport(STOP, 1, 0, 0);
446
447         if(have_subwindow_lock)
448                 subwindow->lock_window("EditPanel::next_edit 1");
449
450         mwindow->gui->lock_window("EditPanel::next_edit 2");
451
452         if( snap )
453                 mwindow->snap_right_edit();
454         else
455                 mwindow->next_edit_handle(shift_down);
456
457         if(!have_mwindow_lock)
458                 mwindow->gui->unlock_window();
459 }
460
461
462 double EditPanel::get_position()
463 {
464         EDL *edl = mwindow->edl;
465         return !edl ? 0 : edl->local_session->get_selectionstart(1);
466 }
467
468 void EditPanel::set_position(double position)
469 {
470         EDL *edl = mwindow->edl;
471         if( !edl ) return;
472         if( position != get_position() ) {
473                 if( position < 0 ) position = 0;
474                 edl->local_session->set_selectionstart(position);
475                 edl->local_session->set_selectionend(position);
476                 mwindow->gui->lock_window();
477                 mwindow->find_cursor();
478                 mwindow->gui->update(1, 1, 1, 1, 1, 1, 0);
479                 mwindow->gui->unlock_window();
480                 mwindow->cwindow->update(1, 0, 0, 0, 0);
481         }
482 }
483
484
485
486
487
488
489
490 void EditPanel::reposition_buttons(int x, int y)
491 {
492         this->x = x;
493         this->y = y;
494         x1 = x, y1 = y;
495
496         if(use_editing_mode)
497         {
498                 arrow->reposition_window(x1, y1);
499                 x1 += arrow->get_w();
500                 ibeam->reposition_window(x1, y1);
501                 x1 += ibeam->get_w();
502                 x1 += mwindow->theme->toggle_margin;
503         }
504
505         if(use_keyframe)
506         {
507                 keyframe->reposition_window(x1, y1);
508                 x1 += keyframe->get_w();
509         }
510
511         if(use_locklabels)
512         {
513                 locklabels->reposition_window(x1,y1);
514                 x1 += locklabels->get_w();
515         }
516
517         if(use_keyframe || use_locklabels)
518                 x1 += mwindow->theme->toggle_margin;
519
520         inpoint->reposition_window(x1, y1);
521         x1 += inpoint->get_w();
522         outpoint->reposition_window(x1, y1);
523         x1 += outpoint->get_w();
524         if(use_splice)
525         {
526                 splice->reposition_window(x1, y1);
527                 x1 += splice->get_w();
528         }
529         if(use_overwrite)
530         {
531                 overwrite->reposition_window(x1, y1);
532                 x1 += overwrite->get_w();
533         }
534         if(use_lift)
535         {
536                 lift->reposition_window(x1, y1);
537                 x1 += lift->get_w();
538         }
539         if(use_extract)
540         {
541                 extract->reposition_window(x1, y1);
542                 x1 += extract->get_w();
543         }
544         if(use_toclip)
545         {
546                 clip->reposition_window(x1, y1);
547                 x1 += clip->get_w();
548         }
549         if(use_cut)
550         {
551                 cut->reposition_window(x1, y1);
552                 x1 += cut->get_w();
553         }
554         if(use_copy)
555         {
556                 copy->reposition_window(x1, y1);
557                 x1 += copy->get_w();
558         }
559         if(use_paste)
560         {
561                 paste->reposition_window(x1, y1);
562                 x1 += paste->get_w();
563         }
564
565         if(use_meters)
566         {
567                 meters->reposition_window(x1, y1);
568                 x1 += meters->get_w();
569         }
570
571         if(use_labels)
572         {
573                 labelbutton->reposition_window(x1, y1);
574                 x1 += labelbutton->get_w();
575                 prevlabel->reposition_window(x1, y1);
576                 x1 += prevlabel->get_w();
577                 nextlabel->reposition_window(x1, y1);
578                 x1 += nextlabel->get_w();
579         }
580
581         if(prevedit)
582         {
583                 prevedit->reposition_window(x1, y1);
584                 x1 += prevedit->get_w();
585         }
586
587         if(nextedit)
588         {
589                 nextedit->reposition_window(x1, y1);
590                 x1 += nextedit->get_w();
591         }
592
593         if(use_fit)
594         {
595                 fit->reposition_window(x1, y1);
596                 x1 += fit->get_w();
597                 fit_autos->reposition_window(x1, y1);
598                 x1 += fit_autos->get_w();
599         }
600
601         if(use_undo)
602         {
603                 undo->reposition_window(x1, y1);
604                 x1 += undo->get_w();
605                 redo->reposition_window(x1, y1);
606                 x1 += redo->get_w();
607         }
608
609         mangoto->reposition_window(x1, y1);
610         x1 += mangoto->get_w();
611 }
612
613
614
615 void EditPanel::create_objects()
616 {
617         create_buttons();
618 }
619
620 int EditPanel::get_w()
621 {
622         return x1 - x;
623 }
624
625
626 void EditPanel::copy_selection()
627 {
628         mwindow->copy();
629 }
630
631 void EditPanel::splice_selection()
632 {
633 }
634
635 void EditPanel::overwrite_selection()
636 {
637 }
638
639 void EditPanel::set_inpoint()
640 {
641         mwindow->set_inpoint(1);
642 }
643
644 void EditPanel::set_outpoint()
645 {
646         mwindow->set_outpoint(1);
647 }
648
649 void EditPanel::unset_inoutpoint()
650 {
651         mwindow->unset_inoutpoint(1);
652 }
653
654
655 EditInPoint::EditInPoint(MWindow *mwindow, EditPanel *panel, int x, int y)
656  : BC_Button(x, y, mwindow->theme->get_image_set("inbutton"))
657 {
658         this->mwindow = mwindow;
659         this->panel = panel;
660         set_tooltip(_("In point ( [ )"));
661 }
662 EditInPoint::~EditInPoint()
663 {
664 }
665 int EditInPoint::handle_event()
666 {
667         panel->set_inpoint();
668         return 1;
669 }
670 int EditInPoint::keypress_event()
671 {
672         if(get_keypress() == '[')
673         {
674                 panel->set_inpoint();
675                 return 1;
676         }
677         if(ctrl_down() && get_keypress() == 't')
678         {
679                 panel->unset_inoutpoint();
680                 return 1;
681         }
682         return 0;
683 }
684
685 EditOutPoint::EditOutPoint(MWindow *mwindow, EditPanel *panel, int x, int y)
686  : BC_Button(x, y, mwindow->theme->get_image_set("outbutton"))
687 {
688         this->mwindow = mwindow;
689         this->panel = panel;
690         set_tooltip(_("Out point ( ] )"));
691 }
692 EditOutPoint::~EditOutPoint()
693 {
694 }
695 int EditOutPoint::handle_event()
696 {
697         panel->set_outpoint();
698         return 1;
699 }
700 int EditOutPoint::keypress_event()
701 {
702         if(get_keypress() == ']')
703         {
704                 panel->set_outpoint();
705                 return 1;
706         }
707         if(ctrl_down() && get_keypress() == 't')
708         {
709                 panel->unset_inoutpoint();
710                 return 1;
711         }
712         return 0;
713 }
714
715
716 EditNextLabel::EditNextLabel(MWindow *mwindow,
717         EditPanel *panel,
718         int x,
719         int y,
720         int is_mwindow)
721  : BC_Button(x, y, mwindow->theme->get_image_set("nextlabel"))
722 {
723         this->mwindow = mwindow;
724         this->panel = panel;
725         this->is_mwindow = is_mwindow;
726         set_tooltip(_("Next label ( ctrl -> )"));
727 }
728 EditNextLabel::~EditNextLabel()
729 {
730 }
731 int EditNextLabel::keypress_event()
732 {
733         if( ctrl_down() && get_keypress() == (!alt_down() ? RIGHT : '>') )
734                 return handle_event();
735         return 0;
736 }
737 int EditNextLabel::handle_event()
738 {
739         panel->next_label();
740         return 1;
741 }
742
743 EditPrevLabel::EditPrevLabel(MWindow *mwindow,
744         EditPanel *panel,
745         int x,
746         int y,
747         int is_mwindow)
748  : BC_Button(x, y, mwindow->theme->get_image_set("prevlabel"))
749 {
750         this->mwindow = mwindow;
751         this->panel = panel;
752         this->is_mwindow = is_mwindow;
753         set_tooltip(_("Previous label ( ctrl <- )"));
754 }
755 EditPrevLabel::~EditPrevLabel()
756 {
757 }
758 int EditPrevLabel::keypress_event()
759 {
760         if( ctrl_down() && get_keypress() == (!alt_down() ? LEFT : '<') )
761                 return handle_event();
762         return 0;
763 }
764 int EditPrevLabel::handle_event()
765 {
766         panel->prev_label();
767         return 1;
768 }
769
770
771
772 EditNextEdit::EditNextEdit(MWindow *mwindow,
773         EditPanel *panel,
774         int x,
775         int y,
776         int is_mwindow)
777  : BC_Button(x, y, mwindow->theme->get_image_set("nextedit"))
778 {
779         this->mwindow = mwindow;
780         this->panel = panel;
781         this->is_mwindow = is_mwindow;
782         set_tooltip(_("Next edit ( alt -> )"));
783 }
784 EditNextEdit::~EditNextEdit()
785 {
786 }
787 int EditNextEdit::keypress_event()
788 {
789         if( alt_down() && get_keypress() == (!ctrl_down() ? RIGHT : '.') )
790                 return handle_event();
791         return 0;
792 }
793 int EditNextEdit::handle_event()
794 {
795         panel->next_edit();
796         return 1;
797 }
798
799 EditPrevEdit::EditPrevEdit(MWindow *mwindow,
800         EditPanel *panel,
801         int x,
802         int y,
803         int is_mwindow)
804  : BC_Button(x, y, mwindow->theme->get_image_set("prevedit"))
805 {
806         this->mwindow = mwindow;
807         this->panel = panel;
808         this->is_mwindow = is_mwindow;
809         set_tooltip(_("Previous edit (alt <- )"));
810 }
811 EditPrevEdit::~EditPrevEdit()
812 {
813 }
814 int EditPrevEdit::keypress_event()
815 {
816         if( alt_down() && get_keypress() == (!ctrl_down() ? LEFT : ',') )
817                 return handle_event();
818         return 0;
819 }
820 int EditPrevEdit::handle_event()
821 {
822         panel->prev_edit();
823         return 1;
824 }
825
826
827
828 EditLift::EditLift(MWindow *mwindow, EditPanel *panel, int x, int y)
829  : BC_Button(x, y, mwindow->theme->lift_data)
830 {
831         this->mwindow = mwindow;
832         this->panel = panel;
833         set_tooltip(_("Lift"));
834 }
835 EditLift::~EditLift()
836 {
837 }
838 int EditLift::handle_event()
839 {
840         return 1;
841 }
842
843 EditOverwrite::EditOverwrite(MWindow *mwindow, EditPanel *panel, int x, int y)
844  : BC_Button(x, y, mwindow->theme->overwrite_data)
845 {
846         this->mwindow = mwindow;
847         this->panel = panel;
848         set_tooltip(_("Overwrite ( b )"));
849 }
850 EditOverwrite::~EditOverwrite()
851 {
852 }
853 int EditOverwrite::handle_event()
854 {
855         panel->overwrite_selection();
856         return 1;
857 }
858 int EditOverwrite::keypress_event()
859 {
860         if(get_keypress() == 'b')
861         {
862                 handle_event();
863                 return 1;
864         }
865         return 0;
866 }
867
868 EditExtract::EditExtract(MWindow *mwindow, EditPanel *panel, int x, int y)
869  : BC_Button(x, y, mwindow->theme->extract_data)
870 {
871         this->mwindow = mwindow;
872         this->panel = panel;
873         set_tooltip(_("Extract"));
874 }
875 EditExtract::~EditExtract()
876 {
877 }
878 int EditExtract::handle_event()
879 {
880 //      mwindow->extract_selection();
881         return 1;
882 }
883
884 EditToClip::EditToClip(MWindow *mwindow, EditPanel *panel, int x, int y)
885  : BC_Button(x, y, mwindow->theme->get_image_set("toclip"))
886 {
887         this->mwindow = mwindow;
888         this->panel = panel;
889         set_tooltip(_("To clip ( i )"));
890 }
891 EditToClip::~EditToClip()
892 {
893 }
894 int EditToClip::handle_event()
895 {
896         panel->to_clip();
897         return 1;
898 }
899
900 int EditToClip::keypress_event()
901 {
902         if(get_keypress() == 'i' && !alt_down())
903         {
904                 handle_event();
905                 return 1;
906         }
907         return 0;
908 }
909
910 EditManualGoto::EditManualGoto(MWindow *mwindow, EditPanel *panel, int x, int y)
911  : BC_Button(x, y, mwindow->theme->get_image_set("goto"))
912 {
913         this->mwindow = mwindow;
914         this->panel = panel;
915         mangoto = new ManualGoto(mwindow, panel);
916         set_tooltip(_("Manual goto ( g )"));
917 }
918 EditManualGoto::~EditManualGoto()
919 {
920         delete mangoto;
921 }
922 int EditManualGoto::handle_event()
923 {
924         mangoto->start();
925         return 1;
926 }
927
928 int EditManualGoto::keypress_event()
929 {
930         if(get_keypress() == 'g')
931         {
932                 handle_event();
933                 return 1;
934         }
935         return 0;
936 }
937
938
939 EditSplice::EditSplice(MWindow *mwindow, EditPanel *panel, int x, int y)
940  : BC_Button(x, y, mwindow->theme->splice_data)
941 {
942         this->mwindow = mwindow;
943         this->panel = panel;
944         set_tooltip(_("Splice ( v )"));
945 }
946 EditSplice::~EditSplice()
947 {
948 }
949 int EditSplice::handle_event()
950 {
951         panel->splice_selection();
952         return 1;
953 }
954 int EditSplice::keypress_event()
955 {
956         if(get_keypress() == 'v')
957         {
958                 handle_event();
959                 return 1;
960         }
961         return 0;
962 }
963
964 EditCut::EditCut(MWindow *mwindow, EditPanel *panel, int x, int y)
965  : BC_Button(x, y, mwindow->theme->get_image_set("cut"))
966 {
967         this->mwindow = mwindow;
968         this->panel = panel;
969         set_tooltip(_("Cut ( x )"));
970 }
971 EditCut::~EditCut()
972 {
973 }
974 int EditCut::keypress_event()
975 {
976         if(get_keypress() == 'x')
977                 return handle_event();
978         return 0;
979 }
980
981 int EditCut::handle_event()
982 {
983         int have_mwindow_lock = mwindow->gui->get_window_lock();
984         if(!have_mwindow_lock)
985                 mwindow->gui->lock_window("EditCut::handle_event");
986
987         mwindow->cut();
988
989         if(!have_mwindow_lock)
990                 mwindow->gui->unlock_window();
991         return 1;
992 }
993
994 EditCommercial::EditCommercial(MWindow *mwindow, EditPanel *panel, int x, int y)
995  : BC_Button(x, y, mwindow->theme->get_image_set("commercial"))
996 {
997         this->mwindow = mwindow;
998         this->panel = panel;
999         set_tooltip(_("Commercial ( shift X )"));
1000 }
1001 EditCommercial::~EditCommercial()
1002 {
1003 }
1004 int EditCommercial::keypress_event()
1005 {
1006         if(get_keypress() == 'X')
1007                 return handle_event();
1008         return 0;
1009 }
1010
1011 int EditCommercial::handle_event()
1012 {
1013         int have_mwindow_lock = mwindow->gui->get_window_lock();
1014         if(have_mwindow_lock)
1015                 mwindow->gui->unlock_window();
1016         mwindow->commit_commercial();
1017         if( !mwindow->put_commercial() ) {
1018                 mwindow->gui->lock_window("EditCommercial::handle_event 1");
1019                 mwindow->cut();
1020                 if(!have_mwindow_lock)
1021                         mwindow->gui->unlock_window();
1022                 mwindow->activate_commercial();
1023                 return 1;
1024         }
1025         mwindow->undo_commercial();
1026         if(have_mwindow_lock)
1027                 mwindow->gui->lock_window("EditCommercial::handle_event 2");
1028         return 1;
1029 }
1030
1031 EditCopy::EditCopy(MWindow *mwindow, EditPanel *panel, int x, int y)
1032  : BC_Button(x, y, mwindow->theme->get_image_set("copy"))
1033 {
1034         this->mwindow = mwindow;
1035         this->panel = panel;
1036         set_tooltip(_("Copy ( c )"));
1037 }
1038 EditCopy::~EditCopy()
1039 {
1040 }
1041
1042 int EditCopy::keypress_event()
1043 {
1044         if(get_keypress() == 'c')
1045                 return handle_event();
1046         return 0;
1047 }
1048 int EditCopy::handle_event()
1049 {
1050         panel->copy_selection();
1051         return 1;
1052 }
1053
1054 EditAppend::EditAppend(MWindow *mwindow, EditPanel *panel, int x, int y)
1055  : BC_Button(x, y, mwindow->theme->append_data)
1056 {
1057         this->mwindow = mwindow;
1058         this->panel = panel;
1059         set_tooltip(_("Append to end of track"));
1060 }
1061 EditAppend::~EditAppend()
1062 {
1063 }
1064
1065
1066 int EditAppend::handle_event()
1067 {
1068         return 1;
1069 }
1070
1071
1072 EditInsert::EditInsert(MWindow *mwindow, EditPanel *panel, int x, int y)
1073  : BC_Button(x, y, mwindow->theme->insert_data)
1074 {
1075         this->mwindow = mwindow;
1076         this->panel = panel;
1077         set_tooltip(_("Insert before beginning of track"));
1078 }
1079 EditInsert::~EditInsert()
1080 {
1081 }
1082
1083
1084 int EditInsert::handle_event()
1085 {
1086
1087         return 1;
1088 }
1089
1090
1091 EditPaste::EditPaste(MWindow *mwindow, EditPanel *panel, int x, int y)
1092  : BC_Button(x, y, mwindow->theme->get_image_set("paste"))
1093 {
1094         this->mwindow = mwindow;
1095         this->panel = panel;
1096         set_tooltip(_("Paste ( v )"));
1097 }
1098 EditPaste::~EditPaste()
1099 {
1100 }
1101
1102 int EditPaste::keypress_event()
1103 {
1104         if(get_keypress() == 'v')
1105                 return handle_event();
1106         return 0;
1107 }
1108 int EditPaste::handle_event()
1109 {
1110         int have_mwindow_lock = mwindow->gui->get_window_lock();
1111         if(!have_mwindow_lock)
1112                 mwindow->gui->lock_window("EditPaste::handle_event");
1113
1114         mwindow->paste();
1115
1116         if(!have_mwindow_lock)
1117                 mwindow->gui->unlock_window();
1118         return 1;
1119 }
1120
1121
1122
1123 EditTransition::EditTransition(MWindow *mwindow, EditPanel *panel, int x, int y)
1124  : BC_Button(x, y, mwindow->theme->transition_data)
1125 {
1126         this->mwindow = mwindow;
1127         this->panel = panel;
1128         set_tooltip(_("Set transition"));
1129 }
1130 EditTransition::~EditTransition()
1131 {
1132 }
1133 int EditTransition::handle_event()
1134 {
1135         return 1;
1136 }
1137
1138 EditPresentation::EditPresentation(MWindow *mwindow, EditPanel *panel, int x, int y)
1139  : BC_Button(x, y, mwindow->theme->presentation_data)
1140 {
1141         this->mwindow = mwindow;
1142         this->panel = panel;
1143         set_tooltip(_("Set presentation up to current position"));
1144 }
1145 EditPresentation::~EditPresentation()
1146 {
1147 }
1148 int EditPresentation::handle_event()
1149 {
1150         return 1;
1151 }
1152
1153 EditUndo::EditUndo(MWindow *mwindow, EditPanel *panel, int x, int y)
1154  : BC_Button(x, y, mwindow->theme->get_image_set("undo"))
1155 {
1156         this->mwindow = mwindow;
1157         this->panel = panel;
1158         set_tooltip(_("Undo ( z )"));
1159 }
1160 EditUndo::~EditUndo()
1161 {
1162 }
1163 int EditUndo::keypress_event()
1164 {
1165         if(get_keypress() == 'z')
1166                 return handle_event();
1167         return 0;
1168 }
1169 int EditUndo::handle_event()
1170 {
1171         mwindow->undo_entry(panel->subwindow);
1172         return 1;
1173 }
1174
1175 EditRedo::EditRedo(MWindow *mwindow, EditPanel *panel, int x, int y)
1176  : BC_Button(x, y, mwindow->theme->get_image_set("redo"))
1177 {
1178         this->mwindow = mwindow;
1179         this->panel = panel;
1180         set_tooltip(_("Redo ( shift Z )"));
1181 }
1182 EditRedo::~EditRedo()
1183 {
1184 }
1185 int EditRedo::keypress_event()
1186 {
1187         if(get_keypress() == 'Z')
1188                 return handle_event();
1189         return 0;
1190 }
1191 int EditRedo::handle_event()
1192 {
1193         mwindow->redo_entry(panel->subwindow);
1194         return 1;
1195 };
1196
1197
1198
1199
1200
1201 EditLabelbutton::EditLabelbutton(MWindow *mwindow, EditPanel *panel, int x, int y)
1202  : BC_Button(x, y, mwindow->theme->get_image_set("labelbutton"))
1203 {
1204         this->mwindow = mwindow;
1205         this->panel = panel;
1206         set_tooltip(_("Toggle label at current position ( l )"));
1207 }
1208
1209 EditLabelbutton::~EditLabelbutton()
1210 {
1211 }
1212 int EditLabelbutton::keypress_event()
1213 {
1214         if(get_keypress() == 'l' && !alt_down())
1215                 return handle_event();
1216         return 0;
1217 }
1218 int EditLabelbutton::handle_event()
1219 {
1220         panel->toggle_label();
1221         return 1;
1222 }
1223
1224
1225
1226
1227
1228
1229
1230 EditFit::EditFit(MWindow *mwindow, EditPanel *panel, int x, int y)
1231  : BC_Button(x, y, mwindow->theme->get_image_set("fit"))
1232 {
1233         this->mwindow = mwindow;
1234         this->panel = panel;
1235         set_tooltip(_("Fit selection to display ( f )"));
1236 }
1237 EditFit::~EditFit()
1238 {
1239 }
1240 int EditFit::keypress_event()
1241 {
1242         if(!alt_down() && get_keypress() == 'f')
1243         {
1244                 handle_event();
1245                 return 1;
1246         }
1247         return 0;
1248 }
1249 int EditFit::handle_event()
1250 {
1251         mwindow->fit_selection();
1252         return 1;
1253 }
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263 EditFitAutos::EditFitAutos(MWindow *mwindow, EditPanel *panel, int x, int y)
1264  : BC_Button(x, y, mwindow->theme->get_image_set("fitautos"))
1265 {
1266         this->mwindow = mwindow;
1267         this->panel = panel;
1268         set_tooltip(_("Fit all autos to display ( Alt + f )"));
1269 }
1270 EditFitAutos::~EditFitAutos()
1271 {
1272 }
1273 int EditFitAutos::keypress_event()
1274 {
1275         if(!ctrl_down() && alt_down() && get_keypress() == 'f')
1276         {
1277                 mwindow->fit_autos(1);
1278                 return 1;
1279         }
1280         if(ctrl_down() && alt_down() && get_keypress() == 'f')
1281         {
1282                 mwindow->fit_autos(0);
1283                 return 1;
1284         }
1285         return 0;
1286 }
1287 int EditFitAutos::handle_event()
1288 {
1289         mwindow->fit_autos(1);
1290         return 1;
1291 }
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305 ArrowButton::ArrowButton(MWindow *mwindow, EditPanel *panel, int x, int y)
1306  : BC_Toggle(x,
1307         y,
1308         mwindow->theme->get_image_set("arrow"),
1309         mwindow->edl->session->editing_mode == EDITING_ARROW,
1310         "",
1311         0,
1312         0,
1313         0)
1314 {
1315         this->mwindow = mwindow;
1316         this->panel = panel;
1317         set_tooltip(_("Drag and drop editing mode"));
1318 }
1319
1320 int ArrowButton::handle_event()
1321 {
1322         update(1);
1323         panel->ibeam->update(0);
1324         mwindow->set_editing_mode(EDITING_ARROW,
1325                 !panel->is_mwindow,
1326                 panel->is_mwindow);
1327 // Nothing after this
1328         return 1;
1329 }
1330
1331
1332 IBeamButton::IBeamButton(MWindow *mwindow, EditPanel *panel, int x, int y)
1333  : BC_Toggle(x,
1334         y,
1335         mwindow->theme->get_image_set("ibeam"),
1336         mwindow->edl->session->editing_mode == EDITING_IBEAM,
1337         "",
1338         0,
1339         0,
1340         0)
1341 {
1342         this->mwindow = mwindow;
1343         this->panel = panel;
1344         set_tooltip(_("Cut and paste editing mode"));
1345 }
1346
1347 int IBeamButton::handle_event()
1348 {
1349         update(1);
1350         panel->arrow->update(0);
1351         mwindow->set_editing_mode(EDITING_IBEAM,
1352                 !panel->is_mwindow,
1353                 panel->is_mwindow);
1354 // Nothing after this
1355         return 1;
1356 }
1357
1358 KeyFrameButton::KeyFrameButton(MWindow *mwindow, EditPanel *panel, int x, int y)
1359  : BC_Toggle(x,
1360         y,
1361         mwindow->theme->get_image_set("autokeyframe"),
1362         mwindow->edl->session->auto_keyframes,
1363         "",
1364         0,
1365         0,
1366         0)
1367 {
1368         this->mwindow = mwindow;
1369         this->panel = panel;
1370         set_tooltip(_("Generate keyframes while tweeking"));
1371 }
1372
1373 int KeyFrameButton::handle_event()
1374 {
1375         mwindow->set_auto_keyframes(get_value(),
1376                 !panel->is_mwindow,
1377                 panel->is_mwindow);
1378         return 1;
1379 }
1380
1381
1382 LockLabelsButton::LockLabelsButton(MWindow *mwindow, int x, int y)
1383  : BC_Toggle(x,
1384         y,
1385         mwindow->theme->get_image_set("locklabels"),
1386         mwindow->edl->session->labels_follow_edits,
1387         "",
1388         0,
1389         0,
1390         0)
1391 {
1392         this->mwindow = mwindow;
1393         set_tooltip(_("Lock labels from moving"));
1394 }
1395
1396 int LockLabelsButton::handle_event()
1397 {
1398         mwindow->set_labels_follow_edits(get_value());
1399         return 1;
1400 }
1401