Fix T90633: Frame all doesn't use meta range

This commit fixes T90633, it changes the behavior of the `Frame All`
operation when the user is tabbed into a metastrip: instead of using
the scene timeline's range, `Frame All` uses the current metastrip's
range.

Reviewed By: ISS

Differential Revision: https://developer.blender.org/D12974
This commit is contained in:
Andrea Beconcini 2021-10-25 06:47:51 +02:00 committed by Richard Antalik
parent 84f7bf56a8
commit 82ae7b990a
Notes: blender-bot 2023-02-14 08:07:50 +01:00
Referenced by issue #94254, Crash when the Home button is pressed in the VSE
Referenced by issue #90633, VSE: "Frame all" inside metastrips uses global frame range instead of metastrip frame range
3 changed files with 36 additions and 6 deletions

View File

@ -92,7 +92,14 @@ static int sequencer_view_all_exec(bContext *C, wmOperator *op)
Scene *scene = CTX_data_scene(C);
const Editing *ed = SEQ_editing_get(scene);
SEQ_timeline_boundbox(scene, SEQ_active_seqbase_get(ed), &box);
SEQ_timeline_init_boundbox(scene, &box);
MetaStack *ms = SEQ_meta_stack_active_get(ed);
/* Use meta strip range instead of scene. */
if (ms != NULL) {
box.xmin = ms->disp_range[0] - 1;
box.xmax = ms->disp_range[1] + 1;
}
SEQ_timeline_expand_boundbox(SEQ_active_seqbase_get(ed), &box);
UI_view2d_smooth_view(C, region, &box, smooth_viewtx);
return OPERATOR_FINISHED;
}

View File

@ -32,6 +32,8 @@ struct Scene;
struct Sequence;
struct rctf;
void SEQ_timeline_init_boundbox(const struct Scene *scene, struct rctf *rect);
void SEQ_timeline_expand_boundbox(const struct ListBase *seqbase, struct rctf *rect);
void SEQ_timeline_boundbox(const struct Scene *scene,
const struct ListBase *seqbase,
struct rctf *rect);

View File

@ -376,19 +376,27 @@ float SEQ_time_sequence_get_fps(Scene *scene, Sequence *seq)
}
/**
* Define boundary rectangle of sequencer timeline and fill in rect data
* Initialize given rectangle with the Scene's timeline boundaries.
*
* \param scene: Scene in which strips are located
* \param seqbase: ListBase in which strips are located
* \param rect: data structure describing rectangle, that will be filled in by this function
* \param scene: the Scene instance whose timeline boundaries are extracted from
* \param rect: output parameter to be filled with timeline boundaries
*/
void SEQ_timeline_boundbox(const Scene *scene, const ListBase *seqbase, rctf *rect)
void SEQ_timeline_init_boundbox(const Scene *scene, rctf *rect)
{
rect->xmin = scene->r.sfra;
rect->xmax = scene->r.efra + 1;
rect->ymin = 0.0f;
rect->ymax = 8.0f;
}
/**
* Stretch the given rectangle to include the given strips boundaries
*
* \param seqbase: ListBase in which strips are located
* \param rect: output parameter to be filled with strips' boundaries
*/
void SEQ_timeline_expand_boundbox(const ListBase *seqbase, rctf *rect)
{
if (seqbase == NULL) {
return;
}
@ -406,6 +414,19 @@ void SEQ_timeline_boundbox(const Scene *scene, const ListBase *seqbase, rctf *re
}
}
/**
* Define boundary rectangle of sequencer timeline and fill in rect data
*
* \param scene: Scene in which strips are located
* \param seqbase: ListBase in which strips are located
* \param rect: data structure describing rectangle, that will be filled in by this function
*/
void SEQ_timeline_boundbox(const Scene *scene, const ListBase *seqbase, rctf *rect)
{
SEQ_timeline_init_boundbox(scene, rect);
SEQ_timeline_expand_boundbox(seqbase, rect);
}
static bool strip_exists_at_frame(SeqCollection *all_strips, const int timeline_frame)
{
Sequence *seq;