Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_sequencer/sequencer_edit.c
| Show First 20 Lines • Show All 1,851 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /** \name Toggle Meta Strip Operator | /** \name Toggle Meta Strip Operator | ||||
| * \{ */ | * \{ */ | ||||
| void recurs_sel_seq(Sequence *seqm) | void recurs_sel_seq(Sequence *seq_meta) | ||||
| { | { | ||||
| Sequence *seq; | Sequence *seq; | ||||
| seq = seqm->seqbase.first; | seq = seq_meta->seqbase.first; | ||||
| while (seq) { | while (seq) { | ||||
| if (seqm->flag & (SEQ_LEFTSEL + SEQ_RIGHTSEL)) { | if (seq_meta->flag & (SEQ_LEFTSEL + SEQ_RIGHTSEL)) { | ||||
| seq->flag &= ~SEQ_ALLSEL; | seq->flag &= ~SEQ_ALLSEL; | ||||
| } | } | ||||
| else if (seqm->flag & SELECT) { | else if (seq_meta->flag & SELECT) { | ||||
| seq->flag |= SELECT; | seq->flag |= SELECT; | ||||
| } | } | ||||
| else { | else { | ||||
| seq->flag &= ~SEQ_ALLSEL; | seq->flag &= ~SEQ_ALLSEL; | ||||
| } | } | ||||
| if (seq->seqbase.first) { | if (seq->seqbase.first) { | ||||
| recurs_sel_seq(seq); | recurs_sel_seq(seq); | ||||
| } | } | ||||
| seq = seq->next; | seq = seq->next; | ||||
| } | } | ||||
| } | } | ||||
| static int sequencer_meta_toggle_exec(bContext *C, wmOperator *UNUSED(op)) | static int sequencer_meta_toggle_exec(bContext *C, wmOperator *UNUSED(op)) | ||||
| { | { | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| Editing *ed = SEQ_editing_get(scene, false); | Editing *ed = SEQ_editing_get(scene, false); | ||||
| Sequence *last_seq = SEQ_select_active_get(scene); | Sequence *active_seq = SEQ_select_active_get(scene); | ||||
| MetaStack *ms; | |||||
| if (last_seq && last_seq->type == SEQ_TYPE_META && last_seq->flag & SELECT) { | if (active_seq && active_seq->type == SEQ_TYPE_META && active_seq->flag & SELECT) { | ||||
| /* Enter metastrip. */ | /* Enter metastrip. */ | ||||
| ms = MEM_mallocN(sizeof(MetaStack), "metastack"); | SEQ_meta_stack_alloc(ed, active_seq); | ||||
| BLI_addtail(&ed->metastack, ms); | SEQ_active_seqbase_set(ed, &active_seq->seqbase); | ||||
| ms->parseq = last_seq; | |||||
| ms->oldbasep = ed->seqbasep; | |||||
| copy_v2_v2_int(ms->disp_range, &ms->parseq->startdisp); | |||||
| ed->seqbasep = &last_seq->seqbase; | |||||
| SEQ_select_active_set(scene, NULL); | SEQ_select_active_set(scene, NULL); | ||||
| } | } | ||||
| else { | else { | ||||
| /* Exit metastrip if possible. */ | /* Exit metastrip if possible. */ | ||||
| Sequence *seq; | |||||
| if (BLI_listbase_is_empty(&ed->metastack)) { | if (BLI_listbase_is_empty(&ed->metastack)) { | ||||
| return OPERATOR_CANCELLED; | return OPERATOR_CANCELLED; | ||||
| } | } | ||||
| ms = ed->metastack.last; | MetaStack *ms = SEQ_active_meta_stack_get(ed); | ||||
| BLI_remlink(&ed->metastack, ms); | SEQ_active_seqbase_set(ed, ms->oldbasep); | ||||
| ed->seqbasep = ms->oldbasep; | |||||
| /* For old files, update from meta. */ | |||||
| if (ms->disp_range[0] == ms->disp_range[1]) { | |||||
| copy_v2_v2_int(ms->disp_range, &ms->parseq->startdisp); | |||||
| } | |||||
| /* Recalc all: the meta can have effects connected to it. */ | |||||
| for (seq = ed->seqbasep->first; seq; seq = seq->next) { | |||||
| SEQ_time_update_sequence(scene, seq); | |||||
| } | |||||
| /* 2.73+, keeping endpoints is important! | |||||
| * Moving them around means you can't usefully use metas in a complex edit. */ | |||||
| #if 1 | |||||
| SEQ_transform_set_left_handle_frame(ms->parseq, ms->disp_range[0]); | |||||
| SEQ_transform_set_right_handle_frame(ms->parseq, ms->disp_range[1]); | |||||
| SEQ_transform_fix_single_image_seq_offsets(ms->parseq); | |||||
| SEQ_time_update_sequence(scene, ms->parseq); | |||||
| #else | |||||
| if (SEQ_transform_test_overlap(ed->seqbasep, ms->parseq)) { | |||||
| SEQ_transform_seqbase_shuffle(ed->seqbasep, ms->parseq, scene); | |||||
| } | |||||
| #endif | |||||
| SEQ_select_active_set(scene, ms->parseq); | SEQ_select_active_set(scene, ms->parseq); | ||||
| SEQ_meta_stack_free(ed, ms); | |||||
| ms->parseq->flag |= SELECT; | |||||
| recurs_sel_seq(ms->parseq); | |||||
| MEM_freeN(ms); | |||||
| } | } | ||||
| DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS); | DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS); | ||||
| WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene); | WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene); | ||||
| return OPERATOR_FINISHED; | return OPERATOR_FINISHED; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 1,401 Lines • Show Last 20 Lines | |||||