VSE: Various refactorings

These changes are not very useful on their own, but committed in order
to make PR #109522 easier to review
This commit is contained in:
Richard Antalik
2024-05-07 13:12:55 +02:00
parent b062980318
commit afa828ffca
11 changed files with 88 additions and 83 deletions

View File

@@ -8,6 +8,8 @@
#pragma once
#include "BLI_vector_set.hh"
struct Scene;
struct Sequence;
struct SpaceSeq;
@@ -46,4 +48,14 @@ Sequence *ED_sequencer_special_preview_get();
void ED_sequencer_special_preview_set(bContext *C, const int mval[2]);
void ED_sequencer_special_preview_clear();
bool sequencer_retiming_mode_is_active(const bContext *C);
/**
* Returns collection with selected strips presented to user. If operation is done in preview,
* collection is limited to selected presented strips, that can produce image output at current
* frame.
*
* \param C: context
* \return collection of strips (`Sequence`)
*/
blender::VectorSet<Sequence *> ED_sequencer_selected_strips_from_context(bContext *C);
bool ED_sequencer_can_select_handle(const Sequence *seq);

View File

@@ -1669,7 +1669,7 @@ static int sequencer_delete_exec(bContext *C, wmOperator *op)
SEQ_prefetch_stop(scene);
for (Sequence *seq : selected_strips_from_context(C)) {
for (Sequence *seq : ED_sequencer_selected_strips_from_context(C)) {
SEQ_edit_flag_for_removal(scene, seqbasep, seq);
if (delete_data) {
sequencer_delete_strip_data(C, seq);

View File

@@ -141,7 +141,7 @@ void channel_draw_context_init(const bContext *C,
/* `sequencer_edit.cc` */
void seq_rectf(const Scene *scene, Sequence *seq, rctf *rectf);
void seq_rectf(const Scene *scene, const Sequence *seq, rctf *rectf);
Sequence *find_neighboring_sequence(Scene *scene, Sequence *test, int lr, int sel);
void recurs_sel_seq(Sequence *seq_meta);
int seq_effect_find_selected(Scene *scene,
@@ -173,16 +173,6 @@ bool sequencer_view_strips_poll(bContext *C);
*/
blender::VectorSet<Sequence *> all_strips_from_context(bContext *C);
/**
* Returns collection with selected strips presented to user. If operation is done in preview,
* collection is limited to selected presented strips, that can produce image output at current
* frame.
*
* \param C: context
* \return collection of strips (`Sequence`)
*/
blender::VectorSet<Sequence *> selected_strips_from_context(bContext *C);
/* Externals. */
extern const EnumPropertyItem sequencer_prop_effect_types[];
@@ -330,12 +320,15 @@ int sequencer_retiming_box_select_exec(bContext *C, wmOperator *op);
/* `sequencer_retiming_draw.cc` */
void sequencer_draw_retiming(const bContext *C, SeqQuadsBatch *quads);
blender::Vector<Sequence *> sequencer_visible_strips_get(const bContext *C);
SeqRetimingKey *try_to_realize_virtual_keys(const bContext *C, Sequence *seq, const int mval[2]);
SeqRetimingKey *retiming_mousover_key_get(const bContext *C, const int mval[2], Sequence **r_seq);
int left_fake_key_frame_get(const bContext *C, const Sequence *seq);
int right_fake_key_frame_get(const bContext *C, const Sequence *seq);
bool retiming_keys_are_visible(const bContext *C);
bool retiming_keys_are_visible(const SpaceSeq *sseq);
/* `sequencer_timeline_draw.cc` */
blender::Vector<Sequence *> sequencer_visible_strips_get(const bContext *C);
blender::Vector<Sequence *> sequencer_visible_strips_get(const Scene *scene, const View2D *v2d);
/* `sequencer_clipboard.cc` */
int sequencer_clipboard_copy_exec(bContext *C, wmOperator *op);

View File

@@ -41,8 +41,7 @@ using blender::MutableSpan;
bool sequencer_retiming_mode_is_active(const bContext *C)
{
const Scene *scene = CTX_data_scene(C);
Editing *ed = SEQ_editing_get(scene);
Editing *ed = SEQ_editing_get(CTX_data_scene(C));
if (ed == nullptr) {
return false;
}
@@ -259,7 +258,7 @@ static int sequencer_retiming_key_add_exec(bContext *C, wmOperator *op)
}
int ret_val;
blender::VectorSet<Sequence *> strips = selected_strips_from_context(C);
blender::VectorSet<Sequence *> strips = ED_sequencer_selected_strips_from_context(C);
if (!strips.is_empty()) {
ret_val = retiming_key_add_from_selection(C, op, strips, timeline_frame);
}
@@ -345,7 +344,7 @@ static bool freeze_frame_add_from_strip_selection(bContext *C,
const int duration)
{
Scene *scene = CTX_data_scene(C);
blender::VectorSet<Sequence *> strips = selected_strips_from_context(C);
blender::VectorSet<Sequence *> strips = ED_sequencer_selected_strips_from_context(C);
const int timeline_frame = BKE_scene_frame_get(scene);
bool success = false;
@@ -543,7 +542,7 @@ static float strip_speed_get(bContext *C, const wmOperator * /* op */)
{
/* Strip mode. */
if (!sequencer_retiming_mode_is_active(C)) {
blender::VectorSet<Sequence *> strips = selected_strips_from_context(C);
blender::VectorSet<Sequence *> strips = ED_sequencer_selected_strips_from_context(C);
if (strips.size() == 1) {
Sequence *seq = strips[0];
SeqRetimingKey *key = ensure_left_and_right_keys(C, seq);
@@ -566,7 +565,7 @@ static float strip_speed_get(bContext *C, const wmOperator * /* op */)
static int strip_speed_set_exec(bContext *C, const wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
blender::VectorSet<Sequence *> strips = selected_strips_from_context(C);
blender::VectorSet<Sequence *> strips = ED_sequencer_selected_strips_from_context(C);
for (Sequence *seq : strips) {
SeqRetimingKey *key = ensure_left_and_right_keys(C, seq);

View File

@@ -42,9 +42,8 @@
#define KEY_SIZE (10 * U.pixelsize)
#define KEY_CENTER (UI_view2d_view_to_region_y(v2d, strip_y_rescale(seq, 0.0f)) + 4 + KEY_SIZE / 2)
bool retiming_keys_are_visible(const bContext *C)
bool retiming_keys_are_visible(const SpaceSeq *sseq)
{
const SpaceSeq *sseq = CTX_wm_space_seq(C);
return (sseq->timeline_overlay.flag & SEQ_TIMELINE_SHOW_STRIP_RETIMING) != 0;
}
@@ -76,67 +75,34 @@ static float pixels_to_view_height(const bContext *C, const float height)
return height / scale_y;
}
static float strip_start_screenspace_get(const bContext *C, const Sequence *seq)
static float strip_start_screenspace_get(const Scene *scene,
const View2D *v2d,
const Sequence *seq)
{
const View2D *v2d = UI_view2d_fromcontext(C);
const Scene *scene = CTX_data_scene(C);
return UI_view2d_view_to_region_x(v2d, SEQ_time_left_handle_frame_get(scene, seq));
}
static float strip_end_screenspace_get(const bContext *C, const Sequence *seq)
static float strip_end_screenspace_get(const Scene *scene, const View2D *v2d, const Sequence *seq)
{
const View2D *v2d = UI_view2d_fromcontext(C);
const Scene *scene = CTX_data_scene(C);
return UI_view2d_view_to_region_x(v2d, SEQ_time_right_handle_frame_get(scene, seq));
}
static rctf strip_box_get(const bContext *C, const Sequence *seq)
static rctf strip_box_get(const Scene *scene, const View2D *v2d, const Sequence *seq)
{
const View2D *v2d = UI_view2d_fromcontext(C);
rctf rect;
rect.xmin = strip_start_screenspace_get(C, seq);
rect.xmax = strip_end_screenspace_get(C, seq);
rect.xmin = strip_start_screenspace_get(scene, v2d, seq);
rect.xmax = strip_end_screenspace_get(scene, v2d, seq);
rect.ymin = UI_view2d_view_to_region_y(v2d, strip_y_rescale(seq, 0));
rect.ymax = UI_view2d_view_to_region_y(v2d, strip_y_rescale(seq, 1));
return rect;
}
blender::Vector<Sequence *> sequencer_visible_strips_get(const bContext *C)
{
const View2D *v2d = UI_view2d_fromcontext(C);
const Scene *scene = CTX_data_scene(C);
const Editing *ed = SEQ_editing_get(CTX_data_scene(C));
blender::Vector<Sequence *> strips;
LISTBASE_FOREACH (Sequence *, seq, ed->seqbasep) {
if (min_ii(SEQ_time_left_handle_frame_get(scene, seq), SEQ_time_start_frame_get(seq)) >
v2d->cur.xmax)
{
continue;
}
if (max_ii(SEQ_time_right_handle_frame_get(scene, seq),
SEQ_time_content_end_frame_get(scene, seq)) < v2d->cur.xmin)
{
continue;
}
if (seq->machine + 1.0f < v2d->cur.ymin) {
continue;
}
if (seq->machine > v2d->cur.ymax) {
continue;
}
strips.append(seq);
}
return strips;
}
/** Size in pixels. */
#define RETIME_KEY_MOUSEOVER_THRESHOLD (16.0f * UI_SCALE_FAC)
static rctf keys_box_get(const bContext *C, const Sequence *seq)
static rctf retiming_keys_box_get(const Scene *scene, const View2D *v2d, const Sequence *seq)
{
const View2D *v2d = UI_view2d_fromcontext(C);
rctf rect = strip_box_get(C, seq);
rctf rect = strip_box_get(scene, v2d, seq);
rect.ymax = KEY_CENTER + KEY_SIZE / 2;
rect.ymin = KEY_CENTER - KEY_SIZE / 2;
return rect;
@@ -163,7 +129,7 @@ static bool retiming_fake_key_is_clicked(const bContext *C,
{
const View2D *v2d = UI_view2d_fromcontext(C);
rctf box = keys_box_get(C, seq);
rctf box = retiming_keys_box_get(CTX_data_scene(C), v2d, seq);
if (!BLI_rctf_isect_pt(&box, mval[0], mval[1])) {
return false;
}
@@ -237,8 +203,10 @@ static SeqRetimingKey *mouse_over_key_get_from_strip(const bContext *C,
SeqRetimingKey *retiming_mousover_key_get(const bContext *C, const int mval[2], Sequence **r_seq)
{
const Scene *scene = CTX_data_scene(C);
const View2D *v2d = UI_view2d_fromcontext(C);
for (Sequence *seq : sequencer_visible_strips_get(C)) {
rctf box = keys_box_get(C, seq);
rctf box = retiming_keys_box_get(scene, v2d, seq);
if (!BLI_rctf_isect_pt(&box, mval[0], mval[1])) {
continue;
}
@@ -270,10 +238,10 @@ static void retime_key_draw(const bContext *C,
const blender::Map<SeqRetimingKey *, Sequence *> &selection)
{
const Scene *scene = CTX_data_scene(C);
const float key_x = key_x_get(scene, seq, key);
const View2D *v2d = UI_view2d_fromcontext(C);
const rctf strip_box = strip_box_get(C, seq);
const float key_x = key_x_get(scene, seq, key);
const rctf strip_box = strip_box_get(scene, v2d, seq);
if (!BLI_rctf_isect_x(&strip_box, UI_view2d_view_to_region_x(v2d, key_x))) {
return; /* Key out of the strip bounds. */
}
@@ -411,7 +379,7 @@ static void retime_keys_draw(const bContext *C, SeqQuadsBatch *quads)
return;
}
if (!retiming_keys_are_visible(C)) {
if (!retiming_keys_are_visible(CTX_wm_space_seq(C))) {
return;
}
@@ -579,7 +547,7 @@ static void retime_speed_draw(const bContext *C)
return;
}
if (!retiming_keys_are_visible(C)) {
if (!retiming_keys_are_visible(CTX_wm_space_seq(C))) {
return;
}

View File

@@ -69,9 +69,9 @@ blender::VectorSet<Sequence *> all_strips_from_context(bContext *C)
return SEQ_query_all_strips(seqbase);
}
blender::VectorSet<Sequence *> selected_strips_from_context(bContext *C)
blender::VectorSet<Sequence *> ED_sequencer_selected_strips_from_context(bContext *C)
{
Scene *scene = CTX_data_scene(C);
const Scene *scene = CTX_data_scene(C);
Editing *ed = SEQ_editing_get(scene);
ListBase *seqbase = SEQ_active_seqbase_get(ed);
ListBase *channels = SEQ_channels_displayed_get(ed);
@@ -248,7 +248,7 @@ void ED_sequencer_select_sequence_single(Scene *scene, Sequence *seq, bool desel
recurs_sel_seq(seq);
}
void seq_rectf(const Scene *scene, Sequence *seq, rctf *rect)
void seq_rectf(const Scene *scene, const Sequence *seq, rctf *rect)
{
rect->xmin = SEQ_time_left_handle_frame_get(scene, seq);
rect->xmax = SEQ_time_right_handle_frame_get(scene, seq);
@@ -448,7 +448,7 @@ static int sequencer_de_select_all_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
if (sequencer_retiming_mode_is_active(C) && retiming_keys_are_visible(C)) {
if (sequencer_retiming_mode_is_active(C) && retiming_keys_are_visible(CTX_wm_space_seq(C))) {
return sequencer_retiming_select_all_exec(C, op);
}
@@ -897,7 +897,7 @@ bool ED_sequencer_can_select_handle(const Sequence *seq)
static bool use_retiming_mode(const bContext *C, const Sequence *seq_key_test)
{
return seq_key_test && SEQ_retiming_data_is_editable(seq_key_test) &&
!sequencer_retiming_mode_is_active(C) && retiming_keys_are_visible(C);
!sequencer_retiming_mode_is_active(C) && retiming_keys_are_visible(CTX_wm_space_seq(C));
}
int sequencer_select_exec(bContext *C, wmOperator *op)
@@ -921,7 +921,7 @@ int sequencer_select_exec(bContext *C, wmOperator *op)
}
}
if (sequencer_retiming_mode_is_active(C) && retiming_keys_are_visible(C)) {
if (sequencer_retiming_mode_is_active(C) && retiming_keys_are_visible(CTX_wm_space_seq(C))) {
return sequencer_retiming_key_select_exec(C, op);
}
@@ -1674,7 +1674,7 @@ static int sequencer_box_select_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
if (sequencer_retiming_mode_is_active(C) && retiming_keys_are_visible(C)) {
if (sequencer_retiming_mode_is_active(C) && retiming_keys_are_visible(CTX_wm_space_seq(C))) {
return sequencer_retiming_box_select_exec(C, op);
}

View File

@@ -103,6 +103,38 @@ struct TimelineDrawContext {
SeqQuadsBatch *quads;
};
blender::Vector<Sequence *> sequencer_visible_strips_get(const bContext *C)
{
return sequencer_visible_strips_get(CTX_data_scene(C), UI_view2d_fromcontext(C));
}
blender::Vector<Sequence *> sequencer_visible_strips_get(const Scene *scene, const View2D *v2d)
{
const Editing *ed = SEQ_editing_get(scene);
blender::Vector<Sequence *> strips;
LISTBASE_FOREACH (Sequence *, seq, ed->seqbasep) {
if (min_ii(SEQ_time_left_handle_frame_get(scene, seq), SEQ_time_start_frame_get(seq)) >
v2d->cur.xmax)
{
continue;
}
if (max_ii(SEQ_time_right_handle_frame_get(scene, seq),
SEQ_time_content_end_frame_get(scene, seq)) < v2d->cur.xmin)
{
continue;
}
if (seq->machine + 1.0f < v2d->cur.ymin) {
continue;
}
if (seq->machine > v2d->cur.ymax) {
continue;
}
strips.append(seq);
}
return strips;
}
static TimelineDrawContext timeline_draw_context_get(const bContext *C, SeqQuadsBatch *quads_batch)
{
TimelineDrawContext ctx;

View File

@@ -27,6 +27,7 @@
/* For menu, popup, icons, etc. */
#include "ED_anim_api.hh"
#include "ED_screen.hh"
#include "ED_sequencer.hh"
#include "ED_time_scrub_ui.hh"
#include "ED_util_imbuf.hh"
@@ -338,7 +339,7 @@ static int sequencer_view_selected_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
ARegion *region = CTX_wm_region(C);
blender::VectorSet strips = selected_strips_from_context(C);
blender::VectorSet strips = ED_sequencer_selected_strips_from_context(C);
View2D *v2d = UI_view2d_fromcontext(C);
rctf cur_new = v2d->cur;

View File

@@ -11,6 +11,6 @@
struct Scene;
struct Sequence;
Sequence *SEQ_select_active_get(Scene *scene);
Sequence *SEQ_select_active_get(const Scene *scene);
bool SEQ_select_active_get_pair(Scene *scene, Sequence **r_seq_act, Sequence **r_seq_other);
void SEQ_select_active_set(Scene *scene, Sequence *seq);

View File

@@ -25,8 +25,8 @@ struct SequencerToolSettings;
enum {
SEQ_SIDE_MOUSE = -1,
SEQ_SIDE_NONE = 0,
SEQ_SIDE_LEFT,
SEQ_SIDE_RIGHT,
SEQ_SIDE_LEFT = (1 << 1), /* Same as SEQ_LEFTSEL. */
SEQ_SIDE_RIGHT = (1 << 2), /* Same as SEQ_RIGHTSEL. */
SEQ_SIDE_BOTH,
SEQ_SIDE_NO_CHANGE,
};

View File

@@ -14,7 +14,7 @@
#include "SEQ_select.hh"
#include "SEQ_sequencer.hh"
Sequence *SEQ_select_active_get(Scene *scene)
Sequence *SEQ_select_active_get(const Scene *scene)
{
const Editing *ed = SEQ_editing_get(scene);