int use_commercial,
int use_goto,
int use_clk2play,
- int use_scope)
+ int use_scope,
+ int use_gang_tracks,
+ int use_timecode)
{
this->window_id = window_id;
this->editing_mode = editing_mode;
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;
this->nextlabel = 0;
this->prevedit = 0;
this->nextedit = 0;
+ this->gang_tracks = 0;
this->undo = 0;
this->redo = 0;
this->meter_panel = 0;
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);
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 ) {
+ 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);
- }
-
- result += button_w * total_buttons;
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()
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);
scope_dialog = new EditPanelScopeDialog(mwindow, this);
}
+ 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();
+ }
+
+ 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_commercial ) {
commercial = new EditCommercial(mwindow, this, x1, y1);
subwindow->add_subwindow(commercial);
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();
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()
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Toggle label at current position ( l )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Labels");
}
EditLabelbutton::~EditLabelbutton()
{
if( get_keypress() == 'l' && !alt_down() )
return handle_event();
- return 0;
+ return context_help_check_and_show();
}
int EditLabelbutton::handle_event()
{
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Next label ( ctrl -> )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Labels");
}
EditNextLabel::~EditNextLabel()
{
return 1;
}
}
- return 0;
+ return context_help_check_and_show();
}
int EditNextLabel::handle_event()
{
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Previous label ( ctrl <- )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Labels");
}
EditPrevLabel::~EditPrevLabel()
{
return 1;
}
}
- return 0;
+ return context_help_check_and_show();
}
int EditPrevLabel::handle_event()
{
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Previous edit (alt <- )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Snapping while Cutting and Dragging");
}
EditPrevEdit::~EditPrevEdit()
{
return 1;
}
}
- return 0;
+ return context_help_check_and_show();
}
int EditPrevEdit::handle_event()
{
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Next edit ( alt -> )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Snapping while Cutting and Dragging");
}
EditNextEdit::~EditNextEdit()
{
return 1;
}
}
- return 0;
+ return context_help_check_and_show();
}
int EditNextEdit::handle_event()
{
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Copy ( c )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Cut and Paste Editing");
}
EditCopy::~EditCopy()
{
int EditCopy::keypress_event()
{
- if( alt_down() ) return 0;
+ 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 0;
+ return context_help_check_and_show();
}
int EditCopy::handle_event()
{
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Overwrite ( b )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Two Screen Editing");
}
EditOverwrite::~EditOverwrite()
{
}
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();
}
//set_inpoint
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("In point ( [ or < )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("In\\/Out Points");
}
EditInPoint::~EditInPoint()
{
return 1;
}
}
- return 0;
+ return context_help_check_and_show();
}
//set_outpoint
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Out point ( ] or > )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("In\\/Out Points");
}
EditOutPoint::~EditOutPoint()
{
return 1;
}
}
- return 0;
+ return context_help_check_and_show();
}
//splice_selection
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Splice ( v )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Two Screen Editing");
}
EditSplice::~EditSplice()
{
}
int EditSplice::keypress_event()
{
- if( alt_down() ) return 0;
+ 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();
}
//to_clip
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("To clip ( i )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Two Screen Editing");
}
EditToClip::~EditToClip()
{
int EditToClip::keypress_event()
{
- if( alt_down() ) return 0;
+ 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
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Split | Cut ( x )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Cut and Paste Editing");
}
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()
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Paste ( v )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Cut and Paste Editing");
}
EditPaste::~EditPaste()
{
{
if( get_keypress() == 'v' && !ctrl_down() )
return handle_event();
- return 0;
+ return context_help_check_and_show();
}
int EditPaste::handle_event()
{
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Fit selection to display ( f )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Transport and Buttons Bar");
}
EditFit::~EditFit()
{
handle_event();
return 1;
}
- return 0;
+ return context_help_check_and_show();
}
int EditFit::handle_event()
{
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Fit all autos to display ( Alt + f )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Using Autos");
}
EditFitAutos::~EditFitAutos()
{
panel->panel_fit_autos(!ctrl_down() ? 1 : 0);
return 1;
}
- return 0;
+ return context_help_check_and_show();
}
int EditFitAutos::handle_event()
{
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Drag and drop editing mode"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Drag and Drop Editing");
}
int ArrowButton::handle_event()
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Cut and paste editing mode"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Cut and Paste Editing");
}
int IBeamButton::handle_event()
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(value);
return 1;
}
- return 0;
+ return context_help_check_and_show();
}
//set_span_keyframes
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Allow keyframe spanning"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Allow Keyframe Spanning");
}
int SpanKeyFrameButton::handle_event()
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Lock labels from moving with edits"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Labels");
}
int LockLabelsButton::handle_event()
this->panel = panel;
mangoto = new ManualGoto(mwindow, panel);
set_tooltip(_("Manual goto ( g )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Transport and Buttons Bar");
}
EditManualGoto::~EditManualGoto()
{
handle_event();
return 1;
}
- return 0;
+ return context_help_check_and_show();
}
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()
{
panel->set_click_to_play(value);
return 1;
}
- return 0;
+ return context_help_check_and_show();
}
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Commercial ( shift A )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("The commercial DB");
}
EditCommercial::~EditCommercial()
{
int EditCommercial::keypress_event()
{
if( ctrl_down() || !shift_down() || alt_down() )
- return 0;
+ return context_help_check_and_show();
if( get_keypress() == 'A' )
return handle_event();
- return 0;
+ return context_help_check_and_show();
}
int EditCommercial::handle_event()
{
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()
{
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()
{
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("Redo ( shift Z )"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Transport and Buttons Bar");
}
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()
{
delete gui_lock;
}
+void EditPanelScopeDialog::handle_close_event(int result)
+{
+ scope_gui = 0;
+}
void EditPanelScopeDialog::handle_done_event(int result)
{
gui_lock->lock("EditPanelScopeDialog::handle_done_event");
: ScopeGUI(mwindow->theme,
mwindow->session->scope_x, mwindow->session->scope_y,
mwindow->session->scope_w, mwindow->session->scope_h,
- mwindow->preferences->processors)
+ mwindow->get_cpus())
{
this->mwindow = mwindow;
this->dialog = dialog;
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();
}
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;
}
int EditPanelScopeGUI::translation_event()
this->mwindow = mwindow;
this->panel = panel;
set_tooltip(_("View scope"));
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Videoscope");
}
EditPanelScope::~EditPanelScope()
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];
+
+VFrame **EditPanelGangTracks::get_images(MWindow *mwindow)
+{
+ 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];
+}
+
+void EditPanelGangTracks::update(int gang)
+{
+ set_images(gang_images[gang]);
+ draw_face();
+ set_tooltip(_(gang_tips[gang]));
+}
+
+int EditPanelGangTracks::handle_event()
+{
+ int gang = mwindow->edl->local_session->gang_tracks;
+ if( !shift_down() ) {
+ if( ++gang > GANG_MEDIA ) gang = GANG_NONE;
+ }
+ else {
+ if( --gang < GANG_NONE ) gang = GANG_MEDIA;
+ }
+ 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()
+{
+}
+
+double EditPanelTcWindow::get_timecode()
+{
+ 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;
+}
+
+void EditPanelTcWindow::update(double timecode)
+{
+ 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();
+}
+
+EditPanelTcReset::EditPanelTcReset(EditPanelTcWindow *window, int x, int y)
+ : BC_Button(x, y, window->tc_dialog->mwindow->theme->get_image_set("reset_button"))
+{
+ this->window = window;
+}
+
+int EditPanelTcReset::handle_event()
+{
+ window->update(0);
+ return 1;
+}
+
+
+EditPanelTcInt::EditPanelTcInt(EditPanelTcWindow *window, int x, int y, int w,
+ int max, const char *format)
+ : BC_TextBox(x, y, w, 1, "")
+{
+ this->window = window;
+ this->max = max;
+ this->format = format;
+ digits = 1;
+ for( int m=max; (m/=10)>0; ++digits );
+}
+
+EditPanelTcInt::~EditPanelTcInt()
+{
+}
+
+int EditPanelTcInt::handle_event()
+{
+ int v = atoi(get_text());
+ if( v > max ) {
+ v = v % (max+1);
+ char string[BCSTRLEN];
+ sprintf(string, format, v);
+ BC_TextBox::update(string);
+ }
+ return 1;
+}
+
+void EditPanelTcInt::update(int v)
+{
+ char text[BCTEXTLEN];
+ if( v > max ) v = max;
+ sprintf(text, format, v);
+ BC_TextBox::update(text);
+}
+
+int EditPanelTcInt::keypress_event()
+{
+ 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;
+}
+