X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ftracksedit.C;h=bf250b36623cd26379552478abfc719c22d1e01c;hb=3cbe62ca61e2b35d3e228978f6cdedd11218077f;hp=849d6942cb24ebd7a058d534cf77d25448421c2d;hpb=48a6854a1ca58aa291ffc6fe3a48807492dfbef7;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/tracksedit.C b/cinelerra-5.1/cinelerra/tracksedit.C index 849d6942..bf250b36 100644 --- a/cinelerra-5.1/cinelerra/tracksedit.C +++ b/cinelerra-5.1/cinelerra/tracksedit.C @@ -372,27 +372,41 @@ void Tracks::set_transition_length(double start, double end, double length) void Tracks::set_transition_length(Transition *transition, double length) { // Must verify existence of transition - int done = 0; - if(!transition) return; - for(Track *current_track = first; - current_track && !done; - current_track = current_track->next) - { - for(Edit *current_edit = current_track->edits->first; - current_edit && !done; - current_edit = current_edit->next) - { - 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; + int found = 0; + if( !transition ) return; + for( Track *track=first; track && !found; track=track->next ) { + for( Edit *edit=track->edits->first; edit && !found; edit = edit->next ) { + if( edit->transition == transition ) { + transition->length = track->to_units(length, 1); + if( edit == track->edits->last && edit->silence() ) { + edit->length = edit->transition->length; } - done = 1; + found = 1; } } } + if( !found ) return; + if( edl->session->gang_tracks == GANG_NONE ) return; + Track *track = transition->edit->track; + double pos = track->from_units(transition->edit->startproject); + Track *current = edl->tracks->first; + for( ; current; current=current->next ) { + if( current == track ) continue; + if( current->data_type != track->data_type ) continue; + if( !current->armed_gang(track) ) continue; + int64_t track_pos = current->to_units(pos, 1); + Edit *edit = current->edits->editof(track_pos, PLAY_FORWARD, 0); + if( !edit || !edit->transition ) continue; + double edit_pos = track->from_units(edit->startproject); + if( !edl->equivalent(pos, edit_pos) ) continue; +// modify gang same transitions at same position + if( edit->transition->Plugin::identical(transition) ) { + edit->transition->length = transition->length; + } + if( edit == track->edits->last && edit->silence() ) { + edit->length = edit->transition->length; + } + } } void Tracks::paste_transitions(double start, double end, int track_type, char* title) @@ -683,6 +697,7 @@ void Tracks::move_effect(Plugin *plugin, Track *track, int64_t position) start, length, plugin->plugin_type); result->copy_from(plugin); result->shift(position - plugin->startproject); + result->gui_id = plugin->gui_id; // Clear new plugin from old set plugin->plugin_set->clear(plugin->startproject, @@ -908,6 +923,61 @@ int Tracks::move_tracks_down() } +int Tracks::swap_track_up(Track *track) +{ + Track *next_track = track->previous; + if(!next_track) next_track = last; + + change_modules(number_of(track), number_of(next_track), 1); + swap(track, next_track); + return 0; +} + +int Tracks::swap_track_down(Track *track) +{ + Track *next_track = track->next; + if(!next_track) next_track = first; + + change_modules(number_of(track), number_of(next_track), 1); + swap(track, next_track); + return 0; +} + + +int Tracks::swap_tracks_up() +{ + int result = 0; + Track *next = first; + while( next ) { + Track *track = next; next = track->next; + if( !track->armed ) continue; + if( track->previous ) { + change_modules(number_of(track->previous), number_of(track), 1); + swap(track->previous, track); + result = 1; + } + } + + return result; +} + +int Tracks::swap_tracks_down() +{ + int result = 0; + Track *prev = last; + while( prev ) { + Track *track = prev; prev = track->previous; + if( !track->armed ) continue; + if( track->next ) { + change_modules(number_of(track), number_of(track->next), 1); + swap(track, track->next); + result = 1; + } + } + + return result; +} + void Tracks::paste_audio_transition(PluginServer *server) { for(Track *current = first; current; current = NEXT) @@ -1060,6 +1130,20 @@ void Tracks::paste_automation(double selectionstart, void Tracks::paste_transition(PluginServer *server, Edit *dest_edit) { dest_edit->insert_transition(server->title); + if( edl->session->gang_tracks == GANG_NONE ) return; + Track *track = dest_edit->track; + double pos = track->from_units(dest_edit->startproject); + for( Track *current=first; current; current=current->next ) { + if( current == track ) continue; + if( current->data_type != track->data_type ) continue; + if( !current->armed_gang(track) ) continue; + int64_t track_pos = current->to_units(pos, 1); + Edit *edit = current->edits->editof(track_pos, PLAY_FORWARD, 0); + if( !edit ) continue; + double edit_pos = track->from_units(edit->startproject); + if( !edl->equivalent(pos, edit_pos) ) continue; + edit->insert_transition(server->title); + } } void Tracks::paste_video_transition(PluginServer *server, int first_track)