X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmwindowedit.C;h=458ced964e8f3418505b7d27ccf19adb80662dd0;hp=47b29ee891e06898cc2ce14dbad0e2a5a36d1117;hb=f62d927a25cb3b02f2197fde99c77df3005d41a7;hpb=84ac8a2bb3357c04a3f67cf763b0f61ddbbd021d diff --git a/cinelerra-5.1/cinelerra/mwindowedit.C b/cinelerra-5.1/cinelerra/mwindowedit.C index 47b29ee8..458ced96 100644 --- a/cinelerra-5.1/cinelerra/mwindowedit.C +++ b/cinelerra-5.1/cinelerra/mwindowedit.C @@ -337,7 +337,7 @@ void MWindow::set_automation_mode(int mode) edl->local_session->get_selectionstart(), edl->local_session->get_selectionend(), mode); - int changed_edl = speed_after(1); + int changed_edl = speed_after(1, 1); save_backup(); char string[BCSTRLEN]; sprintf(string,"set %s", FloatAuto::curve_name(mode)); @@ -353,7 +353,7 @@ void MWindow::clear_automation() speed_before(); edl->tracks->clear_automation(edl->local_session->get_selectionstart(), edl->local_session->get_selectionend()); - int changed_edl = speed_after(1); + int changed_edl = speed_after(1, 1); save_backup(); undo_after(_("clear keyframes"), !changed_edl ? LOAD_AUTOMATION : @@ -366,7 +366,7 @@ int MWindow::clear_default_keyframe() undo_before(); speed_before(); edl->tracks->clear_default_keyframe(); - int changed_edl = speed_after(1); + int changed_edl = speed_after(1, 1); save_backup(); undo_after(_("clear default keyframe"), !changed_edl ? LOAD_AUTOMATION : @@ -426,6 +426,14 @@ void MWindow::clear_select() gui->draw_overlays(1); } +void MWindow::select_edits(int v) +{ + double start = edl->local_session->get_selectionstart(); + double end = edl->local_session->get_selectionend(); + edl->tracks->select_edits(start, end, v); + gui->draw_overlays(1); +} + void MWindow::concatenate_tracks() { undo_before(); @@ -669,7 +677,7 @@ int MWindow::cut_automation() copy_automation(); edl->tracks->clear_automation(edl->local_session->get_selectionstart(), edl->local_session->get_selectionend()); - int changed_edl = speed_after(1); + int changed_edl = speed_after(1, 1); save_backup(); undo_after(_("cut keyframes"), !changed_edl ? LOAD_AUTOMATION : @@ -685,7 +693,7 @@ int MWindow::cut_default_keyframe() speed_before(); copy_default_keyframe(); edl->tracks->clear_default_keyframe(); - int changed_edl = speed_after(1); + int changed_edl = speed_after(1, 1); save_backup(); undo_after(_("cut default keyframe"), !changed_edl ? LOAD_AUTOMATION : @@ -771,7 +779,7 @@ void MWindow::insert_effects_canvas(Track *dest_track, double start, double leng ArrayList shared_locations; PluginSet *pluginset = session->pluginset_highlighted; - int gang = edl->session->gang_tracks != GANG_NONE ? 1 : 0; + int gang = edl->local_session->gang_tracks != GANG_NONE ? 1 : 0; int data_type = dest_track->data_type; int first_track = 1; @@ -833,8 +841,8 @@ void MWindow::insert_effect(char *title, SharedLocation *shared_location, SharedLocation shared_location_local; shared_location_local.copy_from(shared_location); int first_track = 1; - double start_pos = edl->local_session->get_selectionstart(1); - double end_pos = edl->local_session->get_selectionend(1); + double start_pos = edl->local_session->get_selectionstart(); + double end_pos = edl->local_session->get_selectionend(); for( ; current; current=NEXT ) { if( current->data_type != data_type ) continue; if( !current->is_armed() ) continue; @@ -952,6 +960,34 @@ void MWindow::finish_modify_handles() cwindow->update(1, 0, 0, 0, 1); } +int MWindow::modify_transnhandles() +{ + gui->reset_default_message(); + gui->default_message(); + Transition *transition = session->drag_transition; + if( !transition ) return 1; + int64_t length = transition->length; + Track *track = transition->edit->track; + int64_t start_pos = track->to_units(session->drag_start, 0); + int64_t end_pos = track->to_units(session->drag_position, 0); + length += end_pos - start_pos; + if( length < 0 ) length = 0; + if( length == transition->length ) return 0; + + undo_before(); + transition->length = length; + undo_after(_("trans handle"), LOAD_EDITS); + + save_backup(); + restart_brender(); + sync_parameters(CHANGE_EDL); + update_plugin_guis(); + gui->update(1, FORCE_REDRAW, 1, 1, 1, 1, 0); + cwindow->update(1, 0, 0, 0, 1); + + return 0; +} + void MWindow::match_output_size(Track *track) { undo_before(); @@ -1156,10 +1192,10 @@ void MWindow::move_plugins_down(PluginSet *plugin_set) sync_parameters(CHANGE_EDL); } -void MWindow::move_track_down(Track *track) +void MWindow::roll_track_down(Track *track) { undo_before(); - edl->tracks->move_track_down(track); + edl->tracks->roll_track_down(track); save_backup(); undo_after(_("move track down"), LOAD_ALL); @@ -1169,10 +1205,10 @@ void MWindow::move_track_down(Track *track) save_backup(); } -void MWindow::move_tracks_down() +void MWindow::roll_tracks_down() { undo_before(); - edl->tracks->move_tracks_down(); + edl->tracks->roll_tracks_down(); save_backup(); undo_after(_("move tracks down"), LOAD_ALL); @@ -1182,10 +1218,10 @@ void MWindow::move_tracks_down() save_backup(); } -void MWindow::move_track_up(Track *track) +void MWindow::roll_track_up(Track *track) { undo_before(); - edl->tracks->move_track_up(track); + edl->tracks->roll_track_up(track); save_backup(); undo_after(_("move track up"), LOAD_ALL); restart_brender(); @@ -1194,10 +1230,10 @@ void MWindow::move_track_up(Track *track) save_backup(); } -void MWindow::move_tracks_up() +void MWindow::roll_tracks_up() { undo_before(); - edl->tracks->move_tracks_up(); + edl->tracks->roll_tracks_up(); save_backup(); undo_after(_("move tracks up"), LOAD_ALL); restart_brender(); @@ -1206,10 +1242,10 @@ void MWindow::move_tracks_up() } -void MWindow::swap_track_down(Track *track) +void MWindow::move_track_down(Track *track) { undo_before(); - edl->tracks->swap_track_down(track); + edl->tracks->move_track_down(track); save_backup(); undo_after(_("swap track down"), LOAD_ALL); @@ -1219,10 +1255,10 @@ void MWindow::swap_track_down(Track *track) save_backup(); } -void MWindow::swap_tracks_down() +void MWindow::move_tracks_down() { undo_before(); - edl->tracks->swap_tracks_down(); + edl->tracks->move_tracks_down(); save_backup(); undo_after(_("swap tracks down"), LOAD_ALL); @@ -1232,10 +1268,10 @@ void MWindow::swap_tracks_down() save_backup(); } -void MWindow::swap_track_up(Track *track) +void MWindow::move_track_up(Track *track) { undo_before(); - edl->tracks->swap_track_up(track); + edl->tracks->move_track_up(track); save_backup(); undo_after(_("swap track up"), LOAD_ALL); restart_brender(); @@ -1244,10 +1280,10 @@ void MWindow::swap_track_up(Track *track) save_backup(); } -void MWindow::swap_tracks_up() +void MWindow::move_tracks_up() { undo_before(); - edl->tracks->swap_tracks_up(); + edl->tracks->move_tracks_up(); save_backup(); undo_after(_("swap tracks up"), LOAD_ALL); restart_brender(); @@ -1494,7 +1530,7 @@ int MWindow::paste_automation() edl->tracks->clear_automation(start, end); edl->tracks->paste_automation(start, &file, 0, 1, edl->session->typeless_keyframes); - int changed_edl = speed_after(1); + int changed_edl = speed_after(1, 0); save_backup(); undo_after(_("paste keyframes"), !changed_edl ? LOAD_AUTOMATION : @@ -1521,7 +1557,7 @@ int MWindow::paste_default_keyframe() edl->tracks->paste_automation(start, &file, 1, 0, edl->session->typeless_keyframes); // edl->tracks->paste_default_keyframe(&file); - int changed_edl = speed_after(1); + int changed_edl = speed_after(1, 1); undo_after(_("paste default keyframe"), !changed_edl ? LOAD_AUTOMATION : LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); @@ -1554,7 +1590,7 @@ int MWindow::paste_edls(ArrayList *new_edls, int load_mode, // Delete current project if( load_mode == LOADMODE_REPLACE || load_mode == LOADMODE_REPLACE_CONCATENATE ) { - reset_caches(); + reset_caches(1); edl->save_defaults(defaults); hide_plugins(); edl->Garbage::remove_user(); @@ -2574,12 +2610,13 @@ void MWindow::cut_commercials() #endif } -int MWindow::normalize_speed(EDL *old_edl, EDL *new_edl) +int MWindow::normalize_speed(EDL *old_edl, EDL *new_edl, int edit_speed) { + int edit_plugins = edl->session->plugins_follow_edits; + int edit_autos = edl->session->autos_follow_edits; + int edit_labels = edl->session->labels_follow_edits; + if( !edit_autos ) edit_speed = 0; int result = 0, first_track = 1; - int plugins_follow_edits = edl->session->plugins_follow_edits; - int autos_follow_edits = edl->session->autos_follow_edits; - int labels_follow_edits = edl->session->labels_follow_edits; Track *old_track = old_edl->tracks->first; Track *new_track = new_edl->tracks->first; for( ; old_track && new_track; old_track=old_track->next, new_track=new_track->next ) { @@ -2593,102 +2630,105 @@ int MWindow::normalize_speed(EDL *old_edl, EDL *new_edl) old_speed = (FloatAuto *)old_speed->next; new_speed = (FloatAuto *)new_speed->next; } + if( !old_speed && !new_speed ) continue; + result = 1; + if( edit_speed ) { + Autos *old_autos = old_track->automation->autos[AUTOMATION_SPEED]; + Autos *new_autos = new_track->automation->autos[AUTOMATION_SPEED]; + Auto *old_auto = old_autos ? old_autos->first : 0; + for( ; old_auto; old_auto=old_auto->next ) { + Auto *new_auto = new_autos->get_auto(old_auto->orig_id); + if( !new_auto ) continue; + int64_t auto_pos = old_auto->position; + double orig_pos = old_speeds->automation_integral(0, auto_pos, PLAY_FORWARD); + auto_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1); + new_auto->position = auto_pos; + } + } Edit *old_edit = old_track->edits->first; - Edit *new_edit = new_track->edits->first; - while( old_edit && new_edit ) { + for( ; old_edit; old_edit=old_edit->next ) { + Edit *new_edit = new_track->edits->get_edit(old_edit->orig_id); + if( !new_edit ) continue; int64_t edit_start = old_edit->startproject; int64_t edit_end = edit_start + old_edit->length; - if( old_speed || new_speed ) { - double orig_start = old_speeds->automation_integral(0, edit_start, PLAY_FORWARD); - double orig_end = old_speeds->automation_integral(0, edit_end, PLAY_FORWARD); - edit_start = new_track->frame_align(new_speeds->speed_position(orig_start), 1); - edit_end = new_track->frame_align(new_speeds->speed_position(orig_end), 1); - result = 1; - } + double orig_start = old_speeds->automation_integral(0, edit_start, PLAY_FORWARD); + double orig_end = old_speeds->automation_integral(0, edit_end, PLAY_FORWARD); + edit_start = new_track->frame_align(new_speeds->speed_position(orig_start), 1); + edit_end = new_track->frame_align(new_speeds->speed_position(orig_end), 1); new_edit->startproject = edit_start; new_edit->length = edit_end - edit_start; - old_edit = old_edit->next; - new_edit = new_edit->next; } if( first_track && old_track->is_armed() ) { - if( labels_follow_edits ) { - Labels *old_labels = old_edl->labels; - Labels *new_labels = new_edl->labels; - Label *old_label = old_labels ? old_labels->first : 0; - Label *new_label = new_labels ? new_labels->first : 0; - while( old_label && new_label ) { + Labels *old_labels = old_edl->labels; + Labels *new_labels = new_edl->labels; + if( edit_labels && old_labels && new_labels ) { + Label *old_label = old_labels->first; + for( ; old_label; old_label=old_label->next ) { + Label *new_label = new_labels->get_label(old_label->orig_id); + if( !new_label ) continue; int64_t label_pos = old_track->to_units(old_label->position, 1); - if( old_speed || new_speed ) { - double orig_pos = old_speeds->automation_integral(0, label_pos, PLAY_FORWARD); - label_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1); - result = 1; - } + double orig_pos = old_speeds->automation_integral(0, label_pos, PLAY_FORWARD); + label_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1); new_label->position = new_track->from_units(label_pos); - old_label = old_label->next; - new_label = new_label->next; } } first_track = 0; } - if( autos_follow_edits ) { - for( int i=0; iautomation->autos[i]; - Autos *new_autos = new_track->automation->autos[i]; - Auto *old_auto = old_autos ? old_autos->first : 0; - Auto *new_auto = new_autos ? new_autos->first : 0; - while( old_auto && new_auto ) { - int64_t auto_pos = old_auto->position; - if( old_speed || new_speed ) { - double orig_pos = old_speeds->automation_integral(0, auto_pos, PLAY_FORWARD); - auto_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1); - result = 1; - } - new_auto->position = auto_pos; - old_auto = old_auto->next; - new_auto = new_auto->next; - } - } - } - if( !plugins_follow_edits ) continue; - int old_size = old_track->plugin_set.size(); - int new_size = new_track->plugin_set.size(); - int n = bmin(old_size, new_size); - for( int i=0; iplugin_set[i]; - Plugin *old_plugin = (Plugin *)(old_plugin_set ? old_plugin_set->first : 0); - PluginSet *new_plugin_set = new_track->plugin_set[i]; - Plugin *new_plugin = (Plugin *)(new_plugin_set ? new_plugin_set->first : 0); - while( old_plugin && new_plugin ) { - int64_t plugin_start = old_plugin->startproject; - int64_t plugin_end = plugin_start + old_plugin->length; - if( old_speed || new_speed ) { + if( edit_plugins ) { + int old_size = old_track->plugin_set.size(); + int new_size = new_track->plugin_set.size(); + int n = bmin(old_size, new_size); + for( int i=0; iplugin_set[i]; + if( !old_plugin_set ) continue; + PluginSet *new_plugin_set = new_track->plugin_set[i]; + if( !new_plugin_set ) continue; + Plugin *old_plugin = (Plugin *)old_plugin_set->first; + for( ; old_plugin; old_plugin=(Plugin *)old_plugin->next ) { + Plugin *new_plugin = (Plugin *)new_plugin_set->get_edit(old_plugin->orig_id); + if( !new_plugin ) continue; + int64_t plugin_start = old_plugin->startproject; + int64_t plugin_end = plugin_start + old_plugin->length; double orig_start = old_speeds->automation_integral(0, plugin_start, PLAY_FORWARD); double orig_end = old_speeds->automation_integral(0, plugin_end, PLAY_FORWARD); plugin_start = new_track->frame_align(new_speeds->speed_position(orig_start), 1); plugin_end = new_track->frame_align(new_speeds->speed_position(orig_end), 1); - result = 1; - } - new_plugin->startproject = plugin_start; - new_plugin->length = plugin_end - plugin_start; - if( autos_follow_edits ) { - KeyFrames *old_keyframes = old_plugin->keyframes; - Auto *old_auto = old_keyframes ? old_keyframes->first : 0; - KeyFrames *new_keyframes = new_plugin->keyframes; - Auto *new_auto = new_keyframes ? new_keyframes->first : 0; - while( old_auto && new_auto ) { - int64_t auto_pos = old_auto->position; - if( old_speed || new_speed ) { + new_plugin->startproject = plugin_start; + new_plugin->length = plugin_end - plugin_start; + if( edit_autos ) { + KeyFrames *old_keyframes = old_plugin->keyframes; + if( !old_keyframes ) continue; + KeyFrames *new_keyframes = new_plugin->keyframes; + if( !new_keyframes ) continue; + Auto *old_auto = old_keyframes->first; + for( ; old_auto; old_auto=old_auto->next ) { + Auto *new_auto = new_keyframes->get_auto(old_auto->orig_id); + if( !new_auto ) continue; + int64_t auto_pos = old_auto->position; double orig_pos = old_speeds->automation_integral(0, auto_pos, PLAY_FORWARD); auto_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1); - result = 1; + new_auto->position = auto_pos; + old_auto = old_auto->next; } - new_auto->position = auto_pos; - old_auto = old_auto->next; - new_auto = new_auto->next; } } - old_plugin = (Plugin *)old_plugin->next; - new_plugin = (Plugin *)new_plugin->next; + } + } + if( edit_autos ) { // speed must be last + for( int i=0; iautomation->autos[i]; + if( !old_autos ) continue; + Autos *new_autos = new_track->automation->autos[i]; + if( !new_autos ) continue; + Auto *old_auto = old_autos->first; + for( ; old_auto; old_auto=old_auto->next ) { + Auto *new_auto = new_autos->get_auto(old_auto->orig_id); + if( !new_auto ) continue; + int64_t auto_pos = old_auto->position; + double orig_pos = old_speeds->automation_integral(0, auto_pos, PLAY_FORWARD); + auto_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1); + new_auto->position = auto_pos; + } } } } @@ -2704,12 +2744,12 @@ void MWindow::speed_before() speed_edl->copy_all(edl); } -int MWindow::speed_after(int done) +int MWindow::speed_after(int done, int edit_speed) { int result = 0; if( speed_edl ) { if( done >= 0 ) - result = normalize_speed(speed_edl, edl); + result = normalize_speed(speed_edl, edl, edit_speed); if( done != 0 ) { speed_edl->remove_user(); speed_edl = 0; @@ -2829,6 +2869,10 @@ int MWindow::masters_to_mixers() for( ; track && !track->master; track=track->next ) mixer_last = track; Track *next_track = track; + if( !master_track->armed ) { + master_track = next_track; + continue; + } Mixer *master_mixer = 0; for( int i=0, n=edl->mixers.size(); iindex_in(edl->mixers[i]) >= 0 ) {