X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ftrackcanvas.C;h=27eede528e536bc2a324936ac4fb7d943a3dac89;hp=cf20fe90a8096148281f84c166efbe9f13426809;hb=9afc3844e37c6db23435d5d0c33129dcc81061e4;hpb=93cd60723f8816b0c787b1ce9fe7aa6067e0e749 diff --git a/cinelerra-5.1/cinelerra/trackcanvas.C b/cinelerra-5.1/cinelerra/trackcanvas.C index cf20fe90..27eede52 100644 --- a/cinelerra-5.1/cinelerra/trackcanvas.C +++ b/cinelerra-5.1/cinelerra/trackcanvas.C @@ -493,7 +493,7 @@ int TrackCanvas::drag_stop(int *redraw) double track_position = track->from_units(drop_position); track_position = mwindow->edl->align_to_frame(track_position, 0); mwindow->move_edits(mwindow->session->drag_edits, - track, track_position, !insertion); + track, track_position, insertion); } result = 1; @@ -1928,22 +1928,80 @@ void TrackCanvas::draw_inout_points() void TrackCanvas::draw_drag_handle() { - if(mwindow->session->current_operation == DRAG_EDITHANDLE2 || - mwindow->session->current_operation == DRAG_PLUGINHANDLE2) - { -//printf("TrackCanvas::draw_drag_handle 1 %ld %ld\n", mwindow->session->drag_sample, mwindow->edl->local_session->view_start); - int64_t pixel1 = Units::round(mwindow->session->drag_position * - mwindow->edl->session->sample_rate / - mwindow->edl->local_session->zoom_sample - - mwindow->edl->local_session->view_start[pane->number]); -//printf("TrackCanvas::draw_drag_handle 2 %d %jd\n", pane->number, pixel1); - set_color(!snapped ? GREEN : (snapped=0, YELLOW)); - set_inverse(); -//printf("TrackCanvas::draw_drag_handle 3\n"); - draw_line(pixel1, 0, pixel1, get_h()); - set_opaque(); -//printf("TrackCanvas::draw_drag_handle 4\n"); + if( mwindow->session->current_operation != DRAG_EDITHANDLE2 && + mwindow->session->current_operation != DRAG_PLUGINHANDLE2 ) return; + int64_t pixel1 = Units::round(mwindow->session->drag_position * + mwindow->edl->session->sample_rate / + mwindow->edl->local_session->zoom_sample - + mwindow->edl->local_session->view_start[pane->number]); + set_color(!snapped ? GREEN : (snapped=0, YELLOW)); + set_inverse(); + draw_line(pixel1, 0, pixel1, get_h()); + set_opaque(); + + if( mwindow->session->current_operation != DRAG_EDITHANDLE2 ) return; + if( !mwindow->session->drag_edit ) return; + int group_id = mwindow->session->drag_edit->group_id; + if( !group_id ) return; + int64_t dx, dy, dw, dh; + edit_dimensions(mwindow->session->drag_edit, dx, dy, dw, dh); + int drag_handle = mwindow->session->drag_handle; + int64_t pixel0 = !drag_handle ? dx : dx + dw; + int delta = pixel1 - pixel0; + set_color(LTPURPLE); + set_line_width(3); + + for( Track *track=mwindow->edl->tracks->first; track; track=track->next ) { + Edit *left = 0, *right = 0; + double start = DBL_MAX, end = DBL_MIN; + for( Edit *edit=track->edits->first; edit; edit=edit->next ) { + if( edit->group_id != group_id ) continue; + double edit_start = edit->track->from_units(edit->startproject); + if( edit_start < start ) { start = edit_start; left = edit; } + double edit_end = edit->track->from_units(edit->startproject+edit->length); + if( edit_end > end ) { end = edit_end; right = edit; } + } + Edit *edit = !drag_handle ? left : right; + if( !edit ) continue; + Indexable *idxbl = edit->asset; + if( !idxbl ) idxbl = edit->nested_edl; + int can_drag = idxbl ? 1 : 0; + if( drag_handle ) { + int64_t source_len = !idxbl ? -1 : + edit->track->data_type == TRACK_AUDIO ? + idxbl->get_audio_samples() : + edit->track->data_type == TRACK_VIDEO ? + idxbl->get_video_frames() : -1; + if( edit->startsource + edit->length >= source_len ) + can_drag = 0; + } + else if( !edit->startsource ) + can_drag = 0; + int64_t x, y, w, h; + edit_dimensions(edit, x, y, w, h); + if( y+h < 0 || y >= get_h() ) continue; + int edge_x = !drag_handle ? x : x + w; + int edge_y = y + h/2, k = 10; + if( edge_x >= 0 && edge_x < get_w() ) { + if( !can_drag ) { + draw_line(edge_x-k,edge_y-k, edge_x+k,edge_y+k); + draw_line(edge_x-k,edge_y+k, edge_x+k,edge_y-k); + } + else if( !drag_handle ) { + draw_line(edge_x+k,edge_y-k, edge_x,edge_y); + draw_line(edge_x+k,edge_y+k, edge_x,edge_y); + } + else { + draw_line(edge_x,edge_y, edge_x-k,edge_y-k); + draw_line(edge_x,edge_y, edge_x-k,edge_y+k); + } + } + edge_x += delta; + if( edge_x >= 0 && edge_x < get_w() ) { + draw_line(edge_x, y, edge_x, y+h); + } } + set_line_width(1); } @@ -2169,10 +2227,9 @@ int TrackCanvas::do_keyframes(int cursor_x, 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(); + if( result && buttonpress ) { + int color = GWindowGUI::auto_colors[i]; + mwindow->gui->zoombar->update_autozoom(grouptype, color); } break; } @@ -2279,7 +2336,6 @@ int TrackCanvas::do_keyframes(int cursor_x, new_cursor = UPRIGHT_ARROW_CURSOR; } - return result; } @@ -3750,21 +3806,37 @@ void TrackCanvas::update_drag_handle() edl->create_objects(); edl->copy_all(mwindow->edl); MainSession *session = mwindow->session; - int edit_mode = mwindow->edl->session->edit_handle_mode[session->drag_button]; + int handle_mode = mwindow->edl->session->edit_handle_mode[session->drag_button]; edl->modify_edithandles(session->drag_start, - session->drag_position, - session->drag_handle, - edit_mode, + session->drag_position, session->drag_handle, handle_mode, edl->session->labels_follow_edits, edl->session->plugins_follow_edits, - edl->session->autos_follow_edits); - double position = edit_mode != MOVE_NO_EDITS && - ( session->drag_handle || edit_mode == MOVE_ONE_EDIT ) ? + edl->session->autos_follow_edits, + !session->drag_edit ? 0 : session->drag_edit->group_id); + + double position = -1; + int show_edge = !session->drag_handle ? 1 : 2; + switch( handle_mode ) { + case MOVE_RIPPLE: + case MOVE_EDGE: + position = session->drag_handle ? session->drag_position : session->drag_start; + show_edge = 3 - show_edge; + break; + case MOVE_ROLL: + case MOVE_SLIDE: + position = session->drag_position; + break; + case MOVE_SLIP: + position = session->drag_start; + show_edge = 3 - show_edge; + break; + } + + if( position < 0 ) position = 0; Track *track = session->drag_handle_track(); int64_t pos = track->to_units(position, 0); - render_handle_frame(edl, pos, shift_down() ? 0 : - session->drag_handle ? 1 : 2); + render_handle_frame(edl, pos, shift_down() ? 0 : show_edge); edl->remove_user(); } } @@ -3788,8 +3860,6 @@ int TrackCanvas::render_handle_frame(EDL *edl, int64_t pos, int mode) CICache *video_cache = new CICache(preferences); render_engine->set_vcache(video_cache); render_engine->arm_command(&command); - int64_t left = pos-1; - if( left < 0 ) left = 0; VRender *vrender = render_engine->vrender; result = vrender && !vrender->process_buffer(&vlt, left, 0) && @@ -3815,11 +3885,11 @@ int TrackCanvas::render_handle_frame(EDL *edl, int64_t pos, int mode) Track *track = mwindow->session->drag_handle_track(); double position = track->from_units(mode == 1 ? left : pos); if( position < 0 ) position = 0; - edl->local_session->set_selectionstart(position); - edl->local_session->set_selectionend(position); PlaybackEngine *playback_engine = mwindow->cwindow->playback_engine; if( playback_engine->is_playing_back ) playback_engine->stop_playback(1); + edl->local_session->set_selectionstart(position); + edl->local_session->set_selectionend(position); mwindow->cwindow->playback_engine->refresh_frame(CHANGE_EDL, edl, 0); break; } } @@ -3924,7 +3994,7 @@ int TrackCanvas::update_drag_floatauto(int cursor_x, int cursor_y) // Snap to nearby values old_value = current->get_value(); if(shift_down()) { - double value1, value2, distance1, distance2; + double value1, value2, distance1=-1, distance2=-1; if(current->previous) { int autogrouptype = current->previous->autos->autogrouptype; @@ -3963,7 +4033,8 @@ int TrackCanvas::update_drag_floatauto(int cursor_x, int cursor_y) float change = value - old_value; current->adjust_to_new_coordinates(position, value); update_ganged_autos(change, current->autos->track, current); - show_message(current, 1,", %.2f", current->get_value()); + int color = GWindowGUI::auto_colors[current->autos->autoidx]; + show_message(current, color, ", %.2f", current->get_value()); } break; @@ -3982,7 +4053,8 @@ int TrackCanvas::update_drag_floatauto(int cursor_x, int cursor_y) value * levered_position(position - current->position, current->get_control_in_position())); update_ganged_autos(0, current->autos->track, current); - show_message(current, 1,", %.2f", current->get_control_in_value()); + int color = GWindowGUI::auto_colors[current->autos->autoidx]; + show_message(current, color, ", %.2f", current->get_control_in_value()); } break; } @@ -3996,7 +4068,8 @@ int TrackCanvas::update_drag_floatauto(int cursor_x, int cursor_y) value * levered_position(position - current->position, current->get_control_out_position())); update_ganged_autos(0, current->autos->track, current); - show_message(current, 1,", %.2f", current->get_control_out_value()); + int color = GWindowGUI::auto_colors[current->autos->autoidx]; + show_message(current, color, ", %.2f", current->get_control_out_value()); } break; } } @@ -4016,7 +4089,7 @@ int TrackCanvas::update_drag_toggleauto(int cursor_x, int cursor_y) result = 1; current->value = value; current->position = position; - show_message(current, 0,", %d", current->value); + show_message(current, -1, ", %d", current->value); } return result; @@ -4033,7 +4106,7 @@ int TrackCanvas::update_drag_auto(int cursor_x, int cursor_y) { result = 1; current->position = position; - show_message(current, 0,""); + show_message(current, -1, ""); double position_f = current->autos->track->from_units(current->position); double center_f = (mwindow->edl->local_session->get_selectionstart(1) + @@ -4097,7 +4170,7 @@ int TrackCanvas::update_drag_pluginauto(int cursor_x, int cursor_y) mwindow->session->track_highlighted = track; result = 1; current->position = position; - show_message(current, 0,""); + show_message(current, -1, ""); double position_f = current->autos->track->from_units(current->position); double center_f = (mwindow->edl->local_session->get_selectionstart(1) + @@ -4608,6 +4681,9 @@ int TrackCanvas::button_release_event() } } + if( mwindow->edl->local_session->zoombar_showautocolor >= 0 ) + mwindow->gui->zoombar->update_autozoom(-1); + if (result) cursor_update(0); @@ -4663,6 +4739,25 @@ int TrackCanvas::do_edit_handles(int cursor_x, int cursor_y, int button_press, } } + if( result > 0 ) { + int group_id = edit_result->group_id; + if( group_id > 0 ) { + Track *track = edit_result->track; + Edit *left = 0, *right = 0; + double start = DBL_MAX, end = DBL_MIN; + for( Edit *edit=track->edits->first; edit; edit=edit->next ) { + if( edit->group_id != group_id ) continue; + double edit_start = edit->track->from_units(edit->startproject); + if( edit_start < start ) { start = edit_start; left = edit; } + double edit_end = edit->track->from_units(edit->startproject+edit->length); + if( edit_end > end ) { end = edit_end; right = edit; } + } + Edit *edit = !handle_result ? left : right; + if( edit != edit_result ) + result = 0; + } + } + update_cursor = 1; if( result > 0 ) { double position = 0; @@ -5184,7 +5279,7 @@ int TrackCanvas::button_press_event() gui->stop_transport("TrackCanvas::button_press_event"); } - int update_overlay = 0, update_cursor = 0, rerender = 0; + int update_overlay = 0, update_cursor = 0, rerender = 0, update_message = 0; if(get_buttonpress() == WHEEL_UP) { if(shift_down()) @@ -5227,6 +5322,7 @@ int TrackCanvas::button_press_event() if( do_keyframes(cursor_x, cursor_y, 0, get_buttonpress(), new_cursor, update_cursor, rerender) ) break; + update_message = 1; // Test edit boundaries if( do_edit_handles(cursor_x, cursor_y, 1, rerender, update_overlay, new_cursor, @@ -5262,6 +5358,7 @@ int TrackCanvas::button_press_event() update_overlay = 1; break; } + update_message = 1; // Test edit boundaries if( do_edit_handles(cursor_x, cursor_y, 1, rerender, update_overlay, new_cursor, update_cursor) ) break; @@ -5292,9 +5389,12 @@ int TrackCanvas::button_press_event() gui->update_patchbay(); } - if( update_overlay ) { + if( update_message ) + gui->default_message(); + + if( update_overlay ) gui->draw_overlays(1); - } + if( update_cursor < 0 ) { // double_click edit gui->swindow->update_selection(); @@ -5371,11 +5471,11 @@ double TrackCanvas::time_visible() } -void TrackCanvas::show_message(Auto *current, int show_curve_type, const char *fmt, ...) +void TrackCanvas::show_message(Auto *current, int box_color, const char *fmt, ...) { char string[BCTEXTLEN]; char *cp = string, *ep = cp + sizeof(string)-1; - if( show_curve_type ) { + if( box_color >= 0 ) { cp += snprintf(string, ep-cp, "%-8s ", FloatAuto::curve_name(((FloatAuto*)current)->curve_mode)); } @@ -5391,7 +5491,7 @@ void TrackCanvas::show_message(Auto *current, int show_curve_type, const char *f va_start(ap, fmt); vsnprintf(cp, ep-cp, fmt, ap); va_end(ap); - gui->show_message(string); + gui->show_message(string, -1, box_color); } // Patchbay* TrackCanvas::get_patchbay()