edl->local_session->get_selectionstart(),
edl->local_session->get_selectionend(),
mode);
- int changed_edl = speed_after(1);
+ int changed_edl = speed_after(1, 1);
save_backup();
char string[BCSTRLEN];
sprintf(string,"set %s", FloatAuto::curve_name(mode));
speed_before();
edl->tracks->clear_automation(edl->local_session->get_selectionstart(),
edl->local_session->get_selectionend());
- int changed_edl = speed_after(1);
+ int changed_edl = speed_after(1, 1);
save_backup();
undo_after(_("clear keyframes"),
!changed_edl ? LOAD_AUTOMATION :
undo_before();
speed_before();
edl->tracks->clear_default_keyframe();
- int changed_edl = speed_after(1);
+ int changed_edl = speed_after(1, 1);
save_backup();
undo_after(_("clear default keyframe"),
!changed_edl ? LOAD_AUTOMATION :
gui->draw_overlays(1);
}
+void MWindow::select_edits(int v)
+{
+ double start = edl->local_session->get_selectionstart();
+ double end = edl->local_session->get_selectionend();
+ edl->tracks->select_edits(start, end, v);
+ gui->draw_overlays(1);
+}
+
void MWindow::concatenate_tracks()
{
undo_before();
copy_automation();
edl->tracks->clear_automation(edl->local_session->get_selectionstart(),
edl->local_session->get_selectionend());
- int changed_edl = speed_after(1);
+ int changed_edl = speed_after(1, 1);
save_backup();
undo_after(_("cut keyframes"),
!changed_edl ? LOAD_AUTOMATION :
speed_before();
copy_default_keyframe();
edl->tracks->clear_default_keyframe();
- int changed_edl = speed_after(1);
+ int changed_edl = speed_after(1, 1);
save_backup();
undo_after(_("cut default keyframe"),
!changed_edl ? LOAD_AUTOMATION :
ArrayList<SharedLocation> shared_locations;
PluginSet *pluginset = session->pluginset_highlighted;
- int gang = edl->session->gang_tracks != GANG_NONE ? 1 : 0;
+ int gang = edl->local_session->gang_tracks != GANG_NONE ? 1 : 0;
int data_type = dest_track->data_type;
int first_track = 1;
SharedLocation shared_location_local;
shared_location_local.copy_from(shared_location);
int first_track = 1;
- double start_pos = edl->local_session->get_selectionstart(1);
- double end_pos = edl->local_session->get_selectionend(1);
+ double start_pos = edl->local_session->get_selectionstart();
+ double end_pos = edl->local_session->get_selectionend();
for( ; current; current=NEXT ) {
if( current->data_type != data_type ) continue;
if( !current->is_armed() ) continue;
cwindow->update(1, 0, 0, 0, 1);
}
+int MWindow::modify_transnhandles()
+{
+ gui->reset_default_message();
+ gui->default_message();
+ Transition *transition = session->drag_transition;
+ if( !transition ) return 1;
+ int64_t length = transition->length;
+ Track *track = transition->edit->track;
+ int64_t start_pos = track->to_units(session->drag_start, 0);
+ int64_t end_pos = track->to_units(session->drag_position, 0);
+ length += end_pos - start_pos;
+ if( length < 0 ) length = 0;
+ if( length == transition->length ) return 0;
+
+ undo_before();
+ transition->length = length;
+ undo_after(_("trans handle"), LOAD_EDITS);
+
+ save_backup();
+ restart_brender();
+ sync_parameters(CHANGE_EDL);
+ update_plugin_guis();
+ gui->update(1, FORCE_REDRAW, 1, 1, 1, 1, 0);
+ cwindow->update(1, 0, 0, 0, 1);
+
+ return 0;
+}
+
void MWindow::match_output_size(Track *track)
{
undo_before();
sync_parameters(CHANGE_EDL);
}
-void MWindow::move_track_down(Track *track)
+void MWindow::roll_track_down(Track *track)
{
undo_before();
- edl->tracks->move_track_down(track);
+ edl->tracks->roll_track_down(track);
save_backup();
undo_after(_("move track down"), LOAD_ALL);
save_backup();
}
-void MWindow::move_tracks_down()
+void MWindow::roll_tracks_down()
{
undo_before();
- edl->tracks->move_tracks_down();
+ edl->tracks->roll_tracks_down();
save_backup();
undo_after(_("move tracks down"), LOAD_ALL);
save_backup();
}
-void MWindow::move_track_up(Track *track)
+void MWindow::roll_track_up(Track *track)
{
undo_before();
- edl->tracks->move_track_up(track);
+ edl->tracks->roll_track_up(track);
save_backup();
undo_after(_("move track up"), LOAD_ALL);
restart_brender();
save_backup();
}
-void MWindow::move_tracks_up()
+void MWindow::roll_tracks_up()
{
undo_before();
- edl->tracks->move_tracks_up();
+ edl->tracks->roll_tracks_up();
save_backup();
undo_after(_("move tracks up"), LOAD_ALL);
restart_brender();
}
-void MWindow::swap_track_down(Track *track)
+void MWindow::move_track_down(Track *track)
{
undo_before();
- edl->tracks->swap_track_down(track);
+ edl->tracks->move_track_down(track);
save_backup();
undo_after(_("swap track down"), LOAD_ALL);
save_backup();
}
-void MWindow::swap_tracks_down()
+void MWindow::move_tracks_down()
{
undo_before();
- edl->tracks->swap_tracks_down();
+ edl->tracks->move_tracks_down();
save_backup();
undo_after(_("swap tracks down"), LOAD_ALL);
save_backup();
}
-void MWindow::swap_track_up(Track *track)
+void MWindow::move_track_up(Track *track)
{
undo_before();
- edl->tracks->swap_track_up(track);
+ edl->tracks->move_track_up(track);
save_backup();
undo_after(_("swap track up"), LOAD_ALL);
restart_brender();
save_backup();
}
-void MWindow::swap_tracks_up()
+void MWindow::move_tracks_up()
{
undo_before();
- edl->tracks->swap_tracks_up();
+ edl->tracks->move_tracks_up();
save_backup();
undo_after(_("swap tracks up"), LOAD_ALL);
restart_brender();
edl->tracks->clear_automation(start, end);
edl->tracks->paste_automation(start, &file, 0, 1,
edl->session->typeless_keyframes);
- int changed_edl = speed_after(1);
+ int changed_edl = speed_after(1, 0);
save_backup();
undo_after(_("paste keyframes"),
!changed_edl ? LOAD_AUTOMATION :
edl->tracks->paste_automation(start, &file, 1, 0,
edl->session->typeless_keyframes);
// edl->tracks->paste_default_keyframe(&file);
- int changed_edl = speed_after(1);
+ int changed_edl = speed_after(1, 1);
undo_after(_("paste default keyframe"),
!changed_edl ? LOAD_AUTOMATION :
LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR);
// Delete current project
if( load_mode == LOADMODE_REPLACE ||
load_mode == LOADMODE_REPLACE_CONCATENATE ) {
- reset_caches();
+ reset_caches(1);
edl->save_defaults(defaults);
hide_plugins();
edl->Garbage::remove_user();
#endif
}
-int MWindow::normalize_speed(EDL *old_edl, EDL *new_edl)
+int MWindow::normalize_speed(EDL *old_edl, EDL *new_edl, int edit_speed)
{
+ int edit_plugins = edl->session->plugins_follow_edits;
+ int edit_autos = edl->session->autos_follow_edits;
+ int edit_labels = edl->session->labels_follow_edits;
+ if( !edit_autos ) edit_speed = 0;
int result = 0, first_track = 1;
- int plugins_follow_edits = edl->session->plugins_follow_edits;
- int autos_follow_edits = edl->session->autos_follow_edits;
- int labels_follow_edits = edl->session->labels_follow_edits;
Track *old_track = old_edl->tracks->first;
Track *new_track = new_edl->tracks->first;
for( ; old_track && new_track; old_track=old_track->next, new_track=new_track->next ) {
old_speed = (FloatAuto *)old_speed->next;
new_speed = (FloatAuto *)new_speed->next;
}
+ if( !old_speed && !new_speed ) continue;
+ result = 1;
+ if( edit_speed ) {
+ Autos *old_autos = old_track->automation->autos[AUTOMATION_SPEED];
+ Autos *new_autos = new_track->automation->autos[AUTOMATION_SPEED];
+ Auto *old_auto = old_autos ? old_autos->first : 0;
+ for( ; old_auto; old_auto=old_auto->next ) {
+ Auto *new_auto = new_autos->get_auto(old_auto->orig_id);
+ if( !new_auto ) continue;
+ int64_t auto_pos = old_auto->position;
+ double orig_pos = old_speeds->automation_integral(0, auto_pos, PLAY_FORWARD);
+ auto_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1);
+ new_auto->position = auto_pos;
+ }
+ }
Edit *old_edit = old_track->edits->first;
- Edit *new_edit = new_track->edits->first;
- while( old_edit && new_edit ) {
+ for( ; old_edit; old_edit=old_edit->next ) {
+ Edit *new_edit = new_track->edits->get_edit(old_edit->orig_id);
+ if( !new_edit ) continue;
int64_t edit_start = old_edit->startproject;
int64_t edit_end = edit_start + old_edit->length;
- if( old_speed || new_speed ) {
- double orig_start = old_speeds->automation_integral(0, edit_start, PLAY_FORWARD);
- double orig_end = old_speeds->automation_integral(0, edit_end, PLAY_FORWARD);
- edit_start = new_track->frame_align(new_speeds->speed_position(orig_start), 1);
- edit_end = new_track->frame_align(new_speeds->speed_position(orig_end), 1);
- result = 1;
- }
+ double orig_start = old_speeds->automation_integral(0, edit_start, PLAY_FORWARD);
+ double orig_end = old_speeds->automation_integral(0, edit_end, PLAY_FORWARD);
+ edit_start = new_track->frame_align(new_speeds->speed_position(orig_start), 1);
+ edit_end = new_track->frame_align(new_speeds->speed_position(orig_end), 1);
new_edit->startproject = edit_start;
new_edit->length = edit_end - edit_start;
- old_edit = old_edit->next;
- new_edit = new_edit->next;
}
if( first_track && old_track->is_armed() ) {
- if( labels_follow_edits ) {
- Labels *old_labels = old_edl->labels;
- Labels *new_labels = new_edl->labels;
- Label *old_label = old_labels ? old_labels->first : 0;
- Label *new_label = new_labels ? new_labels->first : 0;
- while( old_label && new_label ) {
+ Labels *old_labels = old_edl->labels;
+ Labels *new_labels = new_edl->labels;
+ if( edit_labels && old_labels && new_labels ) {
+ Label *old_label = old_labels->first;
+ for( ; old_label; old_label=old_label->next ) {
+ Label *new_label = new_labels->get_label(old_label->orig_id);
+ if( !new_label ) continue;
int64_t label_pos = old_track->to_units(old_label->position, 1);
- if( old_speed || new_speed ) {
- double orig_pos = old_speeds->automation_integral(0, label_pos, PLAY_FORWARD);
- label_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1);
- result = 1;
- }
+ double orig_pos = old_speeds->automation_integral(0, label_pos, PLAY_FORWARD);
+ label_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1);
new_label->position = new_track->from_units(label_pos);
- old_label = old_label->next;
- new_label = new_label->next;
}
}
first_track = 0;
}
- if( plugins_follow_edits ) {
+ if( edit_plugins ) {
int old_size = old_track->plugin_set.size();
int new_size = new_track->plugin_set.size();
int n = bmin(old_size, new_size);
for( int i=0; i<n; ++i ) {
PluginSet *old_plugin_set = old_track->plugin_set[i];
- Plugin *old_plugin = (Plugin *)(old_plugin_set ? old_plugin_set->first : 0);
+ if( !old_plugin_set ) continue;
PluginSet *new_plugin_set = new_track->plugin_set[i];
- Plugin *new_plugin = (Plugin *)(new_plugin_set ? new_plugin_set->first : 0);
- while( old_plugin && new_plugin ) {
+ if( !new_plugin_set ) continue;
+ Plugin *old_plugin = (Plugin *)old_plugin_set->first;
+ for( ; old_plugin; old_plugin=(Plugin *)old_plugin->next ) {
+ Plugin *new_plugin = (Plugin *)new_plugin_set->get_edit(old_plugin->orig_id);
+ if( !new_plugin ) continue;
int64_t plugin_start = old_plugin->startproject;
int64_t plugin_end = plugin_start + old_plugin->length;
- if( old_speed || new_speed ) {
- double orig_start = old_speeds->automation_integral(0, plugin_start, PLAY_FORWARD);
- double orig_end = old_speeds->automation_integral(0, plugin_end, PLAY_FORWARD);
- plugin_start = new_track->frame_align(new_speeds->speed_position(orig_start), 1);
- plugin_end = new_track->frame_align(new_speeds->speed_position(orig_end), 1);
- result = 1;
- }
+ double orig_start = old_speeds->automation_integral(0, plugin_start, PLAY_FORWARD);
+ double orig_end = old_speeds->automation_integral(0, plugin_end, PLAY_FORWARD);
+ plugin_start = new_track->frame_align(new_speeds->speed_position(orig_start), 1);
+ plugin_end = new_track->frame_align(new_speeds->speed_position(orig_end), 1);
new_plugin->startproject = plugin_start;
new_plugin->length = plugin_end - plugin_start;
- if( autos_follow_edits ) {
+ if( edit_autos ) {
KeyFrames *old_keyframes = old_plugin->keyframes;
- Auto *old_auto = old_keyframes ? old_keyframes->first : 0;
+ if( !old_keyframes ) continue;
KeyFrames *new_keyframes = new_plugin->keyframes;
- Auto *new_auto = new_keyframes ? new_keyframes->first : 0;
- while( old_auto && new_auto ) {
+ if( !new_keyframes ) continue;
+ Auto *old_auto = old_keyframes->first;
+ for( ; old_auto; old_auto=old_auto->next ) {
+ Auto *new_auto = new_keyframes->get_auto(old_auto->orig_id);
+ if( !new_auto ) continue;
int64_t auto_pos = old_auto->position;
- if( old_speed || new_speed ) {
- double orig_pos = old_speeds->automation_integral(0, auto_pos, PLAY_FORWARD);
- auto_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1);
- result = 1;
- }
+ double orig_pos = old_speeds->automation_integral(0, auto_pos, PLAY_FORWARD);
+ auto_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1);
new_auto->position = auto_pos;
old_auto = old_auto->next;
- new_auto = new_auto->next;
}
}
- old_plugin = (Plugin *)old_plugin->next;
- new_plugin = (Plugin *)new_plugin->next;
}
}
}
- if( autos_follow_edits ) { // must be last
- for( int i=0; i<AUTOMATION_TOTAL; ++i ) {
+ if( edit_autos ) { // speed must be last
+ for( int i=0; i<AUTOMATION_SPEED; ++i ) {
Autos *old_autos = old_track->automation->autos[i];
+ if( !old_autos ) continue;
Autos *new_autos = new_track->automation->autos[i];
- Auto *old_auto = old_autos ? old_autos->first : 0;
- Auto *new_auto = new_autos ? new_autos->first : 0;
- while( old_auto && new_auto ) {
+ if( !new_autos ) continue;
+ Auto *old_auto = old_autos->first;
+ for( ; old_auto; old_auto=old_auto->next ) {
+ Auto *new_auto = new_autos->get_auto(old_auto->orig_id);
+ if( !new_auto ) continue;
int64_t auto_pos = old_auto->position;
- if( old_speed || new_speed ) {
- double orig_pos = old_speeds->automation_integral(0, auto_pos, PLAY_FORWARD);
- auto_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1);
- result = 1;
- }
+ double orig_pos = old_speeds->automation_integral(0, auto_pos, PLAY_FORWARD);
+ auto_pos = new_track->frame_align(new_speeds->speed_position(orig_pos), 1);
new_auto->position = auto_pos;
- old_auto = old_auto->next;
- new_auto = new_auto->next;
}
}
}
speed_edl->copy_all(edl);
}
-int MWindow::speed_after(int done)
+int MWindow::speed_after(int done, int edit_speed)
{
int result = 0;
if( speed_edl ) {
if( done >= 0 )
- result = normalize_speed(speed_edl, edl);
+ result = normalize_speed(speed_edl, edl, edit_speed);
if( done != 0 ) {
speed_edl->remove_user();
speed_edl = 0;
for( ; track && !track->master; track=track->next )
mixer_last = track;
Track *next_track = track;
+ if( !master_track->armed ) {
+ master_track = next_track;
+ continue;
+ }
Mixer *master_mixer = 0;
for( int i=0, n=edl->mixers.size(); i<n; ++i ) {
if( master_track->index_in(edl->mixers[i]) >= 0 ) {