X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Feditpanel.C;h=0a56e0fe0ec31b8848b80373ddf7b23c9af906c3;hp=41394277fc1de8aa66199a9567005c8e821c5089;hb=54b918a8b84f666bf32548ebd12b93908061d2a6;hpb=f5725c7e12def18fec49a295dad688652edaa4b3 diff --git a/cinelerra-5.1/cinelerra/editpanel.C b/cinelerra-5.1/cinelerra/editpanel.C index 41394277..0a56e0fe 100644 --- a/cinelerra-5.1/cinelerra/editpanel.C +++ b/cinelerra-5.1/cinelerra/editpanel.C @@ -76,7 +76,8 @@ EditPanel::EditPanel(MWindow *mwindow, int use_goto, int use_clk2play, int use_scope, - int use_gang_tracks) + int use_gang_tracks, + int use_timecode) { this->window_id = window_id; this->editing_mode = editing_mode; @@ -100,6 +101,7 @@ EditPanel::EditPanel(MWindow *mwindow, 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; @@ -160,7 +162,7 @@ void EditPanel::update() mwindow->edl->session->vwindow_click2play ; click2play->set_value(value); } - if( gang_tracks ) gang_tracks->update(mwindow->edl->session->gang_tracks); + if( gang_tracks ) gang_tracks->update(mwindow->edl->local_session->gang_tracks); if( meters ) { if( is_cwindow() ) { meters->update(mwindow->edl->session->cwindow_meter); @@ -322,6 +324,12 @@ void EditPanel::create_buttons() 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); @@ -448,6 +456,10 @@ void EditPanel::reposition_buttons(int x, int y) 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); @@ -1115,7 +1127,7 @@ EditUndo::EditUndo(MWindow *mwindow, EditPanel *panel, int x, int y) { this->mwindow = mwindow; this->panel = panel; - set_tooltip(_("Undo ( z )")); + set_tooltip(_("Undo ( z or Ctrl-z)")); } EditUndo::~EditUndo() { @@ -1326,7 +1338,7 @@ EditPanelGangTracks::EditPanelGangTracks(MWindow *mwindow, EditPanel *panel, { this->mwindow = mwindow; this->panel = panel; - int gang = mwindow->edl->session->gang_tracks; + int gang = mwindow->edl->local_session->gang_tracks; set_tooltip(_(gang_tips[gang])); } @@ -1341,7 +1353,7 @@ 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->session->gang_tracks; + int gang = mwindow->edl->local_session->gang_tracks; return gang_images[gang]; } @@ -1354,7 +1366,7 @@ void EditPanelGangTracks::update(int gang) int EditPanelGangTracks::handle_event() { - int gang = mwindow->edl->session->gang_tracks; + int gang = mwindow->edl->local_session->gang_tracks; if( !shift_down() ) { if( ++gang > GANG_MEDIA ) gang = GANG_NONE; } @@ -1366,3 +1378,195 @@ int EditPanelGangTracks::handle_event() 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")); +} + +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; +} + +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( (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; +} +