+int TrackCanvas::edit_intersects(Track *track, Edit *src_edit, double &pos)
+{
+ if( pos < 0 ) { pos = 0; return 1; }
+ int64_t src_start = src_edit->startproject;
+ int64_t src_end = src_start + src_edit->length;
+ double new_start = src_edit->track->from_units(src_start) + pos;
+ double new_end = src_edit->track->from_units(src_end) + pos;
+ int64_t trk_start = track->to_units(new_start, 1);
+ int64_t trk_end = track->to_units(new_end, 1);
+ for( Edit *edit=track->edits->first; edit; edit=edit->next ) {
+ if( edit->is_selected || edit->silence() ) continue;
+ int64_t edit_start = edit->startproject;
+ if( edit_start >= trk_end ) continue;
+ int64_t edit_end = edit_start + edit->length;
+ if( trk_start >= edit_end ) continue;
+ int64_t lt_dist = labs(trk_end - edit_start);
+ int64_t rt_dist = labs(edit_end - trk_start);
+ int64_t position;
+ if( lt_dist < rt_dist ) {
+ position = edit_start;
+ lt_dist = abs(trk_start - edit_start);
+ rt_dist = abs(trk_end - edit_start);
+ if( lt_dist > rt_dist )
+ position -= src_end;
+ }
+ else {
+ position = edit_end;
+ lt_dist = abs(trk_start - edit_end);
+ rt_dist = abs(trk_end - edit_end);
+ if( lt_dist > rt_dist )
+ position -= src_end;
+ }
+ pos = edit->track->from_units(position);
+ return 1;
+ }
+ return 0;
+}
+