diff options
author | Richard Antalik <richardantalik@gmail.com> | 2020-04-06 03:09:20 +0300 |
---|---|---|
committer | Richard Antalik <richardantalik@gmail.com> | 2020-04-06 03:09:20 +0300 |
commit | 0ca5b7b69b0349e8d074a4942e75ed5386ff3ada (patch) | |
tree | 4a4da653a53d2cc0685ac2787234a4918e37b273 | |
parent | d0d20de183f1afc77a97a119afb66e64799ebc6f (diff) |
Fix T74602: Sequencer slip operator ignores offset constraints
Limit offsets, so each strip contains at least 1 frame of content.
Reviewed By: campbellbarton
Differential Revision: https://developer.blender.org/D7288
-rw-r--r-- | source/blender/editors/space_sequencer/sequencer_edit.c | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index c2ffb2f55c2..d34eed622d4 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -1573,6 +1573,28 @@ static bool sequencer_slip_recursively(Scene *scene, SlipData *data, int offset) return changed; } +/* Make sure, that each strip contains at least 1 frame of content. */ +static void sequencer_slip_apply_limits(SlipData *data, int *offset) +{ + for (int i = 0; i < data->num_seq; i++) { + if (data->trim[i]) { + Sequence *seq = data->seq_array[i]; + int seq_content_start = data->ts[i].start + *offset; + int seq_content_end = seq_content_start + seq->len + seq->anim_startofs + seq->anim_endofs; + int diff = 0; + + if (seq_content_start >= seq->enddisp) { + diff = seq->enddisp - seq_content_start - 1; + } + + if (seq_content_end <= seq->startdisp) { + diff = seq->startdisp - seq_content_end + 1; + } + *offset += diff; + } + } +} + static int sequencer_slip_exec(bContext *C, wmOperator *op) { SlipData *data; @@ -1601,6 +1623,7 @@ static int sequencer_slip_exec(bContext *C, wmOperator *op) transseq_backup(data->ts + i, data->seq_array[i]); } + sequencer_slip_apply_limits(data, &offset); success = sequencer_slip_recursively(scene, data, offset); MEM_freeN(data->seq_array); @@ -1647,10 +1670,12 @@ static int sequencer_slip_modal(bContext *C, wmOperator *op, const wmEvent *even /* Modal numinput active, try to handle numeric inputs. */ if (event->val == KM_PRESS && has_numInput && handleNumInput(C, &data->num_input, event)) { - float offset; - applyNumInput(&data->num_input, &offset); + float offset_fl; + applyNumInput(&data->num_input, &offset_fl); + int offset = round_fl_to_int(offset_fl); - sequencer_slip_update_header(scene, area, data, (int)offset); + sequencer_slip_apply_limits(data, &offset); + sequencer_slip_update_header(scene, area, data, offset); RNA_int_set(op->ptr, "offset", offset); @@ -1682,6 +1707,7 @@ static int sequencer_slip_modal(bContext *C, wmOperator *op, const wmEvent *even UI_view2d_region_to_view(v2d, mouse_x, 0, &mouseloc[0], &mouseloc[1]); offset = mouseloc[0] - data->init_mouseloc[0]; + sequencer_slip_apply_limits(data, &offset); sequencer_slip_update_header(scene, area, data, offset); RNA_int_set(op->ptr, "offset", offset); @@ -1761,10 +1787,12 @@ static int sequencer_slip_modal(bContext *C, wmOperator *op, const wmEvent *even /* Modal numinput inactive, try to handle numeric inputs. */ if (!handled && event->val == KM_PRESS && handleNumInput(C, &data->num_input, event)) { - float offset; - applyNumInput(&data->num_input, &offset); + float offset_fl; + applyNumInput(&data->num_input, &offset_fl); + int offset = round_fl_to_int(offset_fl); - sequencer_slip_update_header(scene, area, data, (int)offset); + sequencer_slip_apply_limits(data, &offset); + sequencer_slip_update_header(scene, area, data, offset); RNA_int_set(op->ptr, "offset", offset); |