X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Feditpanel.C;h=11e1fc5c84609142bdc9af982999c03c3cedf395;hp=26e5b7d071115c80ac91d206a01249afe03499d8;hb=HEAD;hpb=ee1879b1a1850e1d4e19c034d4a9c5459274bbb6 diff --git a/cinelerra-5.1/cinelerra/editpanel.C b/cinelerra-5.1/cinelerra/editpanel.C index 26e5b7d0..6da2d0da 100644 --- a/cinelerra-5.1/cinelerra/editpanel.C +++ b/cinelerra-5.1/cinelerra/editpanel.C @@ -2,6 +2,7 @@ /* * CINELERRA * Copyright (C) 2008 Adam Williams + * Copyright (C) 2003-2016 Cinelerra CV contributors * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,18 +35,22 @@ #include "language.h" #include "localsession.h" #include "mainclock.h" +#include "mainsession.h" #include "mainundo.h" +#include "manualgoto.h" #include "mbuttons.h" #include "meterpanel.h" #include "mwindow.h" #include "mwindowgui.h" #include "playbackengine.h" +#include "preferences.h" +#include "scopewindow.h" #include "theme.h" #include "timebar.h" #include "trackcanvas.h" #include "transportque.h" +#include "vwindowgui.h" #include "zoombar.h" -#include "manualgoto.h" @@ -59,8 +64,6 @@ EditPanel::EditPanel(MWindow *mwindow, int use_keyframe, int use_splice, // Extra buttons int use_overwrite, - int use_lift, - int use_extract, int use_copy, int use_paste, int use_undo, @@ -72,7 +75,10 @@ EditPanel::EditPanel(MWindow *mwindow, int use_cut, int use_commercial, int use_goto, - int use_clk2play) + int use_clk2play, + int use_scope, + int use_gang_tracks, + int use_timecode) { this->window_id = window_id; this->editing_mode = editing_mode; @@ -80,8 +86,6 @@ EditPanel::EditPanel(MWindow *mwindow, this->use_keyframe = use_keyframe; this->use_splice = use_splice; this->use_overwrite = use_overwrite; - this->use_lift = 0; - this->use_extract = 0; this->use_copy = use_copy; this->use_paste = use_paste; this->use_undo = use_undo; @@ -96,6 +100,9 @@ EditPanel::EditPanel(MWindow *mwindow, this->use_commercial = use_commercial; this->use_goto = use_goto; this->use_clk2play = use_clk2play; + this->use_scope = use_scope; + this->use_gang_tracks = use_gang_tracks; + this->use_timecode = use_timecode; this->x = x; this->y = y; @@ -105,8 +112,6 @@ EditPanel::EditPanel(MWindow *mwindow, this->outpoint = 0; this->splice = 0; this->overwrite = 0; - this->lift = 0; - this->extract = 0; this->clip = 0; this->cut = 0; this->commercial = 0; @@ -117,6 +122,7 @@ EditPanel::EditPanel(MWindow *mwindow, this->nextlabel = 0; this->prevedit = 0; this->nextedit = 0; + this->gang_tracks = 0; this->undo = 0; this->redo = 0; this->meter_panel = 0; @@ -124,13 +130,17 @@ EditPanel::EditPanel(MWindow *mwindow, this->arrow = 0; this->ibeam = 0; this->keyframe = 0; + this->span_keyframe = 0; this->mangoto = 0; this->click2play = 0; + this->scope = 0; + this->scope_dialog = 0; locklabels = 0; } EditPanel::~EditPanel() { + delete scope_dialog; } void EditPanel::set_meters(MeterPanel *meter_panel) @@ -145,6 +155,7 @@ void EditPanel::update() if( arrow ) arrow->update(new_editing_mode == EDITING_ARROW); if( ibeam ) ibeam->update(new_editing_mode == EDITING_IBEAM); if( keyframe ) keyframe->update(mwindow->edl->session->auto_keyframes); + if( span_keyframe ) span_keyframe->update(mwindow->edl->session->span_keyframes); if( locklabels ) locklabels->set_value(mwindow->edl->session->labels_follow_edits); if( click2play ) { int value = !is_vwindow() ? @@ -152,6 +163,7 @@ void EditPanel::update() mwindow->edl->session->vwindow_click2play ; click2play->set_value(value); } + if( gang_tracks ) gang_tracks->update(mwindow->edl->local_session->gang_tracks); if( meters ) { if( is_cwindow() ) { meters->update(mwindow->edl->session->cwindow_meter); @@ -166,19 +178,16 @@ void EditPanel::update() int EditPanel::calculate_w(MWindow *mwindow, int use_keyframe, int total_buttons) { - int result = 0; - int button_w = mwindow->theme->get_image_set("ibeam")[0]->get_w(); - if( use_keyframe ) { - result += button_w + mwindow->theme->toggle_margin; - } - - result += button_w * total_buttons; + int button_w = xS(24); // mwindow->theme->get_image_set("meters")[0]->get_w(); + int result = button_w * total_buttons; + if( use_keyframe ) + result += 2*(button_w + mwindow->theme->toggle_margin); return result; } int EditPanel::calculate_h(MWindow *mwindow) { - return mwindow->theme->get_image_set("ibeam")[0]->get_h(); + return mwindow->theme->get_image_set("meters")[0]->get_h(); } void EditPanel::create_buttons() @@ -199,10 +208,13 @@ void EditPanel::create_buttons() keyframe = new KeyFrameButton(mwindow, this, x1, y1); subwindow->add_subwindow(keyframe); x1 += keyframe->get_w(); + span_keyframe = new SpanKeyFrameButton(mwindow, this, x1, y1); + subwindow->add_subwindow(span_keyframe); + x1 += span_keyframe->get_w(); } if( use_locklabels ) { - locklabels = new LockLabelsButton(mwindow, x1, y1); + locklabels = new LockLabelsButton(mwindow, this, x1, y1); subwindow->add_subwindow(locklabels); x1 += locklabels->get_w(); } @@ -230,18 +242,6 @@ void EditPanel::create_buttons() x1 += overwrite->get_w(); } - if( use_lift ) { - lift = new EditLift(mwindow, this, x1, y1); - subwindow->add_subwindow(lift); - x1 += lift->get_w(); - } - - if( use_extract ) { - extract = new EditExtract(mwindow, this, x1, y1); - subwindow->add_subwindow(extract); - x1 += extract->get_w(); - } - if( use_toclip ) { clip = new EditToClip(mwindow, this, x1, y1); subwindow->add_subwindow(clip); @@ -266,16 +266,6 @@ void EditPanel::create_buttons() x1 += paste->get_w(); } - if( use_meters ) { - if( meter_panel ) { - meters = new MeterShow(mwindow, meter_panel, x1, y1); - subwindow->add_subwindow(meters); - x1 += meters->get_w(); - } - else - printf("EditPanel::create_objects: meter_panel == 0\n"); - } - if( use_labels ) { labelbutton = new EditLabelbutton(mwindow, this, x1, y1); subwindow->add_subwindow(labelbutton); @@ -323,126 +313,44 @@ void EditPanel::create_buttons() } if( use_clk2play ) { - click2play = new EditClick2Play(mwindow, this, x1, y1+5); + click2play = new EditClick2Play(mwindow, this, x1, y1+yS(3)); subwindow->add_subwindow(click2play); x1 += click2play->get_w(); } - if( use_commercial ) { - commercial = new EditCommercial(mwindow, this, x1, y1); - subwindow->add_subwindow(commercial); - x1 += commercial->get_w(); + if( use_scope ) { + scope = new EditPanelScope(mwindow, this, x1, y1-yS(1)); + subwindow->add_subwindow(scope); + x1 += scope->get_w(); + scope_dialog = new EditPanelScopeDialog(mwindow, this); } -} - -void EditPanel::stop_transport(const char *lock_msg) -{ - int have_subwindow_lock = subwindow->get_window_lock(); - if( have_subwindow_lock ) subwindow->unlock_window(); - mwindow->stop_transport(); - if( have_subwindow_lock ) subwindow->lock_window(lock_msg); -} - - -void EditPanel::toggle_label() -{ - mwindow->toggle_label(is_mwindow()); -} - -void EditPanel::prev_label(int cut) -{ - int shift_down = subwindow->shift_down(); - int have_mwindow_lock = mwindow->gui->get_window_lock(); - if( have_mwindow_lock ) mwindow->gui->unlock_window(); - - stop_transport("EditPanel::prev_label 1"); - - mwindow->gui->lock_window("EditPanel::prev_label 2"); - if( cut ) - mwindow->cut_left_label(); - else - mwindow->prev_label(shift_down); - if( !have_mwindow_lock ) - mwindow->gui->unlock_window(); -} - -void EditPanel::next_label(int cut) -{ - int shift_down = subwindow->shift_down(); - int have_mwindow_lock = mwindow->gui->get_window_lock(); - if( have_mwindow_lock ) mwindow->gui->unlock_window(); - - stop_transport("EditPanel::next_label 1"); - - mwindow->gui->lock_window("EditPanel::next_label 2"); - if( cut ) - mwindow->cut_right_label(); - else - mwindow->next_label(shift_down); - if( !have_mwindow_lock ) - mwindow->gui->unlock_window(); -} - - - -void EditPanel::prev_edit(int cut) -{ - int shift_down = subwindow->shift_down(); - int have_mwindow_lock = mwindow->gui->get_window_lock(); - if( have_mwindow_lock ) mwindow->gui->unlock_window(); - - stop_transport("EditPanel::prev_edit 1"); - - mwindow->gui->lock_window("EditPanel::prev_edit 2"); - - if( cut ) - mwindow->cut_left_edit(); - else - mwindow->prev_edit_handle(shift_down); - - if( !have_mwindow_lock ) - mwindow->gui->unlock_window(); -} - -void EditPanel::next_edit(int cut) -{ - int shift_down = subwindow->shift_down(); - int have_mwindow_lock = mwindow->gui->get_window_lock(); - if( have_mwindow_lock ) mwindow->gui->unlock_window(); - - stop_transport("EditPanel::next_edit 1"); - - mwindow->gui->lock_window("EditPanel::next_edit 2"); - if( cut ) - mwindow->cut_right_edit(); - else - mwindow->next_edit_handle(shift_down); - - if( !have_mwindow_lock ) - mwindow->gui->unlock_window(); -} + if( use_timecode ) { + timecode = new EditPanelTimecode(mwindow, this, x1, y1); + subwindow->add_subwindow(timecode); + x1 += timecode->get_w(); + } + if( use_gang_tracks ) { + gang_tracks = new EditPanelGangTracks(mwindow, this, x1, y1-yS(1)); + subwindow->add_subwindow(gang_tracks); + x1 += gang_tracks->get_w(); + } -double EditPanel::get_position() -{ - EDL *edl = mwindow->edl; - return !edl ? 0 : edl->local_session->get_selectionstart(1); -} + if( use_meters ) { + if( meter_panel ) { + meters = new MeterShow(mwindow, meter_panel, x1, y1); + subwindow->add_subwindow(meters); + x1 += meters->get_w(); + } + else + printf("EditPanel::create_objects: meter_panel == 0\n"); + } -void EditPanel::set_position(double position) -{ - EDL *edl = mwindow->edl; - if( !edl ) return; - if( position != get_position() ) { - if( position < 0 ) position = 0; - edl->local_session->set_selectionstart(position); - edl->local_session->set_selectionend(position); - mwindow->gui->lock_window(); - mwindow->find_cursor(); - mwindow->gui->update(1, NORMAL_DRAW, 1, 1, 1, 1, 0); - mwindow->gui->unlock_window(); - mwindow->cwindow->update(1, 0, 0, 0, 0); + if( use_commercial ) { + commercial = new EditCommercial(mwindow, this, x1, y1); + subwindow->add_subwindow(commercial); + x1 += commercial->get_w(); } } @@ -463,6 +371,8 @@ void EditPanel::reposition_buttons(int x, int y) if( use_keyframe ) { keyframe->reposition_window(x1, y1); x1 += keyframe->get_w(); + span_keyframe->reposition_window(x1, y1); + x1 += span_keyframe->get_w(); } if( use_locklabels ) { @@ -485,14 +395,6 @@ void EditPanel::reposition_buttons(int x, int y) overwrite->reposition_window(x1, y1); x1 += overwrite->get_w(); } - if( use_lift ) { - lift->reposition_window(x1, y1); - x1 += lift->get_w(); - } - if( use_extract ) { - extract->reposition_window(x1, y1); - x1 += extract->get_w(); - } if( use_toclip ) { clip->reposition_window(x1, y1); x1 += clip->get_w(); @@ -510,11 +412,6 @@ void EditPanel::reposition_buttons(int x, int y) x1 += paste->get_w(); } - if( use_meters ) { - meters->reposition_window(x1, y1); - x1 += meters->get_w(); - } - if( use_labels ) { labelbutton->reposition_window(x1, y1); x1 += labelbutton->get_w(); @@ -553,12 +450,23 @@ void EditPanel::reposition_buttons(int x, int y) x1 += mangoto->get_w(); } if( use_clk2play ) { - click2play->reposition_window(x1, y1+5); + click2play->reposition_window(x1, y1+yS(3)); x1 += click2play->get_w(); } -} - + if( use_scope ) { + scope->reposition_window(x1, y1-yS(1)); + x1 += scope->get_w(); + } + if( use_timecode ) { + timecode->reposition_window(x1, y1); + x1 += timecode->get_w(); + } + if( use_meters ) { + meters->reposition_window(x1, y1); + x1 += meters->get_w(); + } +} void EditPanel::create_objects() { @@ -570,103 +478,33 @@ int EditPanel::get_w() return x1 - x; } - -void EditPanel::copy_selection() -{ - mwindow->copy(); -} - -void EditPanel::splice_selection() -{ -} - -void EditPanel::overwrite_selection() -{ -} - -void EditPanel::set_inpoint() -{ - mwindow->set_inpoint(1); -} - -void EditPanel::set_outpoint() -{ - mwindow->set_outpoint(1); -} - -void EditPanel::unset_inoutpoint() -{ - mwindow->unset_inoutpoint(1); -} - - -EditInPoint::EditInPoint(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->get_image_set("inbutton")) +// toggle_label +EditLabelbutton::EditLabelbutton(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Button(x, y, mwindow->theme->get_image_set("labelbutton")) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("In point ( [ or < )")); -} -EditInPoint::~EditInPoint() -{ -} -int EditInPoint::handle_event() -{ - panel->set_inpoint(); - return 1; -} -int EditInPoint::keypress_event() -{ - int key = get_keypress(); - if( ctrl_down() ) { - if( key == 't' ) { - panel->unset_inoutpoint(); - return 1; - } - } - else if( !alt_down() ) { - if( key == '[' || key == '<' ) { - panel->set_inpoint(); - return 1; - } - } - return 0; + set_tooltip(_("Toggle label at current position ( l )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Labels"); } -EditOutPoint::EditOutPoint(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->get_image_set("outbutton")) +EditLabelbutton::~EditLabelbutton() { - this->mwindow = mwindow; - this->panel = panel; - set_tooltip(_("Out point ( ] or > )")); } -EditOutPoint::~EditOutPoint() +int EditLabelbutton::keypress_event() { + if( get_keypress() == 'l' && !alt_down() ) + return handle_event(); + return context_help_check_and_show(); } -int EditOutPoint::handle_event() +int EditLabelbutton::handle_event() { - panel->set_outpoint(); + panel->panel_toggle_label(); return 1; } -int EditOutPoint::keypress_event() -{ - int key = get_keypress(); - if( ctrl_down() ) { - if( key == 't' ) { - panel->unset_inoutpoint(); - return 1; - } - } - else if( !alt_down() ) { - if( key == ']' || key == '>' ) { - panel->set_outpoint(); - return 1; - } - } - return 0; -} - +//next_label EditNextLabel::EditNextLabel(MWindow *mwindow, EditPanel *panel, int x, int y) : BC_Button(x, y, mwindow->theme->get_image_set("nextlabel")) @@ -674,6 +512,8 @@ EditNextLabel::EditNextLabel(MWindow *mwindow, this->mwindow = mwindow; this->panel = panel; set_tooltip(_("Next label ( ctrl -> )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Labels"); } EditNextLabel::~EditNextLabel() { @@ -683,23 +523,24 @@ int EditNextLabel::keypress_event() if( ctrl_down() ) { int key = get_keypress(); if( (key == RIGHT || key == '.') && !alt_down() ) { - panel->next_label(0); + panel->panel_next_label(0); return 1; } if( key == '>' && alt_down() ) { - panel->next_label(1); + panel->panel_next_label(1); return 1; } } - return 0; + return context_help_check_and_show(); } int EditNextLabel::handle_event() { int cut = ctrl_down() && alt_down(); - panel->next_label(cut); + panel->panel_next_label(cut); return 1; } +//prev_label EditPrevLabel::EditPrevLabel(MWindow *mwindow, EditPanel *panel, int x, int y) : BC_Button(x, y, mwindow->theme->get_image_set("prevlabel")) @@ -707,6 +548,8 @@ EditPrevLabel::EditPrevLabel(MWindow *mwindow, this->mwindow = mwindow; this->panel = panel; set_tooltip(_("Previous label ( ctrl <- )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Labels"); } EditPrevLabel::~EditPrevLabel() { @@ -716,237 +559,295 @@ int EditPrevLabel::keypress_event() if( ctrl_down() ) { int key = get_keypress(); if( (key == LEFT || key == ',') && !alt_down() ) { - panel->prev_label(0); + panel->panel_prev_label(0); return 1; } if( key == '<' && alt_down() ) { - panel->prev_label(1); + panel->panel_prev_label(1); return 1; } } - return 0; + return context_help_check_and_show(); } int EditPrevLabel::handle_event() { int cut = ctrl_down() && alt_down(); - panel->prev_label(cut); + panel->panel_prev_label(cut); return 1; } - - -EditNextEdit::EditNextEdit(MWindow *mwindow, +//prev_edit +EditPrevEdit::EditPrevEdit(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->get_image_set("nextedit")) + : BC_Button(x, y, mwindow->theme->get_image_set("prevedit")) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Next edit ( alt -> )")); + set_tooltip(_("Previous edit (alt <- )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Snapping while Cutting and Dragging"); } -EditNextEdit::~EditNextEdit() +EditPrevEdit::~EditPrevEdit() { } -int EditNextEdit::keypress_event() +int EditPrevEdit::keypress_event() { if( alt_down() ) { int key = get_keypress(); - if( (key == RIGHT || key == '.') && !ctrl_down() ) { - panel->next_edit(0); + if( (key == LEFT || key == ',') && !ctrl_down() ) { + panel->panel_prev_edit(0); return 1; } - if( key == '.' && ctrl_down() ) { - panel->next_edit(1); + if( key == ',' && ctrl_down() ) { + panel->panel_prev_edit(1); return 1; } } - return 0; + return context_help_check_and_show(); } -int EditNextEdit::handle_event() +int EditPrevEdit::handle_event() { int cut = ctrl_down() && alt_down(); - panel->next_edit(cut); + panel->panel_prev_edit(cut); return 1; } -EditPrevEdit::EditPrevEdit(MWindow *mwindow, +//next_edit +EditNextEdit::EditNextEdit(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->get_image_set("prevedit")) + : BC_Button(x, y, mwindow->theme->get_image_set("nextedit")) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Previous edit (alt <- )")); + set_tooltip(_("Next edit ( alt -> )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Snapping while Cutting and Dragging"); } -EditPrevEdit::~EditPrevEdit() +EditNextEdit::~EditNextEdit() { } -int EditPrevEdit::keypress_event() +int EditNextEdit::keypress_event() { if( alt_down() ) { int key = get_keypress(); - if( (key == LEFT || key == ',') && !ctrl_down() ) { - panel->prev_edit(0); + if( (key == RIGHT || key == '.') && !ctrl_down() ) { + panel->panel_next_edit(0); return 1; } - if( key == ',' && ctrl_down() ) { - panel->prev_edit(1); + if( key == '.' && ctrl_down() ) { + panel->panel_next_edit(1); return 1; } } - return 0; + return context_help_check_and_show(); } -int EditPrevEdit::handle_event() +int EditNextEdit::handle_event() { int cut = ctrl_down() && alt_down(); - panel->prev_edit(cut); + panel->panel_next_edit(cut); return 1; } - - -EditLift::EditLift(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->lift_data) +//copy_selection +EditCopy::EditCopy(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Button(x, y, mwindow->theme->get_image_set("copy")) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Lift")); + set_tooltip(_("Copy ( c )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Cut and Paste Editing"); +} +EditCopy::~EditCopy() +{ } -EditLift::~EditLift() + +int EditCopy::keypress_event() { + if( alt_down() ) return context_help_check_and_show(); + if( (get_keypress() == 'c' && !ctrl_down()) || + (panel->is_vwindow() && get_keypress() == 'C') ) { + return handle_event(); + } + return context_help_check_and_show(); } -int EditLift::handle_event() +int EditCopy::handle_event() { + panel->panel_copy_selection(); return 1; } +//overwrite_selection EditOverwrite::EditOverwrite(MWindow *mwindow, EditPanel *panel, int x, int y) : BC_Button(x, y, mwindow->theme->overwrite_data) { this->mwindow = mwindow; this->panel = panel; set_tooltip(_("Overwrite ( b )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Two Screen Editing"); } EditOverwrite::~EditOverwrite() { } int EditOverwrite::handle_event() { - panel->overwrite_selection(); + panel->panel_overwrite_selection(); return 1; } int EditOverwrite::keypress_event() { - if( alt_down() ) return 0; + if( alt_down() ) return context_help_check_and_show(); if( get_keypress() == 'b' || (panel->is_vwindow() && get_keypress() == 'B') ) { handle_event(); return 1; } - return 0; + return context_help_check_and_show(); } -EditExtract::EditExtract(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->extract_data) +//set_inpoint +//unset_inoutpoint +EditInPoint::EditInPoint(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Button(x, y, mwindow->theme->get_image_set("inbutton")) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Extract")); + set_tooltip(_("In point ( [ or < )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("In\\/Out Points"); } -EditExtract::~EditExtract() +EditInPoint::~EditInPoint() { } -int EditExtract::handle_event() +int EditInPoint::handle_event() { -// mwindow->extract_selection(); + panel->panel_set_inpoint(); return 1; } +int EditInPoint::keypress_event() +{ + int key = get_keypress(); + if( ctrl_down() ) { + if( key == 't' ) { + panel->panel_unset_inoutpoint(); + return 1; + } + } + else if( !alt_down() ) { + if( key == '[' || key == '<' ) { + panel->panel_set_inpoint(); + return 1; + } + } + return context_help_check_and_show(); +} -EditToClip::EditToClip(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->get_image_set("toclip")) +//set_outpoint +//unset_inoutpoint +EditOutPoint::EditOutPoint(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Button(x, y, mwindow->theme->get_image_set("outbutton")) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("To clip ( i )")); + set_tooltip(_("Out point ( ] or > )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("In\\/Out Points"); } -EditToClip::~EditToClip() +EditOutPoint::~EditOutPoint() { } -int EditToClip::handle_event() +int EditOutPoint::handle_event() { - panel->to_clip(); + panel->panel_set_outpoint(); return 1; } - -int EditToClip::keypress_event() +int EditOutPoint::keypress_event() { - if( alt_down() ) return 0; - if( get_keypress() == 'i' || - (panel->is_vwindow() && get_keypress() == 'I') ) { - handle_event(); - return 1; + int key = get_keypress(); + if( ctrl_down() ) { + if( key == 't' ) { + panel->panel_unset_inoutpoint(); + return 1; + } } - return 0; + else if( !alt_down() ) { + if( key == ']' || key == '>' ) { + panel->panel_set_outpoint(); + return 1; + } + } + return context_help_check_and_show(); } -EditManualGoto::EditManualGoto(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->get_image_set("goto")) +//splice_selection +EditSplice::EditSplice(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Button(x, y, mwindow->theme->splice_data) { this->mwindow = mwindow; this->panel = panel; - mangoto = new ManualGoto(mwindow, panel); - set_tooltip(_("Manual goto ( g )")); + set_tooltip(_("Splice ( v )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Two Screen Editing"); } -EditManualGoto::~EditManualGoto() +EditSplice::~EditSplice() { - delete mangoto; } -int EditManualGoto::handle_event() +int EditSplice::handle_event() { - mangoto->start(); + panel->panel_splice_selection(); return 1; } - -int EditManualGoto::keypress_event() +int EditSplice::keypress_event() { - if( get_keypress() == 'g' ) { + if( alt_down() ) return context_help_check_and_show(); + if( (get_keypress() == 'v' && !ctrl_down()) || + (panel->is_vwindow() && get_keypress() == 'V') ) { handle_event(); return 1; } - return 0; + return context_help_check_and_show(); } - -EditSplice::EditSplice(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->splice_data) +//to_clip +EditToClip::EditToClip(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Button(x, y, mwindow->theme->get_image_set("toclip")) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Splice ( v )")); + set_tooltip(_("To clip ( i )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Two Screen Editing"); } -EditSplice::~EditSplice() +EditToClip::~EditToClip() { } -int EditSplice::handle_event() +int EditToClip::handle_event() { - panel->splice_selection(); + panel->panel_to_clip(); return 1; } -int EditSplice::keypress_event() + +int EditToClip::keypress_event() { - if( alt_down() ) return 0; - if( (get_keypress() == 'v' && !ctrl_down()) || - (panel->is_vwindow() && get_keypress() == 'V') ) { + if( alt_down() ) return context_help_check_and_show(); + if( get_keypress() == 'i' || + (panel->is_vwindow() && get_keypress() == 'I') ) { handle_event(); return 1; } - return 0; + return context_help_check_and_show(); } +//cut EditCut::EditCut(MWindow *mwindow, EditPanel *panel, int x, int y) : BC_Button(x, y, mwindow->theme->get_image_set("cut")) { this->mwindow = mwindow; this->panel = panel; set_tooltip(_("Split | Cut ( x )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Cut and Paste Editing"); } EditCut::~EditCut() { @@ -954,234 +855,328 @@ EditCut::~EditCut() int EditCut::keypress_event() { if( ctrl_down() || shift_down() || alt_down() ) - return 0; + return context_help_check_and_show(); if( get_keypress() == 'x' ) return handle_event(); - return 0; + return context_help_check_and_show(); } int EditCut::handle_event() { - int have_mwindow_lock = mwindow->gui->get_window_lock(); - if( !have_mwindow_lock ) - mwindow->gui->lock_window("EditCut::handle_event"); - - mwindow->cut(); - - if( !have_mwindow_lock ) - mwindow->gui->unlock_window(); + panel->panel_cut(); return 1; } -EditClick2Play::EditClick2Play(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Toggle(x, y, mwindow->theme->get_image_set("playpatch_data"), - !panel->is_vwindow() ? - mwindow->edl->session->cwindow_click2play : - mwindow->edl->session->vwindow_click2play) +//paste +EditPaste::EditPaste(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Button(x, y, mwindow->theme->get_image_set("paste")) { - this->mwindow = mwindow; - this->panel = panel; - set_tooltip(_("Click to play (p)")); + this->mwindow = mwindow; + this->panel = panel; + set_tooltip(_("Paste ( v )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Cut and Paste Editing"); } -int EditClick2Play::handle_event() +EditPaste::~EditPaste() { - int value = get_value(); - if( panel->is_vwindow() ) { - mwindow->edl->session->vwindow_click2play = value; - mwindow->update_vwindow(); - } - else - mwindow->edl->session->cwindow_click2play = value; - return 1; } -int EditClick2Play::keypress_event() + +int EditPaste::keypress_event() { - int key = get_keypress(); - if( key == 'p' && !ctrl_down() && !shift_down() && !alt_down() ) { - int value = get_value() ? 0 : 1; - update(value); - if( panel->is_vwindow() ) { - mwindow->edl->session->vwindow_click2play = value; - mwindow->update_vwindow(); - } - else - mwindow->edl->session->cwindow_click2play = value; - return 1; - } - return 0; + if( get_keypress() == 'v' && !ctrl_down() ) + return handle_event(); + return context_help_check_and_show(); +} +int EditPaste::handle_event() +{ + panel->panel_paste(); + return 1; } - -EditCommercial::EditCommercial(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->get_image_set("commercial")) +//fit_selection +EditFit::EditFit(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Button(x, y, mwindow->theme->get_image_set("fit")) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Commercial ( shift A )")); -} -EditCommercial::~EditCommercial() -{ + set_tooltip(_("Fit selection to display ( f )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Transport and Buttons Bar"); } -int EditCommercial::keypress_event() +EditFit::~EditFit() { - if( ctrl_down() || !shift_down() || alt_down() ) - return 0; - if( get_keypress() == 'A' ) - return handle_event(); - return 0; } - -int EditCommercial::handle_event() +int EditFit::keypress_event() { - int have_mwindow_lock = mwindow->gui->get_window_lock(); - if( have_mwindow_lock ) - mwindow->gui->unlock_window(); - mwindow->commit_commercial(); - if( !mwindow->put_commercial() ) { - mwindow->gui->lock_window("EditCommercial::handle_event 1"); - mwindow->cut(); - if( !have_mwindow_lock ) - mwindow->gui->unlock_window(); - mwindow->activate_commercial(); + if( !alt_down() && get_keypress() == 'f' ) { + handle_event(); return 1; } - mwindow->undo_commercial(); - if( have_mwindow_lock ) - mwindow->gui->lock_window("EditCommercial::handle_event 2"); + return context_help_check_and_show(); +} +int EditFit::handle_event() +{ + panel->panel_fit_selection(); return 1; } -EditCopy::EditCopy(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->get_image_set("copy")) +//fit_autos +EditFitAutos::EditFitAutos(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Button(x, y, mwindow->theme->get_image_set("fitautos")) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Copy ( c )")); + set_tooltip(_("Fit all autos to display ( Alt + f )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Using Autos"); } -EditCopy::~EditCopy() +EditFitAutos::~EditFitAutos() { } - -int EditCopy::keypress_event() +int EditFitAutos::keypress_event() { - if( alt_down() ) return 0; - if( (get_keypress() == 'c' && !ctrl_down()) || - (panel->is_vwindow() && get_keypress() == 'C') ) { - return handle_event(); + if( get_keypress() == 'f' && alt_down() ) { + panel->panel_fit_autos(!ctrl_down() ? 1 : 0); + return 1; } - return 0; + return context_help_check_and_show(); } -int EditCopy::handle_event() +int EditFitAutos::handle_event() { - panel->copy_selection(); + panel->panel_fit_autos(1); return 1; } -EditAppend::EditAppend(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->append_data) +//set_editing_mode +ArrowButton::ArrowButton(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Toggle(x, y, + mwindow->theme->get_image_set("arrow"), + mwindow->edl->session->editing_mode == EDITING_ARROW, + "", 0, 0, 0) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Append to end of track")); -} -EditAppend::~EditAppend() -{ + set_tooltip(_("Drag and drop editing mode")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Drag and Drop Editing"); } - -int EditAppend::handle_event() +int ArrowButton::handle_event() { + update(1); + panel->ibeam->update(0); + panel->panel_set_editing_mode(EDITING_ARROW); +// Nothing after this return 1; } - -EditInsert::EditInsert(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->insert_data) +IBeamButton::IBeamButton(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Toggle(x, y, + mwindow->theme->get_image_set("ibeam"), + mwindow->edl->session->editing_mode == EDITING_IBEAM, + "", 0, 0, 0) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Insert before beginning of track")); + set_tooltip(_("Cut and paste editing mode")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Cut and Paste Editing"); } -EditInsert::~EditInsert() + +int IBeamButton::handle_event() { + update(1); + panel->arrow->update(0); + panel->panel_set_editing_mode(EDITING_IBEAM); +// Nothing after this + return 1; } - -int EditInsert::handle_event() +//set_auto_keyframes +KeyFrameButton::KeyFrameButton(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Toggle(x, y, + mwindow->theme->get_image_set("autokeyframe"), + mwindow->edl->session->auto_keyframes, + "", 0, 0, 0) { + this->mwindow = mwindow; + this->panel = panel; + set_tooltip(_("Generate keyframes while tweeking (j)")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Generate Keyframes while Tweaking"); +} +int KeyFrameButton::handle_event() +{ + panel->panel_set_auto_keyframes(get_value()); return 1; } +int KeyFrameButton::keypress_event() +{ + int key = get_keypress(); + if( key == 'j' && !ctrl_down() && !shift_down() && !alt_down() ) { + int value = get_value() ? 0 : 1; + update(value); + panel->panel_set_auto_keyframes(value); + return 1; + } + return context_help_check_and_show(); +} -EditPaste::EditPaste(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->get_image_set("paste")) +//set_span_keyframes +SpanKeyFrameButton::SpanKeyFrameButton(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Toggle(x, y, + mwindow->theme->get_image_set("spankeyframe"), + mwindow->edl->session->span_keyframes, + "", 0, 0, 0) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Paste ( v )")); + set_tooltip(_("Allow keyframe spanning")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Allow Keyframe Spanning"); } -EditPaste::~EditPaste() + +int SpanKeyFrameButton::handle_event() { + panel->panel_set_span_keyframes(get_value()); + return 1; } -int EditPaste::keypress_event() +//set_labels_follow_edits +LockLabelsButton::LockLabelsButton(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Toggle(x, y, + mwindow->theme->get_image_set("locklabels"), + mwindow->edl->session->labels_follow_edits, + "", 0, 0, 0) { - if( get_keypress() == 'v' && !ctrl_down() ) - return handle_event(); - return 0; + this->mwindow = mwindow; + this->panel = panel; + set_tooltip(_("Lock labels from moving with edits")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Labels"); } -int EditPaste::handle_event() -{ - int have_mwindow_lock = mwindow->gui->get_window_lock(); - if( !have_mwindow_lock ) - mwindow->gui->lock_window("EditPaste::handle_event"); - mwindow->paste(); - - if( !have_mwindow_lock ) - mwindow->gui->unlock_window(); +int LockLabelsButton::handle_event() +{ + panel->panel_set_labels_follow_edits(get_value()); return 1; } -EditTransition::EditTransition(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->transition_data) +EditManualGoto::EditManualGoto(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Button(x, y, mwindow->theme->get_image_set("goto")) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Set transition")); + mangoto = new ManualGoto(mwindow, panel); + set_tooltip(_("Manual goto ( g )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Transport and Buttons Bar"); } -EditTransition::~EditTransition() +EditManualGoto::~EditManualGoto() { + delete mangoto; } -int EditTransition::handle_event() +int EditManualGoto::handle_event() { + mangoto->start(); return 1; } -EditPresentation::EditPresentation(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->presentation_data) +int EditManualGoto::keypress_event() +{ + if( get_keypress() == 'g' ) { + handle_event(); + return 1; + } + return context_help_check_and_show(); +} + + +EditClick2Play::EditClick2Play(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Toggle(x, y, mwindow->theme->get_image_set("playpatch_data"), + !panel->is_vwindow() ? + mwindow->edl->session->cwindow_click2play : + mwindow->edl->session->vwindow_click2play) +{ + this->mwindow = mwindow; + this->panel = panel; + set_tooltip(_("Click to play (p)")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Click to Play in Viewer and Compositor"); +} +int EditClick2Play::handle_event() +{ + int value = get_value(); + panel->set_click_to_play(value); + return 1; +} +int EditClick2Play::keypress_event() +{ + int key = get_keypress(); + if( key == 'p' && !ctrl_down() && !shift_down() && !alt_down() ) { + int value = get_value() ? 0 : 1; + update(value); + panel->set_click_to_play(value); + return 1; + } + return context_help_check_and_show(); +} + + +EditCommercial::EditCommercial(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Button(x, y, mwindow->theme->get_image_set("commercial")) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Set presentation up to current position")); + set_tooltip(_("Commercial ( shift A )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("The commercial DB"); } -EditPresentation::~EditPresentation() +EditCommercial::~EditCommercial() { } -int EditPresentation::handle_event() +int EditCommercial::keypress_event() { + if( ctrl_down() || !shift_down() || alt_down() ) + return context_help_check_and_show(); + if( get_keypress() == 'A' ) + return handle_event(); + return context_help_check_and_show(); +} + +int EditCommercial::handle_event() +{ + int have_mwindow_lock = mwindow->gui->get_window_lock(); + if( have_mwindow_lock ) + mwindow->gui->unlock_window(); + mwindow->commit_commercial(); + if( !mwindow->put_commercial() ) { + mwindow->gui->lock_window("EditCommercial::handle_event 1"); + mwindow->cut(); + if( !have_mwindow_lock ) + mwindow->gui->unlock_window(); + mwindow->activate_commercial(); + return 1; + } + mwindow->undo_commercial(); + if( have_mwindow_lock ) + mwindow->gui->lock_window("EditCommercial::handle_event 2"); return 1; } + EditUndo::EditUndo(MWindow *mwindow, EditPanel *panel, int x, int y) : BC_Button(x, y, mwindow->theme->get_image_set("undo")) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Undo ( z )")); + set_tooltip(_("Undo ( z or Ctrl-z)")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Transport and Buttons Bar"); } EditUndo::~EditUndo() { @@ -1189,10 +1184,10 @@ EditUndo::~EditUndo() int EditUndo::keypress_event() { if( ctrl_down() || shift_down() || alt_down() ) - return 0; + return context_help_check_and_show(); if( get_keypress() == 'z' ) return handle_event(); - return 0; + return context_help_check_and_show(); } int EditUndo::handle_event() { @@ -1206,6 +1201,8 @@ EditRedo::EditRedo(MWindow *mwindow, EditPanel *panel, int x, int y) this->mwindow = mwindow; this->panel = panel; set_tooltip(_("Redo ( shift Z )")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Transport and Buttons Bar"); } EditRedo::~EditRedo() { @@ -1213,209 +1210,427 @@ EditRedo::~EditRedo() int EditRedo::keypress_event() { if( ctrl_down() || !shift_down() || alt_down() ) - return 0; + return context_help_check_and_show(); if( get_keypress() == 'Z' ) return handle_event(); - return 0; + return context_help_check_and_show(); } int EditRedo::handle_event() { mwindow->redo_entry(panel->subwindow); return 1; -}; - - - +} -EditLabelbutton::EditLabelbutton(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->get_image_set("labelbutton")) +EditPanelScopeDialog::EditPanelScopeDialog(MWindow *mwindow, EditPanel *panel) + : BC_DialogThread() { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Toggle label at current position ( l )")); + scope_gui = 0; + gui_lock = new Mutex("EditPanelScopeDialog::gui_lock"); } -EditLabelbutton::~EditLabelbutton() +EditPanelScopeDialog::~EditPanelScopeDialog() { + close_window(); + delete gui_lock; } -int EditLabelbutton::keypress_event() + +void EditPanelScopeDialog::handle_close_event(int result) { - if( get_keypress() == 'l' && !alt_down() ) - return handle_event(); - return 0; + scope_gui = 0; } -int EditLabelbutton::handle_event() +void EditPanelScopeDialog::handle_done_event(int result) { - panel->toggle_label(); - return 1; + gui_lock->lock("EditPanelScopeDialog::handle_done_event"); + scope_gui = 0; + gui_lock->unlock(); + + panel->subwindow->lock_window("EditPanelScopeDialog::handle_done_event"); + panel->scope->update(0); + panel->subwindow->unlock_window(); } +BC_Window* EditPanelScopeDialog::new_gui() +{ + EditPanelScopeGUI *gui = new EditPanelScopeGUI(mwindow, this); + gui->create_objects(); + scope_gui = gui; + return gui; +} +void EditPanelScopeDialog::process(VFrame *output_frame) +{ + if( panel->scope_dialog ) { + panel->scope_dialog->gui_lock->lock("EditPanelScopeDialog::process"); + if( panel->scope_dialog->scope_gui ) { + EditPanelScopeGUI *gui = panel->scope_dialog->scope_gui; + gui->process(output_frame); + } + panel->scope_dialog->gui_lock->unlock(); + } +} +EditPanelScopeGUI::EditPanelScopeGUI(MWindow *mwindow, EditPanelScopeDialog *dialog) + : ScopeGUI(mwindow->theme, + mwindow->session->scope_x, mwindow->session->scope_y, + mwindow->session->scope_w, mwindow->session->scope_h, + mwindow->get_cpus()) +{ + this->mwindow = mwindow; + this->dialog = dialog; +} +EditPanelScopeGUI::~EditPanelScopeGUI() +{ +} +void EditPanelScopeGUI::create_objects() +{ + MainSession *session = mwindow->session; + use_hist = session->use_hist; + use_wave = session->use_wave; + use_vector = session->use_vector; + use_hist_parade = session->use_hist_parade; + use_wave_parade = session->use_wave_parade; + use_wave_gain = session->use_wave_gain; + use_vect_gain = session->use_vect_gain; + use_smooth = session->use_smooth; + use_refresh = session->use_refresh; + use_release = session->use_release; + use_graticule = session->use_graticule; + ScopeGUI::create_objects(); +} +void EditPanelScopeGUI::toggle_event() +{ + MainSession *session = mwindow->session; + session->use_hist = use_hist; + session->use_wave = use_wave; + session->use_vector = use_vector; + session->use_hist_parade = use_hist_parade; + session->use_wave_parade = use_wave_parade; + session->use_wave_gain = use_wave_gain; + session->use_vect_gain = use_vect_gain; + session->use_smooth = use_smooth; + session->use_refresh = use_refresh; + session->use_release = use_release; + session->use_graticule = use_graticule; +} -EditFit::EditFit(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->get_image_set("fit")) +int EditPanelScopeGUI::translation_event() +{ + ScopeGUI::translation_event(); + MainSession *session = mwindow->session; + session->scope_x = get_x(); + session->scope_y = get_y(); + return 0; +} + +int EditPanelScopeGUI::resize_event(int w, int h) +{ + ScopeGUI::resize_event(w, h); + MainSession *session = mwindow->session; + session->scope_w = w; + session->scope_h = h; + return 0; +} + +EditPanelScope::EditPanelScope(MWindow *mwindow, EditPanel *panel, int x, int y) + : BC_Toggle(x, y, mwindow->theme ? + mwindow->theme->get_image_set("scope_toggle") : 0, 0) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Fit selection to display ( f )")); + set_tooltip(_("View scope")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Videoscope"); } -EditFit::~EditFit() + +EditPanelScope::~EditPanelScope() { } -int EditFit::keypress_event() + +void EditPanelScopeGUI::update_scope() { - if( !alt_down() && get_keypress() == 'f' ) { - handle_event(); - return 1; + Canvas *canvas = 0; + if( dialog->panel->is_cwindow() ) { + CWindowGUI *cgui = (CWindowGUI *)dialog->panel->subwindow; + canvas = cgui->canvas; } - return 0; + else if( dialog->panel->is_vwindow() ) { + VWindowGUI *vgui = (VWindowGUI *)dialog->panel->subwindow; + canvas = vgui->canvas; + } + if( canvas && canvas->refresh_frame ) + process(canvas->refresh_frame); } -int EditFit::handle_event() + +int EditPanelScope::handle_event() { - mwindow->fit_selection(); + unlock_window(); + int v = get_value(); + if( v ) + panel->scope_dialog->start(); + else + panel->scope_dialog->close_window(); + lock_window("EditPanelScope::handle_event"); return 1; } +const char *EditPanelGangTracks::gang_tips[TOTAL_GANGS] = { + N_("Currently: Gang None\n Click to: Gang Channels"), + N_("Currently: Gang Channels\n Click to: Gang Media"), + N_("Currently: Gang Media\n Click to: Gang None"), +}; +EditPanelGangTracks::EditPanelGangTracks(MWindow *mwindow, EditPanel *panel, + int x, int y) + : BC_Button(x, y, get_images(mwindow)) +{ + this->mwindow = mwindow; + this->panel = panel; + int gang = mwindow->edl->local_session->gang_tracks; + set_tooltip(_(gang_tips[gang])); +// *** CONTEXT_HELP *** + context_help_set_keyword("Displaying tracks: Ganged mode"); +} +EditPanelGangTracks::~EditPanelGangTracks() +{ +} +VFrame **EditPanelGangTracks::gang_images[TOTAL_GANGS]; - - - - -EditFitAutos::EditFitAutos(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Button(x, y, mwindow->theme->get_image_set("fitautos")) +VFrame **EditPanelGangTracks::get_images(MWindow *mwindow) { - this->mwindow = mwindow; - this->panel = panel; - set_tooltip(_("Fit all autos to display ( Alt + f )")); + gang_images[GANG_NONE] = mwindow->theme->get_image_set("gang0"); + gang_images[GANG_MEDIA] = mwindow->theme->get_image_set("gang1"); + gang_images[GANG_CHANNELS] = mwindow->theme->get_image_set("gang2"); + int gang = mwindow->edl->local_session->gang_tracks; + return gang_images[gang]; } -EditFitAutos::~EditFitAutos() + +void EditPanelGangTracks::update(int gang) { + set_images(gang_images[gang]); + draw_face(); + set_tooltip(_(gang_tips[gang])); } -int EditFitAutos::keypress_event() + +int EditPanelGangTracks::handle_event() { - if( !ctrl_down() && alt_down() && get_keypress() == 'f' ) { - mwindow->fit_autos(1); - return 1; + int gang = mwindow->edl->local_session->gang_tracks; + if( !shift_down() ) { + if( ++gang > GANG_MEDIA ) gang = GANG_NONE; } - if( ctrl_down() && alt_down() && get_keypress() == 'f' ) { - mwindow->fit_autos(0); - return 1; + else { + if( --gang < GANG_NONE ) gang = GANG_MEDIA; } - return 0; -} -int EditFitAutos::handle_event() -{ - mwindow->fit_autos(1); + update(gang); + panel->panel_set_gang_tracks(gang); return 1; } +EditPanelTimecode::EditPanelTimecode(MWindow *mwindow, + EditPanel *panel, int x, int y) + : BC_Button(x, y, mwindow->theme->get_image_set("clapperbutton")) +{ + this->mwindow = mwindow; + this->panel = panel; + tc_dialog = 0; + set_tooltip(_("Set Timecode")); +// *** CONTEXT_HELP *** + context_help_set_keyword("Align Timecodes"); +} +EditPanelTimecode::~EditPanelTimecode() +{ + delete tc_dialog; +} +int EditPanelTimecode::handle_event() +{ + if( !tc_dialog ) + tc_dialog = new EditPanelTcDialog(mwindow, panel); + int px, py; + get_pop_cursor(px, py, 0); + tc_dialog->start_dialog(px, py); + return 1; +} +EditPanelTcDialog::EditPanelTcDialog(MWindow *mwindow, EditPanel *panel) + : BC_DialogThread() +{ + this->mwindow = mwindow; + this->panel = panel; + tc_gui = 0; + px = py = 0; +} +EditPanelTcDialog::~EditPanelTcDialog() +{ + close_window(); +} +#define TCW_W xS(200) +#define TCW_H yS(120) +void EditPanelTcDialog::start_dialog(int px, int py) +{ + this->px = px - TCW_W/2; + this->py = py - TCW_H/2; + start(); +} +BC_Window *EditPanelTcDialog::new_gui() +{ + tc_gui = new EditPanelTcWindow(this, px, py); + tc_gui->create_objects(); + double timecode = mwindow->get_timecode_offset(); + tc_gui->update(timecode); + tc_gui->show_window(); + return tc_gui; +} +void EditPanelTcDialog::handle_done_event(int result) +{ + if( result ) return; + double ofs = tc_gui->get_timecode(); + mwindow->set_timecode_offset(ofs); +} +EditPanelTcWindow::EditPanelTcWindow(EditPanelTcDialog *tc_dialog, int x, int y) + : BC_Window(_(PROGRAM_NAME ": Timecode"), x, y, + TCW_W, TCW_H, TCW_W, TCW_H, 0, 0, 1) +{ + this->tc_dialog = tc_dialog; +// *** CONTEXT_HELP *** + context_help_set_keyword("Align Timecodes"); +} +EditPanelTcWindow::~EditPanelTcWindow() +{ +} -ArrowButton::ArrowButton(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Toggle(x, y, - mwindow->theme->get_image_set("arrow"), - mwindow->edl->session->editing_mode == EDITING_ARROW, - "", 0, 0, 0) +double EditPanelTcWindow::get_timecode() { - this->mwindow = mwindow; - this->panel = panel; - set_tooltip(_("Drag and drop editing mode")); + int hrs = atoi(hours->get_text()); + int mins = atoi(minutes->get_text()); + int secs = atoi(seconds->get_text()); + int frms = atoi(frames->get_text()); + double frame_rate = tc_dialog->mwindow->edl->session->frame_rate; + double timecode = hrs*3600 + mins*60 + secs + frms/frame_rate; + return timecode; } -int ArrowButton::handle_event() +void EditPanelTcWindow::update(double timecode) { - update(1); - panel->ibeam->update(0); - mwindow->set_editing_mode(EDITING_ARROW, - !panel->is_mwindow(), panel->is_mwindow()); -// Nothing after this - return 1; + if( timecode < 0 ) timecode = 0; + int64_t pos = timecode; + int hrs = pos/3600; + int mins = pos/60 - hrs*60; + int secs = pos - hrs*3600 - mins*60; + double frame_rate = tc_dialog->mwindow->edl->session->frame_rate; + int frms = (timecode-pos) * frame_rate; + hours->update(hrs); + minutes->update(mins); + seconds->update(secs); + frames->update(frms); } +void EditPanelTcWindow::create_objects() +{ + lock_window("EditPanelTcWindow::create_objects"); + int x = xS(20), y = yS(5); + BC_Title *title = new BC_Title(x - 2, y, _("hour min sec frms"), SMALLFONT); + add_subwindow(title); y += title->get_h() + xS(3); + hours = new EditPanelTcInt(this, x, y, xS(26), 99, "%02i"); + add_subwindow(hours); x += hours->get_w() + xS(4); + minutes = new EditPanelTcInt(this, x, y, xS(26), 59, "%02i"); + add_subwindow(minutes); x += minutes->get_w() + xS(4); + seconds = new EditPanelTcInt(this, x, y, xS(26), 60, "%02i"); + add_subwindow(seconds); x += seconds->get_w() + xS(4); + frames = new EditPanelTcInt(this, x, y, xS(34), 999, "%03i"); + add_subwindow(frames); x += frames->get_w() + xS(16); + add_subwindow(new EditPanelTcReset(this, x, y)); + double timecode = tc_dialog->mwindow->get_timecode_offset(); + update(timecode); + add_subwindow(new BC_OKButton(this)); + add_subwindow(new BC_CancelButton(this)); + unlock_window(); +} -IBeamButton::IBeamButton(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Toggle(x, y, - mwindow->theme->get_image_set("ibeam"), - mwindow->edl->session->editing_mode == EDITING_IBEAM, - "", 0, 0, 0) +EditPanelTcReset::EditPanelTcReset(EditPanelTcWindow *window, int x, int y) + : BC_Button(x, y, window->tc_dialog->mwindow->theme->get_image_set("reset_button")) { - this->mwindow = mwindow; - this->panel = panel; - set_tooltip(_("Cut and paste editing mode")); + this->window = window; } -int IBeamButton::handle_event() +int EditPanelTcReset::handle_event() { - update(1); - panel->arrow->update(0); - mwindow->set_editing_mode(EDITING_IBEAM, - !panel->is_mwindow(), panel->is_mwindow()); -// Nothing after this + window->update(0); return 1; } -KeyFrameButton::KeyFrameButton(MWindow *mwindow, EditPanel *panel, int x, int y) - : BC_Toggle(x, y, - mwindow->theme->get_image_set("autokeyframe"), - mwindow->edl->session->auto_keyframes, - "", 0, 0, 0) + +EditPanelTcInt::EditPanelTcInt(EditPanelTcWindow *window, int x, int y, int w, + int max, const char *format) + : BC_TextBox(x, y, w, 1, "") { - this->mwindow = mwindow; - this->panel = panel; - set_tooltip(_("Generate keyframes while tweeking (j)")); + this->window = window; + this->max = max; + this->format = format; + digits = 1; + for( int m=max; (m/=10)>0; ++digits ); } -int KeyFrameButton::handle_event() +EditPanelTcInt::~EditPanelTcInt() { - mwindow->set_auto_keyframes(get_value(), - !panel->is_mwindow(), panel->is_mwindow()); - return 1; } -int KeyFrameButton::keypress_event() +int EditPanelTcInt::handle_event() { - int key = get_keypress(); - if( key == 'j' && !ctrl_down() && !shift_down() && !alt_down() ) { - int value = get_value() ? 0 : 1; - update(value); - mwindow->set_auto_keyframes(value, - !panel->is_mwindow(), panel->is_mwindow()); - return 1; + int v = atoi(get_text()); + if( v > max ) { + v = v % (max+1); + char string[BCSTRLEN]; + sprintf(string, format, v); + BC_TextBox::update(string); } - return 0; + return 1; } -LockLabelsButton::LockLabelsButton(MWindow *mwindow, int x, int y) - : BC_Toggle(x, y, - mwindow->theme->get_image_set("locklabels"), - mwindow->edl->session->labels_follow_edits, - "", 0, 0, 0) +void EditPanelTcInt::update(int v) { - this->mwindow = mwindow; - set_tooltip(_("Lock labels from moving with edits")); + char text[BCTEXTLEN]; + if( v > max ) v = max; + sprintf(text, format, v); + BC_TextBox::update(text); } -int LockLabelsButton::handle_event() +int EditPanelTcInt::keypress_event() { - mwindow->set_labels_follow_edits(get_value()); + if( get_keypress() == 'h' && alt_down() ) { + context_help_show("Align Timecodes"); + return 1; + } + + if( (int)strlen(get_text()) >= digits ) + BC_TextBox::update(""); + int key = get_keypress(); + switch( key ) { + case TAB: case LEFTTAB: + case LEFT: case RIGHT: + case HOME: case END: + case BACKSPACE: + case DELETE: + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + return BC_TextBox::keypress_event(); + } return 1; }