bug fix for In/Out pointer Attach Effect on empty track/location - Andrew+Anon
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / mwindowedit.C
index 7b359ce2d817bb5672049bf4ea03a2c4f6143acd..458ced964e8f3418505b7d27ccf19adb80662dd0 100644 (file)
@@ -426,11 +426,11 @@ void MWindow::clear_select()
        gui->draw_overlays(1);
 }
 
-void MWindow::select_edits()
+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);
+       edl->tracks->select_edits(start, end, v);
        gui->draw_overlays(1);
 }
 
@@ -779,7 +779,7 @@ void MWindow::insert_effects_canvas(Track *dest_track, double start, double leng
 
        ArrayList<SharedLocation> 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;
 
@@ -841,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;
@@ -960,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();
@@ -1164,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);
 
@@ -1177,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);
 
@@ -1190,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();
@@ -1202,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();
@@ -1214,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);
 
@@ -1227,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);
 
@@ -1240,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();
@@ -1252,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();
@@ -1562,7 +1590,7 @@ int MWindow::paste_edls(ArrayList<EDL*> *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();
@@ -2602,56 +2630,46 @@ int MWindow::normalize_speed(EDL *old_edl, EDL *new_edl, int edit_speed)
                        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;
-                       Auto *new_auto = new_autos ? new_autos->first : 0;
-                       while( old_auto && new_auto ) {
+                       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;
-                               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;
-                               }
+                               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;
-                               old_auto = old_auto->next;
-                               new_auto = new_auto->next;
                        }
                }
                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( edit_labels ) {
-                               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;
@@ -2662,59 +2680,54 @@ int MWindow::normalize_speed(EDL *old_edl, EDL *new_edl, int edit_speed)
                        int n = bmin(old_size, new_size);
                        for( int i=0; i<n; ++i ) {
                                PluginSet *old_plugin_set = old_track->plugin_set[i];
-                               Plugin *old_plugin = (Plugin *)(old_plugin_set ? old_plugin_set->first : 0);
+                               if( !old_plugin_set ) continue;
                                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 ) {
+                               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;
-                                       if( old_speed || new_speed ) {
-                                               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;
-                                       }
+                                       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);
                                        new_plugin->startproject = plugin_start;
                                        new_plugin->length = plugin_end - plugin_start;
                                        if( edit_autos ) {
                                                KeyFrames *old_keyframes = old_plugin->keyframes;
-                                               Auto *old_auto = old_keyframes ? old_keyframes->first : 0;
+                                               if( !old_keyframes ) continue;
                                                KeyFrames *new_keyframes = new_plugin->keyframes;
-                                               Auto *new_auto = new_keyframes ? new_keyframes->first : 0;
-                                               while( old_auto && new_auto ) {
+                                               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;
-                                                       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;
-                                                       }
+                                                       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;
                                                        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; i<AUTOMATION_SPEED; ++i ) {
                                Autos *old_autos = old_track->automation->autos[i];
+                               if( !old_autos ) continue;
                                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 ) {
+                               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;
-                                       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;
-                                       }
+                                       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;
-                                       old_auto = old_auto->next;
-                                       new_auto = new_auto->next;
                                }
                        }
                }
@@ -2856,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(); i<n; ++i ) {
                        if( master_track->index_in(edl->mixers[i]) >= 0 ) {