X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ftrackcanvas.C;h=061545bac18728ba5f25be967788c789a304367f;hb=9f0e523f895dabf635f694efc854f2be479d712c;hp=6a34b7f1d33deff5abd4f5b01ff533358765f743;hpb=62709d0558a8c4366f75ae39f5f98e759e19fcfc;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/trackcanvas.C b/cinelerra-5.1/cinelerra/trackcanvas.C index 6a34b7f1..061545ba 100644 --- a/cinelerra-5.1/cinelerra/trackcanvas.C +++ b/cinelerra-5.1/cinelerra/trackcanvas.C @@ -642,7 +642,6 @@ int64_t TrackCanvas::drop_plugin_position(PluginSet *plugin_set, Plugin *moved_p return -1; } - void TrackCanvas::draw(int mode, int hide_cursor) { const int debug = 0; @@ -709,9 +708,6 @@ void TrackCanvas::draw_resources(int mode, if(debug) PRINT_TRACE - if(!mwindow->edl->session->show_assets) return; - - // can't stop thread here, because this is called for every pane // if(mode != IGNORE_THREAD && !indexes_only) // gui->resource_thread->stop_draw(!indexes_only); @@ -801,24 +797,29 @@ void TrackCanvas::draw_resources(int mode, if(pixmap_w && pixmap_h) { // Create pixmap if it doesn't exist - ResourcePixmap* pixmap = create_pixmap(edit, - edit_x, - pixmap_x, - pixmap_w, - pixmap_h); + ResourcePixmap* pixmap = create_pixmap(edit, edit_x, + pixmap_x, pixmap_w, pixmap_h); // Resize it if it's bigger - if(pixmap_w > pixmap->pixmap_w || - pixmap_h > pixmap->pixmap_h) + if( pixmap_w > pixmap->pixmap_w || + pixmap_h > pixmap->pixmap_h) pixmap->resize(pixmap_w, pixmap_h); - pixmap->draw_data(this, - edit, - edit_x, - edit_w, - pixmap_x, - pixmap_w, - pixmap_h, - mode, - indexes_only); + pixmap->update_settings(edit, edit_x, edit_w, + pixmap_x, pixmap_w, pixmap_h); +// Draw data + if( current->show_assets() ) + pixmap->draw_data(this, + edit, edit_x, edit_w, + pixmap_x, pixmap_w, pixmap_h, + mode, indexes_only); + else { + set_bg_color(BLACK); + clear_box(0,0, pixmap_w,pixmap_h, pixmap); + } +// Draw title + if( current->show_titles() ) + pixmap->draw_title(this, + edit, edit_x, edit_w, + pixmap_x, pixmap_w); // Resize it if it's smaller if(pixmap_w < pixmap->pixmap_w || pixmap_h < pixmap->pixmap_h) @@ -959,27 +960,22 @@ void TrackCanvas::get_pixmap_size(Edit *edit, // } pixmap_h = mwindow->edl->local_session->zoom_track; - if(mwindow->edl->session->show_titles) pixmap_h += mwindow->theme->get_image("title_bg_data")->get_h(); + Track *track = edit->edits->track; + if( track->show_titles() ) + pixmap_h += mwindow->theme->get_image("title_bg_data")->get_h(); //printf("get_pixmap_size %d %d %d %d\n", edit_x, edit_w, pixmap_x, pixmap_w); } void TrackCanvas::edit_dimensions(Edit *edit, - int64_t &x, - int64_t &y, - int64_t &w, - int64_t &h) + int64_t &x, int64_t &y, int64_t &w, int64_t &h) { -// w = Units::round(edit->track->from_units(edit->length) * -// mwindow->edl->session->sample_rate / -// mwindow->edl->local_session->zoom_sample); - - h = resource_h(); - x = Units::round(edit->track->from_units(edit->startproject) * mwindow->edl->session->sample_rate / mwindow->edl->local_session->zoom_sample - mwindow->edl->local_session->view_start[pane->number]); + y = edit->edits->track->y_pixel - mwindow->edl->local_session->track_start[pane->number]; + // Method for calculating w so when edits are together we never get off by one error due to rounding int64_t x_next = Units::round(edit->track->from_units(edit->startproject + edit->length) * mwindow->edl->session->sample_rate / @@ -987,10 +983,12 @@ void TrackCanvas::edit_dimensions(Edit *edit, mwindow->edl->local_session->view_start[pane->number]); w = x_next - x; - y = edit->edits->track->y_pixel - mwindow->edl->local_session->track_start[pane->number]; - - if(mwindow->edl->session->show_titles) - h += mwindow->theme->get_image("title_bg_data")->get_h(); + int edit_h = 0; + if( edit->track->show_titles() ) + edit_h += mwindow->theme->get_image("title_bg_data")->get_h(); + if( edit->track->show_assets() ) + edit_h += resource_h(); + h = edit_h; } void TrackCanvas::track_dimensions(Track *track, int64_t &x, int64_t &y, int64_t &w, int64_t &h) @@ -1240,13 +1238,14 @@ void TrackCanvas::plugin_dimensions(Plugin *plugin, int64_t &x, int64_t &y, int6 w = Units::round(plugin->track->from_units(plugin->length) * mwindow->edl->session->sample_rate / mwindow->edl->local_session->zoom_sample); - y = plugin->track->y_pixel - - mwindow->edl->local_session->track_start[pane->number] + - mwindow->edl->local_session->zoom_track + - plugin->plugin_set->get_number() * - mwindow->theme->get_image("plugin_bg_data")->get_h(); - if(mwindow->edl->session->show_titles) + y = plugin->track->y_pixel + - mwindow->edl->local_session->track_start[pane->number]; + if( plugin->track->show_titles() ) y += mwindow->theme->get_image("title_bg_data")->get_h(); + if( plugin->track->show_assets() ) + y += resource_h(); + y += plugin->plugin_set->get_number() * + mwindow->theme->get_image("plugin_bg_data")->get_h(); h = mwindow->theme->get_image("plugin_bg_data")->get_h(); } @@ -1379,42 +1378,30 @@ void TrackCanvas::get_handle_coords(Edit *edit, int64_t &x, int64_t &y, int64_t edit_dimensions(edit, x, y, w, h); - if(mwindow->edl->session->show_titles) - { + if( edit->track->show_titles() ) y += mwindow->theme->get_image("title_bg_data")->get_h(); - } - else - { - y = 0; - } if(side == EDIT_OUT) - { x += w - handle_w; - } h = handle_h; w = handle_w; } -void TrackCanvas::get_transition_coords(int64_t &x, int64_t &y, int64_t &w, int64_t &h) +void TrackCanvas::get_transition_coords(Edit *edit, + int64_t &x, int64_t &y, int64_t &w, int64_t &h) { -//printf("TrackCanvas::get_transition_coords 1\n"); -// int transition_w = mwindow->theme->transitionhandle_data[0]->get_w(); -// int transition_h = mwindow->theme->transitionhandle_data[0]->get_h(); - int transition_w = 30; - int transition_h = 30; -//printf("TrackCanvas::get_transition_coords 1\n"); - - if(mwindow->edl->session->show_titles) + int transition_w = 30, transition_h = 30; + + if( edit->track->show_titles() ) y += mwindow->theme->get_image("title_bg_data")->get_h(); -//printf("TrackCanvas::get_transition_coords 2\n"); + if( edit->track->show_assets() ) + y += resource_h() / 2; - y += (h - mwindow->theme->get_image("title_bg_data")->get_h()) / 2 - transition_h / 2; x -= transition_w / 2; - - h = transition_h; + y -= transition_h / 2; w = transition_w; + h = transition_h; } void TrackCanvas::draw_highlighting() @@ -1429,21 +1416,18 @@ void TrackCanvas::draw_highlighting() //printf("TrackCanvas::draw_highlighting 1 %p %p\n", // mwindow->session->track_highlighted, mwindow->session->edit_highlighted); if(mwindow->session->edit_highlighted) { -//printf("TrackCanvas::draw_highlighting 2\n"); if((mwindow->session->current_operation == DRAG_ATRANSITION && mwindow->session->track_highlighted->data_type == TRACK_AUDIO) || (mwindow->session->current_operation == DRAG_VTRANSITION && mwindow->session->track_highlighted->data_type == TRACK_VIDEO)) { -//printf("TrackCanvas::draw_highlighting 2\n"); - edit_dimensions(mwindow->session->edit_highlighted, x, y, w, h); -//printf("TrackCanvas::draw_highlighting 2\n"); - + edit_dimensions(mwindow->session->edit_highlighted, + x, y, w, h); if(MWindowGUI::visible(x, x + w, 0, get_w()) && MWindowGUI::visible(y, y + h, 0, get_h())) { draw_box = 1; - get_transition_coords(x, y, w, h); + get_transition_coords(mwindow->session->edit_highlighted, + x, y, w, h); } -//printf("TrackCanvas::draw_highlighting 3\n"); } } break; @@ -1611,8 +1595,6 @@ void TrackCanvas::draw_plugins() int current_show = 0; int current_preset = 0; -// if(!mwindow->edl->session->show_assets) goto done; - for(int i = 0; i < plugin_on_toggles.total; i++) plugin_on_toggles.values[i]->in_use = 0; for(int i = 0; i < plugin_show_toggles.total; i++) @@ -1788,14 +1770,19 @@ void TrackCanvas::draw_hard_edges() { int64_t x, y, w, h; -// if(!mwindow->edl->session->show_assets) return; - for(Track *track = mwindow->edl->tracks->first; track; track = track->next) { for(Edit *edit = track->edits->first; edit; edit = edit->next) { if( !edit->hard_left && !edit->hard_right ) continue; edit_dimensions(edit, x, y, w, h); set_color(GREEN); - set_opaque(); int y1 = y+h-1; + set_opaque(); + int y1 = y; + if( track->show_titles() ) + y1 += mwindow->theme->get_image("title_bg_data")->get_h(); + if( track->show_assets() ) + y1 += resource_h(); + if( y1 == y ) + y1 += mwindow->theme->title_h; if( edit->hard_left ) { ArrayList xpt, ypt; xpt.append(x); ypt.append(y1); @@ -1844,16 +1831,16 @@ void TrackCanvas::draw_transitions() { int64_t x, y, w, h; -// if(!mwindow->edl->session->show_assets) return; - for(Track *track = mwindow->edl->tracks->first; track; track = track->next) { + if( !track->show_transitions() ) continue; + for(Edit *edit = track->edits->first; edit; edit = edit->next) { if(!edit->transition) continue; edit_dimensions(edit, x, y, w, h); int strip_x = x, strip_y = y; - if(mwindow->edl->session->show_titles) + if( track->show_titles() ) strip_y += mwindow->theme->get_image("title_bg_data")->get_h(); - get_transition_coords(x, y, w, h); + get_transition_coords(edit, x, y, w, h); int strip_w = Units::round(edit->track->from_units(edit->transition->length) * mwindow->edl->session->sample_rate / mwindow->edl->local_session->zoom_sample); if( MWindowGUI::visible(x, x + w, 0, get_w()) && @@ -2046,16 +2033,27 @@ int TrackCanvas::do_keyframes(int cursor_x, case Autos::AUTOMATION_TYPE_FLOAT: { Automation automation(0, track); int grouptype = automation.autogrouptype(i, track); + if( buttonpress && i == AUTOMATION_SPEED ) { + mwindow->speed_before(); + } + if(draw) // Do dropshadow result = do_float_autos(track, autos, cursor_x, cursor_y, draw, buttonpress, 1, 1, MDGREY, auto_keyframe, grouptype); - result = do_float_autos(track, autos, cursor_x, cursor_y, draw, buttonpress, 0, 0, GWindowGUI::auto_colors[i], auto_keyframe, grouptype); + + if( !result && buttonpress && i == AUTOMATION_SPEED ) + mwindow->speed_after(-1); + int current_grouptype = mwindow->edl->local_session->zoombar_showautotype; + if( result && buttonpress && grouptype != current_grouptype ) { + mwindow->edl->local_session->zoombar_showautotype = grouptype; + mwindow->gui->zoombar->update_autozoom(); + } break; } case Autos::AUTOMATION_TYPE_INT: { @@ -2117,9 +2115,7 @@ int TrackCanvas::do_keyframes(int cursor_x, } } - if(!result && - session->auto_conf->plugins /* && - mwindow->edl->session->show_assets */) { + if(!result && session->auto_conf->plugins) { Plugin *plugin; KeyFrame *keyframe; result = do_plugin_autos(track, cursor_x, cursor_y, @@ -2865,14 +2861,13 @@ void TrackCanvas::calculate_viewport(Track *track, mwindow->edl->local_session->zoom_sample / mwindow->edl->session->sample_rate; unit_end = track->to_doubleunits(view_end); - yscale = mwindow->edl->local_session->zoom_track; -//printf("TrackCanvas::calculate_viewport yscale=%.0f\n", yscale); - center_pixel = (int)(track->y_pixel - - mwindow->edl->local_session->track_start[pane->number] + - yscale / 2) + - (mwindow->edl->session->show_titles ? - mwindow->theme->get_image("title_bg_data")->get_h() : - 0); + yscale = resource_h(); + center_pixel = track->y_pixel + - mwindow->edl->local_session->track_start[pane->number]; + if( track->show_assets() ) + center_pixel += yscale / 2; + if( track->show_titles() ) + center_pixel += mwindow->theme->get_image("title_bg_data")->get_h(); zoom_sample = mwindow->edl->local_session->zoom_sample; zoom_units = track->to_doubleunits(zoom_sample / mwindow->edl->session->sample_rate); @@ -3365,11 +3360,13 @@ int TrackCanvas::do_plugin_autos(Track *track, int cursor_x, int cursor_y, for(int i = 0; i < track->plugin_set.total && !result; i++) { PluginSet *plugin_set = track->plugin_set.values[i]; - int center_pixel = (int)(track->y_pixel - - mwindow->edl->local_session->track_start[pane->number] + - mwindow->edl->local_session->zoom_track + - (i + 0.5) * mwindow->theme->get_image("plugin_bg_data")->get_h() + - (mwindow->edl->session->show_titles ? mwindow->theme->get_image("title_bg_data")->get_h() : 0)); + int center_pixel = track->y_pixel - + mwindow->edl->local_session->track_start[pane->number]; + if( track->show_titles() ) + center_pixel += mwindow->theme->get_image("title_bg_data")->get_h(); + if( track->show_assets() ) + center_pixel += resource_h(); + center_pixel += (i + 0.5) * mwindow->theme->get_image("plugin_bg_data")->get_h(); for(Plugin *plugin = (Plugin*)plugin_set->first; plugin && !result; @@ -3481,7 +3478,7 @@ void TrackCanvas::draw_overlays() draw_inout_points(); // Transitions - if(mwindow->edl->session->auto_conf->transitions) draw_transitions(); + draw_transitions(); // Plugins draw_plugins(); @@ -3902,7 +3899,7 @@ void TrackCanvas::update_drag_caption() -int TrackCanvas::cursor_motion_event() +int TrackCanvas::cursor_update(int in_motion) { int result = 0; int cursor_x = 0; @@ -3915,7 +3912,7 @@ int TrackCanvas::cursor_motion_event() int new_cursor = 0; int rerender = 0; double position = 0.; -//printf("TrackCanvas::cursor_motion_event %d\n", __LINE__); +//printf("TrackCanvas::cursor_update %d\n", __LINE__); // Default cursor switch(mwindow->edl->session->editing_mode) @@ -3978,6 +3975,8 @@ int TrackCanvas::cursor_motion_event() case DRAG_PROJECTOR_Z: if(active) rerender = update_overlay = update_drag_floatauto(get_cursor_x(), get_cursor_y()); + if( rerender && mwindow->session->current_operation == DRAG_SPEED ) + mwindow->speed_after(!in_motion ? 1 : 0); break; case DRAG_PLAY: @@ -4043,7 +4042,7 @@ int TrackCanvas::cursor_motion_event() start != mwindow->edl->local_session->get_selectionstart(1) ? 1 : end != mwindow->edl->local_session->get_selectionend(1) ? -1 : 0; mwindow->cwindow->update(dir, 0, 0, 0, 1); - gui->lock_window("TrackCanvas::cursor_motion_event 1"); + gui->lock_window("TrackCanvas::cursor_update 1"); // Update the faders mwindow->update_plugin_guis(); gui->update_patchbay(); @@ -4078,7 +4077,7 @@ int TrackCanvas::cursor_motion_event() for(int i = 0; i < TOTAL_PANES; i++) if(gui->pane[i]) gui->pane[i]->canvas->timebar_position = position; -//printf("TrackCanvas::cursor_motion_event %d %d %p %p\n", __LINE__, pane->number, pane, pane->timebar); +//printf("TrackCanvas::cursor_update %d %d %p %p\n", __LINE__, pane->number, pane, pane->timebar); gui->update_timebar(0); // Update cursor if(do_transitions(get_cursor_x(), get_cursor_y(), @@ -4096,13 +4095,13 @@ int TrackCanvas::cursor_motion_event() break; } -//printf("TrackCanvas::cursor_motion_event 1\n"); +//printf("TrackCanvas::cursor_update 1\n"); if(update_cursor && new_cursor != get_cursor()) { set_cursor(new_cursor, 0, 1); } -//printf("TrackCanvas::cursor_motion_event 1 %d\n", rerender); +//printf("TrackCanvas::cursor_update 1 %d\n", rerender); if(rerender && render_timer->get_difference() > 0.25 ) { render_timer->update(); mwindow->restart_brender(); @@ -4110,7 +4109,7 @@ int TrackCanvas::cursor_motion_event() mwindow->update_plugin_guis(); gui->unlock_window(); mwindow->cwindow->update(1, 0, 0, 0, 1); - gui->lock_window("TrackCanvas::cursor_motion_event 2"); + gui->lock_window("TrackCanvas::cursor_update 2"); } if(rerender) { // Update faders @@ -4141,10 +4140,15 @@ int TrackCanvas::cursor_motion_event() gui->draw_overlays(1); } -//printf("TrackCanvas::cursor_motion_event %d\n", __LINE__); +//printf("TrackCanvas::cursor_update %d\n", __LINE__); return result; } +int TrackCanvas::cursor_motion_event() +{ + return cursor_update(1); +} + void TrackCanvas::start_dragscroll() { if(!drag_scroll) { @@ -4244,7 +4248,8 @@ int TrackCanvas::repeat_event(int64_t duration) int TrackCanvas::button_release_event() { - int redraw = 0, update_overlay = 0, result = 0; + int redraw = -1, update_overlay = 0; + int result = 0, load_flags = 0; // printf("TrackCanvas::button_release_event %d\n", // mwindow->session->current_operation); @@ -4278,8 +4283,10 @@ int TrackCanvas::button_release_event() result = 1; break; - case DRAG_FADE: case DRAG_SPEED: + redraw = FORCE_REDRAW; + load_flags |= LOAD_EDITS; + case DRAG_FADE: // delete the drag_auto_gang first and remove out of order keys synchronize_autos(0, 0, 0, -1); case DRAG_CZOOM: @@ -4296,6 +4303,7 @@ int TrackCanvas::button_release_event() case DRAG_PROJECTOR_Y: case DRAG_PROJECTOR_Z: case DRAG_PLUGINKEY: + load_flags |= LOAD_AUTOMATION; mwindow->session->current_operation = NO_OPERATION; mwindow->session->drag_handle = 0; // Remove any out-of-order keyframe @@ -4306,8 +4314,7 @@ int TrackCanvas::button_release_event() update_overlay = 1; } - - mwindow->undo->update_undo_after(_("keyframe"), LOAD_AUTOMATION); + mwindow->undo->update_undo_after(_("keyframe"), load_flags); result = 1; break; @@ -4334,13 +4341,14 @@ int TrackCanvas::button_release_event() } if (result) - cursor_motion_event(); + cursor_update(0); if(update_overlay) { gui->draw_overlays(1); } - if(redraw) { - gui->draw_canvas(NORMAL_DRAW, 0); + if(redraw >= 0) { + gui->draw_canvas(redraw, 0); + gui->flash_canvas(1); } return result; } @@ -4352,9 +4360,9 @@ int TrackCanvas::do_edit_handles(int cursor_x, int cursor_y, int button_press, int handle_result = -1; int result = 0; - if( !mwindow->edl->session->show_assets ) return 0; - for( Track *track=mwindow->edl->tracks->first; track && !result; track=track->next) { + if( !track->show_assets() ) continue; + for( Edit *edit=track->edits->first; edit && !result; edit=edit->next ) { int64_t edit_x, edit_y, edit_w, edit_h; edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h); @@ -4473,8 +4481,6 @@ int TrackCanvas::do_plugin_handles(int cursor_x, int handle_result = 0; int result = 0; -// if(!mwindow->edl->session->show_assets) return 0; - for(Track *track = mwindow->edl->tracks->first; track && !result; track = track->next) { @@ -4541,17 +4547,17 @@ int TrackCanvas::do_tracks(int cursor_x, int cursor_y, int button_press) { int result = 0; -// if(!mwindow->edl->session->show_assets) return 0; - for(Track *track = mwindow->edl->tracks->first; track && !result; track = track->next) { int64_t track_x, track_y, track_w, track_h; track_dimensions(track, track_x, track_y, track_w, track_h); - if(button_press && get_buttonpress() == RIGHT_BUTTON && - cursor_y >= track_y && cursor_y < track_y + track_h) { - gui->edit_menu->update(track, 0); + if( button_press && get_buttonpress() == RIGHT_BUTTON && + cursor_y >= track_y && cursor_y < track_y + track_h) { + double pos = mwindow->edl->get_cursor_position(cursor_x, pane->number); + int64_t position = track->to_units(pos, 0); + gui->edit_menu->update(track, track->edits->editof(position, PLAY_FORWARD, 0)); gui->edit_menu->activate_menu(); result = 1; } @@ -4565,9 +4571,8 @@ int TrackCanvas::do_edits(int cursor_x, int cursor_y, int button_press, int drag { int result = 0; - if(!mwindow->edl->session->show_assets) return 0; - for(Track *track = mwindow->edl->tracks->first; track && !result; track = track->next) { + if( !track->show_assets() ) continue; for(Edit *edit = track->edits->first; edit && !result; edit = edit->next) { int64_t edit_x, edit_y, edit_w, edit_h; @@ -4654,10 +4659,6 @@ int TrackCanvas::do_plugins(int cursor_x, int cursor_y, int drag_start, int64_t x, y, w, h; Track *track = 0; - -// if(!mwindow->edl->session->show_assets) return 0; - - for(track = mwindow->edl->tracks->first; track && !done; track = track->next) { if(!track->expand_view) continue; @@ -4766,15 +4767,14 @@ int TrackCanvas::do_transitions(int cursor_x, int cursor_y, int result = 0; int64_t x, y, w, h; - if(/* !mwindow->edl->session->show_assets || */ - !mwindow->edl->session->auto_conf->transitions) return 0; for( Track *track = mwindow->edl->tracks->first; track && !result; track = track->next ) { + if( !track->show_transitions() ) continue; for( Edit *edit = track->edits->first; edit; edit = edit->next ) { if( edit->transition ) { edit_dimensions(edit, x, y, w, h); - get_transition_coords(x, y, w, h); + get_transition_coords(edit, x, y, w, h); if( MWindowGUI::visible(x, x + w, 0, get_w()) && MWindowGUI::visible(y, y + h, 0, get_h()) ) { @@ -4814,12 +4814,7 @@ int TrackCanvas::button_press_event() mwindow->session->trim_edits = 0; if(is_event_win() && cursor_inside()) { -// double position = (double)cursor_x * -// mwindow->edl->local_session->zoom_sample / -// mwindow->edl->session->sample_rate + -// (double)mwindow->edl->local_session->view_start[pane->number] * -// mwindow->edl->local_session->zoom_sample / -// mwindow->edl->session->sample_rate; +// double position = mwindow->edl->get_cursor_position(cursor_x, pane->number); result = 1; if(!active) { @@ -4899,12 +4894,7 @@ int TrackCanvas::button_press_event() // Test handles only and select a region case EDITING_IBEAM: { - double position = (double)cursor_x * - mwindow->edl->local_session->zoom_sample / - mwindow->edl->session->sample_rate + - (double)mwindow->edl->local_session->view_start[pane->number] * - mwindow->edl->local_session->zoom_sample / - mwindow->edl->session->sample_rate; + double position = mwindow->edl->get_cursor_position(cursor_x, pane->number); //printf("TrackCanvas::button_press_event %d\n", position); if( do_transitions(cursor_x, cursor_y,