X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ftracksedit.C;h=4a836b96a1fb15755d52c498c290ada63c858c65;hb=7eded24eb31529ad7652dea64e34b0a6210e5be1;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..4a836b96 100644 --- a/cinelerra-5.1/cinelerra/tracksedit.C +++ b/cinelerra-5.1/cinelerra/tracksedit.C @@ -47,6 +47,15 @@ #include "vtrack.h" #include +int Tracks::blade(double position) +{ + for( Track *track=first; track!=0; track=track->next ) { + if( !track->record ) continue; + track->blade(position); + } + return 0; +} + int Tracks::clear(double start, double end, int clear_plugins, int edit_autos) { Track *current_track; @@ -61,10 +70,10 @@ int Tracks::clear(double start, double end, int clear_plugins, int edit_autos) end, 1, // edits 1, // labels - clear_plugins, + clear_plugins, // edit_plugins edit_autos, - 1, - 0); + 1, // convert_units + 0); // trim_edits } } return 0; @@ -361,6 +370,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 +396,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 +416,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 +569,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 @@ -605,15 +632,18 @@ void Tracks::move_edits(ArrayList *edits, { // This works like this: CUT edit, INSERT edit at final position, keyframes also follow // FIXME: there should be a GUI way to tell whenever user also wants to move autos or not +// this is all screwed up +// inserts defaults/bogus everywhere +#if 0 // Copy keyframes FileXML temp; AutoConf temp_autoconf; 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 +651,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 +659,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); - +#endif // 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 +708,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 +775,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 +1009,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 +1163,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);