this->track = track;
if(track) this->edits = track->edits;
id = EDL::next_id();
+ orig_id = id;
}
Edit::Edit(EDL *edl, Edits *edits)
this->edits = edits;
if(edits) this->track = edits->track;
id = EDL::next_id();
+ orig_id = id;
}
Edit::~Edit()
channel = 0;
user_title[0] = 0;
nested_edl = 0;
- is_plugin = 0;
is_selected = 0;
hard_left = 0;
hard_right = 0;
void Edit::copy_from(Edit *edit)
{
+ this->orig_id = edit->orig_id;
this->nested_edl = edl->nested_edls.get_nested(edit->nested_edl);
this->asset = edl->assets->update(edit->asset);
this->startsource = edit->startsource;
this->channel = edit->channel;
}
+void Edit::clone_from(Edit *edit)
+{
+ copy_from(edit);
+ edit->orig_id = edit->id;
+}
+
void Edit::equivalent_output(Edit *edit, int64_t *result)
{
// End of edit changed
w = nested_edl->session->output_w;
h = nested_edl->session->output_h;
}
- return w>0 && h>0 ? ((double)edl->local_session->zoom_track*w)/h : 0;
+ return w>0 && h>0 ? ((double)track->data_h*w)/h : 0;
}
int Edit::picon_h()
{
- return edl->local_session->zoom_track;
+ return track->data_h;
}
int Edit::dump(FILE *fp)
{
fprintf(fp," EDIT %p\n", this); fflush(fp);
- fprintf(fp," nested_edl=%p %s asset=%p %s\n",
- nested_edl,
- nested_edl ? nested_edl->path : "",
- asset,
- asset ? asset->path : "");
+ fprintf(fp," id %d, orig_id %d, nested_edl=%p %s asset=%p %s\n",
+ id, orig_id, nested_edl, nested_edl ? nested_edl->path : "",
+ asset, asset ? asset->path : "");
fflush(fp);
- fprintf(fp," channel %d, color %08x, group_id %d, is_selected %d\n",
- channel, color, group_id, is_selected);
- if(transition)
- {
+ fprintf(fp," channel %d, color %08x, hard lt/rt %d/%d"
+ " group_id %d, is_selected %d\n",
+ channel, color, hard_left, hard_right, group_id, is_selected);
+ if( transition ) {
fprintf(fp," TRANSITION %p\n", transition);
transition->dump(fp);
}
- fprintf(fp," startsource %jd startproject %jd hard lt/rt %d/%d length %jd\n",
- startsource, startproject, hard_left, hard_right, length); fflush(fp);
+ fprintf(fp," startsource %jd startproject %jd length %jd\n",
+ startsource, startproject, length);
+ fflush(fp);
return 0;
}
startproject += difference;
}
+void Edit::trim(int64_t difference)
+{
+ length += difference;
+ if( startproject < 0 ) {
+ if( (startsource+=startproject) < 0 ) startsource = 0;
+ if( (length+=startproject) < 0 ) length = 0;
+ startproject = 0;
+ }
+ if( startsource < 0 )
+ startsource = 0;
+ int64_t src_len = get_source_end(INT64_MAX);
+ if( startsource + length > src_len ) {
+ length = src_len - startsource;
+ if( length < 0 ) length = 0;
+ }
+ if( length < 0 )
+ length = 0;
+}
int Edit::shift_start(int edit_mode, int64_t newposition, int64_t oldposition,
- int edit_edits, int edit_labels, int edit_plugins, int edit_autos,
- Edits *trim_edits)
+ int edit_labels, int edit_autos, int edit_plugins, Edits *trim_edits)
{
- int64_t startproject = this->startproject;
- int64_t startsource = this->startsource;
- int64_t length = this->length;
- int64_t source_len = get_source_end(startsource + length);
int64_t cut_length = newposition - oldposition;
- source_len -= cut_length;
+ int rest_moved = edit_mode == MOVE_RIPPLE || edit_mode == MOVE_EDGE ? 1 : 0;
+ if( cut_length > length )
+ cut_length = length;
+ else if( cut_length < -length )
+ cut_length = -length;
+
+ int64_t start = startproject, end = start + length;
+ Edit *prev = this->previous, *next = this->next;
+ int edits_moved = 0;
switch( edit_mode ) {
- case MOVE_EDGE:
+ case MOVE_RIPPLE:
+ edits_moved = 1;
+ startsource += cut_length;
+ cut_length = -cut_length;
+ length += cut_length;
+ for( Edit *edit=next; edit; edit=edit->next )
+ edit->startproject += cut_length;
+ break;
+ case MOVE_ROLL:
+ if( prev && prev->length + cut_length < 0 )
+ cut_length = -prev->length;
+ if( prev ) prev->trim(cut_length);
startproject += cut_length;
startsource += cut_length;
length -= cut_length;
break;
- case MOVE_MEDIA:
- startsource += cut_length;
+ case MOVE_SLIP:
+ edits_moved = 1;
+ startsource -= cut_length;
break;
- case MOVE_EDGE_MEDIA:
+ case MOVE_SLIDE:
+ edits_moved = 1;
+ if( prev && prev->length + cut_length < 0 )
+ cut_length = -prev->length;
+ if( next && next->length - cut_length < 0 )
+ cut_length = next->length;
+ if( prev ) prev->trim(cut_length);
startproject += cut_length;
- length -= cut_length;
+ if( next ) {
+ next->startproject += cut_length;
+ next->startsource += cut_length;
+ next->trim(-cut_length);
+ }
break;
- }
-
- if( startproject < 0 ) {
- startsource += startproject;
- length += startproject;
- startproject = 0;
- }
- if( startsource < 0 )
- startsource = 0;
- if( length > source_len )
- length = source_len;
- if( length < 0 )
- length = 0;
-
- int64_t start = this->startproject;
- int64_t end = start + this->length;
- if( edit_labels ) {
- double cut_len = track->from_units(cut_length);
- double start_pos = edits->track->from_units(start);
- edits->edl->labels->insert(start_pos, cut_len);
- double end_pos = edits->track->from_units(end);
- edits->edl->labels->insert(end_pos + cut_len, -cut_len);
- }
- if( edit_autos ) {
- edits->shift_keyframes_recursive(start, cut_length);
- edits->shift_keyframes_recursive(end + cut_length, -cut_length);
- }
- if( edit_plugins ) {
- edits->shift_effects_recursive(start, cut_length, 1);
- edits->shift_effects_recursive(end + cut_length, -cut_length, 1);
- }
- if( !edit_edits && startproject < start ) {
- edits->clear(startproject, start);
- cut_length = start - startproject;
+ case MOVE_EDGE:
+ edits_moved = 1;
+ startsource -= cut_length;
+ length += cut_length;
for( Edit *edit=next; edit; edit=edit->next )
edit->startproject += cut_length;
+ break;
}
-
- this->startproject = startproject;
- this->startsource = startsource;
- this->length = length;
-
- return 0;
+ trim(0);
+ return follow_edits(start, end, cut_length, edits_moved, rest_moved,
+ edit_labels, edit_autos, edit_plugins, trim_edits);
}
int Edit::shift_end(int edit_mode, int64_t newposition, int64_t oldposition,
- int edit_edits, int edit_labels, int edit_plugins, int edit_autos,
- Edits *trim_edits)
+ int edit_labels, int edit_autos, int edit_plugins, Edits *trim_edits)
{
- int64_t startproject = this->startproject;
- int64_t startsource = this->startsource;
- int64_t length = this->length;
- int64_t source_len = get_source_end(startsource + length);
int64_t cut_length = newposition - oldposition;
- source_len += cut_length;
+ int rest_moved = edit_mode == MOVE_RIPPLE || edit_mode == MOVE_EDGE ? 1 : 0;
+ if( cut_length > length ) {
+ if( !rest_moved ) cut_length = length;
+ }
+ else if( cut_length < -length )
+ cut_length = -length;
+ int64_t start = startproject, end = start + length;
+ Edit *prev = this->previous, *next = this->next;
+ int edits_moved = 0;
switch( edit_mode ) {
+ case MOVE_RIPPLE:
case MOVE_EDGE:
length += cut_length;
+ for( Edit *edit=next; edit; edit=edit->next )
+ edit->startproject += cut_length;
break;
- case MOVE_MEDIA:
- startsource += cut_length;
+ case MOVE_ROLL:
+ if( next && next->length - cut_length < 0 )
+ cut_length = next->length;
+ length += cut_length;
+ if( next ) {
+ next->startproject += cut_length;
+ next->startsource += cut_length;
+ next->trim(-cut_length);
+ }
break;
- case MOVE_EDGE_MEDIA:
+ case MOVE_SLIP:
+ edits_moved = 1;
startsource -= cut_length;
- length += cut_length;
+ break;
+ case MOVE_SLIDE:
+ edits_moved = 1;
+ if( prev && prev->length + cut_length < 0 )
+ cut_length = -prev->length;
+ if( next && next->length - cut_length < 0 )
+ cut_length = next->length;
+ if( prev ) prev->trim(cut_length);
+ startproject += cut_length;
+ if( next ) {
+ next->startproject += cut_length;
+ next->startsource += cut_length;
+ next->trim(-cut_length);
+ }
break;
}
- if( startproject < 0 ) {
- startsource += startproject;
- length += startproject;
- startproject = 0;
- }
- if( startsource < 0 )
- startsource = 0;
- if( length > source_len )
- length = source_len;
- if( length < 0 )
- length = 0;
+ trim(0);
+ return follow_edits(start, end, cut_length, edits_moved, rest_moved,
+ edit_labels, edit_autos, edit_plugins, trim_edits);
+}
- int64_t start = this->startproject;
- int64_t end = start + this->length;
- if( edit_labels ) {
- double cut_len = track->from_units(cut_length);
- double end_pos = edits->track->from_units(end);
- if( cut_len < 0 )
- edits->edl->labels->clear(end_pos + cut_len, end_pos, 1);
- else
- edits->edl->labels->insert(end_pos, cut_len);
+int Edit::follow_edits(int64_t start, int64_t end, int64_t cut_length,
+ int edits_moved, int rest_moved, int edit_labels, int edit_autos,
+ int edit_plugins, Edits *trim_edits)
+{
+ if( edits_moved && rest_moved ) {
+ if( edit_labels ) {
+ double cut_len = track->from_units(cut_length);
+ double start_pos = edits->track->from_units(start);
+ if( cut_len < 0 )
+ edits->edl->labels->clear(start_pos + cut_len, start_pos, 1);
+ else if( cut_len > 0 )
+ edits->edl->labels->insert(start_pos, cut_len);
+ }
+ if( cut_length < 0 )
+ track->clear(start + cut_length, start,
+ 0, 0, edit_autos, edit_plugins, trim_edits);
+ else if( cut_length > 0 ) {
+ if( edit_autos )
+ track->shift_keyframes(start, cut_length);
+ if( edit_plugins )
+ track->shift_effects(start, cut_length, 1, trim_edits);
+ }
}
- Track *track = edits->track;
- if( cut_length < 0 )
- track->clear(end+cut_length, end,
- 0, 0, edit_autos, edit_plugins, trim_edits);
- else if( cut_length > 0 ) {
- if( edit_autos )
- track->shift_keyframes(end, cut_length);
- if( edit_plugins )
- track->shift_effects(end, cut_length, 1, trim_edits);
+ else if( edits_moved ) {
+ if( edit_labels ) {
+ double cut_len = track->from_units(cut_length);
+ double start_pos = edits->track->from_units(start);
+ edits->edl->labels->insert(start_pos, cut_len);
+ double end_pos = edits->track->from_units(end);
+ edits->edl->labels->insert(end_pos + cut_len, -cut_len);
+ }
+ if( edit_autos ) {
+ if( cut_length > 0 ) {
+ track->clear(end, end+cut_length, 0, 0, 0, 1, 0);
+ track->shift_keyframes(start, cut_length);
+ }
+ else if( cut_length < 0 ) {
+ track->clear(start+cut_length, start, 0, 0, 0, 1, 0);
+ track->shift_keyframes(end+cut_length, -cut_length);
+ }
+ }
+ if( edit_plugins ) {
+ if( cut_length > 0 ) {
+ track->clear(end, end+cut_length, 0, 0, -1, 0, 0);
+ track->shift_effects(start, cut_length, 1, 0);
+ }
+ else if( cut_length < 0 ) {
+ track->clear(start+cut_length, start, 0, 0, -1, 0, 0);
+ track->shift_effects(end+cut_length, -cut_length, 1, 0);
+ }
+ }
}
-
- int64_t new_end = startproject + length;
- if( edit_edits ) {
- cut_length = new_end - end;
- for( Edit* edit=next; edit; edit=edit->next )
- edit->startproject += cut_length;
+ else if( rest_moved ) {
+ if( edit_labels ) {
+ double cut_len = track->from_units(cut_length);
+ double end_pos = edits->track->from_units(end);
+ if( cut_len < 0 )
+ edits->edl->labels->clear(end_pos + cut_len, end_pos, 1);
+ else if( cut_len > 0 )
+ edits->edl->labels->insert(end_pos, cut_len);
+ }
+ if( cut_length < 0 )
+ track->clear(end + cut_length, end,
+ 0, 0, edit_autos, edit_plugins, trim_edits);
+ else if( cut_length > 0 ) {
+ if( edit_autos )
+ track->shift_keyframes(end, cut_length);
+ if( edit_plugins )
+ track->shift_effects(end, cut_length, 1, trim_edits);
+ }
}
- else if( new_end > end )
- edits->clear(end, new_end);
-
- this->startproject = startproject;
- this->startsource = startsource;
- this->length = length;
-
return 0;
}
+
int Edit::popup_transition(float view_start, float zoom_units, int cursor_x, int cursor_y)
{
int64_t left, right, left_unit, right_unit;
int64_t pixel1, pixel2;
pixel1 = left;
- pixel2 = pixel1 + 10;
+ pixel2 = pixel1 + xS(10);
// test left edit
// cursor_x is faked in acanvas
//int64_t endproject = startproject + length;
pixel2 = right;
- pixel1 = pixel2 - 10;
+ pixel1 = pixel2 - xS(10);
// test right edit
if(cursor_x >= pixel1 && cursor_x <= pixel2)