-EDL *MWindow::selected_edits_to_clip(int packed,
- double *start_position, Track **start_track,
- int edit_labels, int edit_autos, int edit_plugins)
-{
- double start = DBL_MAX, end = DBL_MIN;
- Track *first_track=0, *last_track = 0;
- for( Track *track=edl->tracks->first; track; track=track->next ) {
- if( !track->record ) continue;
- int empty = 1;
- for( Edit *edit=track->edits->first; edit; edit=edit->next ) {
- if( !edit->is_selected || edit->silence() ) continue;
- double edit_pos = track->from_units(edit->startproject);
- if( start > edit_pos ) start = edit_pos;
- if( end < (edit_pos+=edit->length) ) end = edit_pos;
- empty = 0;
- }
- if( empty ) continue;
- if( !first_track ) first_track = track;
- last_track = track;
- }
- if( start_position ) *start_position = start;
- if( start_track ) *start_track = first_track;
- if( !first_track ) return 0;
- EDL *new_edl = new EDL();
- new_edl->create_objects();
- new_edl->copy_session(edl);
- const char *text = _("new_edl edit");
- new_edl->set_path(text);
- strcpy(new_edl->local_session->clip_title, text);
- strcpy(new_edl->local_session->clip_notes, text);
- new_edl->session->video_tracks = 0;
- new_edl->session->audio_tracks = 0;
- for( Track *track=edl->tracks->first; track; track=track->next ) {
- if( !track->record ) continue;
- if( first_track ) {
- if( first_track != track ) continue;
- first_track = 0;
- }
- Track *new_track = 0;
- if( !packed )
- new_track = new_edl->add_new_track(track->data_type);
- int64_t start_pos = track->to_units(start, 0);
- int64_t end_pos = track->to_units(end, 0);
- int64_t startproject = 0;
- Edit *edit = track->edits->first;
- for( ; edit; edit=edit->next ) {
- if( !edit->is_selected || edit->silence() ) continue;
- if( edit->startproject < start_pos ) continue;
- if( edit->startproject >= end_pos ) break;
- int64_t edit_start_pos = edit->startproject;
- int64_t edit_end_pos = edit->startproject + edit->length;
- if( !new_track )
- new_track = new_edl->add_new_track(track->data_type);
- int64_t edit_pos = edit_start_pos - start_pos;
- if( !packed && edit_pos > startproject ) {
- Edit *silence = new Edit(new_edl, new_track);
- silence->startproject = startproject;
- silence->length = edit_pos - startproject;
- new_track->edits->append(silence);
- startproject = edit_pos;
- }
- int64_t clip_start_pos = startproject;
- Edit *clip_edit = new Edit(new_edl, new_track);
- clip_edit->copy_from(edit);
- clip_edit->startproject = startproject;
- startproject += clip_edit->length;
- new_track->edits->append(clip_edit);
- if( edit_labels ) {
- double edit_start = track->from_units(edit_start_pos);
- double edit_end = track->from_units(edit_end_pos);
- double clip_start = new_track->from_units(clip_start_pos);
- Label *label = edl->labels->first;
- for( ; label; label=label->next ) {
- if( label->position < edit_start ) continue;
- if( label->position >= edit_end ) break;
- double clip_position = label->position - edit_start + clip_start;
- Label *clip_label = new_edl->labels->first;
- while( clip_label && clip_label->position<clip_position )
- clip_label = clip_label->next;
- if( clip_label && clip_label->position == clip_position ) continue;
- Label *new_label = new Label(new_edl,
- new_edl->labels, clip_position, label->textstr);
- new_edl->labels->insert_before(clip_label, new_label);
- }
- }
- if( edit_autos ) {
- Automation *automation = track->automation;
- Automation *new_automation = new_track->automation;
- for( int i=0; i<AUTOMATION_TOTAL; ++i ) {
- Autos *autos = automation->autos[i];
- if( !autos ) continue;
- Autos *new_autos = new_automation->autos[i];
- new_autos->default_auto->copy_from(autos->default_auto);
- Auto *aut0 = autos->first;
- for( ; aut0; aut0=aut0->next ) {
- if( aut0->position < edit_start_pos ) continue;
- if( aut0->position >= edit_end_pos ) break;
- Auto *new_auto = new_autos->new_auto();
- new_auto->copy_from(aut0);
- int64_t clip_position = aut0->position - edit_start_pos + clip_start_pos;
- new_auto->position = clip_position;
- new_autos->append(new_auto);
- }
- }
- }
- if( edit_plugins ) {
- while( new_track->plugin_set.size() < track->plugin_set.size() )
- new_track->plugin_set.append(0);
- for( int i=0; i<track->plugin_set.total; ++i ) {
- PluginSet *plugin_set = track->plugin_set[i];
- if( !plugin_set ) continue;
- PluginSet *new_plugin_set = new_track->plugin_set[i];
- if( !new_plugin_set ) {
- new_plugin_set = new PluginSet(new_edl, new_track);
- new_track->plugin_set[i] = new_plugin_set;
- }
- Plugin *plugin = (Plugin*)plugin_set->first;
- int64_t startplugin = new_plugin_set->length();
- for( ; plugin ; plugin=(Plugin*)plugin->next ) {
- if( plugin->silence() ) continue;
- int64_t plugin_start_pos = plugin->startproject;
- int64_t plugin_end_pos = plugin_start_pos + plugin->length;
- if( plugin_end_pos < start_pos ) continue;
- if( plugin_start_pos > end_pos ) break;
- if( plugin_start_pos < edit_start_pos )
- plugin_start_pos = edit_start_pos;
- if( plugin_end_pos > edit_end_pos )
- plugin_end_pos = edit_end_pos;
- if( plugin_start_pos >= plugin_end_pos ) continue;
- int64_t plugin_pos = plugin_start_pos - start_pos;
- if( !packed && plugin_pos > startplugin ) {
- Plugin *silence = new Plugin(new_edl, new_track, "");
- silence->startproject = startplugin;
- silence->length = plugin_pos - startplugin;
- new_plugin_set->append(silence);
- startplugin = plugin_pos;
- }
- Plugin *new_plugin = new Plugin(new_edl, new_track, plugin->title);
- new_plugin->copy_base(plugin);
- new_plugin->startproject = startplugin;
- new_plugin->length = plugin_end_pos - plugin_start_pos;
- startplugin += new_plugin->length;
- new_plugin_set->append(new_plugin);
- KeyFrames *keyframes = plugin->keyframes;
- KeyFrames *new_keyframes = new_plugin->keyframes;
- new_keyframes->default_auto->copy_from(keyframes->default_auto);
- new_keyframes->default_auto->position = new_plugin->startproject;
- KeyFrame *keyframe = (KeyFrame*)keyframes->first;
- for( ; keyframe; keyframe=(KeyFrame*)keyframe->next ) {
- if( keyframe->position < edit_start_pos ) continue;
- if( keyframe->position >= edit_end_pos ) break;
- KeyFrame *clip_keyframe = new KeyFrame(new_edl, new_keyframes);
- clip_keyframe->copy_from(keyframe);
- int64_t key_position = keyframe->position - start_pos;
- if( packed )
- key_position += new_plugin->startproject - plugin_pos;
- clip_keyframe->position = key_position;
- new_keyframes->append(clip_keyframe);
- }
- }
- }
- }
- }
- if( last_track == track ) break;
- }
- return new_edl;
-}
-
-void MWindow::selected_edits_to_clipboard(int packed)
-{
- EDL *new_edl = selected_edits_to_clip(packed, 0, 0,
- edl->session->labels_follow_edits,
- edl->session->autos_follow_edits,
- edl->session->plugins_follow_edits);
- if( !new_edl ) return;
- double length = new_edl->tracks->total_length();
- FileXML file;
- new_edl->copy(0, length, 1, &file, "", 1);
- const char *file_string = file.string();
- long file_length = strlen(file_string);
- gui->to_clipboard(file_string, file_length, BC_PRIMARY_SELECTION);
- gui->to_clipboard(file_string, file_length, SECONDARY_SELECTION);
- new_edl->remove_user();
-}
-