diff options
4 files changed, 68 insertions, 0 deletions
diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index 2848b49ef2b..4640e82b53f 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -242,6 +242,7 @@ class SEQUENCER_MT_strip(Menu): layout.operator("sequencer.offset_clear") layout.operator("sequencer.deinterlace_selected_movies") layout.operator("sequencer.rebuild_proxy") + layout.operator("sequencer.update_strip_length") layout.separator() layout.operator("sequencer.duplicate") diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index cd16b35ea25..8d04edd0c7f 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -55,6 +55,7 @@ #include "BKE_sequencer.h" #include "BKE_report.h" #include "BKE_sound.h" +#include "BKE_movieclip.h" #include "IMB_imbuf.h" @@ -3055,3 +3056,65 @@ void SEQUENCER_OT_change_path(struct wmOperatorType *ot) WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_DIRECTORY|WM_FILESEL_RELPATH|WM_FILESEL_FILEPATH|WM_FILESEL_FILES, FILE_DEFAULTDISPLAY); } + +static int sequencer_update_strip_length_exec(bContext *C, wmOperator *UNUSED(op)) +{ + Scene *scene = CTX_data_scene(C); + Editing *ed = seq_give_editing(scene, FALSE); + Sequence *seq; + int update = FALSE; + + SEQP_BEGIN(ed, seq) { + if ((seq->flag & SELECT)) { + int changed = FALSE; + + switch (seq->type) { + case SEQ_SCENE: + seq->len = seq->scene->r.efra - seq->scene->r.sfra + 1; + changed = TRUE; + break; + case SEQ_MOVIECLIP: + seq->len = BKE_movieclip_get_duration(seq->clip); + changed = TRUE; + break; + case SEQ_MOVIE: + seq->len = IMB_anim_get_duration(seq->anim, IMB_TC_RECORD_RUN); + changed = TRUE; + break; + } + + if (changed) { + calc_sequence_disp(scene, seq); + + if (seq_test_overlap(ed->seqbasep, seq)) + shuffle_seq(ed->seqbasep, seq, scene); + + update = TRUE; + } + } + } + SEQ_END + + if (update) { + free_imbuf_seq(scene, &ed->seqbase, FALSE, FALSE); + + WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene); + } + + return OPERATOR_FINISHED; +} + +void SEQUENCER_OT_update_strip_length(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Update Strip Length"; + ot->idname = "SEQUENCER_OT_update_strip_length"; + ot->description = "Update actual content length for selected strips"; + + /* api callbacks */ + ot->exec = sequencer_update_strip_length_exec; + ot->poll = ED_operator_sequencer_active; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; +} diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h b/source/blender/editors/space_sequencer/sequencer_intern.h index ef782832f13..7acaaf76c62 100644 --- a/source/blender/editors/space_sequencer/sequencer_intern.h +++ b/source/blender/editors/space_sequencer/sequencer_intern.h @@ -117,6 +117,8 @@ void SEQUENCER_OT_paste(struct wmOperatorType *ot); void SEQUENCER_OT_rebuild_proxy(struct wmOperatorType *ot); +void SEQUENCER_OT_update_strip_length(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 1ebb8af321c..88b9c61a033 100644 --- a/source/blender/editors/space_sequencer/sequencer_ops.c +++ b/source/blender/editors/space_sequencer/sequencer_ops.c @@ -113,6 +113,8 @@ void sequencer_operatortypes(void) WM_operatortype_append(SEQUENCER_OT_copy); WM_operatortype_append(SEQUENCER_OT_paste); + + WM_operatortype_append(SEQUENCER_OT_update_strip_length); } |