3 * Copyright (C) 1997-2012 Adam Williams <broadcast at earthling dot net>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "awindowgui.h"
25 #include "bcsignals.h"
29 #include "commercials.h"
30 #include "cplayback.h"
33 #include "cwindowgui.h"
36 #include "edlsession.h"
38 #include "floatauto.h"
39 #include "floatautos.h"
41 #include "gwindowgui.h"
45 #include "levelwindow.h"
46 #include "localsession.h"
47 #include "mainclock.h"
48 #include "maincursor.h"
49 #include "mainerror.h"
50 #include "mainindexes.h"
52 #include "mainsession.h"
54 #include "maskautos.h"
56 #include "mwindowgui.h"
60 #include "playbackengine.h"
61 #include "pluginset.h"
62 #include "recordlabel.h"
63 #include "samplescroll.h"
64 #include "trackcanvas.h"
66 #include "trackscroll.h"
68 #include "transition.h"
69 #include "transportque.h"
71 #include "vplayback.h"
73 #include "vwindowgui.h"
85 void MWindow::add_audio_track_entry(int above, Track *dst)
87 undo->update_undo_before();
88 add_audio_track(above, dst);
90 undo->update_undo_after(_("add track"), LOAD_ALL);
100 gui->activate_timeline();
102 // gui->get_scrollbars(0);
103 // gui->canvas->draw();
104 // gui->patchbay->update();
105 // gui->cursor->draw(1);
106 // gui->canvas->flash();
107 // gui->canvas->activate();
108 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
114 void MWindow::add_video_track_entry(Track *dst)
116 undo->update_undo_before();
117 add_video_track(1, dst);
118 undo->update_undo_after(_("add track"), LOAD_ALL);
129 gui->activate_timeline();
130 // gui->get_scrollbars(0);
131 // gui->canvas->draw();
132 // gui->patchbay->update();
133 // gui->cursor->draw(1);
134 // gui->canvas->flash();
135 // gui->canvas->activate();
136 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
143 void MWindow::add_subttl_track_entry(Track *dst)
145 undo->update_undo_before();
146 add_subttl_track(1, dst);
147 undo->update_undo_after(_("add track"), LOAD_ALL);
150 // gui->get_scrollbars(0);
151 // gui->canvas->draw();
152 // gui->patchbay->update();
153 // gui->cursor->draw(1);
154 // gui->canvas->flash();
155 // gui->canvas->activate();
156 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
164 int MWindow::add_audio_track(int above, Track *dst)
166 edl->tracks->add_audio_track(above, dst);
167 edl->tracks->update_y_pixels(theme);
172 int MWindow::add_video_track(int above, Track *dst)
174 edl->tracks->add_video_track(above, dst);
175 edl->tracks->update_y_pixels(theme);
180 int MWindow::add_subttl_track(int above, Track *dst)
182 edl->tracks->add_subttl_track(above, dst);
183 edl->tracks->update_y_pixels(theme);
191 void MWindow::asset_to_all()
193 if(!session->drag_assets->size()) return;
194 Indexable *indexable = session->drag_assets->get(0);
196 // if(indexable->have_video())
200 undo->update_undo_before();
203 w = indexable->get_w();
204 h = indexable->get_h();
205 double new_framerate = session->drag_assets->get(0)->get_frame_rate();
206 double old_framerate = edl->session->frame_rate;
207 int old_samplerate = edl->session->sample_rate;
208 int new_samplerate = session->drag_assets->get(0)->get_sample_rate();
211 if(indexable->have_video())
213 edl->session->output_w = w;
214 edl->session->output_h = h;
215 edl->session->frame_rate = new_framerate;
216 create_aspect_ratio(edl->session->aspect_w,
217 edl->session->aspect_h,
221 for(Track *current = edl->tracks->first;
225 if(current->data_type == TRACK_VIDEO /* &&
228 current->track_w = w;
229 current->track_h = h;
234 if(((edl->session->output_w % 4) ||
235 (edl->session->output_h % 4)) &&
236 edl->session->playback_config->vconfig->driver == PLAYBACK_X11_GL)
238 MainError::show_error(
239 _("This project's dimensions are not multiples of 4 so\n"
240 "it can't be rendered by OpenGL."));
245 if(defaults->get("AUTOASPECT", 0))
247 create_aspect_ratio(edl->session->aspect_w,
248 edl->session->aspect_h,
254 if(indexable->have_audio())
256 edl->session->sample_rate = new_samplerate;
257 edl->resample(old_framerate, new_framerate, TRACK_VIDEO);
258 edl->resample(old_samplerate, new_samplerate, TRACK_AUDIO);
264 undo->update_undo_after(_("asset to all"), LOAD_ALL);
273 sync_parameters(CHANGE_ALL);
282 void MWindow::asset_to_size()
284 if(!session->drag_assets->size()) return;
285 Indexable *indexable = session->drag_assets->get(0);
287 if(indexable->have_video())
290 undo->update_undo_before();
293 w = indexable->get_w();
294 h = indexable->get_h();
297 edl->session->output_w = w;
298 edl->session->output_h = h;
300 if(((edl->session->output_w % 4) ||
301 (edl->session->output_h % 4)) &&
302 edl->session->playback_config->vconfig->driver == PLAYBACK_X11_GL)
304 MainError::show_error(
305 _("This project's dimensions are not multiples of 4 so\n"
306 "it can't be rendered by OpenGL."));
311 if(defaults->get("AUTOASPECT", 0))
313 create_aspect_ratio(edl->session->aspect_w,
314 edl->session->aspect_h,
321 undo->update_undo_after(_("asset to size"), LOAD_ALL);
323 sync_parameters(CHANGE_ALL);
328 void MWindow::asset_to_rate()
330 if(session->drag_assets->size() &&
331 session->drag_assets->get(0)->have_video())
333 double new_framerate = session->drag_assets->get(0)->get_frame_rate();
334 double old_framerate = edl->session->frame_rate;
335 undo->update_undo_before();
337 edl->session->frame_rate = new_framerate;
338 edl->resample(old_framerate, new_framerate, TRACK_VIDEO);
342 undo->update_undo_after(_("asset to rate"), LOAD_ALL);
351 sync_parameters(CHANGE_ALL);
357 void MWindow::clear_entry()
359 undo->update_undo_before();
364 undo->update_undo_after(_("clear"), LOAD_EDITS | LOAD_TIMEBAR);
367 update_plugin_guis();
368 gui->update(1, 2, 1, 1, 1, 1, 0);
369 cwindow->update(1, 0, 0, 0, 1);
370 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
376 void MWindow::clear(int clear_handle)
378 double start = edl->local_session->get_selectionstart();
379 double end = edl->local_session->get_selectionend();
380 if(clear_handle || !EQUIV(start, end))
384 edl->session->labels_follow_edits,
385 edl->session->plugins_follow_edits,
386 edl->session->autos_follow_edits);
390 void MWindow::set_automation_mode(int mode)
392 undo->update_undo_before();
393 edl->tracks->set_automation_mode(
394 edl->local_session->get_selectionstart(),
395 edl->local_session->get_selectionend(),
399 if(mode == Auto::LINEAR)
400 undo->update_undo_after(_("set linear"), LOAD_AUTOMATION);
402 undo->update_undo_after(_("set bezier"), LOAD_AUTOMATION);
405 update_plugin_guis();
406 gui->draw_overlays(1);
407 sync_parameters(CHANGE_PARAMS);
408 gui->update_patchbay();
409 cwindow->update(1, 0, 0);
412 void MWindow::clear_automation()
414 undo->update_undo_before();
415 edl->tracks->clear_automation(edl->local_session->get_selectionstart(),
416 edl->local_session->get_selectionend());
418 undo->update_undo_after(_("clear keyframes"), LOAD_AUTOMATION);
421 update_plugin_guis();
422 gui->draw_overlays(1);
423 sync_parameters(CHANGE_PARAMS);
424 gui->update_patchbay();
425 cwindow->update(1, 0, 0);
428 int MWindow::clear_default_keyframe()
430 undo->update_undo_before();
431 edl->tracks->clear_default_keyframe();
433 undo->update_undo_after(_("clear default keyframe"), LOAD_AUTOMATION);
436 gui->draw_overlays(1);
437 sync_parameters(CHANGE_PARAMS);
438 gui->update_patchbay();
439 cwindow->update(1, 0, 0);
444 void MWindow::clear_labels()
446 undo->update_undo_before();
447 clear_labels(edl->local_session->get_selectionstart(),
448 edl->local_session->get_selectionend());
449 undo->update_undo_after(_("clear labels"), LOAD_TIMEBAR);
451 gui->update_timebar(1);
452 cwindow->update(0, 0, 0, 0, 1);
456 int MWindow::clear_labels(double start, double end)
458 edl->labels->clear(start, end, 0);
462 void MWindow::concatenate_tracks()
464 undo->update_undo_before();
465 edl->tracks->concatenate_tracks(edl->session->plugins_follow_edits,
466 edl->session->autos_follow_edits);
468 undo->update_undo_after(_("concatenate tracks"), LOAD_EDITS);
471 gui->update(1, 1, 0, 0, 1, 0, 0);
472 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
481 copy(edl->local_session->get_selectionstart(),
482 edl->local_session->get_selectionend());
485 int MWindow::copy(double start, double end)
487 if(start == end) return 1;
489 //printf("MWindow::copy 1\n");
491 //printf("MWindow::copy 1\n");
500 //printf("MWindow::copy 1\n");
502 // File is now terminated and rewound
504 //printf("MWindow::copy 1\n");
505 const char *file_string = file.string();
506 long file_length = strlen(file_string);
507 gui->get_clipboard()->to_clipboard(file_string, file_length,
508 SECONDARY_SELECTION);
509 gui->get_clipboard()->to_clipboard(file_string, file_length,
510 BC_PRIMARY_SELECTION);
511 //printf("MWindow::copy\n%s\n", file.string);
512 //printf("MWindow::copy 2\n");
517 int MWindow::copy_automation()
520 edl->tracks->copy_automation(edl->local_session->get_selectionstart(),
521 edl->local_session->get_selectionend(),
525 const char *file_string = file.string();
526 long file_length = strlen(file_string);
527 gui->get_clipboard()->to_clipboard(file_string, file_length,
528 BC_PRIMARY_SELECTION);
529 gui->get_clipboard()->to_clipboard(file_string, file_length,
530 SECONDARY_SELECTION);
534 int MWindow::copy_default_keyframe()
537 edl->tracks->copy_automation(edl->local_session->get_selectionstart(),
538 edl->local_session->get_selectionend(),
542 const char *file_string = file.string();
543 long file_length = strlen(file_string);
544 gui->get_clipboard()->to_clipboard(file_string, file_length,
545 BC_PRIMARY_SELECTION);
546 gui->get_clipboard()->to_clipboard(file_string, file_length,
547 SECONDARY_SELECTION);
552 // Uses cropping coordinates in edl session to crop and translate video.
553 // We modify the projector since camera automation depends on the track size.
554 void MWindow::crop_video()
557 undo->update_undo_before();
558 // Clamp EDL crop region
559 if(edl->session->crop_x1 > edl->session->crop_x2)
561 edl->session->crop_x1 ^= edl->session->crop_x2;
562 edl->session->crop_x2 ^= edl->session->crop_x1;
563 edl->session->crop_x1 ^= edl->session->crop_x2;
565 if(edl->session->crop_y1 > edl->session->crop_y2)
567 edl->session->crop_y1 ^= edl->session->crop_y2;
568 edl->session->crop_y2 ^= edl->session->crop_y1;
569 edl->session->crop_y1 ^= edl->session->crop_y2;
572 float old_projector_x = (float)edl->session->output_w / 2;
573 float old_projector_y = (float)edl->session->output_h / 2;
574 float new_projector_x = (float)(edl->session->crop_x1 + edl->session->crop_x2) / 2;
575 float new_projector_y = (float)(edl->session->crop_y1 + edl->session->crop_y2) / 2;
576 float projector_offset_x = -(new_projector_x - old_projector_x);
577 float projector_offset_y = -(new_projector_y - old_projector_y);
579 edl->tracks->translate_projector(projector_offset_x, projector_offset_y);
581 edl->session->output_w = edl->session->crop_x2 - edl->session->crop_x1;
582 edl->session->output_h = edl->session->crop_y2 - edl->session->crop_y1;
583 edl->session->crop_x1 = 0;
584 edl->session->crop_y1 = 0;
585 edl->session->crop_x2 = edl->session->output_w;
586 edl->session->crop_y2 = edl->session->output_h;
588 // Recalculate aspect ratio
589 if(defaults->get("AUTOASPECT", 0))
591 create_aspect_ratio(edl->session->aspect_w,
592 edl->session->aspect_h,
593 edl->session->output_w,
594 edl->session->output_h);
597 undo->update_undo_after(_("crop"), LOAD_ALL);
600 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
609 undo->update_undo_before();
611 double start = edl->local_session->get_selectionstart();
612 double end = edl->local_session->get_selectionend();
617 edl->session->labels_follow_edits,
618 edl->session->plugins_follow_edits,
619 edl->session->autos_follow_edits);
624 undo->update_undo_after(_("cut"), LOAD_EDITS | LOAD_TIMEBAR);
627 update_plugin_guis();
628 gui->update(1, 2, 1, 1, 1, 1, 0);
629 cwindow->update(1, 0, 0, 0, 1);
630 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
636 int MWindow::cut_automation()
638 undo->update_undo_before();
642 edl->tracks->clear_automation(edl->local_session->get_selectionstart(),
643 edl->local_session->get_selectionend());
645 undo->update_undo_after(_("cut keyframes"), LOAD_AUTOMATION);
649 update_plugin_guis();
650 gui->draw_overlays(1);
651 sync_parameters(CHANGE_PARAMS);
652 gui->update_patchbay();
653 cwindow->update(1, 0, 0);
657 int MWindow::cut_default_keyframe()
660 undo->update_undo_before();
661 copy_default_keyframe();
662 edl->tracks->clear_default_keyframe();
663 undo->update_undo_after(_("cut default keyframe"), LOAD_AUTOMATION);
666 gui->draw_overlays(1);
667 sync_parameters(CHANGE_PARAMS);
668 gui->update_patchbay();
669 cwindow->update(1, 0, 0);
676 void MWindow::delete_inpoint()
678 edl->local_session->unset_inpoint();
682 void MWindow::delete_outpoint()
684 edl->local_session->unset_outpoint();
688 void MWindow::delete_track()
690 if (edl->tracks->last)
691 delete_track(edl->tracks->last);
694 void MWindow::delete_tracks()
696 undo->update_undo_before();
697 edl->tracks->delete_tracks();
698 undo->update_undo_after(_("delete tracks"), LOAD_ALL);
702 update_plugin_states();
703 gui->update(1, 1, 1, 0, 1, 0, 0);
704 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
710 void MWindow::delete_track(Track *track)
712 undo->update_undo_before();
713 edl->tracks->delete_track(track);
714 undo->update_undo_after(_("delete track"), LOAD_ALL);
717 update_plugin_states();
718 gui->update(1, 1, 1, 0, 1, 0, 0);
719 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
730 // Insert data from clipboard
731 void MWindow::insert(double position,
738 // For clipboard pasting make the new edl use a separate session
739 // from the master EDL. Then it can be resampled to the master rates.
740 // For splice, overwrite, and dragging need same session to get the assets.
741 EDL *edl = new EDL(parent_edl);
742 ArrayList<EDL*> new_edls;
743 uint32_t load_flags = LOAD_ALL;
746 new_edls.append(edl);
747 edl->create_objects();
752 if(parent_edl) load_flags &= ~LOAD_SESSION;
753 if(!edl->session->autos_follow_edits) load_flags &= ~LOAD_AUTOMATION;
754 if(!edl->session->labels_follow_edits) load_flags &= ~LOAD_TIMEBAR;
756 edl->load_xml(file, load_flags);
759 //printf("MWindow::insert %f\n", edl->local_session->clipboard_length);
763 paste_edls(&new_edls,
771 // printf("MWindow::insert 5 %f %f\n",
772 // vwindow->edl->local_session->in_point,
773 // vwindow->edl->local_session->out_point);
774 new_edls.remove_all();
775 edl->Garbage::remove_user();
776 //printf("MWindow::insert 6 %p\n", vwindow->get_edl());
779 void MWindow::insert_effects_canvas(double start,
782 Track *dest_track = session->track_highlighted;
783 if(!dest_track) return;
785 undo->update_undo_before();
787 for(int i = 0; i < session->drag_pluginservers->total; i++)
789 PluginServer *plugin = session->drag_pluginservers->values[i];
791 insert_effect(plugin->title,
794 i == 0 ? session->pluginset_highlighted : 0,
801 undo->update_undo_after(_("insert effect"), LOAD_EDITS | LOAD_PATCHES);
803 sync_parameters(CHANGE_EDL);
804 // GUI updated in TrackCanvas, after current_operations are reset
807 void MWindow::insert_effects_cwindow(Track *dest_track)
809 if(!dest_track) return;
811 undo->update_undo_before();
814 double length = dest_track->get_length();
816 if(edl->local_session->get_selectionend() >
817 edl->local_session->get_selectionstart())
819 start = edl->local_session->get_selectionstart();
820 length = edl->local_session->get_selectionend() -
821 edl->local_session->get_selectionstart();
824 for(int i = 0; i < session->drag_pluginservers->total; i++)
826 PluginServer *plugin = session->drag_pluginservers->values[i];
829 insert_effect(plugin->title,
839 undo->update_undo_after(_("insert effect"), LOAD_EDITS | LOAD_PATCHES);
841 sync_parameters(CHANGE_EDL);
851 void MWindow::insert_effect(char *title,
852 SharedLocation *shared_location,
855 int single_standalone)
857 Track *current = edl->tracks->first;
858 SharedLocation shared_location_local;
859 shared_location_local.copy_from(shared_location);
861 for( ; current; current = NEXT)
863 if(current->data_type == data_type &&
867 &shared_location_local,
876 if(plugin_type == PLUGIN_STANDALONE && single_standalone)
878 plugin_type = PLUGIN_SHAREDPLUGIN;
879 shared_location_local.module = edl->tracks->number_of(current);
880 shared_location_local.plugin = current->plugin_set.total - 1;
889 void MWindow::insert_effect(char *title,
890 SharedLocation *shared_location,
892 PluginSet *plugin_set,
897 KeyFrame *default_keyframe = 0;
898 PluginServer *server = 0;
905 // Get default keyframe
906 if(plugin_type == PLUGIN_STANDALONE)
908 default_keyframe = new KeyFrame;
909 server = new PluginServer(*scan_plugindb(title, track->data_type));
911 server->open_plugin(0, preferences, edl, 0);
912 server->save_data(default_keyframe);
917 // Insert plugin object
918 track->insert_effect(title,
929 if(plugin_type == PLUGIN_STANDALONE)
931 server->close_plugin();
933 delete default_keyframe;
937 int MWindow::modify_edithandles()
939 undo->update_undo_before();
940 edl->modify_edithandles(session->drag_start,
941 session->drag_position,
942 session->drag_handle,
943 edl->session->edit_handle_mode[session->drag_button],
944 edl->session->labels_follow_edits,
945 edl->session->plugins_follow_edits,
946 edl->session->autos_follow_edits);
948 finish_modify_handles();
951 //printf("MWindow::modify_handles 1\n");
955 int MWindow::modify_pluginhandles()
957 undo->update_undo_before();
959 edl->modify_pluginhandles(session->drag_start,
960 session->drag_position,
961 session->drag_handle,
962 edl->session->edit_handle_mode[session->drag_button],
963 edl->session->labels_follow_edits,
964 edl->session->autos_follow_edits,
965 session->trim_edits);
967 finish_modify_handles();
973 // Common to edithandles and plugin handles
974 void MWindow::finish_modify_handles()
976 int edit_mode = edl->session->edit_handle_mode[session->drag_button];
978 if((session->drag_handle == 1 && edit_mode != MOVE_NO_EDITS) ||
979 (session->drag_handle == 0 && edit_mode == MOVE_ONE_EDIT))
981 edl->local_session->set_selectionstart(session->drag_position);
982 edl->local_session->set_selectionend(session->drag_position);
985 if(edit_mode != MOVE_NO_EDITS)
987 edl->local_session->set_selectionstart(session->drag_start);
988 edl->local_session->set_selectionend(session->drag_start);
991 if(edl->local_session->get_selectionstart(1) < 0)
993 edl->local_session->set_selectionstart(0);
994 edl->local_session->set_selectionend(0);
996 undo->update_undo_after(_("drag handle"), LOAD_EDITS | LOAD_TIMEBAR);
1000 sync_parameters(CHANGE_EDL);
1001 update_plugin_guis();
1002 gui->update(1, 2, 1, 1, 1, 1, 0);
1003 cwindow->update(1, 0, 0, 0, 1);
1006 void MWindow::match_output_size(Track *track)
1008 undo->update_undo_before();
1009 track->track_w = edl->session->output_w;
1010 track->track_h = edl->session->output_h;
1012 undo->update_undo_after(_("match output size"), LOAD_ALL);
1015 sync_parameters(CHANGE_EDL);
1019 void MWindow::move_edits(ArrayList<Edit*> *edits,
1023 undo->update_undo_before();
1025 edl->tracks->move_edits(edits,
1028 edl->session->labels_follow_edits,
1029 edl->session->plugins_follow_edits,
1030 edl->session->autos_follow_edits);
1033 undo->update_undo_after(_("move edit"), LOAD_ALL);
1036 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1041 update_plugin_guis();
1043 1, // 1 for incremental drawing. 2 for full refresh
1051 void MWindow::move_effect(Plugin *plugin,
1052 PluginSet *dest_plugin_set,
1054 int64_t dest_position)
1056 undo->update_undo_before();
1058 edl->tracks->move_effect(plugin,
1064 undo->update_undo_after(_("move effect"), LOAD_ALL);
1067 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1072 update_plugin_guis();
1074 1, // 1 for incremental drawing. 2 for full refresh
1082 void MWindow::move_plugins_up(PluginSet *plugin_set)
1085 undo->update_undo_before();
1086 plugin_set->track->move_plugins_up(plugin_set);
1089 undo->update_undo_after(_("move effect up"), LOAD_ALL);
1092 1, // 1 for incremental drawing. 2 for full refresh
1098 sync_parameters(CHANGE_EDL);
1101 void MWindow::move_plugins_down(PluginSet *plugin_set)
1103 undo->update_undo_before();
1105 plugin_set->track->move_plugins_down(plugin_set);
1108 undo->update_undo_after(_("move effect down"), LOAD_ALL);
1111 1, // 1 for incremental drawing. 2 for full refresh
1117 sync_parameters(CHANGE_EDL);
1120 void MWindow::move_track_down(Track *track)
1122 undo->update_undo_before();
1123 edl->tracks->move_track_down(track);
1125 undo->update_undo_after(_("move track down"), LOAD_ALL);
1128 gui->update(1, 1, 0, 0, 1, 0, 0);
1129 sync_parameters(CHANGE_EDL);
1133 void MWindow::move_tracks_down()
1135 undo->update_undo_before();
1136 edl->tracks->move_tracks_down();
1138 undo->update_undo_after(_("move tracks down"), LOAD_ALL);
1141 gui->update(1, 1, 0, 0, 1, 0, 0);
1142 sync_parameters(CHANGE_EDL);
1146 void MWindow::move_track_up(Track *track)
1148 undo->update_undo_before();
1149 edl->tracks->move_track_up(track);
1151 undo->update_undo_after(_("move track up"), LOAD_ALL);
1153 gui->update(1, 1, 0, 0, 1, 0, 0);
1154 sync_parameters(CHANGE_EDL);
1158 void MWindow::move_tracks_up()
1160 undo->update_undo_before();
1161 edl->tracks->move_tracks_up();
1163 undo->update_undo_after(_("move tracks up"), LOAD_ALL);
1165 gui->update(1, 1, 0, 0, 1, 0, 0);
1166 sync_parameters(CHANGE_EDL);
1170 void MWindow::mute_selection()
1172 double start = edl->local_session->get_selectionstart();
1173 double end = edl->local_session->get_selectionend();
1176 undo->update_undo_before();
1180 edl->session->plugins_follow_edits,
1181 edl->session->autos_follow_edits);
1182 edl->local_session->set_selectionend(end);
1183 edl->local_session->set_selectionstart(start);
1184 edl->paste_silence(start,
1187 edl->session->plugins_follow_edits,
1188 edl->session->autos_follow_edits);
1190 undo->update_undo_after(_("mute"), LOAD_EDITS);
1193 update_plugin_guis();
1194 gui->update(1, 2, 1, 1, 1, 1, 0);
1195 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1204 void MWindow::overwrite(EDL *source)
1208 double src_start = source->local_session->get_selectionstart();
1209 double overwrite_len = source->local_session->get_selectionend() - src_start;
1210 double dst_start = edl->local_session->get_selectionstart();
1211 double dst_len = edl->local_session->get_selectionend() - dst_start;
1213 undo->update_undo_before();
1214 if (!EQUIV(dst_len, 0) && (dst_len < overwrite_len))
1216 // in/out points or selection present and shorter than overwrite range
1217 // shorten the copy range
1218 overwrite_len = dst_len;
1221 source->copy(src_start,
1222 src_start + overwrite_len,
1230 // HACK around paste_edl get_start/endselection on its own
1231 // so we need to clear only when not using both io points
1232 // FIXME: need to write simple overwrite_edl to be used for overwrite function
1233 if (edl->local_session->get_inpoint() < 0 ||
1234 edl->local_session->get_outpoint() < 0)
1235 edl->clear(dst_start,
1236 dst_start + overwrite_len,
1242 dst_start + overwrite_len,
1248 edl->local_session->set_selectionstart(dst_start + overwrite_len);
1249 edl->local_session->set_selectionend(dst_start + overwrite_len);
1252 undo->update_undo_after(_("overwrite"), LOAD_EDITS);
1255 update_plugin_guis();
1256 gui->update(1, 1, 1, 1, 0, 1, 0);
1257 sync_parameters(CHANGE_EDL);
1260 // For splice and overwrite
1261 int MWindow::paste(double start,
1270 // Want to insert with assets shared with the master EDL.
1281 // For editing using insertion point
1282 void MWindow::paste()
1284 double start = edl->local_session->get_selectionstart();
1285 //double end = edl->local_session->get_selectionend();
1286 int64_t len = gui->get_clipboard()->clipboard_len(SECONDARY_SELECTION);
1290 char *string = new char[len + 1];
1292 undo->update_undo_before();
1295 gui->get_clipboard()->from_clipboard(string,
1297 BC_PRIMARY_SELECTION);
1299 file.read_from_string(string);
1308 edl->session->labels_follow_edits,
1309 edl->session->plugins_follow_edits,
1310 edl->session->autos_follow_edits,
1323 undo->update_undo_after(_("paste"), LOAD_EDITS | LOAD_TIMEBAR);
1325 update_plugin_guis();
1326 gui->update(1, 2, 1, 1, 0, 1, 0);
1327 gui->unlock_window();
1329 awindow->gui->lock_window("MWindow::paste");
1330 awindow->gui->update_assets();
1331 awindow->gui->unlock_window();
1333 gui->lock_window("MWindow::paste");
1334 sync_parameters(CHANGE_EDL);
1339 int MWindow::paste_assets(double position, Track *dest_track)
1343 undo->update_undo_before();
1347 if(session->drag_assets->total)
1349 load_assets(session->drag_assets,
1354 edl->session->labels_follow_edits,
1355 edl->session->plugins_follow_edits,
1356 edl->session->autos_follow_edits);
1361 if(session->drag_clips->total)
1363 paste_edls(session->drag_clips,
1367 edl->session->labels_follow_edits,
1368 edl->session->plugins_follow_edits,
1369 edl->session->autos_follow_edits);
1376 undo->update_undo_after(_("paste assets"), LOAD_EDITS);
1385 sync_parameters(CHANGE_EDL);
1389 void MWindow::load_assets(ArrayList<Indexable*> *new_assets,
1393 RecordLabels *labels,
1398 const int debug = 0;
1399 if(debug) printf("MWindow::load_assets %d\n", __LINE__);
1400 if(position < 0) position = edl->local_session->get_selectionstart();
1402 ArrayList<EDL*> new_edls;
1403 for(int i = 0; i < new_assets->total; i++)
1405 Indexable *indexable = new_assets->get(i);
1406 if(indexable->is_asset)
1408 remove_asset_from_caches((Asset*)indexable);
1410 EDL *new_edl = new EDL;
1411 new_edl->create_objects();
1412 new_edl->copy_session(edl);
1413 new_edls.append(new_edl);
1416 if(indexable->is_asset)
1418 if(debug) printf("MWindow::load_assets %d\n", __LINE__);
1419 if(debug) ((Asset*)indexable)->dump();
1420 asset_to_edl(new_edl, (Asset*)indexable);
1423 edl_to_nested(new_edl, (EDL*)indexable);
1424 if(debug) printf("MWindow::load_assets %d\n", __LINE__);
1429 for(RecordLabel *label = labels->first; label; label = label->next)
1431 new_edl->labels->toggle_label(label->position, label->position);
1435 if(debug) printf("MWindow::load_assets %d\n", __LINE__);
1437 paste_edls(&new_edls,
1444 if(debug) printf("MWindow::load_assets %d\n", __LINE__);
1448 for(int i = 0; i < new_edls.size(); i++)
1449 new_edls.get(i)->Garbage::remove_user();
1451 if(debug) printf("MWindow::load_assets %d\n", __LINE__);
1454 int MWindow::paste_automation()
1456 int64_t len = gui->get_clipboard()->clipboard_len(SECONDARY_SELECTION);
1460 undo->update_undo_before();
1461 char *string = new char[len + 1];
1462 gui->get_clipboard()->from_clipboard(string,
1464 BC_PRIMARY_SELECTION);
1466 file.read_from_string(string);
1468 edl->tracks->clear_automation(edl->local_session->get_selectionstart(),
1469 edl->local_session->get_selectionend());
1470 edl->tracks->paste_automation(edl->local_session->get_selectionstart(),
1474 edl->session->typeless_keyframes);
1476 undo->update_undo_after(_("paste keyframes"), LOAD_AUTOMATION);
1481 update_plugin_guis();
1482 gui->draw_overlays(1);
1483 sync_parameters(CHANGE_PARAMS);
1484 gui->update_patchbay();
1485 cwindow->update(1, 0, 0);
1491 int MWindow::paste_default_keyframe()
1493 int64_t len = gui->get_clipboard()->clipboard_len(SECONDARY_SELECTION);
1497 undo->update_undo_before();
1498 char *string = new char[len + 1];
1499 gui->get_clipboard()->from_clipboard(string,
1501 BC_PRIMARY_SELECTION);
1503 file.read_from_string(string);
1504 edl->tracks->paste_automation(edl->local_session->get_selectionstart(),
1508 edl->session->typeless_keyframes);
1509 // edl->tracks->paste_default_keyframe(&file);
1510 undo->update_undo_after(_("paste default keyframe"), LOAD_AUTOMATION);
1514 update_plugin_guis();
1515 gui->draw_overlays(1);
1516 sync_parameters(CHANGE_PARAMS);
1517 gui->update_patchbay();
1518 cwindow->update(1, 0, 0);
1527 // Insert edls with project deletion and index file generation.
1528 int MWindow::paste_edls(ArrayList<EDL*> *new_edls,
1531 double current_position,
1537 ArrayList<Track*> destination_tracks;
1538 int need_new_tracks = 0;
1541 if(!new_edls->total) return 0;
1544 // double original_length = edl->tracks->total_playable_length();
1545 // double original_preview_end = edl->local_session->preview_end;
1548 // Delete current project
1549 if(load_mode == LOADMODE_REPLACE ||
1550 load_mode == LOADMODE_REPLACE_CONCATENATE)
1554 edl->save_defaults(defaults);
1558 edl->Garbage::remove_user();
1562 edl->create_objects();
1564 edl->copy_session(new_edls->values[0]);
1566 gui->mainmenu->update_toggles(0);
1569 gui->unlock_window();
1571 gwindow->gui->update_toggles(1);
1573 gui->lock_window("MWindow::paste_edls");
1576 // Insert labels for certain modes constitutively
1580 // Force reset of preview
1581 // original_length = 0;
1582 // original_preview_end = -1;
1588 // Create new tracks in master EDL
1589 if(load_mode == LOADMODE_REPLACE ||
1590 load_mode == LOADMODE_REPLACE_CONCATENATE ||
1591 load_mode == LOADMODE_NEW_TRACKS)
1594 need_new_tracks = 1;
1595 for(int i = 0; i < new_edls->total; i++)
1597 EDL *new_edl = new_edls->values[i];
1598 for(Track *current = new_edl->tracks->first;
1602 if(current->data_type == TRACK_VIDEO)
1604 edl->tracks->add_video_track(0, 0);
1605 if(current->draw) edl->tracks->last->draw = 1;
1606 destination_tracks.append(edl->tracks->last);
1609 if(current->data_type == TRACK_AUDIO)
1611 edl->tracks->add_audio_track(0, 0);
1612 destination_tracks.append(edl->tracks->last);
1615 if(current->data_type == TRACK_SUBTITLE)
1617 edl->tracks->add_subttl_track(0, 0);
1618 destination_tracks.append(edl->tracks->last);
1620 edl->session->highlighted_track = edl->tracks->total() - 1;
1623 // Base track count on first EDL only for concatenation
1624 if(load_mode == LOADMODE_REPLACE_CONCATENATE) break;
1629 // Recycle existing tracks of master EDL
1630 if(load_mode == LOADMODE_CONCATENATE ||
1631 load_mode == LOADMODE_PASTE ||
1632 load_mode == LOADMODE_NESTED)
1636 // The point of this is to shift forward labels after the selection so they can
1637 // then be shifted back to their original locations without recursively
1638 // shifting back every paste.
1639 if((load_mode == LOADMODE_PASTE ||
1640 load_mode == LOADMODE_NESTED) &&
1641 edl->session->labels_follow_edits)
1642 edl->labels->clear(edl->local_session->get_selectionstart(),
1643 edl->local_session->get_selectionend(),
1646 Track *current = first_track ? first_track : edl->tracks->first;
1647 for( ; current; current = NEXT)
1651 destination_tracks.append(current);
1662 int destination_track = 0;
1663 double *paste_position = new double[destination_tracks.total];
1669 // Iterate through the edls
1670 for(int i = 0; i < new_edls->total; i++)
1673 EDL *new_edl = new_edls->values[i];
1674 double edl_length = new_edl->local_session->clipboard_length ?
1675 new_edl->local_session->clipboard_length :
1676 new_edl->tracks->total_length();
1677 // printf("MWindow::paste_edls 2 %f %f\n",
1678 // new_edl->local_session->clipboard_length,
1679 // new_edl->tracks->total_length());
1686 // Convert EDL to master rates
1687 new_edl->resample(new_edl->session->sample_rate,
1688 edl->session->sample_rate,
1690 new_edl->resample(new_edl->session->frame_rate,
1691 edl->session->frame_rate,
1698 // Add assets and prepare index files
1699 for(Asset *new_asset = new_edl->assets->first;
1701 new_asset = new_asset->next)
1703 mainindexes->add_next_asset(0, new_asset);
1705 // Capture index file status from mainindex test
1706 edl->update_assets(new_edl);
1711 // Get starting point of insertion. Need this to paste labels.
1714 case LOADMODE_REPLACE:
1715 case LOADMODE_NEW_TRACKS:
1716 current_position = 0;
1719 case LOADMODE_CONCATENATE:
1720 case LOADMODE_REPLACE_CONCATENATE:
1721 destination_track = 0;
1722 if(destination_tracks.total)
1723 current_position = destination_tracks.values[0]->get_length();
1725 current_position = 0;
1728 case LOADMODE_PASTE:
1729 case LOADMODE_NESTED:
1730 destination_track = 0;
1733 for(int j = 0; j < destination_tracks.total; j++)
1735 paste_position[j] = (current_position >= 0) ?
1737 edl->local_session->get_selectionstart();
1742 case LOADMODE_RESOURCESONLY:
1743 edl->add_clip(new_edl);
1753 if(load_mode != LOADMODE_RESOURCESONLY)
1756 //printf("MWindow::paste_edls %f %f\n", current_position, edl_length);
1757 if(load_mode == LOADMODE_PASTE ||
1758 load_mode == LOADMODE_NESTED)
1759 edl->labels->insert_labels(new_edl->labels,
1760 destination_tracks.total ? paste_position[0] : 0.0,
1764 edl->labels->insert_labels(new_edl->labels,
1770 for(Track *new_track = new_edl->tracks->first;
1772 new_track = new_track->next)
1774 // Get destination track of same type as new_track
1776 k < destination_tracks.total &&
1777 destination_tracks.values[destination_track]->data_type != new_track->data_type;
1778 k++, destination_track++)
1780 if(destination_track >= destination_tracks.total - 1)
1781 destination_track = 0;
1784 // Insert data into destination track
1785 if(destination_track < destination_tracks.total &&
1786 destination_tracks.values[destination_track]->data_type == new_track->data_type)
1788 Track *track = destination_tracks.values[destination_track];
1790 // Replace default keyframes if first EDL and new tracks were created.
1791 // This means data copied from one track and pasted to another won't retain
1792 // the camera position unless it's a keyframe. If it did, previous data in the
1793 // track might get unknowingly corrupted. Ideally we would detect when differing
1794 // default keyframes existed and create discrete keyframes for both.
1795 int replace_default = (i == 0) && need_new_tracks;
1797 //printf("MWindow::paste_edls 1 %d\n", replace_default);
1798 // Insert new track at current position
1801 case LOADMODE_REPLACE_CONCATENATE:
1802 case LOADMODE_CONCATENATE:
1803 current_position = track->get_length();
1806 case LOADMODE_PASTE:
1807 case LOADMODE_NESTED:
1808 current_position = paste_position[destination_track];
1809 paste_position[destination_track] += new_track->get_length();
1814 track->insert_track(new_track,
1823 // Get next destination track
1824 destination_track++;
1825 if(destination_track >= destination_tracks.total)
1826 destination_track = 0;
1830 if(load_mode == LOADMODE_PASTE ||
1831 load_mode == LOADMODE_NESTED)
1832 current_position += edl_length;
1836 // Move loading of clips and vwindow to the end - this fixes some
1837 // strange issue, for index not being shown
1838 // Assume any paste operation from the same EDL won't contain any clips.
1839 // If it did it would duplicate every clip here.
1840 for(int i = 0; i < new_edls->total; i++)
1842 EDL *new_edl = new_edls->values[i];
1844 for(int j = 0; j < new_edl->clips.total; j++)
1846 edl->add_clip(new_edl->clips.values[j]);
1849 if(new_edl->total_vwindow_edls())
1851 // if(edl->vwindow_edl)
1852 // edl->vwindow_edl->Garbage::remove_user();
1853 // edl->vwindow_edl = new EDL(edl);
1854 // edl->vwindow_edl->create_objects();
1855 // edl->vwindow_edl->copy_all(new_edl->vwindow_edl);
1857 for(int j = 0; j < new_edl->total_vwindow_edls(); j++)
1859 EDL *vwindow_edl = new EDL(edl);
1860 vwindow_edl->create_objects();
1861 vwindow_edl->copy_all(new_edl->get_vwindow_edl(j));
1862 edl->append_vwindow_edl(vwindow_edl, 0);
1868 if(paste_position) delete [] paste_position;
1871 // This is already done in load_filenames and everything else that uses paste_edls
1872 // update_project(load_mode);
1874 // Fix preview range
1875 // if(EQUIV(original_length, original_preview_end))
1877 // edl->local_session->preview_end = edl->tracks->total_playable_length();
1881 // Start examining next batch of index files
1882 mainindexes->start_build();
1885 // Don't save a backup after loading since the loaded file is on disk already.
1892 void MWindow::paste_silence()
1894 double start = edl->local_session->get_selectionstart();
1895 double end = edl->local_session->get_selectionend();
1896 undo->update_undo_before();
1897 edl->paste_silence(start,
1899 edl->session->labels_follow_edits,
1900 edl->session->plugins_follow_edits,
1901 edl->session->autos_follow_edits);
1904 undo->update_undo_after(_("silence"), LOAD_EDITS | LOAD_TIMEBAR);
1906 update_plugin_guis();
1908 gui->update(1, 2, 1, 1, 1, 1, 0);
1909 cwindow->update(1, 0, 0, 0, 1);
1910 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1916 void MWindow::detach_transition(Transition *transition)
1918 undo->update_undo_before();
1919 hide_plugin(transition, 1);
1920 int is_video = (transition->edit->track->data_type == TRACK_VIDEO);
1921 transition->edit->detach_transition();
1923 undo->update_undo_after(_("detach transition"), LOAD_ALL);
1925 if(is_video) restart_brender();
1933 sync_parameters(CHANGE_EDL);
1936 void MWindow::detach_transitions()
1938 gui->lock_window("MWindow::detach_transitions 1");
1940 undo->update_undo_before();
1941 double start = edl->local_session->get_selectionstart();
1942 double end = edl->local_session->get_selectionend();
1943 edl->tracks->clear_transitions(start, end);
1946 undo->update_undo_after(_("detach transitions"), LOAD_EDITS);
1948 sync_parameters(CHANGE_EDL);
1949 gui->update(0, 1, 0, 0, 0, 0, 0);
1950 gui->unlock_window();
1953 void MWindow::paste_transition()
1955 // Only the first transition gets dropped.
1956 PluginServer *server = session->drag_pluginservers->values[0];
1958 undo->update_undo_before();
1960 strcpy(edl->session->default_atransition, server->title);
1962 strcpy(edl->session->default_vtransition, server->title);
1964 edl->tracks->paste_transition(server, session->edit_highlighted);
1966 undo->update_undo_after(_("transition"), LOAD_EDITS);
1968 if(server->video) restart_brender();
1969 sync_parameters(CHANGE_ALL);
1972 void MWindow::paste_transitions(int track_type, char *title)
1974 gui->lock_window("MWindow::detach_transitions 1");
1976 undo->update_undo_before();
1977 double start = edl->local_session->get_selectionstart();
1978 double end = edl->local_session->get_selectionend();
1979 edl->tracks->paste_transitions(start, end, track_type, title);
1982 undo->update_undo_after(_("attach transitions"), LOAD_EDITS);
1984 sync_parameters(CHANGE_EDL);
1985 gui->update(0, 1, 0, 0, 0, 0, 0);
1986 gui->unlock_window();
1989 void MWindow::paste_transition_cwindow(Track *dest_track)
1991 PluginServer *server = session->drag_pluginservers->values[0];
1992 undo->update_undo_before();
1993 edl->tracks->paste_video_transition(server, 1);
1995 undo->update_undo_after(_("transition"), LOAD_EDITS);
1997 gui->update(0, 1, 0, 0, 0, 0, 0);
1998 sync_parameters(CHANGE_ALL);
2001 void MWindow::paste_audio_transition()
2003 PluginServer *server = scan_plugindb(edl->session->default_atransition,
2007 char string[BCTEXTLEN];
2008 sprintf(string, _("No default transition %s found."), edl->session->default_atransition);
2009 gui->show_message(string);
2013 undo->update_undo_before();
2014 edl->tracks->paste_audio_transition(server);
2016 undo->update_undo_after(_("transition"), LOAD_EDITS);
2018 sync_parameters(CHANGE_EDL);
2019 gui->update(0, 1, 0, 0, 0, 0, 0);
2022 void MWindow::paste_video_transition()
2024 PluginServer *server = scan_plugindb(edl->session->default_vtransition,
2028 char string[BCTEXTLEN];
2029 sprintf(string, _("No default transition %s found."), edl->session->default_vtransition);
2030 gui->show_message(string);
2034 undo->update_undo_before();
2036 edl->tracks->paste_video_transition(server);
2038 undo->update_undo_after(_("transition"), LOAD_EDITS);
2040 sync_parameters(CHANGE_EDL);
2042 gui->update(0, 1, 0, 0, 0, 0, 0);
2045 void MWindow::shuffle_edits()
2047 gui->lock_window("MWindow::shuffle_edits 1");
2049 undo->update_undo_before();
2050 double start = edl->local_session->get_selectionstart();
2051 double end = edl->local_session->get_selectionend();
2053 edl->tracks->shuffle_edits(start, end);
2056 undo->update_undo_after(_("shuffle edits"), LOAD_EDITS | LOAD_TIMEBAR);
2058 sync_parameters(CHANGE_EDL);
2060 gui->update(0, 1, 1, 0, 0, 0, 0);
2061 gui->unlock_window();
2064 void MWindow::reverse_edits()
2066 gui->lock_window("MWindow::reverse_edits 1");
2068 undo->update_undo_before();
2069 double start = edl->local_session->get_selectionstart();
2070 double end = edl->local_session->get_selectionend();
2072 edl->tracks->reverse_edits(start, end);
2075 undo->update_undo_after(_("reverse edits"), LOAD_EDITS | LOAD_TIMEBAR);
2077 sync_parameters(CHANGE_EDL);
2079 gui->update(0, 1, 1, 0, 0, 0, 0);
2080 gui->unlock_window();
2083 void MWindow::align_edits()
2085 gui->lock_window("MWindow::align_edits 1");
2087 undo->update_undo_before();
2088 double start = edl->local_session->get_selectionstart();
2089 double end = edl->local_session->get_selectionend();
2091 edl->tracks->align_edits(start, end);
2094 undo->update_undo_after(_("align edits"), LOAD_EDITS | LOAD_TIMEBAR);
2096 sync_parameters(CHANGE_EDL);
2098 gui->update(0, 1, 1, 0, 0, 0, 0);
2099 gui->unlock_window();
2102 void MWindow::set_edit_length(double length)
2104 gui->lock_window("MWindow::detach_transitions 1");
2106 undo->update_undo_before();
2107 double start = edl->local_session->get_selectionstart();
2108 double end = edl->local_session->get_selectionend();
2110 edl->tracks->set_edit_length(start, end, length);
2113 undo->update_undo_after(_("edit length"), LOAD_EDITS | LOAD_TIMEBAR);
2115 sync_parameters(CHANGE_EDL);
2117 gui->update(0, 1, 1, 0, 0, 0, 0);
2118 gui->unlock_window();
2122 void MWindow::set_transition_length(Transition *transition, double length)
2124 gui->lock_window("MWindow::detach_transitions 1");
2126 undo->update_undo_before();
2127 //double start = edl->local_session->get_selectionstart();
2128 //double end = edl->local_session->get_selectionend();
2130 edl->tracks->set_transition_length(transition, length);
2133 undo->update_undo_after(_("transition length"), LOAD_EDITS);
2135 edl->session->default_transition_length = length;
2136 sync_parameters(CHANGE_PARAMS);
2137 gui->update(0, 1, 0, 0, 0, 0, 0);
2138 gui->unlock_window();
2141 void MWindow::set_transition_length(double length)
2143 gui->lock_window("MWindow::detach_transitions 1");
2145 undo->update_undo_before();
2146 double start = edl->local_session->get_selectionstart();
2147 double end = edl->local_session->get_selectionend();
2149 edl->tracks->set_transition_length(start, end, length);
2152 undo->update_undo_after(_("transition length"), LOAD_EDITS);
2154 edl->session->default_transition_length = length;
2155 sync_parameters(CHANGE_PARAMS);
2157 gui->update(0, 1, 0, 0, 0, 0, 0);
2158 gui->unlock_window();
2162 void MWindow::redo_entry(BC_WindowBase *calling_window_gui)
2165 calling_window_gui->unlock_window();
2167 cwindow->playback_engine->que->send_command(STOP,
2171 cwindow->playback_engine->interrupt_playback(0);
2173 for(int i = 0; i < vwindows.size(); i++)
2175 if(vwindows.get(i)->is_running())
2177 vwindows.get(i)->playback_engine->que->send_command(STOP,
2181 vwindows.get(i)->playback_engine->interrupt_playback(0);
2185 cwindow->gui->lock_window("MWindow::redo_entry");
2186 for(int i = 0; i < vwindows.size(); i++)
2188 if(vwindows.get(i)->is_running())
2190 if (calling_window_gui != vwindows.get(i)->gui)
2192 vwindows.get(i)->gui->lock_window("MWindow::redo_entry 2");
2201 update_plugin_states();
2202 update_plugin_guis();
2204 gui->update(1, 2, 1, 1, 1, 1, 1);
2205 cwindow->update(1, 1, 1, 1, 1);
2207 if (calling_window_gui != cwindow->gui)
2208 cwindow->gui->unlock_window();
2209 if (calling_window_gui != gui)
2210 gui->unlock_window();
2213 for(int i = 0; i < vwindows.size(); i++)
2215 if(vwindows.get(i)->is_running())
2217 if (calling_window_gui != vwindows.get(i)->gui)
2219 vwindows.get(i)->gui->unlock_window();
2224 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
2232 void MWindow::resize_track(Track *track, int w, int h)
2234 undo->update_undo_before();
2235 // We have to move all maskpoints so they do not move in relation to image areas
2236 ((MaskAutos*)track->automation->autos[AUTOMATION_MASK])->translate_masks(
2237 (w - track->track_w) / 2,
2238 (h - track->track_h) / 2);
2241 undo->update_undo_after(_("resize track"), LOAD_ALL);
2245 sync_parameters(CHANGE_EDL);
2249 void MWindow::set_inpoint(int is_mwindow)
2251 undo->update_undo_before();
2252 edl->set_inpoint(edl->local_session->get_selectionstart(1));
2254 undo->update_undo_after(_("in point"), LOAD_TIMEBAR);
2259 gui->lock_window("MWindow::set_inpoint 1");
2261 gui->update_timebar(1);
2264 gui->unlock_window();
2269 cwindow->gui->lock_window("MWindow::set_inpoint 2");
2271 cwindow->gui->timebar->update(1);
2274 cwindow->gui->unlock_window();
2278 void MWindow::set_outpoint(int is_mwindow)
2280 undo->update_undo_before();
2281 edl->set_outpoint(edl->local_session->get_selectionend(1));
2283 undo->update_undo_after(_("out point"), LOAD_TIMEBAR);
2288 gui->lock_window("MWindow::set_outpoint 1");
2290 gui->update_timebar(1);
2293 gui->unlock_window();
2298 cwindow->gui->lock_window("MWindow::set_outpoint 2");
2300 cwindow->gui->timebar->update(1);
2303 cwindow->gui->unlock_window();
2307 void MWindow::splice(EDL *source)
2311 undo->update_undo_before();
2312 source->copy(source->local_session->get_selectionstart(),
2313 source->local_session->get_selectionend(),
2324 double start = edl->local_session->get_selectionstart();
2325 //double end = edl->local_session->get_selectionend();
2326 double source_start = source->local_session->get_selectionstart();
2327 double source_end = source->local_session->get_selectionend();
2332 edl->session->labels_follow_edits,
2333 edl->session->plugins_follow_edits,
2334 edl->session->autos_follow_edits);
2336 // Position at end of clip
2337 edl->local_session->set_selectionstart(start +
2340 edl->local_session->set_selectionend(start +
2345 undo->update_undo_after(_("splice"), LOAD_EDITS | LOAD_TIMEBAR);
2346 update_plugin_guis();
2348 gui->update(1, 1, 1, 1, 0, 1, 0);
2349 sync_parameters(CHANGE_EDL);
2352 void MWindow::to_clip()
2357 gui->lock_window("MWindow::to_clip 1");
2358 start = edl->local_session->get_selectionstart();
2359 end = edl->local_session->get_selectionend();
2361 if(EQUIV(end, start))
2364 end = edl->tracks->total_length();
2367 // Don't copy all since we don't want the clips twice.
2378 EDL *new_edl = new EDL(edl);
2379 new_edl->create_objects();
2380 new_edl->load_xml(&file, LOAD_ALL);
2381 sprintf(new_edl->local_session->clip_title, _("Clip %d"), session->clip_number++);
2382 new_edl->local_session->set_selectionstart(0);
2383 new_edl->local_session->set_selectionend(0);
2385 gui->unlock_window();
2387 awindow->clip_edit->create_clip(new_edl);
2389 gui->lock_window("MWindow::to_clip 2");
2391 gui->unlock_window();
2397 int MWindow::toggle_label(int is_mwindow)
2399 double position1, position2;
2400 undo->update_undo_before();
2402 if(cwindow->playback_engine->is_playing_back)
2404 position1 = position2 =
2405 cwindow->playback_engine->get_tracking_position();
2409 position1 = edl->local_session->get_selectionstart(1);
2410 position2 = edl->local_session->get_selectionend(1);
2413 position1 = edl->align_to_frame(position1, 0);
2414 position2 = edl->align_to_frame(position2, 0);
2416 edl->labels->toggle_label(position1, position2);
2421 gui->lock_window("MWindow::toggle_label 1");
2423 gui->update_timebar(0);
2424 gui->activate_timeline();
2428 gui->unlock_window();
2433 cwindow->gui->lock_window("MWindow::toggle_label 2");
2435 cwindow->gui->timebar->update(1);
2438 cwindow->gui->unlock_window();
2441 undo->update_undo_after(_("label"), LOAD_TIMEBAR);
2445 void MWindow::trim_selection()
2447 undo->update_undo_before();
2450 edl->trim_selection(edl->local_session->get_selectionstart(),
2451 edl->local_session->get_selectionend(),
2452 edl->session->labels_follow_edits,
2453 edl->session->plugins_follow_edits,
2454 edl->session->autos_follow_edits);
2457 undo->update_undo_after(_("trim selection"), LOAD_EDITS | LOAD_TIMEBAR);
2458 update_plugin_guis();
2459 gui->update(1, 2, 1, 1, 1, 1, 0);
2460 cwindow->update(1, 0, 0, 0, 1);
2462 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
2470 void MWindow::undo_entry(BC_WindowBase *calling_window_gui)
2472 calling_window_gui->unlock_window();
2474 cwindow->playback_engine->que->send_command(STOP,
2478 cwindow->playback_engine->interrupt_playback(0);
2480 printf("MWindow::undo_entry %d %d\n", __LINE__, vwindows.size());
2481 for(int i = 0; i < vwindows.size(); i++)
2483 if(vwindows.get(i)->is_running())
2485 vwindows.get(i)->playback_engine->que->send_command(STOP,
2489 vwindows.get(i)->playback_engine->interrupt_playback(0);
2493 cwindow->gui->lock_window("MWindow::undo_entry 1");
2494 for(int i = 0; i < vwindows.size(); i++)
2496 if(vwindows.get(i)->is_running())
2498 if (calling_window_gui != vwindows.get(i)->gui)
2500 vwindows.get(i)->gui->lock_window("MWindow::undo_entry 4");
2504 gui->lock_window("MWindow::undo_entry 2");
2510 update_plugin_states();
2511 update_plugin_guis();
2515 gui->update(1, 2, 1, 1, 1, 1, 1);
2517 gui->unlock_window();
2519 cwindow->update(1, 1, 1, 1, 1);
2521 cwindow->gui->unlock_window();
2523 for(int i = 0; i < vwindows.size(); i++)
2525 if(vwindows.get(i)->is_running())
2527 if (calling_window_gui != vwindows.get(i)->gui)
2529 vwindows.get(i)->gui->unlock_window();
2534 if (calling_window_gui != gui)
2535 gui->unlock_window();
2538 awindow->gui->lock_window("MWindow::undo_entry 3");
2539 awindow->gui->update_assets();
2540 awindow->gui->flush();
2541 awindow->gui->unlock_window();
2543 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
2547 calling_window_gui->lock_window("MWindow::undo_entry 4");
2552 void MWindow::new_folder(const char *new_folder)
2554 undo->update_undo_before();
2555 edl->new_folder(new_folder);
2556 undo->update_undo_after(_("new folder"), LOAD_ALL);
2557 awindow->gui->lock_window("MWindow::new_folder");
2558 awindow->gui->update_assets();
2559 awindow->gui->unlock_window();
2562 void MWindow::delete_folder(char *folder)
2564 // undo->update_undo_after(_("delete folder"), LOAD_ALL);
2567 void MWindow::select_point(double position)
2569 edl->local_session->set_selectionstart(position);
2570 edl->local_session->set_selectionend(position);
2573 cwindow->update(1, 0, 0, 0, 1);
2576 update_plugin_guis();
2577 gui->update_patchbay();
2578 gui->hide_cursor(0);
2579 gui->draw_cursor(0);
2580 gui->mainclock->update(edl->local_session->get_selectionstart(1));
2581 gui->zoombar->update();
2582 gui->update_timebar(0);
2583 gui->flash_canvas(0);
2590 void MWindow::map_audio(int pattern)
2592 undo->update_undo_before();
2593 remap_audio(pattern);
2594 undo->update_undo_after(_("map 1:1"), LOAD_AUTOMATION);
2595 sync_parameters(CHANGE_PARAMS);
2605 void MWindow::remap_audio(int pattern)
2607 int current_channel = 0;
2608 int current_track = 0;
2609 for(Track *current = edl->tracks->first; current; current = NEXT)
2611 if(current->data_type == TRACK_AUDIO &&
2614 Autos *pan_autos = current->automation->autos[AUTOMATION_PAN];
2615 PanAuto *pan_auto = (PanAuto*)pan_autos->get_auto_for_editing(-1);
2617 for(int i = 0; i < MAXCHANNELS; i++)
2619 pan_auto->values[i] = 0.0;
2622 if(pattern == MWindow::AUDIO_1_TO_1)
2624 pan_auto->values[current_channel] = 1.0;
2627 if(pattern == MWindow::AUDIO_5_1_TO_2)
2629 switch(current_track)
2632 pan_auto->values[0] = 0.5;
2633 pan_auto->values[1] = 0.5;
2636 pan_auto->values[0] = 1;
2639 pan_auto->values[1] = 1;
2642 pan_auto->values[0] = 1;
2645 pan_auto->values[1] = 1;
2648 pan_auto->values[0] = 0.5;
2649 pan_auto->values[1] = 0.5;
2654 BC_Pan::calculate_stick_position(edl->session->audio_channels,
2655 edl->session->achannel_positions,
2660 pan_auto->handle_y);
2664 if(current_channel >= edl->session->audio_channels)
2665 current_channel = 0;
2670 void MWindow::cut_commercials()
2672 undo->update_undo_before();
2673 commercials->scan_media();
2676 undo->update_undo_after(_("cut ads"), LOAD_EDITS | LOAD_TIMEBAR);
2679 update_plugin_guis();
2680 gui->update(1, 2, 1, 1, 1, 1, 0);
2681 cwindow->update(1, 0, 0, 0, 1);
2682 cwindow->playback_engine->que->
2683 send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1);