-//printf("Tracks::move_edits 2 %s %s %d\n", source_track->title, dest_track->title, source_edit->length);
- if(source_edit)
- {
- int64_t position_i = source_track->to_units(position, 0);
-// Source edit changes
- int64_t source_length = source_edit->length;
- int64_t source_startproject = source_edit->startproject;
-
- if (behaviour == 0)
- {
- // 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,
- 0,
- 0);
- temp.terminate_string();
- temp.rewind();
-// 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,
- &temp_autoconf,
- 1);
- int64_t position_a = position_i;
- if (dest_track == source_track)
- {
- if (position_a > source_edit->startproject)
- position_a -= source_length;
- }
-
- dest_track->automation->paste_silence(position_a,
- position_a + source_length);
- while(!temp.read_tag())
- 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,
- source_length);
- 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_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,
- NULL);
- temp.terminate_string();
- temp.rewind();
- 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,
- 0,
- &temp_autoconf);
- */
-
-
- } else
- if (behaviour == 1)
- // 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();
- 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_startproject + source_length);
- source_track->edits->paste_silence(source_startproject,
- source_startproject + source_length);
-
- 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,
- dest_track->edits->create_edit());
- result->copy_from(temp_edit);
- result->startproject = position_i;
- result->length = source_length;
- delete temp_edit;
- }
- source_track->optimize();
- dest_track->optimize();
+ FileXML track_xml;
+ source_track->copy(COPY_TRACKS, source_start, source_end, &track_xml, "");
+ if( !track_xml.read_tag() )
+ clip_track->load(&track_xml, 0, LOAD_ALL);
+
+ if( !mode ) { // mute and overwrite
+ source_track->clear(start, end, 1, 0,
+ edit_plugins, edit_autos, 0);
+ source_track->edits->paste_silence(start, end);
+ if( edit_autos )
+ source_track->shift_keyframes(start, length);
+ if( edit_plugins ) {
+ int n = source_track->plugin_set.size();
+ if( n > 0 ) dest_track->expand_view = 1;
+ for( int k=0; k<n; ++k )
+ source_track->plugin_set[k]->paste_silence(start, end, 1);
+ }
+ dest_track->clear(dest_start, dest_end, 1, 0,
+ edit_plugins, edit_autos, 0);
+ dest_track->insert_track(clip_track, dest_start, 0,
+ edit_plugins, edit_autos, len);
+ }
+ else { // cut and paste
+ dest_track->insert_track(clip_track, dest_start, 0,
+ edit_plugins, edit_autos, len);
+ if( source_track == dest_track && dest_start < source_start ) {
+ source_start += len; source_end += len;