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"
40 #include "gwindowgui.h"
44 #include "levelwindow.h"
45 #include "localsession.h"
46 #include "mainclock.h"
47 #include "maincursor.h"
48 #include "mainerror.h"
49 #include "mainindexes.h"
51 #include "mainsession.h"
53 #include "maskautos.h"
55 #include "mwindowgui.h"
59 #include "playbackengine.h"
60 #include "pluginset.h"
61 #include "recordlabel.h"
62 #include "samplescroll.h"
63 #include "trackcanvas.h"
65 #include "trackscroll.h"
67 #include "transition.h"
68 #include "transportque.h"
70 #include "vplayback.h"
72 #include "vwindowgui.h"
84 void MWindow::add_audio_track_entry(int above, Track *dst)
86 undo->update_undo_before();
87 add_audio_track(above, dst);
89 undo->update_undo_after(_("add track"), LOAD_ALL);
99 gui->activate_timeline();
101 // gui->get_scrollbars(0);
102 // gui->canvas->draw();
103 // gui->patchbay->update();
104 // gui->cursor->draw(1);
105 // gui->canvas->flash();
106 // gui->canvas->activate();
107 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
113 void MWindow::add_video_track_entry(Track *dst)
115 undo->update_undo_before();
116 add_video_track(1, dst);
117 undo->update_undo_after(_("add track"), LOAD_ALL);
128 gui->activate_timeline();
129 // gui->get_scrollbars(0);
130 // gui->canvas->draw();
131 // gui->patchbay->update();
132 // gui->cursor->draw(1);
133 // gui->canvas->flash();
134 // gui->canvas->activate();
135 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
142 void MWindow::add_subttl_track_entry(Track *dst)
144 undo->update_undo_before();
145 add_subttl_track(1, dst);
146 undo->update_undo_after(_("add track"), LOAD_ALL);
149 // gui->get_scrollbars(0);
150 // gui->canvas->draw();
151 // gui->patchbay->update();
152 // gui->cursor->draw(1);
153 // gui->canvas->flash();
154 // gui->canvas->activate();
155 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
163 int MWindow::add_audio_track(int above, Track *dst)
165 edl->tracks->add_audio_track(above, dst);
166 edl->tracks->update_y_pixels(theme);
171 int MWindow::add_video_track(int above, Track *dst)
173 edl->tracks->add_video_track(above, dst);
174 edl->tracks->update_y_pixels(theme);
179 int MWindow::add_subttl_track(int above, Track *dst)
181 edl->tracks->add_subttl_track(above, dst);
182 edl->tracks->update_y_pixels(theme);
190 void MWindow::asset_to_all()
192 if(!session->drag_assets->size()) return;
193 Indexable *indexable = session->drag_assets->get(0);
195 // if(indexable->have_video())
199 undo->update_undo_before();
202 w = indexable->get_w();
203 h = indexable->get_h();
204 double new_framerate = session->drag_assets->get(0)->get_frame_rate();
205 double old_framerate = edl->session->frame_rate;
206 int old_samplerate = edl->session->sample_rate;
207 int new_samplerate = session->drag_assets->get(0)->get_sample_rate();
210 if(indexable->have_video())
212 edl->session->output_w = w;
213 edl->session->output_h = h;
214 edl->session->frame_rate = new_framerate;
215 create_aspect_ratio(edl->session->aspect_w,
216 edl->session->aspect_h,
220 for(Track *current = edl->tracks->first;
224 if(current->data_type == TRACK_VIDEO &&
227 current->track_w = w;
228 current->track_h = h;
233 if(((edl->session->output_w % 4) ||
234 (edl->session->output_h % 4)) &&
235 edl->session->playback_config->vconfig->driver == PLAYBACK_X11_GL)
237 MainError::show_error(
238 _("This project's dimensions are not multiples of 4 so\n"
239 "it can't be rendered by OpenGL."));
244 if(defaults->get("AUTOASPECT", 0))
246 create_aspect_ratio(edl->session->aspect_w,
247 edl->session->aspect_h,
253 if(indexable->have_audio())
255 edl->session->sample_rate = new_samplerate;
256 edl->resample(old_framerate, new_framerate, TRACK_VIDEO);
257 edl->resample(old_samplerate, new_samplerate, TRACK_AUDIO);
263 undo->update_undo_after(_("asset to all"), LOAD_ALL);
272 sync_parameters(CHANGE_ALL);
281 void MWindow::asset_to_size()
283 if(!session->drag_assets->size()) return;
284 Indexable *indexable = session->drag_assets->get(0);
286 if(indexable->have_video())
289 undo->update_undo_before();
292 w = indexable->get_w();
293 h = indexable->get_h();
296 edl->session->output_w = w;
297 edl->session->output_h = h;
299 if(((edl->session->output_w % 4) ||
300 (edl->session->output_h % 4)) &&
301 edl->session->playback_config->vconfig->driver == PLAYBACK_X11_GL)
303 MainError::show_error(
304 _("This project's dimensions are not multiples of 4 so\n"
305 "it can't be rendered by OpenGL."));
310 if(defaults->get("AUTOASPECT", 0))
312 create_aspect_ratio(edl->session->aspect_w,
313 edl->session->aspect_h,
320 undo->update_undo_after(_("asset to size"), LOAD_ALL);
322 sync_parameters(CHANGE_ALL);
327 void MWindow::asset_to_rate()
329 if(session->drag_assets->size() &&
330 session->drag_assets->get(0)->have_video())
332 double new_framerate = session->drag_assets->get(0)->get_frame_rate();
333 double old_framerate = edl->session->frame_rate;
334 undo->update_undo_before();
336 edl->session->frame_rate = new_framerate;
337 edl->resample(old_framerate, new_framerate, TRACK_VIDEO);
341 undo->update_undo_after(_("asset to rate"), LOAD_ALL);
350 sync_parameters(CHANGE_ALL);
356 void MWindow::clear_entry()
358 undo->update_undo_before();
363 undo->update_undo_after(_("clear"), LOAD_EDITS | LOAD_TIMEBAR);
366 update_plugin_guis();
367 gui->update(1, 2, 1, 1, 1, 1, 0);
368 cwindow->update(1, 0, 0, 0, 1);
369 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
375 void MWindow::clear(int clear_handle)
377 double start = edl->local_session->get_selectionstart();
378 double end = edl->local_session->get_selectionend();
379 if(clear_handle || !EQUIV(start, end))
383 edl->session->labels_follow_edits,
384 edl->session->plugins_follow_edits,
385 edl->session->autos_follow_edits);
389 void MWindow::set_automation_mode(int mode)
391 undo->update_undo_before();
392 edl->tracks->set_automation_mode(
393 edl->local_session->get_selectionstart(),
394 edl->local_session->get_selectionend(),
398 if(mode == Auto::LINEAR)
399 undo->update_undo_after(_("set linear"), LOAD_AUTOMATION);
401 undo->update_undo_after(_("set bezier"), LOAD_AUTOMATION);
404 update_plugin_guis();
405 gui->draw_overlays(1);
406 sync_parameters(CHANGE_PARAMS);
407 gui->update_patchbay();
408 cwindow->update(1, 0, 0);
411 void MWindow::clear_automation()
413 undo->update_undo_before();
414 edl->tracks->clear_automation(edl->local_session->get_selectionstart(),
415 edl->local_session->get_selectionend());
417 undo->update_undo_after(_("clear keyframes"), LOAD_AUTOMATION);
420 update_plugin_guis();
421 gui->draw_overlays(1);
422 sync_parameters(CHANGE_PARAMS);
423 gui->update_patchbay();
424 cwindow->update(1, 0, 0);
427 int MWindow::clear_default_keyframe()
429 undo->update_undo_before();
430 edl->tracks->clear_default_keyframe();
432 undo->update_undo_after(_("clear default keyframe"), LOAD_AUTOMATION);
435 gui->draw_overlays(1);
436 sync_parameters(CHANGE_PARAMS);
437 gui->update_patchbay();
438 cwindow->update(1, 0, 0);
443 void MWindow::clear_labels()
445 undo->update_undo_before();
446 clear_labels(edl->local_session->get_selectionstart(),
447 edl->local_session->get_selectionend());
448 undo->update_undo_after(_("clear labels"), LOAD_TIMEBAR);
450 gui->update_timebar(1);
451 cwindow->update(0, 0, 0, 0, 1);
455 int MWindow::clear_labels(double start, double end)
457 edl->labels->clear(start, end, 0);
461 void MWindow::concatenate_tracks()
463 undo->update_undo_before();
464 edl->tracks->concatenate_tracks(edl->session->plugins_follow_edits,
465 edl->session->autos_follow_edits);
467 undo->update_undo_after(_("concatenate tracks"), LOAD_EDITS);
470 gui->update(1, 1, 0, 0, 1, 0, 0);
471 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
480 copy(edl->local_session->get_selectionstart(),
481 edl->local_session->get_selectionend());
484 int MWindow::copy(double start, double end)
486 if(start == end) return 1;
488 //printf("MWindow::copy 1\n");
490 //printf("MWindow::copy 1\n");
499 //printf("MWindow::copy 1\n");
501 // File is now terminated and rewound
503 //printf("MWindow::copy 1\n");
504 const char *file_string = file.string();
505 long file_length = strlen(file_string);
506 gui->get_clipboard()->to_clipboard(file_string, file_length,
507 SECONDARY_SELECTION);
508 gui->get_clipboard()->to_clipboard(file_string, file_length,
509 BC_PRIMARY_SELECTION);
510 //printf("MWindow::copy\n%s\n", file.string);
511 //printf("MWindow::copy 2\n");
516 int MWindow::copy_automation()
519 edl->tracks->copy_automation(edl->local_session->get_selectionstart(),
520 edl->local_session->get_selectionend(),
524 const char *file_string = file.string();
525 long file_length = strlen(file_string);
526 gui->get_clipboard()->to_clipboard(file_string, file_length,
527 BC_PRIMARY_SELECTION);
528 gui->get_clipboard()->to_clipboard(file_string, file_length,
529 SECONDARY_SELECTION);
533 int MWindow::copy_default_keyframe()
536 edl->tracks->copy_automation(edl->local_session->get_selectionstart(),
537 edl->local_session->get_selectionend(),
541 const char *file_string = file.string();
542 long file_length = strlen(file_string);
543 gui->get_clipboard()->to_clipboard(file_string, file_length,
544 BC_PRIMARY_SELECTION);
545 gui->get_clipboard()->to_clipboard(file_string, file_length,
546 SECONDARY_SELECTION);
551 // Uses cropping coordinates in edl session to crop and translate video.
552 // We modify the projector since camera automation depends on the track size.
553 void MWindow::crop_video()
556 undo->update_undo_before();
557 // Clamp EDL crop region
558 if(edl->session->crop_x1 > edl->session->crop_x2)
560 edl->session->crop_x1 ^= edl->session->crop_x2;
561 edl->session->crop_x2 ^= edl->session->crop_x1;
562 edl->session->crop_x1 ^= edl->session->crop_x2;
564 if(edl->session->crop_y1 > edl->session->crop_y2)
566 edl->session->crop_y1 ^= edl->session->crop_y2;
567 edl->session->crop_y2 ^= edl->session->crop_y1;
568 edl->session->crop_y1 ^= edl->session->crop_y2;
571 float old_projector_x = (float)edl->session->output_w / 2;
572 float old_projector_y = (float)edl->session->output_h / 2;
573 float new_projector_x = (float)(edl->session->crop_x1 + edl->session->crop_x2) / 2;
574 float new_projector_y = (float)(edl->session->crop_y1 + edl->session->crop_y2) / 2;
575 float projector_offset_x = -(new_projector_x - old_projector_x);
576 float projector_offset_y = -(new_projector_y - old_projector_y);
578 edl->tracks->translate_projector(projector_offset_x, projector_offset_y);
580 edl->session->output_w = edl->session->crop_x2 - edl->session->crop_x1;
581 edl->session->output_h = edl->session->crop_y2 - edl->session->crop_y1;
582 edl->session->crop_x1 = 0;
583 edl->session->crop_y1 = 0;
584 edl->session->crop_x2 = edl->session->output_w;
585 edl->session->crop_y2 = edl->session->output_h;
587 // Recalculate aspect ratio
588 if(defaults->get("AUTOASPECT", 0))
590 create_aspect_ratio(edl->session->aspect_w,
591 edl->session->aspect_h,
592 edl->session->output_w,
593 edl->session->output_h);
596 undo->update_undo_after(_("crop"), LOAD_ALL);
599 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
608 undo->update_undo_before();
610 double start = edl->local_session->get_selectionstart();
611 double end = edl->local_session->get_selectionend();
616 edl->session->labels_follow_edits,
617 edl->session->plugins_follow_edits,
618 edl->session->autos_follow_edits);
623 undo->update_undo_after(_("cut"), LOAD_EDITS | LOAD_TIMEBAR);
626 update_plugin_guis();
627 gui->update(1, 2, 1, 1, 1, 1, 0);
628 cwindow->update(1, 0, 0, 0, 1);
629 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
635 int MWindow::cut_automation()
637 undo->update_undo_before();
641 edl->tracks->clear_automation(edl->local_session->get_selectionstart(),
642 edl->local_session->get_selectionend());
644 undo->update_undo_after(_("cut keyframes"), LOAD_AUTOMATION);
648 update_plugin_guis();
649 gui->draw_overlays(1);
650 sync_parameters(CHANGE_PARAMS);
651 gui->update_patchbay();
652 cwindow->update(1, 0, 0);
656 int MWindow::cut_default_keyframe()
659 undo->update_undo_before();
660 copy_default_keyframe();
661 edl->tracks->clear_default_keyframe();
662 undo->update_undo_after(_("cut default keyframe"), LOAD_AUTOMATION);
665 gui->draw_overlays(1);
666 sync_parameters(CHANGE_PARAMS);
667 gui->update_patchbay();
668 cwindow->update(1, 0, 0);
675 void MWindow::delete_inpoint()
677 edl->local_session->unset_inpoint();
681 void MWindow::delete_outpoint()
683 edl->local_session->unset_outpoint();
687 void MWindow::delete_track()
689 if (edl->tracks->last)
690 delete_track(edl->tracks->last);
693 void MWindow::delete_tracks()
695 undo->update_undo_before();
696 edl->tracks->delete_tracks();
697 undo->update_undo_after(_("delete tracks"), LOAD_ALL);
701 update_plugin_states();
702 gui->update(1, 1, 1, 0, 1, 0, 0);
703 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
709 void MWindow::delete_track(Track *track)
711 undo->update_undo_before();
712 edl->tracks->delete_track(track);
713 undo->update_undo_after(_("delete track"), LOAD_ALL);
716 update_plugin_states();
717 gui->update(1, 1, 1, 0, 1, 0, 0);
718 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
729 // Insert data from clipboard
730 void MWindow::insert(double position,
737 // For clipboard pasting make the new edl use a separate session
738 // from the master EDL. Then it can be resampled to the master rates.
739 // For splice, overwrite, and dragging need same session to get the assets.
740 EDL *edl = new EDL(parent_edl);
741 ArrayList<EDL*> new_edls;
742 uint32_t load_flags = LOAD_ALL;
745 new_edls.append(edl);
746 edl->create_objects();
751 if(parent_edl) load_flags &= ~LOAD_SESSION;
752 if(!edl->session->autos_follow_edits) load_flags &= ~LOAD_AUTOMATION;
753 if(!edl->session->labels_follow_edits) load_flags &= ~LOAD_TIMEBAR;
755 edl->load_xml(file, load_flags);
758 //printf("MWindow::insert %f\n", edl->local_session->clipboard_length);
762 paste_edls(&new_edls,
770 // printf("MWindow::insert 5 %f %f\n",
771 // vwindow->edl->local_session->in_point,
772 // vwindow->edl->local_session->out_point);
773 new_edls.remove_all();
774 edl->Garbage::remove_user();
775 //printf("MWindow::insert 6 %p\n", vwindow->get_edl());
778 void MWindow::insert_effects_canvas(double start,
781 Track *dest_track = session->track_highlighted;
782 if(!dest_track) return;
784 undo->update_undo_before();
786 for(int i = 0; i < session->drag_pluginservers->total; i++)
788 PluginServer *plugin = session->drag_pluginservers->values[i];
790 insert_effect(plugin->title,
793 i == 0 ? session->pluginset_highlighted : 0,
800 undo->update_undo_after(_("insert effect"), LOAD_EDITS | LOAD_PATCHES);
802 sync_parameters(CHANGE_EDL);
803 // GUI updated in TrackCanvas, after current_operations are reset
806 void MWindow::insert_effects_cwindow(Track *dest_track)
808 if(!dest_track) return;
810 undo->update_undo_before();
813 double length = dest_track->get_length();
815 if(edl->local_session->get_selectionend() >
816 edl->local_session->get_selectionstart())
818 start = edl->local_session->get_selectionstart();
819 length = edl->local_session->get_selectionend() -
820 edl->local_session->get_selectionstart();
823 for(int i = 0; i < session->drag_pluginservers->total; i++)
825 PluginServer *plugin = session->drag_pluginservers->values[i];
828 insert_effect(plugin->title,
838 undo->update_undo_after(_("insert effect"), LOAD_EDITS | LOAD_PATCHES);
840 sync_parameters(CHANGE_EDL);
850 void MWindow::insert_effect(char *title,
851 SharedLocation *shared_location,
854 int single_standalone)
856 Track *current = edl->tracks->first;
857 SharedLocation shared_location_local;
858 shared_location_local.copy_from(shared_location);
860 for( ; current; current = NEXT)
862 if(current->data_type == data_type &&
866 &shared_location_local,
875 if(plugin_type == PLUGIN_STANDALONE && single_standalone)
877 plugin_type = PLUGIN_SHAREDPLUGIN;
878 shared_location_local.module = edl->tracks->number_of(current);
879 shared_location_local.plugin = current->plugin_set.total - 1;
888 void MWindow::insert_effect(char *title,
889 SharedLocation *shared_location,
891 PluginSet *plugin_set,
896 KeyFrame *default_keyframe = 0;
897 PluginServer *server = 0;
904 // Get default keyframe
905 if(plugin_type == PLUGIN_STANDALONE)
907 default_keyframe = new KeyFrame;
908 server = new PluginServer(*scan_plugindb(title, track->data_type));
910 server->open_plugin(0, preferences, edl, 0);
911 server->save_data(default_keyframe);
916 // Insert plugin object
917 track->insert_effect(title,
928 if(plugin_type == PLUGIN_STANDALONE)
930 server->close_plugin();
932 delete default_keyframe;
936 int MWindow::modify_edithandles()
938 undo->update_undo_before();
939 edl->modify_edithandles(session->drag_start,
940 session->drag_position,
941 session->drag_handle,
942 edl->session->edit_handle_mode[session->drag_button],
943 edl->session->labels_follow_edits,
944 edl->session->plugins_follow_edits,
945 edl->session->autos_follow_edits);
947 finish_modify_handles();
950 //printf("MWindow::modify_handles 1\n");
954 int MWindow::modify_pluginhandles()
956 undo->update_undo_before();
958 edl->modify_pluginhandles(session->drag_start,
959 session->drag_position,
960 session->drag_handle,
961 edl->session->edit_handle_mode[session->drag_button],
962 edl->session->labels_follow_edits,
963 edl->session->autos_follow_edits,
964 session->trim_edits);
966 finish_modify_handles();
972 // Common to edithandles and plugin handles
973 void MWindow::finish_modify_handles()
975 int edit_mode = edl->session->edit_handle_mode[session->drag_button];
977 if((session->drag_handle == 1 && edit_mode != MOVE_NO_EDITS) ||
978 (session->drag_handle == 0 && edit_mode == MOVE_ONE_EDIT))
980 edl->local_session->set_selectionstart(session->drag_position);
981 edl->local_session->set_selectionend(session->drag_position);
984 if(edit_mode != MOVE_NO_EDITS)
986 edl->local_session->set_selectionstart(session->drag_start);
987 edl->local_session->set_selectionend(session->drag_start);
990 if(edl->local_session->get_selectionstart(1) < 0)
992 edl->local_session->set_selectionstart(0);
993 edl->local_session->set_selectionend(0);
995 undo->update_undo_after(_("drag handle"), LOAD_EDITS | LOAD_TIMEBAR);
999 sync_parameters(CHANGE_EDL);
1000 update_plugin_guis();
1001 gui->update(1, 2, 1, 1, 1, 1, 0);
1002 cwindow->update(1, 0, 0, 0, 1);
1005 void MWindow::match_output_size(Track *track)
1007 undo->update_undo_before();
1008 track->track_w = edl->session->output_w;
1009 track->track_h = edl->session->output_h;
1011 undo->update_undo_after(_("match output size"), LOAD_ALL);
1014 sync_parameters(CHANGE_EDL);
1018 void MWindow::move_edits(ArrayList<Edit*> *edits,
1022 undo->update_undo_before();
1024 edl->tracks->move_edits(edits,
1027 edl->session->labels_follow_edits,
1028 edl->session->plugins_follow_edits,
1029 edl->session->autos_follow_edits);
1032 undo->update_undo_after(_("move edit"), LOAD_ALL);
1035 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1040 update_plugin_guis();
1042 1, // 1 for incremental drawing. 2 for full refresh
1050 void MWindow::move_effect(Plugin *plugin,
1051 PluginSet *dest_plugin_set,
1053 int64_t dest_position)
1055 undo->update_undo_before();
1057 edl->tracks->move_effect(plugin,
1063 undo->update_undo_after(_("move effect"), LOAD_ALL);
1066 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1071 update_plugin_guis();
1073 1, // 1 for incremental drawing. 2 for full refresh
1081 void MWindow::move_plugins_up(PluginSet *plugin_set)
1084 undo->update_undo_before();
1085 plugin_set->track->move_plugins_up(plugin_set);
1088 undo->update_undo_after(_("move effect up"), LOAD_ALL);
1091 1, // 1 for incremental drawing. 2 for full refresh
1097 sync_parameters(CHANGE_EDL);
1100 void MWindow::move_plugins_down(PluginSet *plugin_set)
1102 undo->update_undo_before();
1104 plugin_set->track->move_plugins_down(plugin_set);
1107 undo->update_undo_after(_("move effect down"), LOAD_ALL);
1110 1, // 1 for incremental drawing. 2 for full refresh
1116 sync_parameters(CHANGE_EDL);
1119 void MWindow::move_track_down(Track *track)
1121 undo->update_undo_before();
1122 edl->tracks->move_track_down(track);
1124 undo->update_undo_after(_("move track down"), LOAD_ALL);
1127 gui->update(1, 1, 0, 0, 1, 0, 0);
1128 sync_parameters(CHANGE_EDL);
1132 void MWindow::move_tracks_down()
1134 undo->update_undo_before();
1135 edl->tracks->move_tracks_down();
1137 undo->update_undo_after(_("move tracks down"), LOAD_ALL);
1140 gui->update(1, 1, 0, 0, 1, 0, 0);
1141 sync_parameters(CHANGE_EDL);
1145 void MWindow::move_track_up(Track *track)
1147 undo->update_undo_before();
1148 edl->tracks->move_track_up(track);
1150 undo->update_undo_after(_("move track up"), LOAD_ALL);
1152 gui->update(1, 1, 0, 0, 1, 0, 0);
1153 sync_parameters(CHANGE_EDL);
1157 void MWindow::move_tracks_up()
1159 undo->update_undo_before();
1160 edl->tracks->move_tracks_up();
1162 undo->update_undo_after(_("move tracks up"), LOAD_ALL);
1164 gui->update(1, 1, 0, 0, 1, 0, 0);
1165 sync_parameters(CHANGE_EDL);
1169 void MWindow::mute_selection()
1171 double start = edl->local_session->get_selectionstart();
1172 double end = edl->local_session->get_selectionend();
1175 undo->update_undo_before();
1179 edl->session->plugins_follow_edits,
1180 edl->session->autos_follow_edits);
1181 edl->local_session->set_selectionend(end);
1182 edl->local_session->set_selectionstart(start);
1183 edl->paste_silence(start,
1186 edl->session->plugins_follow_edits,
1187 edl->session->autos_follow_edits);
1189 undo->update_undo_after(_("mute"), LOAD_EDITS);
1192 update_plugin_guis();
1193 gui->update(1, 2, 1, 1, 1, 1, 0);
1194 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1203 void MWindow::overwrite(EDL *source)
1207 double src_start = source->local_session->get_selectionstart();
1208 double overwrite_len = source->local_session->get_selectionend() - src_start;
1209 double dst_start = edl->local_session->get_selectionstart();
1210 double dst_len = edl->local_session->get_selectionend() - dst_start;
1212 undo->update_undo_before();
1213 if (!EQUIV(dst_len, 0) && (dst_len < overwrite_len))
1215 // in/out points or selection present and shorter than overwrite range
1216 // shorten the copy range
1217 overwrite_len = dst_len;
1220 source->copy(src_start,
1221 src_start + overwrite_len,
1229 // HACK around paste_edl get_start/endselection on its own
1230 // so we need to clear only when not using both io points
1231 // FIXME: need to write simple overwrite_edl to be used for overwrite function
1232 if (edl->local_session->get_inpoint() < 0 ||
1233 edl->local_session->get_outpoint() < 0)
1234 edl->clear(dst_start,
1235 dst_start + overwrite_len,
1241 dst_start + overwrite_len,
1247 edl->local_session->set_selectionstart(dst_start + overwrite_len);
1248 edl->local_session->set_selectionend(dst_start + overwrite_len);
1251 undo->update_undo_after(_("overwrite"), LOAD_EDITS);
1254 update_plugin_guis();
1255 gui->update(1, 1, 1, 1, 0, 1, 0);
1256 sync_parameters(CHANGE_EDL);
1259 // For splice and overwrite
1260 int MWindow::paste(double start,
1269 // Want to insert with assets shared with the master EDL.
1280 // For editing using insertion point
1281 void MWindow::paste()
1283 double start = edl->local_session->get_selectionstart();
1284 //double end = edl->local_session->get_selectionend();
1285 int64_t len = gui->get_clipboard()->clipboard_len(SECONDARY_SELECTION);
1289 char *string = new char[len + 1];
1291 undo->update_undo_before();
1294 gui->get_clipboard()->from_clipboard(string,
1296 BC_PRIMARY_SELECTION);
1298 file.read_from_string(string);
1307 edl->session->labels_follow_edits,
1308 edl->session->plugins_follow_edits,
1309 edl->session->autos_follow_edits,
1322 undo->update_undo_after(_("paste"), LOAD_EDITS | LOAD_TIMEBAR);
1324 update_plugin_guis();
1325 gui->update(1, 2, 1, 1, 0, 1, 0);
1326 gui->unlock_window();
1328 awindow->gui->lock_window("MWindow::paste");
1329 awindow->gui->update_assets();
1330 awindow->gui->unlock_window();
1332 gui->lock_window("MWindow::paste");
1333 sync_parameters(CHANGE_EDL);
1338 int MWindow::paste_assets(double position, Track *dest_track)
1342 undo->update_undo_before();
1346 if(session->drag_assets->total)
1348 load_assets(session->drag_assets,
1353 edl->session->labels_follow_edits,
1354 edl->session->plugins_follow_edits,
1355 edl->session->autos_follow_edits);
1360 if(session->drag_clips->total)
1362 paste_edls(session->drag_clips,
1366 edl->session->labels_follow_edits,
1367 edl->session->plugins_follow_edits,
1368 edl->session->autos_follow_edits);
1375 undo->update_undo_after(_("paste assets"), LOAD_EDITS);
1384 sync_parameters(CHANGE_EDL);
1388 void MWindow::load_assets(ArrayList<Indexable*> *new_assets,
1392 RecordLabels *labels,
1397 const int debug = 0;
1398 if(debug) printf("MWindow::load_assets %d\n", __LINE__);
1399 if(position < 0) position = edl->local_session->get_selectionstart();
1401 ArrayList<EDL*> new_edls;
1402 for(int i = 0; i < new_assets->total; i++)
1404 Indexable *indexable = new_assets->get(i);
1405 if(indexable->is_asset)
1407 remove_asset_from_caches((Asset*)indexable);
1409 EDL *new_edl = new EDL;
1410 new_edl->create_objects();
1411 new_edl->copy_session(edl);
1412 new_edls.append(new_edl);
1415 if(indexable->is_asset)
1417 if(debug) printf("MWindow::load_assets %d\n", __LINE__);
1418 if(debug) ((Asset*)indexable)->dump();
1419 asset_to_edl(new_edl, (Asset*)indexable);
1422 edl_to_nested(new_edl, (EDL*)indexable);
1423 if(debug) printf("MWindow::load_assets %d\n", __LINE__);
1428 for(RecordLabel *label = labels->first; label; label = label->next)
1430 new_edl->labels->toggle_label(label->position, label->position);
1434 if(debug) printf("MWindow::load_assets %d\n", __LINE__);
1436 paste_edls(&new_edls,
1443 if(debug) printf("MWindow::load_assets %d\n", __LINE__);
1447 for(int i = 0; i < new_edls.size(); i++)
1448 new_edls.get(i)->Garbage::remove_user();
1450 if(debug) printf("MWindow::load_assets %d\n", __LINE__);
1453 int MWindow::paste_automation()
1455 int64_t len = gui->get_clipboard()->clipboard_len(SECONDARY_SELECTION);
1459 undo->update_undo_before();
1460 char *string = new char[len + 1];
1461 gui->get_clipboard()->from_clipboard(string,
1463 BC_PRIMARY_SELECTION);
1465 file.read_from_string(string);
1467 edl->tracks->clear_automation(edl->local_session->get_selectionstart(),
1468 edl->local_session->get_selectionend());
1469 edl->tracks->paste_automation(edl->local_session->get_selectionstart(),
1473 edl->session->typeless_keyframes);
1475 undo->update_undo_after(_("paste keyframes"), LOAD_AUTOMATION);
1480 update_plugin_guis();
1481 gui->draw_overlays(1);
1482 sync_parameters(CHANGE_PARAMS);
1483 gui->update_patchbay();
1484 cwindow->update(1, 0, 0);
1490 int MWindow::paste_default_keyframe()
1492 int64_t len = gui->get_clipboard()->clipboard_len(SECONDARY_SELECTION);
1496 undo->update_undo_before();
1497 char *string = new char[len + 1];
1498 gui->get_clipboard()->from_clipboard(string,
1500 BC_PRIMARY_SELECTION);
1502 file.read_from_string(string);
1503 edl->tracks->paste_automation(edl->local_session->get_selectionstart(),
1507 edl->session->typeless_keyframes);
1508 // edl->tracks->paste_default_keyframe(&file);
1509 undo->update_undo_after(_("paste default keyframe"), LOAD_AUTOMATION);
1513 update_plugin_guis();
1514 gui->draw_overlays(1);
1515 sync_parameters(CHANGE_PARAMS);
1516 gui->update_patchbay();
1517 cwindow->update(1, 0, 0);
1526 // Insert edls with project deletion and index file generation.
1527 int MWindow::paste_edls(ArrayList<EDL*> *new_edls,
1530 double current_position,
1536 ArrayList<Track*> destination_tracks;
1537 int need_new_tracks = 0;
1540 if(!new_edls->total) return 0;
1543 // double original_length = edl->tracks->total_playable_length();
1544 // double original_preview_end = edl->local_session->preview_end;
1547 // Delete current project
1548 if(load_mode == LOADMODE_REPLACE ||
1549 load_mode == LOADMODE_REPLACE_CONCATENATE)
1553 edl->save_defaults(defaults);
1557 edl->Garbage::remove_user();
1561 edl->create_objects();
1563 edl->copy_session(new_edls->values[0]);
1565 gui->mainmenu->update_toggles(0);
1568 gui->unlock_window();
1570 gwindow->gui->update_toggles(1);
1572 gui->lock_window("MWindow::paste_edls");
1575 // Insert labels for certain modes constitutively
1579 // Force reset of preview
1580 // original_length = 0;
1581 // original_preview_end = -1;
1587 // Create new tracks in master EDL
1588 if(load_mode == LOADMODE_REPLACE ||
1589 load_mode == LOADMODE_REPLACE_CONCATENATE ||
1590 load_mode == LOADMODE_NEW_TRACKS)
1593 need_new_tracks = 1;
1594 for(int i = 0; i < new_edls->total; i++)
1596 EDL *new_edl = new_edls->values[i];
1597 for(Track *current = new_edl->tracks->first;
1601 if(current->data_type == TRACK_VIDEO)
1603 edl->tracks->add_video_track(0, 0);
1604 if(current->draw) edl->tracks->last->draw = 1;
1605 destination_tracks.append(edl->tracks->last);
1608 if(current->data_type == TRACK_AUDIO)
1610 edl->tracks->add_audio_track(0, 0);
1611 destination_tracks.append(edl->tracks->last);
1614 if(current->data_type == TRACK_SUBTITLE)
1616 edl->tracks->add_subttl_track(0, 0);
1617 destination_tracks.append(edl->tracks->last);
1619 edl->session->highlighted_track = edl->tracks->total() - 1;
1622 // Base track count on first EDL only for concatenation
1623 if(load_mode == LOADMODE_REPLACE_CONCATENATE) break;
1628 // Recycle existing tracks of master EDL
1629 if(load_mode == LOADMODE_CONCATENATE ||
1630 load_mode == LOADMODE_PASTE ||
1631 load_mode == LOADMODE_NESTED)
1635 // The point of this is to shift forward labels after the selection so they can
1636 // then be shifted back to their original locations without recursively
1637 // shifting back every paste.
1638 if((load_mode == LOADMODE_PASTE ||
1639 load_mode == LOADMODE_NESTED) &&
1640 edl->session->labels_follow_edits)
1641 edl->labels->clear(edl->local_session->get_selectionstart(),
1642 edl->local_session->get_selectionend(),
1645 Track *current = first_track ? first_track : edl->tracks->first;
1646 for( ; current; current = NEXT)
1650 destination_tracks.append(current);
1661 int destination_track = 0;
1662 double *paste_position = new double[destination_tracks.total];
1668 // Iterate through the edls
1669 for(int i = 0; i < new_edls->total; i++)
1672 EDL *new_edl = new_edls->values[i];
1673 double edl_length = new_edl->local_session->clipboard_length ?
1674 new_edl->local_session->clipboard_length :
1675 new_edl->tracks->total_length();
1676 // printf("MWindow::paste_edls 2 %f %f\n",
1677 // new_edl->local_session->clipboard_length,
1678 // new_edl->tracks->total_length());
1685 // Convert EDL to master rates
1686 new_edl->resample(new_edl->session->sample_rate,
1687 edl->session->sample_rate,
1689 new_edl->resample(new_edl->session->frame_rate,
1690 edl->session->frame_rate,
1697 // Add assets and prepare index files
1698 for(Asset *new_asset = new_edl->assets->first;
1700 new_asset = new_asset->next)
1702 mainindexes->add_next_asset(0, new_asset);
1704 // Capture index file status from mainindex test
1705 edl->update_assets(new_edl);
1710 // Get starting point of insertion. Need this to paste labels.
1713 case LOADMODE_REPLACE:
1714 case LOADMODE_NEW_TRACKS:
1715 current_position = 0;
1718 case LOADMODE_CONCATENATE:
1719 case LOADMODE_REPLACE_CONCATENATE:
1720 destination_track = 0;
1721 if(destination_tracks.total)
1722 current_position = destination_tracks.values[0]->get_length();
1724 current_position = 0;
1727 case LOADMODE_PASTE:
1728 case LOADMODE_NESTED:
1729 destination_track = 0;
1732 for(int j = 0; j < destination_tracks.total; j++)
1734 paste_position[j] = (current_position >= 0) ?
1736 edl->local_session->get_selectionstart();
1741 case LOADMODE_RESOURCESONLY:
1742 edl->add_clip(new_edl);
1752 if(load_mode != LOADMODE_RESOURCESONLY)
1755 //printf("MWindow::paste_edls %f %f\n", current_position, edl_length);
1756 if(load_mode == LOADMODE_PASTE ||
1757 load_mode == LOADMODE_NESTED)
1758 edl->labels->insert_labels(new_edl->labels,
1759 destination_tracks.total ? paste_position[0] : 0.0,
1763 edl->labels->insert_labels(new_edl->labels,
1769 for(Track *new_track = new_edl->tracks->first;
1771 new_track = new_track->next)
1773 // Get destination track of same type as new_track
1775 k < destination_tracks.total &&
1776 destination_tracks.values[destination_track]->data_type != new_track->data_type;
1777 k++, destination_track++)
1779 if(destination_track >= destination_tracks.total - 1)
1780 destination_track = 0;
1783 // Insert data into destination track
1784 if(destination_track < destination_tracks.total &&
1785 destination_tracks.values[destination_track]->data_type == new_track->data_type)
1787 Track *track = destination_tracks.values[destination_track];
1789 // Replace default keyframes if first EDL and new tracks were created.
1790 // This means data copied from one track and pasted to another won't retain
1791 // the camera position unless it's a keyframe. If it did, previous data in the
1792 // track might get unknowingly corrupted. Ideally we would detect when differing
1793 // default keyframes existed and create discrete keyframes for both.
1794 int replace_default = (i == 0) && need_new_tracks;
1796 //printf("MWindow::paste_edls 1 %d\n", replace_default);
1797 // Insert new track at current position
1800 case LOADMODE_REPLACE_CONCATENATE:
1801 case LOADMODE_CONCATENATE:
1802 current_position = track->get_length();
1805 case LOADMODE_PASTE:
1806 case LOADMODE_NESTED:
1807 current_position = paste_position[destination_track];
1808 paste_position[destination_track] += new_track->get_length();
1813 track->insert_track(new_track,
1822 // Get next destination track
1823 destination_track++;
1824 if(destination_track >= destination_tracks.total)
1825 destination_track = 0;
1829 if(load_mode == LOADMODE_PASTE ||
1830 load_mode == LOADMODE_NESTED)
1831 current_position += edl_length;
1835 // Move loading of clips and vwindow to the end - this fixes some
1836 // strange issue, for index not being shown
1837 // Assume any paste operation from the same EDL won't contain any clips.
1838 // If it did it would duplicate every clip here.
1839 for(int i = 0; i < new_edls->total; i++)
1841 EDL *new_edl = new_edls->values[i];
1843 for(int j = 0; j < new_edl->clips.total; j++)
1845 edl->add_clip(new_edl->clips.values[j]);
1848 if(new_edl->total_vwindow_edls())
1850 // if(edl->vwindow_edl)
1851 // edl->vwindow_edl->Garbage::remove_user();
1852 // edl->vwindow_edl = new EDL(edl);
1853 // edl->vwindow_edl->create_objects();
1854 // edl->vwindow_edl->copy_all(new_edl->vwindow_edl);
1856 for(int j = 0; j < new_edl->total_vwindow_edls(); j++)
1858 EDL *vwindow_edl = new EDL(edl);
1859 vwindow_edl->create_objects();
1860 vwindow_edl->copy_all(new_edl->get_vwindow_edl(j));
1861 edl->append_vwindow_edl(vwindow_edl, 0);
1867 if(paste_position) delete [] paste_position;
1870 // This is already done in load_filenames and everything else that uses paste_edls
1871 // update_project(load_mode);
1873 // Fix preview range
1874 // if(EQUIV(original_length, original_preview_end))
1876 // edl->local_session->preview_end = edl->tracks->total_playable_length();
1880 // Start examining next batch of index files
1881 mainindexes->start_build();
1884 // Don't save a backup after loading since the loaded file is on disk already.
1891 void MWindow::paste_silence()
1893 double start = edl->local_session->get_selectionstart();
1894 double end = edl->local_session->get_selectionend();
1895 undo->update_undo_before();
1896 edl->paste_silence(start,
1898 edl->session->labels_follow_edits,
1899 edl->session->plugins_follow_edits,
1900 edl->session->autos_follow_edits);
1903 undo->update_undo_after(_("silence"), LOAD_EDITS | LOAD_TIMEBAR);
1905 update_plugin_guis();
1907 gui->update(1, 2, 1, 1, 1, 1, 0);
1908 cwindow->update(1, 0, 0, 0, 1);
1909 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1915 void MWindow::detach_transition(Transition *transition)
1917 undo->update_undo_before();
1918 hide_plugin(transition, 1);
1919 int is_video = (transition->edit->track->data_type == TRACK_VIDEO);
1920 transition->edit->detach_transition();
1922 undo->update_undo_after(_("detach transition"), LOAD_ALL);
1924 if(is_video) restart_brender();
1932 sync_parameters(CHANGE_EDL);
1935 void MWindow::detach_transitions()
1937 gui->lock_window("MWindow::detach_transitions 1");
1939 undo->update_undo_before();
1940 double start = edl->local_session->get_selectionstart();
1941 double end = edl->local_session->get_selectionend();
1942 edl->tracks->clear_transitions(start, end);
1945 undo->update_undo_after(_("detach transitions"), LOAD_EDITS);
1947 sync_parameters(CHANGE_EDL);
1948 gui->update(0, 1, 0, 0, 0, 0, 0);
1949 gui->unlock_window();
1952 void MWindow::paste_transition()
1954 // Only the first transition gets dropped.
1955 PluginServer *server = session->drag_pluginservers->values[0];
1957 undo->update_undo_before();
1959 strcpy(edl->session->default_atransition, server->title);
1961 strcpy(edl->session->default_vtransition, server->title);
1963 edl->tracks->paste_transition(server, session->edit_highlighted);
1965 undo->update_undo_after(_("transition"), LOAD_EDITS);
1967 if(server->video) restart_brender();
1968 sync_parameters(CHANGE_ALL);
1971 void MWindow::paste_transitions(int track_type, char *title)
1973 gui->lock_window("MWindow::detach_transitions 1");
1975 undo->update_undo_before();
1976 double start = edl->local_session->get_selectionstart();
1977 double end = edl->local_session->get_selectionend();
1978 edl->tracks->paste_transitions(start, end, track_type, title);
1981 undo->update_undo_after(_("attach transitions"), LOAD_EDITS);
1983 sync_parameters(CHANGE_EDL);
1984 gui->update(0, 1, 0, 0, 0, 0, 0);
1985 gui->unlock_window();
1988 void MWindow::paste_transition_cwindow(Track *dest_track)
1990 PluginServer *server = session->drag_pluginservers->values[0];
1991 undo->update_undo_before();
1992 edl->tracks->paste_video_transition(server, 1);
1994 undo->update_undo_after(_("transition"), LOAD_EDITS);
1996 gui->update(0, 1, 0, 0, 0, 0, 0);
1997 sync_parameters(CHANGE_ALL);
2000 void MWindow::paste_audio_transition()
2002 PluginServer *server = scan_plugindb(edl->session->default_atransition,
2006 char string[BCTEXTLEN];
2007 sprintf(string, _("No default transition %s found."), edl->session->default_atransition);
2008 gui->show_message(string);
2012 undo->update_undo_before();
2013 edl->tracks->paste_audio_transition(server);
2015 undo->update_undo_after(_("transition"), LOAD_EDITS);
2017 sync_parameters(CHANGE_EDL);
2018 gui->update(0, 1, 0, 0, 0, 0, 0);
2021 void MWindow::paste_video_transition()
2023 PluginServer *server = scan_plugindb(edl->session->default_vtransition,
2027 char string[BCTEXTLEN];
2028 sprintf(string, _("No default transition %s found."), edl->session->default_vtransition);
2029 gui->show_message(string);
2033 undo->update_undo_before();
2035 edl->tracks->paste_video_transition(server);
2037 undo->update_undo_after(_("transition"), LOAD_EDITS);
2039 sync_parameters(CHANGE_EDL);
2041 gui->update(0, 1, 0, 0, 0, 0, 0);
2044 void MWindow::shuffle_edits()
2046 gui->lock_window("MWindow::shuffle_edits 1");
2048 undo->update_undo_before();
2049 double start = edl->local_session->get_selectionstart();
2050 double end = edl->local_session->get_selectionend();
2052 edl->tracks->shuffle_edits(start, end);
2055 undo->update_undo_after(_("shuffle edits"), LOAD_EDITS | LOAD_TIMEBAR);
2057 sync_parameters(CHANGE_EDL);
2059 gui->update(0, 1, 1, 0, 0, 0, 0);
2060 gui->unlock_window();
2063 void MWindow::align_edits()
2065 gui->lock_window("MWindow::align_edits 1");
2067 undo->update_undo_before();
2068 double start = edl->local_session->get_selectionstart();
2069 double end = edl->local_session->get_selectionend();
2071 edl->tracks->align_edits(start, end);
2074 undo->update_undo_after(_("align edits"), LOAD_EDITS | LOAD_TIMEBAR);
2076 sync_parameters(CHANGE_EDL);
2078 gui->update(0, 1, 1, 0, 0, 0, 0);
2079 gui->unlock_window();
2082 void MWindow::set_edit_length(double length)
2084 gui->lock_window("MWindow::detach_transitions 1");
2086 undo->update_undo_before();
2087 double start = edl->local_session->get_selectionstart();
2088 double end = edl->local_session->get_selectionend();
2090 edl->tracks->set_edit_length(start, end, length);
2093 undo->update_undo_after(_("edit length"), LOAD_EDITS | LOAD_TIMEBAR);
2095 sync_parameters(CHANGE_EDL);
2097 gui->update(0, 1, 1, 0, 0, 0, 0);
2098 gui->unlock_window();
2102 void MWindow::set_transition_length(Transition *transition, 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_transition_length(transition, length);
2113 undo->update_undo_after(_("transition length"), LOAD_EDITS);
2115 edl->session->default_transition_length = length;
2116 sync_parameters(CHANGE_PARAMS);
2117 gui->update(0, 1, 0, 0, 0, 0, 0);
2118 gui->unlock_window();
2121 void MWindow::set_transition_length(double length)
2123 gui->lock_window("MWindow::detach_transitions 1");
2125 undo->update_undo_before();
2126 double start = edl->local_session->get_selectionstart();
2127 double end = edl->local_session->get_selectionend();
2129 edl->tracks->set_transition_length(start, end, length);
2132 undo->update_undo_after(_("transition length"), LOAD_EDITS);
2134 edl->session->default_transition_length = length;
2135 sync_parameters(CHANGE_PARAMS);
2137 gui->update(0, 1, 0, 0, 0, 0, 0);
2138 gui->unlock_window();
2142 void MWindow::redo_entry(BC_WindowBase *calling_window_gui)
2145 calling_window_gui->unlock_window();
2147 cwindow->playback_engine->que->send_command(STOP,
2151 cwindow->playback_engine->interrupt_playback(0);
2153 for(int i = 0; i < vwindows.size(); i++)
2155 vwindows.get(i)->playback_engine->que->send_command(STOP,
2159 vwindows.get(i)->playback_engine->interrupt_playback(0);
2162 cwindow->gui->lock_window("MWindow::redo_entry");
2163 for(int i = 0; i < vwindows.size(); i++)
2165 vwindows.get(i)->gui->lock_window("MWindow::redo_entry 2");
2172 update_plugin_states();
2173 update_plugin_guis();
2175 gui->update(1, 2, 1, 1, 1, 1, 1);
2176 cwindow->update(1, 1, 1, 1, 1);
2178 if (calling_window_gui != cwindow->gui)
2179 cwindow->gui->unlock_window();
2180 if (calling_window_gui != gui)
2181 gui->unlock_window();
2184 for(int i = 0; i < vwindows.size(); i++)
2186 if (calling_window_gui != vwindows.get(i)->gui)
2187 vwindows.get(i)->gui->unlock_window();
2190 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
2198 void MWindow::resize_track(Track *track, int w, int h)
2200 undo->update_undo_before();
2201 // We have to move all maskpoints so they do not move in relation to image areas
2202 ((MaskAutos*)track->automation->autos[AUTOMATION_MASK])->translate_masks(
2203 (w - track->track_w) / 2,
2204 (h - track->track_h) / 2);
2207 undo->update_undo_after(_("resize track"), LOAD_ALL);
2211 sync_parameters(CHANGE_EDL);
2215 void MWindow::set_inpoint(int is_mwindow)
2217 undo->update_undo_before();
2218 edl->set_inpoint(edl->local_session->get_selectionstart(1));
2220 undo->update_undo_after(_("in point"), LOAD_TIMEBAR);
2225 gui->lock_window("MWindow::set_inpoint 1");
2227 gui->update_timebar(1);
2230 gui->unlock_window();
2235 cwindow->gui->lock_window("MWindow::set_inpoint 2");
2237 cwindow->gui->timebar->update(1);
2240 cwindow->gui->unlock_window();
2244 void MWindow::set_outpoint(int is_mwindow)
2246 undo->update_undo_before();
2247 edl->set_outpoint(edl->local_session->get_selectionend(1));
2249 undo->update_undo_after(_("out point"), LOAD_TIMEBAR);
2254 gui->lock_window("MWindow::set_outpoint 1");
2256 gui->update_timebar(1);
2259 gui->unlock_window();
2264 cwindow->gui->lock_window("MWindow::set_outpoint 2");
2266 cwindow->gui->timebar->update(1);
2269 cwindow->gui->unlock_window();
2273 void MWindow::splice(EDL *source)
2277 undo->update_undo_before();
2278 source->copy(source->local_session->get_selectionstart(),
2279 source->local_session->get_selectionend(),
2290 double start = edl->local_session->get_selectionstart();
2291 //double end = edl->local_session->get_selectionend();
2292 double source_start = source->local_session->get_selectionstart();
2293 double source_end = source->local_session->get_selectionend();
2298 edl->session->labels_follow_edits,
2299 edl->session->plugins_follow_edits,
2300 edl->session->autos_follow_edits);
2302 // Position at end of clip
2303 edl->local_session->set_selectionstart(start +
2306 edl->local_session->set_selectionend(start +
2311 undo->update_undo_after(_("splice"), LOAD_EDITS | LOAD_TIMEBAR);
2312 update_plugin_guis();
2314 gui->update(1, 1, 1, 1, 0, 1, 0);
2315 sync_parameters(CHANGE_EDL);
2318 void MWindow::to_clip()
2323 gui->lock_window("MWindow::to_clip 1");
2324 start = edl->local_session->get_selectionstart();
2325 end = edl->local_session->get_selectionend();
2327 if(EQUIV(end, start))
2330 end = edl->tracks->total_length();
2333 // Don't copy all since we don't want the clips twice.
2344 EDL *new_edl = new EDL(edl);
2345 new_edl->create_objects();
2346 new_edl->load_xml(&file, LOAD_ALL);
2347 sprintf(new_edl->local_session->clip_title, _("Clip %d"), session->clip_number++);
2348 new_edl->local_session->set_selectionstart(0);
2349 new_edl->local_session->set_selectionend(0);
2351 gui->unlock_window();
2353 awindow->clip_edit->create_clip(new_edl);
2355 gui->lock_window("MWindow::to_clip 2");
2357 gui->unlock_window();
2363 int MWindow::toggle_label(int is_mwindow)
2365 double position1, position2;
2366 undo->update_undo_before();
2368 if(cwindow->playback_engine->is_playing_back)
2370 position1 = position2 =
2371 cwindow->playback_engine->get_tracking_position();
2375 position1 = edl->local_session->get_selectionstart(1);
2376 position2 = edl->local_session->get_selectionend(1);
2379 position1 = edl->align_to_frame(position1, 0);
2380 position2 = edl->align_to_frame(position2, 0);
2382 edl->labels->toggle_label(position1, position2);
2387 gui->lock_window("MWindow::toggle_label 1");
2389 gui->update_timebar(0);
2390 gui->activate_timeline();
2394 gui->unlock_window();
2399 cwindow->gui->lock_window("MWindow::toggle_label 2");
2401 cwindow->gui->timebar->update(1);
2404 cwindow->gui->unlock_window();
2407 undo->update_undo_after(_("label"), LOAD_TIMEBAR);
2411 void MWindow::trim_selection()
2413 undo->update_undo_before();
2416 edl->trim_selection(edl->local_session->get_selectionstart(),
2417 edl->local_session->get_selectionend(),
2418 edl->session->labels_follow_edits,
2419 edl->session->plugins_follow_edits,
2420 edl->session->autos_follow_edits);
2423 undo->update_undo_after(_("trim selection"), LOAD_EDITS | LOAD_TIMEBAR);
2424 update_plugin_guis();
2425 gui->update(1, 2, 1, 1, 1, 1, 0);
2426 cwindow->update(1, 0, 0, 0, 1);
2428 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
2436 void MWindow::undo_entry(BC_WindowBase *calling_window_gui)
2438 calling_window_gui->unlock_window();
2440 cwindow->playback_engine->que->send_command(STOP,
2444 cwindow->playback_engine->interrupt_playback(0);
2447 for(int i = 0; i < vwindows.size(); i++)
2449 vwindows.get(i)->playback_engine->que->send_command(STOP,
2453 vwindows.get(i)->playback_engine->interrupt_playback(0);
2456 cwindow->gui->lock_window("MWindow::undo_entry 1");
2457 for(int i = 0; i < vwindows.size(); i++)
2459 vwindows.get(i)->gui->lock_window("MWindow::undo_entry 4");
2461 gui->lock_window("MWindow::undo_entry 2");
2467 update_plugin_states();
2468 update_plugin_guis();
2472 gui->update(1, 2, 1, 1, 1, 1, 1);
2474 gui->unlock_window();
2476 cwindow->update(1, 1, 1, 1, 1);
2478 cwindow->gui->unlock_window();
2480 for(int i = 0; i < vwindows.size(); i++)
2482 if (calling_window_gui != vwindows.get(i)->gui)
2483 vwindows.get(i)->gui->unlock_window();
2486 if (calling_window_gui != gui)
2487 gui->unlock_window();
2490 awindow->gui->lock_window("MWindow::undo_entry 3");
2491 awindow->gui->update_assets();
2492 awindow->gui->flush();
2493 awindow->gui->unlock_window();
2495 cwindow->playback_engine->que->send_command(CURRENT_FRAME,
2499 calling_window_gui->lock_window("MWindow::undo_entry 4");
2504 void MWindow::new_folder(const char *new_folder)
2506 undo->update_undo_before();
2507 edl->new_folder(new_folder);
2508 undo->update_undo_after(_("new folder"), LOAD_ALL);
2509 awindow->gui->lock_window("MWindow::new_folder");
2510 awindow->gui->update_assets();
2511 awindow->gui->unlock_window();
2514 void MWindow::delete_folder(char *folder)
2516 // undo->update_undo_after(_("delete folder"), LOAD_ALL);
2519 void MWindow::select_point(double position)
2521 edl->local_session->set_selectionstart(position);
2522 edl->local_session->set_selectionend(position);
2525 cwindow->update(1, 0, 0, 0, 1);
2528 update_plugin_guis();
2529 gui->update_patchbay();
2530 gui->hide_cursor(0);
2531 gui->draw_cursor(0);
2532 gui->mainclock->update(edl->local_session->get_selectionstart(1));
2533 gui->zoombar->update();
2534 gui->update_timebar(0);
2535 gui->flash_canvas(0);
2542 void MWindow::map_audio(int pattern)
2544 undo->update_undo_before();
2545 remap_audio(pattern);
2546 undo->update_undo_after(_("map 1:1"), LOAD_AUTOMATION);
2547 sync_parameters(CHANGE_PARAMS);
2557 void MWindow::remap_audio(int pattern)
2559 int current_channel = 0;
2560 int current_track = 0;
2561 for(Track *current = edl->tracks->first; current; current = NEXT)
2563 if(current->data_type == TRACK_AUDIO &&
2566 Autos *pan_autos = current->automation->autos[AUTOMATION_PAN];
2567 PanAuto *pan_auto = (PanAuto*)pan_autos->get_auto_for_editing(-1);
2569 for(int i = 0; i < MAXCHANNELS; i++)
2571 pan_auto->values[i] = 0.0;
2574 if(pattern == MWindow::AUDIO_1_TO_1)
2576 pan_auto->values[current_channel] = 1.0;
2579 if(pattern == MWindow::AUDIO_5_1_TO_2)
2581 switch(current_track)
2584 pan_auto->values[0] = 0.5;
2585 pan_auto->values[1] = 0.5;
2588 pan_auto->values[0] = 1;
2591 pan_auto->values[1] = 1;
2594 pan_auto->values[0] = 1;
2597 pan_auto->values[1] = 1;
2600 pan_auto->values[0] = 0.5;
2601 pan_auto->values[1] = 0.5;
2606 BC_Pan::calculate_stick_position(edl->session->audio_channels,
2607 edl->session->achannel_positions,
2612 pan_auto->handle_y);
2616 if(current_channel >= edl->session->audio_channels)
2617 current_channel = 0;
2622 void MWindow::cut_commercials()
2624 undo->update_undo_before();
2625 commercials->scan_media();
2628 undo->update_undo_after(_("cut ads"), LOAD_EDITS | LOAD_TIMEBAR);
2631 update_plugin_guis();
2632 gui->update(1, 2, 1, 1, 1, 1, 0);
2633 cwindow->update(1, 0, 0, 0, 1);
2634 cwindow->playback_engine->que->
2635 send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1);