X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ftracksedit.C;h=18ca87d1950c9a2e8fa7fd0ace95f4a46e373025;hb=d26ed189093987978190ee07f485a4840746c13c;hp=77f31e5c0a59d9ce9f621f0c298d543817d5bcac;hpb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/tracksedit.C b/cinelerra-5.1/cinelerra/tracksedit.C index 77f31e5c..18ca87d1 100644 --- a/cinelerra-5.1/cinelerra/tracksedit.C +++ b/cinelerra-5.1/cinelerra/tracksedit.C @@ -361,6 +361,10 @@ void Tracks::set_transition_length(double start, double end, double length) { current_edit->transition->length = current_track->to_units(length, 1); + if( current_edit == current_track->edits->last && + current_edit->silence() ) { + current_edit->length = current_edit->transition->length; + } } } } @@ -383,6 +387,10 @@ void Tracks::set_transition_length(Transition *transition, double length) if(current_edit->transition == transition) { transition->length = current_track->to_units(length, 1); + if( current_edit == current_track->edits->last && + current_edit->silence() ) { + current_edit->length = current_edit->transition->length; + } done = 1; } } @@ -399,22 +407,32 @@ void Tracks::paste_transitions(double start, double end, int track_type, char* t { int64_t start_units = current_track->to_units(start, 0); int64_t end_units = current_track->to_units(end, 0); - - for(Edit *current_edit = current_track->edits->first; - current_edit; - current_edit = current_edit->next) - { - if(current_edit->startproject > 0 && - ((end_units > start_units && - current_edit->startproject >= start_units && - current_edit->startproject < end_units) || - (end_units == start_units && - current_edit->startproject <= start_units && - current_edit->startproject + current_edit->length > start_units))) - { + if( start_units == end_units ) { + for( Edit *current_edit = current_track->edits->first; + current_edit; current_edit = current_edit->next) { + int64_t edit_start = current_edit->startproject; + int64_t edit_end = edit_start + current_edit->length; + if( edit_start > start_units ) continue; + if( start_units == current_track->edits->length() ) { + double length = edl->session->default_transition_length; + int64_t units = current_track->to_units(length, 1); + current_edit = current_track->edits-> + create_silence(start_units, start_units+units); + } + else if( start_units >= edit_end ) continue; current_edit->insert_transition(title); } } + else { + for( Edit *current_edit = current_track->edits->first; + current_edit; current_edit = current_edit->next) { + int64_t edit_start = current_edit->startproject; + if( !edit_start ) continue; + if( edit_start >= start_units && edit_start < end_units ) { + current_edit->insert_transition(title); + } + } + } } } } @@ -542,7 +560,7 @@ int Tracks::delete_tracks() return total_deleted; } -void Tracks::move_edits(ArrayList *edits, +void Tracks::move_edits(ArrayList *edits, Track *track, double position, int edit_labels, // Ignored @@ -611,9 +629,9 @@ void Tracks::move_edits(ArrayList *edits, temp_autoconf.set_all(1); - source_track->automation->copy(source_edit->startproject, - source_edit->startproject + source_edit->length, - &temp, + source_track->automation->copy(source_edit->startproject, + source_edit->startproject + source_edit->length, + &temp, 0, 0); temp.terminate_string(); @@ -621,7 +639,7 @@ void Tracks::move_edits(ArrayList *edits, // Insert new keyframes //printf("Tracks::move_edits 2 %d %p\n", result->startproject, result->asset); source_track->automation->clear(source_edit->startproject, - source_edit->startproject + source_edit->length, + source_edit->startproject + source_edit->length, &temp_autoconf, 1); int64_t position_a = position_i; @@ -629,45 +647,45 @@ void Tracks::move_edits(ArrayList *edits, { if (position_a > source_edit->startproject) position_a -= source_length; - } + } - dest_track->automation->paste_silence(position_a, + dest_track->automation->paste_silence(position_a, position_a + source_length); while(!temp.read_tag()) - dest_track->automation->paste(position_a, + dest_track->automation->paste(position_a, source_length, 1.0, &temp, 0, 1, &temp_autoconf); // Insert new edit - Edit *dest_edit = dest_track->edits->shift(position_i, + Edit *dest_edit = dest_track->edits->shift(position_i, source_length); - Edit *result = dest_track->edits->insert_before(dest_edit, + Edit *result = dest_track->edits->insert_before(dest_edit, dest_track->edits->create_edit()); result->copy_from(source_edit); result->startproject = position_i; result->length = source_length; // Clear source - source_track->edits->clear(source_edit->startproject, + source_track->edits->clear(source_edit->startproject, source_edit->startproject + source_length); /* //this is outline for future thinking how it is supposed to be done trough C&P mechanisms temp.reset_tag(); - source_track->cut(source_edit->startproject, - source_edit->startproject + source_edit->length, - &temp, + source_track->cut(source_edit->startproject, + source_edit->startproject + source_edit->length, + &temp, NULL); temp.terminate_string(); temp.rewind(); - dest_track->paste_silence(position_a, + dest_track->paste_silence(position_a, position_a + source_length, edit_plugins); while(!temp.read_tag()) - dest_track->paste(position_a, // MISSING PIECE OF FUNCTIONALITY - source_length, - 1.0, - &temp, + dest_track->paste(position_a, // MISSING PIECE OF FUNCTIONALITY + source_length, + 1.0, + &temp, 0, &temp_autoconf); */ @@ -678,18 +696,18 @@ void Tracks::move_edits(ArrayList *edits, // ONLY edit is moved, all other edits stay where they are { // Copy edit to temp, delete the edit, insert the edit - Edit *temp_edit = dest_track->edits->create_edit(); + Edit *temp_edit = dest_track->edits->create_edit(); temp_edit->copy_from(source_edit); // we call the edits directly since we do not want to move keyframes or anything else - source_track->edits->clear(source_startproject, + source_track->edits->clear(source_startproject, + source_startproject + source_length); + source_track->edits->paste_silence(source_startproject, source_startproject + source_length); - source_track->edits->paste_silence(source_startproject, - source_startproject + source_length); - dest_track->edits->clear(position_i, + dest_track->edits->clear(position_i, position_i + source_length); Edit *dest_edit = dest_track->edits->shift(position_i, source_length); - Edit *result = dest_track->edits->insert_before(dest_edit, + Edit *result = dest_track->edits->insert_before(dest_edit, dest_track->edits->create_edit()); result->copy_from(temp_edit); result->startproject = position_i; @@ -745,6 +763,7 @@ void Tracks::move_effect(Plugin *plugin, PluginSet *plugin_set, int64_t position // update plugin position plugin->startproject = position; plugin->plugin_set = plugin_set; + plugin->edits = plugin_set; src_plugin_set->track->optimize(); } @@ -978,6 +997,11 @@ void Tracks::paste_audio_transition(PluginServer *server) Edit *current_edit = current->edits->editof(position, PLAY_FORWARD, 0); + if( !current_edit && position == current->edits->length() ) { + double length = edl->session->default_transition_length; + int64_t units = current->to_units(length, 1); + current_edit = current->edits->create_silence(position, position+units); + } if(current_edit) { paste_transition(server, current_edit); @@ -1127,6 +1151,11 @@ void Tracks::paste_video_transition(PluginServer *server, int first_track) Edit *current_edit = current->edits->editof(position, PLAY_FORWARD, 0); + if( !current_edit && position == current->edits->length() ) { + double length = edl->session->default_transition_length; + int64_t units = current->to_units(length, 1); + current_edit = current->edits->create_silence(position, position+units); + } if(current_edit) { paste_transition(server, current_edit);