X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fedit.C;h=e9e9f1b467e1e337ebd6f8b8535c10d17558f636;hp=47ca63c3ffe915a28469da28700988e616b28186;hb=f41ee8a0f00338fffb7fd6760a5ecd04c0101a41;hpb=ab958f323d68316c450ef81ba296536580620163 diff --git a/cinelerra-5.1/cinelerra/edit.C b/cinelerra-5.1/cinelerra/edit.C index 47ca63c3..e9e9f1b4 100644 --- a/cinelerra-5.1/cinelerra/edit.C +++ b/cinelerra-5.1/cinelerra/edit.C @@ -443,14 +443,19 @@ int Edit::shift_start(int edit_mode, int64_t newposition, int64_t oldposition, int edit_labels, int edit_autos, int edit_plugins, Edits *trim_edits) { int64_t cut_length = newposition - oldposition; - if( !cut_length ) return 0; + 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, rest_moved = 0; + int edits_moved = 0; switch( edit_mode ) { case MOVE_RIPPLE: - edits_moved = rest_moved = 1; + edits_moved = 1; startsource += cut_length; cut_length = -cut_length; length += cut_length; @@ -458,6 +463,8 @@ int Edit::shift_start(int edit_mode, int64_t newposition, int64_t oldposition, 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; @@ -469,6 +476,10 @@ int Edit::shift_start(int edit_mode, int64_t newposition, int64_t oldposition, 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 ) { @@ -478,7 +489,7 @@ int Edit::shift_start(int edit_mode, int64_t newposition, int64_t oldposition, } break; case MOVE_EDGE: - edits_moved = rest_moved = 1; + edits_moved = 1; startsource -= cut_length; length += cut_length; for( Edit *edit=next; edit; edit=edit->next ) @@ -486,7 +497,6 @@ int Edit::shift_start(int edit_mode, int64_t newposition, int64_t oldposition, break; } trim(0); - return follow_edits(start, end, cut_length, edits_moved, rest_moved, edit_labels, edit_autos, edit_plugins, trim_edits); } @@ -495,20 +505,26 @@ int Edit::shift_end(int edit_mode, int64_t newposition, int64_t oldposition, int edit_labels, int edit_autos, int edit_plugins, Edits *trim_edits) { int64_t cut_length = newposition - oldposition; - if( !cut_length ) return 0; + 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, rest_moved = 0; + int edits_moved = 0; switch( edit_mode ) { case MOVE_RIPPLE: case MOVE_EDGE: - rest_moved = 1; length += cut_length; for( Edit *edit=next; edit; edit=edit->next ) edit->startproject += cut_length; break; case MOVE_ROLL: + if( next && next->length - cut_length < 0 ) + cut_length = next->length; length += cut_length; if( next ) { next->startproject += cut_length; @@ -522,6 +538,10 @@ int Edit::shift_end(int edit_mode, int64_t newposition, int64_t oldposition, 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 ) { @@ -532,7 +552,6 @@ int Edit::shift_end(int edit_mode, int64_t newposition, int64_t oldposition, break; } trim(0); - return follow_edits(start, end, cut_length, edits_moved, rest_moved, edit_labels, edit_autos, edit_plugins, trim_edits); }