add bump floatautos, add time_references for align timecodes, add menuitem create_key...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / tracksedit.C
index f1684204d4fdb8d9f74296e7e41c000825b3789c..a3dfca741e4a69f784285087a934e65b2ead7e98 100644 (file)
@@ -697,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,
@@ -922,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)
@@ -957,7 +1013,6 @@ void Tracks::paste_automation(double selectionstart,
        Track* current_atrack = 0;
        Track* current_vtrack = 0;
        Track* dst_track = 0;
-       int src_type;
        int result = 0;
        double length;
        double frame_rate = edl->session->frame_rate;
@@ -966,10 +1021,9 @@ void Tracks::paste_automation(double selectionstart,
        string[0] = 0;
 
 // Search for start
-       do{
-         result = file->read_tag();
-       }while(!result &&
-               !file->tag.title_is("AUTO_CLIPBOARD"));
+       do {
+               result = file->read_tag();
+       } while(!result && !file->tag.title_is("AUTO_CLIPBOARD"));
 
        if(!result)
        {
@@ -977,7 +1031,6 @@ void Tracks::paste_automation(double selectionstart,
                frame_rate = file->tag.get_property("FRAMERATE", frame_rate);
                sample_rate = file->tag.get_property("SAMPLERATE", sample_rate);
 
-
                do
                {
                        result = file->read_tag();
@@ -992,15 +1045,9 @@ void Tracks::paste_automation(double selectionstart,
                                if(file->tag.title_is("TRACK"))
                                {
                                        file->tag.get_property("TYPE", string);
-                                       if(!strcmp(string, "AUDIO"))
-                                       {
-                                               src_type = TRACK_AUDIO;
-                                       }
-                                       else
-                                       {
-                                               src_type = TRACK_VIDEO;
-                                       }
-
+                                       double src_rate = !strcmp(string, "AUDIO") ?
+                                               sample_rate : frame_rate;
+                                       double src_length = length / src_rate;
 // paste to any media type
                                        if(typeless)
                                        {
@@ -1042,22 +1089,9 @@ void Tracks::paste_automation(double selectionstart,
 
                                        if(dst_track)
                                        {
-                                               double frame_rate2 = frame_rate;
-                                               double sample_rate2 = sample_rate;
-
-                                               if(src_type != dst_track->data_type)
-                                               {
-                                                       frame_rate2 = sample_rate;
-                                                       sample_rate2 = frame_rate;
-                                               }
-
-                                               dst_track->paste_automation(selectionstart,
-                                                       length,
-                                                       frame_rate2,
-                                                       sample_rate2,
-                                                       file,
-                                                       default_only,
-                                                       active_only);
+                                               dst_track->paste_automation(file,
+                                                       selectionstart, src_length, src_rate,
+                                                       default_only, active_only);
                                        }
                                }
                        }