4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
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.
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.
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
23 #include "awindowgui.h"
24 #include "bcsignals.h"
26 #include "cplayback.h"
28 #include "cwindowgui.h"
29 #include "editpanel.h"
31 #include "edlsession.h"
35 #include "localsession.h"
36 #include "mainclock.h"
39 #include "meterpanel.h"
41 #include "mwindowgui.h"
42 #include "playbackengine.h"
45 #include "trackcanvas.h"
46 #include "transportque.h"
48 #include "manualgoto.h"
52 EditPanel::EditPanel(MWindow *mwindow,
53 BC_WindowBase *subwindow,
60 int use_splice, // Extra buttons
77 this->window_id = window_id;
78 this->editing_mode = editing_mode;
79 this->use_editing_mode = use_editing_mode;
80 this->use_keyframe = use_keyframe;
81 this->use_splice = use_splice;
82 this->use_overwrite = use_overwrite;
84 this->use_extract = 0;
85 this->use_copy = use_copy;
86 this->use_paste = use_paste;
87 this->use_undo = use_undo;
88 this->mwindow = mwindow;
89 this->subwindow = subwindow;
90 this->use_fit = use_fit;
91 this->use_labels = use_labels;
92 this->use_locklabels = use_locklabels;
93 this->use_toclip = use_toclip;
94 this->use_meters = use_meters;
95 this->use_cut = use_cut;
96 this->use_commercial = use_commercial;
97 this->use_goto = use_goto;
98 this->use_clk2play = use_clk2play;
112 this->commercial = 0;
115 this->labelbutton = 0;
122 this->meter_panel = 0;
128 this->click2play = 0;
132 EditPanel::~EditPanel()
136 void EditPanel::set_meters(MeterPanel *meter_panel)
138 this->meter_panel = meter_panel;
142 void EditPanel::update()
144 int new_editing_mode = mwindow->edl->session->editing_mode;
145 if( arrow ) arrow->update(new_editing_mode == EDITING_ARROW);
146 if( ibeam ) ibeam->update(new_editing_mode == EDITING_IBEAM);
147 if( keyframe ) keyframe->update(mwindow->edl->session->auto_keyframes);
148 if( locklabels ) locklabels->set_value(mwindow->edl->session->labels_follow_edits);
150 int value = !is_vwindow() ?
151 mwindow->edl->session->cwindow_click2play :
152 mwindow->edl->session->vwindow_click2play ;
153 click2play->set_value(value);
157 meters->update(mwindow->edl->session->cwindow_meter);
158 mwindow->cwindow->gui->update_meters();
161 meters->update(mwindow->edl->session->vwindow_meter);
167 int EditPanel::calculate_w(MWindow *mwindow, int use_keyframe, int total_buttons)
170 int button_w = mwindow->theme->get_image_set("ibeam")[0]->get_w();
172 result += button_w + mwindow->theme->toggle_margin;
175 result += button_w * total_buttons;
179 int EditPanel::calculate_h(MWindow *mwindow)
181 return mwindow->theme->get_image_set("ibeam")[0]->get_h();
184 void EditPanel::create_buttons()
188 if( use_editing_mode ) {
189 arrow = new ArrowButton(mwindow, this, x1, y1);
190 subwindow->add_subwindow(arrow);
191 x1 += arrow->get_w();
192 ibeam = new IBeamButton(mwindow, this, x1, y1);
193 subwindow->add_subwindow(ibeam);
194 x1 += ibeam->get_w();
195 x1 += mwindow->theme->toggle_margin;
199 keyframe = new KeyFrameButton(mwindow, this, x1, y1);
200 subwindow->add_subwindow(keyframe);
201 x1 += keyframe->get_w();
204 if( use_locklabels ) {
205 locklabels = new LockLabelsButton(mwindow, x1, y1);
206 subwindow->add_subwindow(locklabels);
207 x1 += locklabels->get_w();
210 if( use_keyframe || use_locklabels )
211 x1 += mwindow->theme->toggle_margin;
214 inpoint = new EditInPoint(mwindow, this, x1, y1);
215 subwindow->add_subwindow(inpoint);
216 x1 += inpoint->get_w();
217 outpoint = new EditOutPoint(mwindow, this, x1, y1);
218 subwindow->add_subwindow(outpoint);
219 x1 += outpoint->get_w();
222 splice = new EditSplice(mwindow, this, x1, y1);
223 subwindow->add_subwindow(splice);
224 x1 += splice->get_w();
227 if( use_overwrite ) {
228 overwrite = new EditOverwrite(mwindow, this, x1, y1);
229 subwindow->add_subwindow(overwrite);
230 x1 += overwrite->get_w();
234 lift = new EditLift(mwindow, this, x1, y1);
235 subwindow->add_subwindow(lift);
240 extract = new EditExtract(mwindow, this, x1, y1);
241 subwindow->add_subwindow(extract);
242 x1 += extract->get_w();
246 clip = new EditToClip(mwindow, this, x1, y1);
247 subwindow->add_subwindow(clip);
252 cut = new EditCut(mwindow, this, x1, y1);
253 subwindow->add_subwindow(cut);
258 copy = new EditCopy(mwindow, this, x1, y1);
259 subwindow->add_subwindow(copy);
264 paste = new EditPaste(mwindow, this, x1, y1);
265 subwindow->add_subwindow(paste);
266 x1 += paste->get_w();
271 meters = new MeterShow(mwindow, meter_panel, x1, y1);
272 subwindow->add_subwindow(meters);
273 x1 += meters->get_w();
276 printf("EditPanel::create_objects: meter_panel == 0\n");
280 labelbutton = new EditLabelbutton(mwindow, this, x1, y1);
281 subwindow->add_subwindow(labelbutton);
282 x1 += labelbutton->get_w();
283 prevlabel = new EditPrevLabel(mwindow, this, x1, y1);
284 subwindow->add_subwindow(prevlabel);
285 x1 += prevlabel->get_w();
286 nextlabel = new EditNextLabel(mwindow, this, x1, y1);
287 subwindow->add_subwindow(nextlabel);
288 x1 += nextlabel->get_w();
291 // all windows except VWindow since it's only implemented in MWindow.
293 prevedit = new EditPrevEdit(mwindow, this, x1, y1);
294 subwindow->add_subwindow(prevedit);
295 x1 += prevedit->get_w();
296 nextedit = new EditNextEdit(mwindow, this, x1, y1);
297 subwindow->add_subwindow(nextedit);
298 x1 += nextedit->get_w();
302 fit = new EditFit(mwindow, this, x1, y1);
303 subwindow->add_subwindow(fit);
305 fit_autos = new EditFitAutos(mwindow, this, x1, y1);
306 subwindow->add_subwindow(fit_autos);
307 x1 += fit_autos->get_w();
311 undo = new EditUndo(mwindow, this, x1, y1);
312 subwindow->add_subwindow(undo);
314 redo = new EditRedo(mwindow, this, x1, y1);
315 subwindow->add_subwindow(redo);
320 mangoto = new EditManualGoto(mwindow, this, x1, y1);
321 subwindow->add_subwindow(mangoto);
322 x1 += mangoto->get_w();
326 click2play = new EditClick2Play(mwindow, this, x1, y1+5);
327 subwindow->add_subwindow(click2play);
328 x1 += click2play->get_w();
331 if( use_commercial ) {
332 commercial = new EditCommercial(mwindow, this, x1, y1);
333 subwindow->add_subwindow(commercial);
334 x1 += commercial->get_w();
338 void EditPanel::stop_transport(const char *lock_msg)
340 int have_subwindow_lock = subwindow->get_window_lock();
341 if( have_subwindow_lock ) subwindow->unlock_window();
342 mwindow->stop_transport();
343 if( have_subwindow_lock ) subwindow->lock_window(lock_msg);
347 void EditPanel::toggle_label()
349 mwindow->toggle_label(is_mwindow());
352 void EditPanel::prev_label(int cut)
354 int shift_down = subwindow->shift_down();
355 int have_mwindow_lock = mwindow->gui->get_window_lock();
356 if( have_mwindow_lock ) mwindow->gui->unlock_window();
358 stop_transport("EditPanel::prev_label 1");
360 mwindow->gui->lock_window("EditPanel::prev_label 2");
362 mwindow->cut_left_label();
364 mwindow->prev_label(shift_down);
365 if( !have_mwindow_lock )
366 mwindow->gui->unlock_window();
369 void EditPanel::next_label(int cut)
371 int shift_down = subwindow->shift_down();
372 int have_mwindow_lock = mwindow->gui->get_window_lock();
373 if( have_mwindow_lock ) mwindow->gui->unlock_window();
375 stop_transport("EditPanel::next_label 1");
377 mwindow->gui->lock_window("EditPanel::next_label 2");
379 mwindow->cut_right_label();
381 mwindow->next_label(shift_down);
382 if( !have_mwindow_lock )
383 mwindow->gui->unlock_window();
388 void EditPanel::prev_edit(int cut)
390 int shift_down = subwindow->shift_down();
391 int have_mwindow_lock = mwindow->gui->get_window_lock();
392 if( have_mwindow_lock ) mwindow->gui->unlock_window();
394 stop_transport("EditPanel::prev_edit 1");
396 mwindow->gui->lock_window("EditPanel::prev_edit 2");
399 mwindow->cut_left_edit();
401 mwindow->prev_edit_handle(shift_down);
403 if( !have_mwindow_lock )
404 mwindow->gui->unlock_window();
407 void EditPanel::next_edit(int cut)
409 int shift_down = subwindow->shift_down();
410 int have_mwindow_lock = mwindow->gui->get_window_lock();
411 if( have_mwindow_lock ) mwindow->gui->unlock_window();
413 stop_transport("EditPanel::next_edit 1");
415 mwindow->gui->lock_window("EditPanel::next_edit 2");
418 mwindow->cut_right_edit();
420 mwindow->next_edit_handle(shift_down);
422 if( !have_mwindow_lock )
423 mwindow->gui->unlock_window();
427 double EditPanel::get_position()
429 EDL *edl = mwindow->edl;
430 return !edl ? 0 : edl->local_session->get_selectionstart(1);
433 void EditPanel::set_position(double position)
435 EDL *edl = mwindow->edl;
437 if( position != get_position() ) {
438 if( position < 0 ) position = 0;
439 edl->local_session->set_selectionstart(position);
440 edl->local_session->set_selectionend(position);
441 mwindow->gui->lock_window();
442 mwindow->find_cursor();
443 mwindow->gui->update(1, NORMAL_DRAW, 1, 1, 1, 1, 0);
444 mwindow->gui->unlock_window();
445 mwindow->cwindow->update(1, 0, 0, 0, 0);
449 void EditPanel::reposition_buttons(int x, int y)
455 if( use_editing_mode ) {
456 arrow->reposition_window(x1, y1);
457 x1 += arrow->get_w();
458 ibeam->reposition_window(x1, y1);
459 x1 += ibeam->get_w();
460 x1 += mwindow->theme->toggle_margin;
464 keyframe->reposition_window(x1, y1);
465 x1 += keyframe->get_w();
468 if( use_locklabels ) {
469 locklabels->reposition_window(x1,y1);
470 x1 += locklabels->get_w();
473 if( use_keyframe || use_locklabels )
474 x1 += mwindow->theme->toggle_margin;
476 inpoint->reposition_window(x1, y1);
477 x1 += inpoint->get_w();
478 outpoint->reposition_window(x1, y1);
479 x1 += outpoint->get_w();
481 splice->reposition_window(x1, y1);
482 x1 += splice->get_w();
484 if( use_overwrite ) {
485 overwrite->reposition_window(x1, y1);
486 x1 += overwrite->get_w();
489 lift->reposition_window(x1, y1);
493 extract->reposition_window(x1, y1);
494 x1 += extract->get_w();
497 clip->reposition_window(x1, y1);
501 cut->reposition_window(x1, y1);
505 copy->reposition_window(x1, y1);
509 paste->reposition_window(x1, y1);
510 x1 += paste->get_w();
514 meters->reposition_window(x1, y1);
515 x1 += meters->get_w();
519 labelbutton->reposition_window(x1, y1);
520 x1 += labelbutton->get_w();
521 prevlabel->reposition_window(x1, y1);
522 x1 += prevlabel->get_w();
523 nextlabel->reposition_window(x1, y1);
524 x1 += nextlabel->get_w();
528 prevedit->reposition_window(x1, y1);
529 x1 += prevedit->get_w();
533 nextedit->reposition_window(x1, y1);
534 x1 += nextedit->get_w();
538 fit->reposition_window(x1, y1);
540 fit_autos->reposition_window(x1, y1);
541 x1 += fit_autos->get_w();
545 undo->reposition_window(x1, y1);
547 redo->reposition_window(x1, y1);
552 mangoto->reposition_window(x1, y1);
553 x1 += mangoto->get_w();
556 click2play->reposition_window(x1, y1+5);
557 x1 += click2play->get_w();
563 void EditPanel::create_objects()
568 int EditPanel::get_w()
574 void EditPanel::copy_selection()
579 void EditPanel::splice_selection()
583 void EditPanel::overwrite_selection()
587 void EditPanel::set_inpoint()
589 mwindow->set_inpoint(1);
592 void EditPanel::set_outpoint()
594 mwindow->set_outpoint(1);
597 void EditPanel::unset_inoutpoint()
599 mwindow->unset_inoutpoint(1);
603 EditInPoint::EditInPoint(MWindow *mwindow, EditPanel *panel, int x, int y)
604 : BC_Button(x, y, mwindow->theme->get_image_set("inbutton"))
606 this->mwindow = mwindow;
608 set_tooltip(_("In point ( [ or < )"));
610 EditInPoint::~EditInPoint()
613 int EditInPoint::handle_event()
615 panel->set_inpoint();
618 int EditInPoint::keypress_event()
620 int key = get_keypress();
623 panel->unset_inoutpoint();
627 else if( !alt_down() ) {
628 if( key == '[' || key == '<' ) {
629 panel->set_inpoint();
636 EditOutPoint::EditOutPoint(MWindow *mwindow, EditPanel *panel, int x, int y)
637 : BC_Button(x, y, mwindow->theme->get_image_set("outbutton"))
639 this->mwindow = mwindow;
641 set_tooltip(_("Out point ( ] or > )"));
643 EditOutPoint::~EditOutPoint()
646 int EditOutPoint::handle_event()
648 panel->set_outpoint();
651 int EditOutPoint::keypress_event()
653 int key = get_keypress();
656 panel->unset_inoutpoint();
660 else if( !alt_down() ) {
661 if( key == ']' || key == '>' ) {
662 panel->set_outpoint();
670 EditNextLabel::EditNextLabel(MWindow *mwindow,
671 EditPanel *panel, int x, int y)
672 : BC_Button(x, y, mwindow->theme->get_image_set("nextlabel"))
674 this->mwindow = mwindow;
676 set_tooltip(_("Next label ( ctrl -> )"));
678 EditNextLabel::~EditNextLabel()
681 int EditNextLabel::keypress_event()
684 int key = get_keypress();
685 if( (key == RIGHT || key == '.') && !alt_down() ) {
686 panel->next_label(0);
689 if( key == '>' && alt_down() ) {
690 panel->next_label(1);
696 int EditNextLabel::handle_event()
698 int cut = ctrl_down() && alt_down();
699 panel->next_label(cut);
703 EditPrevLabel::EditPrevLabel(MWindow *mwindow,
704 EditPanel *panel, int x, int y)
705 : BC_Button(x, y, mwindow->theme->get_image_set("prevlabel"))
707 this->mwindow = mwindow;
709 set_tooltip(_("Previous label ( ctrl <- )"));
711 EditPrevLabel::~EditPrevLabel()
714 int EditPrevLabel::keypress_event()
717 int key = get_keypress();
718 if( (key == LEFT || key == ',') && !alt_down() ) {
719 panel->prev_label(0);
722 if( key == '<' && alt_down() ) {
723 panel->prev_label(1);
729 int EditPrevLabel::handle_event()
731 int cut = ctrl_down() && alt_down();
732 panel->prev_label(cut);
738 EditNextEdit::EditNextEdit(MWindow *mwindow,
739 EditPanel *panel, int x, int y)
740 : BC_Button(x, y, mwindow->theme->get_image_set("nextedit"))
742 this->mwindow = mwindow;
744 set_tooltip(_("Next edit ( alt -> )"));
746 EditNextEdit::~EditNextEdit()
749 int EditNextEdit::keypress_event()
752 int key = get_keypress();
753 if( (key == RIGHT || key == '.') && !ctrl_down() ) {
757 if( key == '.' && ctrl_down() ) {
764 int EditNextEdit::handle_event()
766 int cut = ctrl_down() && alt_down();
767 panel->next_edit(cut);
771 EditPrevEdit::EditPrevEdit(MWindow *mwindow,
772 EditPanel *panel, int x, int y)
773 : BC_Button(x, y, mwindow->theme->get_image_set("prevedit"))
775 this->mwindow = mwindow;
777 set_tooltip(_("Previous edit (alt <- )"));
779 EditPrevEdit::~EditPrevEdit()
782 int EditPrevEdit::keypress_event()
785 int key = get_keypress();
786 if( (key == LEFT || key == ',') && !ctrl_down() ) {
790 if( key == ',' && ctrl_down() ) {
797 int EditPrevEdit::handle_event()
799 int cut = ctrl_down() && alt_down();
800 panel->prev_edit(cut);
806 EditLift::EditLift(MWindow *mwindow, EditPanel *panel, int x, int y)
807 : BC_Button(x, y, mwindow->theme->lift_data)
809 this->mwindow = mwindow;
811 set_tooltip(_("Lift"));
813 EditLift::~EditLift()
816 int EditLift::handle_event()
821 EditOverwrite::EditOverwrite(MWindow *mwindow, EditPanel *panel, int x, int y)
822 : BC_Button(x, y, mwindow->theme->overwrite_data)
824 this->mwindow = mwindow;
826 set_tooltip(_("Overwrite ( b )"));
828 EditOverwrite::~EditOverwrite()
831 int EditOverwrite::handle_event()
833 panel->overwrite_selection();
836 int EditOverwrite::keypress_event()
838 if( alt_down() ) return 0;
839 if( get_keypress() == 'b' ||
840 (panel->is_vwindow() && get_keypress() == 'B') ) {
847 EditExtract::EditExtract(MWindow *mwindow, EditPanel *panel, int x, int y)
848 : BC_Button(x, y, mwindow->theme->extract_data)
850 this->mwindow = mwindow;
852 set_tooltip(_("Extract"));
854 EditExtract::~EditExtract()
857 int EditExtract::handle_event()
859 // mwindow->extract_selection();
863 EditToClip::EditToClip(MWindow *mwindow, EditPanel *panel, int x, int y)
864 : BC_Button(x, y, mwindow->theme->get_image_set("toclip"))
866 this->mwindow = mwindow;
868 set_tooltip(_("To clip ( i )"));
870 EditToClip::~EditToClip()
873 int EditToClip::handle_event()
879 int EditToClip::keypress_event()
881 if( alt_down() ) return 0;
882 if( get_keypress() == 'i' ||
883 (panel->is_vwindow() && get_keypress() == 'I') ) {
890 EditManualGoto::EditManualGoto(MWindow *mwindow, EditPanel *panel, int x, int y)
891 : BC_Button(x, y, mwindow->theme->get_image_set("goto"))
893 this->mwindow = mwindow;
895 mangoto = new ManualGoto(mwindow, panel);
896 set_tooltip(_("Manual goto ( g )"));
898 EditManualGoto::~EditManualGoto()
902 int EditManualGoto::handle_event()
908 int EditManualGoto::keypress_event()
910 if( get_keypress() == 'g' ) {
918 EditSplice::EditSplice(MWindow *mwindow, EditPanel *panel, int x, int y)
919 : BC_Button(x, y, mwindow->theme->splice_data)
921 this->mwindow = mwindow;
923 set_tooltip(_("Splice ( v )"));
925 EditSplice::~EditSplice()
928 int EditSplice::handle_event()
930 panel->splice_selection();
933 int EditSplice::keypress_event()
935 if( alt_down() ) return 0;
936 if( get_keypress() == 'v' ||
937 (panel->is_vwindow() && get_keypress() == 'V') ) {
944 EditCut::EditCut(MWindow *mwindow, EditPanel *panel, int x, int y)
945 : BC_Button(x, y, mwindow->theme->get_image_set("cut"))
947 this->mwindow = mwindow;
949 set_tooltip(_("Split | Cut ( x )"));
954 int EditCut::keypress_event()
956 if( ctrl_down() || shift_down() || alt_down() )
958 if( get_keypress() == 'x' )
959 return handle_event();
963 int EditCut::handle_event()
965 int have_mwindow_lock = mwindow->gui->get_window_lock();
966 if( !have_mwindow_lock )
967 mwindow->gui->lock_window("EditCut::handle_event");
971 if( !have_mwindow_lock )
972 mwindow->gui->unlock_window();
976 EditClick2Play::EditClick2Play(MWindow *mwindow, EditPanel *panel, int x, int y)
977 : BC_Toggle(x, y, mwindow->theme->get_image_set("playpatch_data"),
978 !panel->is_vwindow() ?
979 mwindow->edl->session->cwindow_click2play :
980 mwindow->edl->session->vwindow_click2play)
982 this->mwindow = mwindow;
984 set_tooltip(_("Click to play (p)"));
986 int EditClick2Play::handle_event()
988 int value = get_value();
989 if( panel->is_vwindow() ) {
990 mwindow->edl->session->vwindow_click2play = value;
991 mwindow->update_vwindow();
994 mwindow->edl->session->cwindow_click2play = value;
997 int EditClick2Play::keypress_event()
999 int key = get_keypress();
1000 if( key == 'p' && !ctrl_down() && !shift_down() && !alt_down() ) {
1001 int value = get_value() ? 0 : 1;
1003 if( panel->is_vwindow() ) {
1004 mwindow->edl->session->vwindow_click2play = value;
1005 mwindow->update_vwindow();
1008 mwindow->edl->session->cwindow_click2play = value;
1015 EditCommercial::EditCommercial(MWindow *mwindow, EditPanel *panel, int x, int y)
1016 : BC_Button(x, y, mwindow->theme->get_image_set("commercial"))
1018 this->mwindow = mwindow;
1019 this->panel = panel;
1020 set_tooltip(_("Commercial ( shift A )"));
1022 EditCommercial::~EditCommercial()
1025 int EditCommercial::keypress_event()
1027 if( ctrl_down() || !shift_down() || alt_down() )
1029 if( get_keypress() == 'A' )
1030 return handle_event();
1034 int EditCommercial::handle_event()
1036 int have_mwindow_lock = mwindow->gui->get_window_lock();
1037 if( have_mwindow_lock )
1038 mwindow->gui->unlock_window();
1039 mwindow->commit_commercial();
1040 if( !mwindow->put_commercial() ) {
1041 mwindow->gui->lock_window("EditCommercial::handle_event 1");
1043 if( !have_mwindow_lock )
1044 mwindow->gui->unlock_window();
1045 mwindow->activate_commercial();
1048 mwindow->undo_commercial();
1049 if( have_mwindow_lock )
1050 mwindow->gui->lock_window("EditCommercial::handle_event 2");
1054 EditCopy::EditCopy(MWindow *mwindow, EditPanel *panel, int x, int y)
1055 : BC_Button(x, y, mwindow->theme->get_image_set("copy"))
1057 this->mwindow = mwindow;
1058 this->panel = panel;
1059 set_tooltip(_("Copy ( c )"));
1061 EditCopy::~EditCopy()
1065 int EditCopy::keypress_event()
1067 if( alt_down() ) return 0;
1068 if( get_keypress() == 'c' ||
1069 (panel->is_vwindow() && get_keypress() == 'C') ) {
1070 return handle_event();
1074 int EditCopy::handle_event()
1076 panel->copy_selection();
1080 EditAppend::EditAppend(MWindow *mwindow, EditPanel *panel, int x, int y)
1081 : BC_Button(x, y, mwindow->theme->append_data)
1083 this->mwindow = mwindow;
1084 this->panel = panel;
1085 set_tooltip(_("Append to end of track"));
1087 EditAppend::~EditAppend()
1092 int EditAppend::handle_event()
1098 EditInsert::EditInsert(MWindow *mwindow, EditPanel *panel, int x, int y)
1099 : BC_Button(x, y, mwindow->theme->insert_data)
1101 this->mwindow = mwindow;
1102 this->panel = panel;
1103 set_tooltip(_("Insert before beginning of track"));
1105 EditInsert::~EditInsert()
1110 int EditInsert::handle_event()
1117 EditPaste::EditPaste(MWindow *mwindow, EditPanel *panel, int x, int y)
1118 : BC_Button(x, y, mwindow->theme->get_image_set("paste"))
1120 this->mwindow = mwindow;
1121 this->panel = panel;
1122 set_tooltip(_("Paste ( v )"));
1124 EditPaste::~EditPaste()
1128 int EditPaste::keypress_event()
1130 if( get_keypress() == 'v' )
1131 return handle_event();
1134 int EditPaste::handle_event()
1136 int have_mwindow_lock = mwindow->gui->get_window_lock();
1137 if( !have_mwindow_lock )
1138 mwindow->gui->lock_window("EditPaste::handle_event");
1142 if( !have_mwindow_lock )
1143 mwindow->gui->unlock_window();
1149 EditTransition::EditTransition(MWindow *mwindow, EditPanel *panel, int x, int y)
1150 : BC_Button(x, y, mwindow->theme->transition_data)
1152 this->mwindow = mwindow;
1153 this->panel = panel;
1154 set_tooltip(_("Set transition"));
1156 EditTransition::~EditTransition()
1159 int EditTransition::handle_event()
1164 EditPresentation::EditPresentation(MWindow *mwindow, EditPanel *panel, int x, int y)
1165 : BC_Button(x, y, mwindow->theme->presentation_data)
1167 this->mwindow = mwindow;
1168 this->panel = panel;
1169 set_tooltip(_("Set presentation up to current position"));
1171 EditPresentation::~EditPresentation()
1174 int EditPresentation::handle_event()
1179 EditUndo::EditUndo(MWindow *mwindow, EditPanel *panel, int x, int y)
1180 : BC_Button(x, y, mwindow->theme->get_image_set("undo"))
1182 this->mwindow = mwindow;
1183 this->panel = panel;
1184 set_tooltip(_("Undo ( z )"));
1186 EditUndo::~EditUndo()
1189 int EditUndo::keypress_event()
1191 if( ctrl_down() || shift_down() || alt_down() )
1193 if( get_keypress() == 'z' )
1194 return handle_event();
1197 int EditUndo::handle_event()
1199 mwindow->undo_entry(panel->subwindow);
1203 EditRedo::EditRedo(MWindow *mwindow, EditPanel *panel, int x, int y)
1204 : BC_Button(x, y, mwindow->theme->get_image_set("redo"))
1206 this->mwindow = mwindow;
1207 this->panel = panel;
1208 set_tooltip(_("Redo ( shift Z )"));
1210 EditRedo::~EditRedo()
1213 int EditRedo::keypress_event()
1215 if( ctrl_down() || !shift_down() || alt_down() )
1217 if( get_keypress() == 'Z' )
1218 return handle_event();
1221 int EditRedo::handle_event()
1223 mwindow->redo_entry(panel->subwindow);
1231 EditLabelbutton::EditLabelbutton(MWindow *mwindow, EditPanel *panel, int x, int y)
1232 : BC_Button(x, y, mwindow->theme->get_image_set("labelbutton"))
1234 this->mwindow = mwindow;
1235 this->panel = panel;
1236 set_tooltip(_("Toggle label at current position ( l )"));
1239 EditLabelbutton::~EditLabelbutton()
1242 int EditLabelbutton::keypress_event()
1244 if( get_keypress() == 'l' && !alt_down() )
1245 return handle_event();
1248 int EditLabelbutton::handle_event()
1250 panel->toggle_label();
1260 EditFit::EditFit(MWindow *mwindow, EditPanel *panel, int x, int y)
1261 : BC_Button(x, y, mwindow->theme->get_image_set("fit"))
1263 this->mwindow = mwindow;
1264 this->panel = panel;
1265 set_tooltip(_("Fit selection to display ( f )"));
1270 int EditFit::keypress_event()
1272 if( !alt_down() && get_keypress() == 'f' ) {
1278 int EditFit::handle_event()
1280 mwindow->fit_selection();
1292 EditFitAutos::EditFitAutos(MWindow *mwindow, EditPanel *panel, int x, int y)
1293 : BC_Button(x, y, mwindow->theme->get_image_set("fitautos"))
1295 this->mwindow = mwindow;
1296 this->panel = panel;
1297 set_tooltip(_("Fit all autos to display ( Alt + f )"));
1299 EditFitAutos::~EditFitAutos()
1302 int EditFitAutos::keypress_event()
1304 if( !ctrl_down() && alt_down() && get_keypress() == 'f' ) {
1305 mwindow->fit_autos(1);
1308 if( ctrl_down() && alt_down() && get_keypress() == 'f' ) {
1309 mwindow->fit_autos(0);
1314 int EditFitAutos::handle_event()
1316 mwindow->fit_autos(1);
1332 ArrowButton::ArrowButton(MWindow *mwindow, EditPanel *panel, int x, int y)
1334 mwindow->theme->get_image_set("arrow"),
1335 mwindow->edl->session->editing_mode == EDITING_ARROW,
1338 this->mwindow = mwindow;
1339 this->panel = panel;
1340 set_tooltip(_("Drag and drop editing mode"));
1343 int ArrowButton::handle_event()
1346 panel->ibeam->update(0);
1347 mwindow->set_editing_mode(EDITING_ARROW,
1348 !panel->is_mwindow(), panel->is_mwindow());
1349 // Nothing after this
1354 IBeamButton::IBeamButton(MWindow *mwindow, EditPanel *panel, int x, int y)
1356 mwindow->theme->get_image_set("ibeam"),
1357 mwindow->edl->session->editing_mode == EDITING_IBEAM,
1360 this->mwindow = mwindow;
1361 this->panel = panel;
1362 set_tooltip(_("Cut and paste editing mode"));
1365 int IBeamButton::handle_event()
1368 panel->arrow->update(0);
1369 mwindow->set_editing_mode(EDITING_IBEAM,
1370 !panel->is_mwindow(), panel->is_mwindow());
1371 // Nothing after this
1375 KeyFrameButton::KeyFrameButton(MWindow *mwindow, EditPanel *panel, int x, int y)
1377 mwindow->theme->get_image_set("autokeyframe"),
1378 mwindow->edl->session->auto_keyframes,
1381 this->mwindow = mwindow;
1382 this->panel = panel;
1383 set_tooltip(_("Generate keyframes while tweeking (j)"));
1386 int KeyFrameButton::handle_event()
1388 mwindow->set_auto_keyframes(get_value(),
1389 !panel->is_mwindow(), panel->is_mwindow());
1393 int KeyFrameButton::keypress_event()
1395 int key = get_keypress();
1396 if( key == 'j' && !ctrl_down() && !shift_down() && !alt_down() ) {
1397 int value = get_value() ? 0 : 1;
1399 mwindow->set_auto_keyframes(value,
1400 !panel->is_mwindow(), panel->is_mwindow());
1406 LockLabelsButton::LockLabelsButton(MWindow *mwindow, int x, int y)
1408 mwindow->theme->get_image_set("locklabels"),
1409 mwindow->edl->session->labels_follow_edits,
1412 this->mwindow = mwindow;
1413 set_tooltip(_("Lock labels from moving with edits"));
1416 int LockLabelsButton::handle_event()
1418 mwindow->set_labels_follow_edits(get_value());