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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user