From d4bef6a215080e99119089148c0368e60c43f436 Mon Sep 17 00:00:00 2001 From: Alessio Monti di Sopra Date: Sat, 2 Nov 2019 22:53:39 -0700 Subject: VSE: add a Set frame range to Strips operator Add operator that sets the frame range, with an option to choose the regular or the preview one, around the selected strips. Reviewed By: ISS Differential Revision: https://developer.blender.org/D6078 --- .../editors/space_sequencer/sequencer_edit.c | 64 ++++++++++++++++++++++ .../editors/space_sequencer/sequencer_intern.h | 2 + .../editors/space_sequencer/sequencer_ops.c | 2 + 3 files changed, 68 insertions(+) (limited to 'source/blender/editors/space_sequencer') diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index ca1c55b80eb..dc4299b637b 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -4185,3 +4185,67 @@ void SEQUENCER_OT_export_subtitles(struct wmOperatorType *ot) FILE_DEFAULTDISPLAY, FILE_SORT_ALPHA); } + +static int sequencer_set_range_to_strips_exec(bContext *C, wmOperator *op) +{ + Scene *scene = CTX_data_scene(C); + Editing *ed = BKE_sequencer_editing_get(scene, false); + Sequence *seq; + + int sfra = MAXFRAME; + int efra = -MAXFRAME; + bool selected = false; + const bool preview = RNA_boolean_get(op->ptr, "preview"); + + for (seq = ed->seqbasep->first; seq; seq = seq->next) { + if (seq->flag & SELECT) { + selected = true; + sfra = min_ii(sfra, seq->startdisp); + efra = max_ii(efra, seq->enddisp - 1); + } + } + + if (!selected) { + BKE_report(op->reports, RPT_WARNING, "Select one or more strips"); + return OPERATOR_CANCELLED; + } + else if (efra < 0) { + BKE_report(op->reports, RPT_ERROR, "Can't set a negative range"); + return OPERATOR_CANCELLED; + } + + if (preview) { + scene->r.flag |= SCER_PRV_RANGE; + scene->r.psfra = max_ii(0, sfra); + scene->r.pefra = efra; + } + else { + scene->r.flag &= ~SCER_PRV_RANGE; + scene->r.sfra = max_ii(0, sfra); + scene->r.efra = efra; + } + + WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene); + + return OPERATOR_FINISHED; +} + +void SEQUENCER_OT_set_range_to_strips(struct wmOperatorType *ot) +{ + PropertyRNA *prop; + + /* identifiers */ + ot->name = "Set Range to Strips"; + ot->idname = "SEQUENCER_OT_set_range_to_strips"; + ot->description = "Set the frame range to the selected strips start and end"; + + /* api callbacks */ + ot->exec = sequencer_set_range_to_strips_exec; + ot->poll = sequencer_edit_poll; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + prop = RNA_def_boolean(ot->srna, "preview", false, "Preview", "Set the preview range instead"); + RNA_def_property_flag(prop, PROP_SKIP_SAVE); +} diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h b/source/blender/editors/space_sequencer/sequencer_intern.h index 093d333c007..0a51578da3b 100644 --- a/source/blender/editors/space_sequencer/sequencer_intern.h +++ b/source/blender/editors/space_sequencer/sequencer_intern.h @@ -149,6 +149,8 @@ void SEQUENCER_OT_enable_proxies(struct wmOperatorType *ot); void SEQUENCER_OT_export_subtitles(struct wmOperatorType *ot); +void SEQUENCER_OT_set_range_to_strips(struct wmOperatorType *ot); + /* preview specific operators */ void SEQUENCER_OT_view_all_preview(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c index e91d6cfa3e6..af03035d10f 100644 --- a/source/blender/editors/space_sequencer/sequencer_ops.c +++ b/source/blender/editors/space_sequencer/sequencer_ops.c @@ -88,6 +88,8 @@ void sequencer_operatortypes(void) WM_operatortype_append(SEQUENCER_OT_change_effect_type); WM_operatortype_append(SEQUENCER_OT_change_path); + WM_operatortype_append(SEQUENCER_OT_set_range_to_strips); + /* sequencer_select.c */ WM_operatortype_append(SEQUENCER_OT_select_all); WM_operatortype_append(SEQUENCER_OT_select); -- cgit v1.2.3