repair default keyframe load, tweak init default histogram threshold
[goodguy/history.git] / cinelerra-5.1 / cinelerra / tracksedit.C
index 77f31e5c0a59d9ce9f621f0c298d543817d5bcac..4a836b96a1fb15755d52c498c290ada63c858c65 100644 (file)
 #include "vtrack.h"
 #include <string.h>
 
+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<Edit*> *edits, 
+void Tracks::move_edits(ArrayList<Edit*> *edits,
        Track *track,
        double position,
        int edit_labels,  // Ignored
@@ -605,15 +632,18 @@ void Tracks::move_edits(ArrayList<Edit*> *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<Edit*> *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<Edit*> *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<Edit*> *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);