Cleanup: VSE: Clarify selection code

Rename a few functions to more accurately express their intent:
- `sequence_handle_size_get_clamped()` ->`strip_handle_draw_size_get()`
- `clickable_handle_size_get()` -> `inner_clickable_handle_size_get()`

Additionally:
- Move check for making strips unclickable when they are short enough in
  the vertical direction from `sequencer_main_cursor()` to
  `ED_sequencer_get_handle()`.
- Use `inner_clickable_handle_size_get()` in box select with handles.
- Add clarifying comments that calculate exact handle sizes.

There should be no functional changes (barring a tiny change in box
select with handle calculation).
This commit is contained in:
John Kiril Swenson
2025-02-02 22:39:55 -06:00
parent 3c9a71b46f
commit 0141bbb71c
4 changed files with 25 additions and 14 deletions

View File

@@ -141,7 +141,7 @@ int sequencer_draw_get_transform_preview_frame(Scene *scene);
void sequencer_special_update_set(Strip *strip);
/* Get handle width in 2d-View space. */
float sequence_handle_size_get_clamped(const Scene *scene, Strip *strip, float pixelx);
float strip_handle_draw_size_get(const Scene *scene, Strip *strip, float pixelx);
/* UNUSED */
/* void seq_reset_imageofs(SpaceSeq *sseq); */

View File

@@ -897,8 +897,13 @@ static void select_linked_time(const Scene *scene,
}
}
/* Similar to `sequence_handle_size_get_clamped()` but allows for larger clickable area. */
static float clickable_handle_size_get(const Scene *scene, const Strip *strip, const View2D *v2d)
/* Similar to `strip_handle_draw_size_get()`, but returns a larger clickable area that is
* the same for a given zoom level no matter whether "simplified tweaking" is turned off or on.
* `strip_clickable_areas_get` will pad this past strip bounds by 1/3 of the inner handle size,
* making the full handle size either 15 + 5 = 20px or 1/4 + 1/12 = 1/3 of the strip size. */
static float inner_clickable_handle_size_get(const Scene *scene,
const Strip *strip,
const View2D *v2d)
{
const float pixelx = 1 / UI_view2d_scale_get_x(v2d);
const float strip_len = SEQ_time_right_handle_frame_get(scene, strip) -
@@ -918,6 +923,10 @@ bool ED_sequencer_can_select_handle(const Scene *scene, const Strip *strip, cons
return false;
}
/* This ensures clickable handles are deactivated when the strip gets too small (25 or 15
* frames). Since the full handle size for a small strip is 1/3 of the strip size (see
* `inner_clickable_handle_size_get`), this means handles cannot be smaller than 25/3 = 8px for
* simple tweaking, 15/3 = 5px for legacy behavior. */
int min_len = 25 * U.pixelsize;
if ((U.sequencer_editor_flag & USER_SEQ_ED_SIMPLE_TWEAKING) == 0) {
min_len = 15 * U.pixelsize;
@@ -929,6 +938,11 @@ bool ED_sequencer_can_select_handle(const Scene *scene, const Strip *strip, cons
if (strip_len / pixelx < min_len) {
return false;
}
if (UI_view2d_scale_get_y(v2d) < 16 * U.pixelsize) {
return false;
}
return true;
}
@@ -943,11 +957,11 @@ static void strip_clickable_areas_get(const Scene *scene,
*r_left_handle = *r_body;
*r_right_handle = *r_body;
const float handsize = clickable_handle_size_get(scene, strip, v2d);
BLI_rctf_pad(r_left_handle, handsize / 3, 0.0f);
BLI_rctf_pad(r_right_handle, handsize / 3, 0.0f);
const float handsize = inner_clickable_handle_size_get(scene, strip, v2d);
r_left_handle->xmax = r_body->xmin + handsize;
r_right_handle->xmin = r_body->xmax - handsize;
BLI_rctf_pad(r_left_handle, handsize / 3, 0.0f);
BLI_rctf_pad(r_right_handle, handsize / 3, 0.0f);
BLI_rctf_pad(r_body, -handsize, 0.0f);
}
@@ -2046,9 +2060,8 @@ static int sequencer_box_select_exec(bContext *C, wmOperator *op)
strip_rectf(scene, strip, &rq);
if (BLI_rctf_isect(&rq, &rectf, nullptr)) {
if (handles) {
/* Get the handles draw size. */
float pixelx = BLI_rctf_size_x(&v2d->cur) / BLI_rcti_size_x(&v2d->mask);
float handsize = sequence_handle_size_get_clamped(scene, strip, pixelx) * 4;
/* Get the clickable handle size, ignoring padding. */
float handsize = inner_clickable_handle_size_get(scene, strip, v2d) * 4;
/* Right handle. */
if (rectf.xmax > (SEQ_time_right_handle_frame_get(scene, strip) - handsize)) {

View File

@@ -234,7 +234,7 @@ static StripDrawContext strip_draw_context_get(TimelineDrawContext *ctx, Strip *
!strip_ctx.can_draw_strip_content);
strip_ctx.is_active_strip = strip == SEQ_select_active_get(scene);
strip_ctx.is_single_image = SEQ_transform_single_image_check(strip);
strip_ctx.handle_width = sequence_handle_size_get_clamped(ctx->scene, strip, ctx->pixelx);
strip_ctx.handle_width = strip_handle_draw_size_get(ctx->scene, strip, ctx->pixelx);
strip_ctx.show_strip_color_tag = (ctx->sseq->timeline_overlay.flag &
SEQ_TIMELINE_SHOW_STRIP_COLOR_TAG);
@@ -772,7 +772,7 @@ static void draw_handle_transform_text(const TimelineDrawContext *timeline_ctx,
UI_view2d_text_cache_add(timeline_ctx->v2d, text_x, text_y, numstr, numstr_len, col);
}
float sequence_handle_size_get_clamped(const Scene *scene, Strip *strip, const float pixelx)
float strip_handle_draw_size_get(const Scene *scene, Strip *strip, const float pixelx)
{
const bool use_thin_handle = (U.sequencer_editor_flag & USER_SEQ_ED_SIMPLE_TWEAKING) != 0;
const float handle_size = use_thin_handle ? 5.0f : 8.0f;

View File

@@ -707,9 +707,7 @@ static void sequencer_main_cursor(wmWindow *win, ScrArea *area, ARegion *region)
return;
}
const float scale_y = UI_view2d_scale_get_y(v2d);
if (!ED_sequencer_can_select_handle(scene, selection.seq1, v2d) || scale_y < 16 * U.pixelsize) {
if (!ED_sequencer_can_select_handle(scene, selection.seq1, v2d)) {
WM_cursor_set(win, wmcursor);
return;
}