Fix: scrubbing time always has extra update that is only used by sequencer
The sequencer has a feature where it only draws a preview while scrubbing.
This was introduced in 8abdc89912.
When scrubbing ends, the sequencer requires an extra update so that the
non-preview version is shown again.
This is only needed by the sequencer and hence the update should not be
done if the sequencer is not used.
Changing `screen->scrubbing` is moved out of the sequencer specific
functions, because it's used elsewhere as well.
This commit is contained in:
@@ -194,42 +194,25 @@ static float frame_from_event(bContext *C, const wmEvent *event)
|
||||
return frame;
|
||||
}
|
||||
|
||||
static void change_frame_seq_preview_begin(bContext *C, const wmEvent *event)
|
||||
static void change_frame_seq_preview_begin(bContext *C, const wmEvent *event, SpaceSeq *sseq)
|
||||
{
|
||||
ScrArea *area = CTX_wm_area(C);
|
||||
bScreen *screen = CTX_wm_screen(C);
|
||||
if (area && area->spacetype == SPACE_SEQ) {
|
||||
SpaceSeq *sseq = area->spacedata.first;
|
||||
ARegion *region = CTX_wm_region(C);
|
||||
if (ED_space_sequencer_check_show_strip(sseq) && !ED_time_scrub_event_in_region(region, event))
|
||||
{
|
||||
ED_sequencer_special_preview_set(C, event->mval);
|
||||
}
|
||||
}
|
||||
if (screen) {
|
||||
screen->scrubbing = true;
|
||||
BLI_assert(sseq != NULL);
|
||||
ARegion *region = CTX_wm_region(C);
|
||||
if (ED_space_sequencer_check_show_strip(sseq) && !ED_time_scrub_event_in_region(region, event)) {
|
||||
ED_sequencer_special_preview_set(C, event->mval);
|
||||
}
|
||||
}
|
||||
|
||||
static void change_frame_seq_preview_end(bContext *C)
|
||||
static void change_frame_seq_preview_end(bContext *C, SpaceSeq *sseq)
|
||||
{
|
||||
bScreen *screen = CTX_wm_screen(C);
|
||||
bool notify = false;
|
||||
|
||||
if (screen->scrubbing) {
|
||||
screen->scrubbing = false;
|
||||
notify = true;
|
||||
}
|
||||
|
||||
BLI_assert(sseq != NULL);
|
||||
UNUSED_VARS_NDEBUG(sseq);
|
||||
if (ED_sequencer_special_preview_get() != NULL) {
|
||||
ED_sequencer_special_preview_clear();
|
||||
notify = true;
|
||||
}
|
||||
|
||||
if (notify) {
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene);
|
||||
}
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene);
|
||||
}
|
||||
|
||||
static bool use_sequencer_snapping(bContext *C)
|
||||
@@ -248,6 +231,7 @@ static bool use_sequencer_snapping(bContext *C)
|
||||
static int change_frame_invoke(bContext *C, wmOperator *op, const wmEvent *event)
|
||||
{
|
||||
ARegion *region = CTX_wm_region(C);
|
||||
bScreen *screen = CTX_wm_screen(C);
|
||||
if (CTX_wm_space_seq(C) != NULL && region->regiontype == RGN_TYPE_PREVIEW) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
@@ -262,7 +246,11 @@ static int change_frame_invoke(bContext *C, wmOperator *op, const wmEvent *event
|
||||
RNA_boolean_set(op->ptr, "snap", true);
|
||||
}
|
||||
|
||||
change_frame_seq_preview_begin(C, event);
|
||||
screen->scrubbing = true;
|
||||
SpaceSeq *sseq = CTX_wm_space_seq(C);
|
||||
if (sseq) {
|
||||
change_frame_seq_preview_begin(C, event, sseq);
|
||||
}
|
||||
|
||||
change_frame_apply(C, op, true);
|
||||
|
||||
@@ -274,7 +262,13 @@ static int change_frame_invoke(bContext *C, wmOperator *op, const wmEvent *event
|
||||
|
||||
static void change_frame_cancel(bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
change_frame_seq_preview_end(C);
|
||||
bScreen *screen = CTX_wm_screen(C);
|
||||
screen->scrubbing = false;
|
||||
|
||||
SpaceSeq *sseq = CTX_wm_space_seq(C);
|
||||
if (sseq != NULL) {
|
||||
change_frame_seq_preview_end(C, sseq);
|
||||
}
|
||||
}
|
||||
|
||||
/* Modal event handling of frame changing */
|
||||
@@ -324,7 +318,13 @@ static int change_frame_modal(bContext *C, wmOperator *op, const wmEvent *event)
|
||||
}
|
||||
|
||||
if (ret != OPERATOR_RUNNING_MODAL) {
|
||||
change_frame_seq_preview_end(C);
|
||||
bScreen *screen = CTX_wm_screen(C);
|
||||
screen->scrubbing = false;
|
||||
|
||||
SpaceSeq *sseq = CTX_wm_space_seq(C);
|
||||
if (sseq != NULL) {
|
||||
change_frame_seq_preview_end(C, sseq);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user