//printf("Edits::insert_new_edit 1\n");
Edit *new_edit = create_edit();
- if( current ) new_edit->hard_right = current->hard_left;
if( current ) current = PREVIOUS;
- if( current ) new_edit->hard_left = current->hard_right;
//printf("Edits::insert_new_edit 1\n");
insert_after(current, new_edit);
new_edit->startproject = position;
new_edit->copy_from(edit);
new_edit->length = new_edit->startproject + new_edit->length - position;
edit->length = position - edit->startproject;
+ if( !new_edit->length || edit->silence() )
+ new_edit->hard_left = new_edit->hard_right = 0;
+ else if( !edit->length )
+ edit->hard_left = edit->hard_right = 0;
+ else {
+ new_edit->hard_right = edit->hard_right;
+ new_edit->hard_left = edit->hard_right = 0;
+ }
new_edit->startproject = position;
new_edit->startsource += edit->length;
}
}
+// trim edits before position 0
+ while( first && first->startproject+first->length < 0 )
+ delete first;
+ if( first && first->startproject < 0 ) {
+ first->length += first->startproject;
+ first->startproject = 0;
+ }
+
// Insert silence between edits which aren't consecutive
for(current = last; current; current = current->previous)
{
// delete 0 length edits
for( current = first; !result && current; ) {
- Edit* next = current->next;
+ Edit* prev = current->previous, *next = current->next;
if( current->length == 0 ) {
if( next && current->transition && !next->transition) {
next->transition = current->transition;
next->transition->edit = next;
current->transition = 0;
}
+ if( !current->silence() ) {
+ if( current->hard_left && next && !next->silence() )
+ next->hard_left = 1;
+ if( current->hard_right && prev && !prev->silence())
+ prev->hard_right = 1;
+ }
delete current;
result = 1;
break;
Edit *next_edit = 0;
for( ; current && (next_edit=current->next); current=NEXT ) {
// both edges are not hard edges
- if( current->hard_right || next_edit->hard_left ) continue;
+ if( current->hard_right || next_edit->hard_left )
+ continue;
// next edit is a glitch
if( is_glitch(next_edit) )
break;
{
//printf("Edits::clear_recursive 1\n");
track->clear(start, end,
- edit_edits, edit_labels, edit_plugins, edit_autos, 0,
- trim_edits);
+ edit_edits, edit_labels, edit_plugins, edit_autos, trim_edits);
}
// Lengthen effects
if(edit_plugins)
track->shift_effects(current_edit->next->startproject,
- length,
- edit_autos);
+ length, edit_autos, 0);
for(current_edit = current_edit->next; current_edit; current_edit = current_edit->next)
{
int Edits::modify_handles(double oldposition, double newposition, int currentend,
int edit_mode, int edit_edits, int edit_labels, int edit_plugins, int edit_autos,
- Edits *trim_edits)
+ Edits *trim_edits, int group_id)
{
int result = 0;
Edit *current_edit;
+ Edit *left = 0, *right = 0;
+ if( group_id > 0 ) {
+ double start = DBL_MAX, end = DBL_MIN;
+ for( Edit *edit=first; edit; edit=edit->next ) {
+ if( edit->group_id != group_id ) continue;
+ double edit_start = edit->track->from_units(edit->startproject);
+ if( edit_start < start ) { start = edit_start; left = edit; }
+ double edit_end = edit->track->from_units(edit->startproject+edit->length);
+ if( edit_end > end ) { end = edit_end; right = edit; }
+ }
+ }
//printf("Edits::modify_handles 1 %d %f %f\n", currentend, newposition, oldposition);
if(currentend == 0) {
// left handle
for(current_edit = first; current_edit && !result;) {
- if(edl->equivalent(track->from_units(current_edit->startproject),
- oldposition)) {
+ if( group_id > 0 ? current_edit == left :
+ edl->equivalent(track->from_units(current_edit->startproject),
+ oldposition) ) {
// edit matches selection
//printf("Edits::modify_handles 3 %f %f\n", newposition, oldposition);
+ double delta = newposition - oldposition;
oldposition = track->from_units(current_edit->startproject);
+ if( group_id > 0 ) newposition = oldposition + delta;
+ current_edit->shift_start(edit_mode,
+ track->to_units(newposition, 0), track->to_units(oldposition, 0),
+ edit_labels, edit_autos, edit_plugins, trim_edits);
result = 1;
-
- if(newposition >= oldposition) {
-//printf("Edits::modify_handle 1 %s %f %f\n", track->title, oldposition, newposition);
-// shift start of edit in
- current_edit->shift_start_in(edit_mode,
- track->to_units(newposition, 0),
- track->to_units(oldposition, 0),
- edit_edits,
- edit_labels,
- edit_plugins,
- edit_autos,
- trim_edits);
- }
- else
- {
-//printf("Edits::modify_handle 2 %s\n", track->title);
-// move start of edit out
- current_edit->shift_start_out(edit_mode,
- track->to_units(newposition, 0),
- track->to_units(oldposition, 0),
- edit_edits,
- edit_labels,
- edit_plugins,
- edit_autos,
- trim_edits);
- }
}
if(!result) current_edit = current_edit->next;
else {
// right handle selected
for(current_edit = first; current_edit && !result;) {
- if(edl->equivalent(track->from_units(current_edit->startproject) +
- track->from_units(current_edit->length), oldposition)) {
- oldposition = track->from_units(current_edit->startproject) +
+ if( group_id > 0 ? current_edit == right :
+ edl->equivalent(track->from_units(current_edit->startproject) +
+ track->from_units(current_edit->length), oldposition) ) {
+ double delta = newposition - oldposition;
+ oldposition = track->from_units(current_edit->startproject) +
track->from_units(current_edit->length);
+ if( group_id > 0 ) newposition = oldposition + delta;
result = 1;
-//printf("Edits::modify_handle 3\n");
- if(newposition <= oldposition) {
-// shift end of edit in
-//printf("Edits::modify_handle 4\n");
- current_edit->shift_end_in(edit_mode,
- track->to_units(newposition, 0),
- track->to_units(oldposition, 0),
- edit_edits,
- edit_labels,
- edit_plugins,
- edit_autos,
- trim_edits);
-//printf("Edits::modify_handle 5\n");
- }
- else
- {
-// move end of edit out
-//printf("Edits::modify_handle %d edit_mode=%d\n", __LINE__, edit_mode);
- current_edit->shift_end_out(edit_mode,
- track->to_units(newposition, 0),
- track->to_units(oldposition, 0),
- edit_edits,
- edit_labels,
- edit_plugins,
- edit_autos,
- trim_edits);
-//printf("Edits::modify_handle 7\n");
- }
+ current_edit->shift_end(edit_mode,
+ track->to_units(newposition, 0), track->to_units(oldposition, 0),
+ edit_labels, edit_autos, edit_plugins, trim_edits);
}
if(!result) current_edit = current_edit->next;
return 0;
}
-
void Edits::paste_silence(int64_t start, int64_t end)
{
Edit *new_edit = editof(start, PLAY_FORWARD, 0);
void Edits::shift_effects_recursive(int64_t position, int64_t length, int edit_autos)
{
- track->shift_effects(position, length, edit_autos);
+ track->shift_effects(position, length, edit_autos, 0);
}