[Bf-blender-cvs] [68dc970219e] master: Sequencer: improvements to preview selection
Campbell Barton
noreply at git.blender.org
Wed Oct 6 09:02:16 CEST 2021
Commit: 68dc970219ef7a559b48bd1b3e45d033367b4172
Author: Campbell Barton
Date: Wed Oct 6 17:27:52 2021 +1100
Branches: master
https://developer.blender.org/rB68dc970219ef7a559b48bd1b3e45d033367b4172
Sequencer: improvements to preview selection
- Support toggle/deselect/deselect_all options
(matching 3D viewport object selection).
- Support legacy selection behavior.
- Support selecting by the center in preview views (holding Ctrl).
===================================================================
M release/scripts/presets/keyconfig/keymap_data/blender_default.py
M source/blender/editors/space_sequencer/sequencer_select.c
===================================================================
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index 80ec9e0edfe..265db782eff 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -2767,21 +2767,11 @@ def km_sequencer(params):
for i in range(10)
)
),
- *_template_sequencer_select(
+ *_template_sequencer_timeline_select(
type=params.select_mouse,
value=params.select_mouse_value_fallback,
legacy=params.legacy,
),
- ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
- {"properties": [("linked_handle", True)]}),
- ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
- {"properties": [("extend", True), ("linked_handle", True)]}),
- ("sequencer.select",
- {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True},
- {"properties": [("side_of_frame", True), ("linked_time", True)]}),
- ("sequencer.select",
- {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True, "shift": True},
- {"properties": [("side_of_frame", True), ("linked_time", True), ("extend", True)]}),
("sequencer.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None),
("sequencer.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None),
("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS'}, None),
@@ -2831,7 +2821,7 @@ def km_sequencerpreview(params):
items.extend([
# Selection.
- *_template_sequencer_select(
+ *_template_sequencer_preview_select(
type=params.select_mouse,
value=params.select_mouse_value_fallback,
legacy=params.legacy,
@@ -4646,32 +4636,58 @@ def _template_uv_select_for_fallback(params, fallback):
return []
-def _template_sequencer_select(*, type, value, legacy):
- # FIXME.
- legacy = True
+def _template_sequencer_generic_select(*, type, value, legacy):
return [(
"sequencer.select",
{"type": type, "value": value, **{m: True for m in mods}},
{"properties": [(c, True) for c in props]},
) for props, mods in (
(("deselect_all",) if not legacy else (), ()),
- (("extend",), ("shift",)),
+ (("toggle",), ("shift",)),
+ )]
+
+
+def _template_sequencer_timeline_select(*, type, value, legacy):
+ return _template_sequencer_generic_select(
+ type=type, value=value, legacy=legacy,
+ ) + [(
+ "sequencer.select",
+ {"type": type, "value": value, **{m: True for m in mods}},
+ {"properties": [(c, True) for c in props]},
+ ) for props, mods in (
+ (("center",), ("ctrl",)),
# TODO:
- # (("center", "object"), ("ctrl",)),
# (("enumerate",), ("alt",)),
- # (("toggle", "center"), ("shift", "ctrl")),
+ (("toggle", "center"), ("shift", "ctrl")),
# (("center", "enumerate"), ("ctrl", "alt")),
# (("toggle", "enumerate"), ("shift", "alt")),
# (("toggle", "center", "enumerate"), ("shift", "ctrl", "alt")),
)]
+def _template_sequencer_preview_select(*, type, value, legacy):
+ return _template_sequencer_generic_select(
+ type=type, value=value, legacy=legacy,
+ ) + [(
+ "sequencer.select",
+ {"type": type, "value": value, **{m: True for m in mods}},
+ {"properties": [(c, True) for c in props]},
+ ) for props, mods in (
+ (("linked_handle",), ("alt",)),
+ (("linked_handle", "extend"), ("shift", "alt",)),
+
+ (("side_of_frame", "linked_time"), ("ctrl",)),
+ (("side_of_frame", "linked_time", "extend"), ("ctrl", "shift")),
+ )]
+
+
def _template_sequencer_select_for_fallback(params, fallback):
if (not fallback) and params.use_fallback_tool_rmb:
# Needed so we have immediate select+tweak when the default select tool is active.
- return _template_sequencer_select(
+ return _template_sequencer_generic_select(
type=params.select_mouse,
value=params.select_mouse_value,
+ preview=False,
legacy=params.legacy,
)
return []
@@ -7452,10 +7468,10 @@ def km_sequencer_editor_tool_select(params, *, fallback):
{"items": [
# TODO: Use 2D cursor for preview region (currently `sequencer.sample`).
*([] if fallback else
- _template_items_tool_select(params, "sequencer.select", "sequencer.sample", extend="extend")
+ _template_items_tool_select(params, "sequencer.select", "sequencer.sample", extend="toggle")
),
- *([] if (not params.use_fallback_tool_rmb) else _template_sequencer_select(
- type=params.select_mouse, value=params.select_mouse_value, legacy=params.legacy)),
+ *([] if (not params.use_fallback_tool_rmb) else _template_sequencer_generic_select(
+ type=params.select_mouse, value=params.select_mouse_value, preview=False, legacy=params.legacy)),
*_template_items_change_frame(params),
]},
diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c
index c7d97ea16a7..5b5b5e002f6 100644
--- a/source/blender/editors/space_sequencer/sequencer_select.c
+++ b/source/blender/editors/space_sequencer/sequencer_select.c
@@ -637,7 +637,9 @@ static void sequencer_select_linked_handle(const bContext *C,
/* Check if click happened on image which belongs to strip. If multiple strips are found, loop
* through them in order. */
-static Sequence *seq_select_seq_from_preview(const bContext *C, const int mval[2])
+static Sequence *seq_select_seq_from_preview(const bContext *C,
+ const int mval[2],
+ const bool center)
{
Scene *scene = CTX_data_scene(C);
Editing *ed = SEQ_editing_get(scene);
@@ -649,10 +651,53 @@ static Sequence *seq_select_seq_from_preview(const bContext *C, const int mval[2
UI_view2d_region_to_view(v2d, mval[0], mval[1], &mouseco_view[0], &mouseco_view[1]);
SeqCollection *strips = SEQ_query_rendered_strips(seqbase, scene->r.cfra, sseq->chanshown);
+
+ /* Allow strips this far from the closest center to be included.
+ * This allows cycling over center points which are near enough
+ * to overlapping from the users perspective. */
+ const float center_threshold_cycle_px = 5.0f;
+ const float center_dist_sq_eps = square_f(center_threshold_cycle_px * U.pixelsize);
+ const float center_scale_px[2] = {
+ UI_view2d_scale_get_x(v2d),
+ UI_view2d_scale_get_y(v2d),
+ };
+ float center_co_best[2] = {0.0f};
+
+ if (center) {
+ Sequence *seq_best = NULL;
+ float center_dist_sq_best = 0.0f;
+
+ Sequence *seq;
+ SEQ_ITERATOR_FOREACH (seq, strips) {
+ float co[2];
+ SEQ_image_transform_origin_offset_pixelspace_get(scene, seq, co);
+ sub_v2_v2(co, mouseco_view);
+ const float center_dist_sq_test = len_squared_v2(co);
+ if ((seq_best == NULL) || (center_dist_sq_test < center_dist_sq_best)) {
+ seq_best = seq;
+ center_dist_sq_best = center_dist_sq_test;
+ copy_v2_v2(center_co_best, co);
+ }
+ }
+ }
+
ListBase strips_ordered = {NULL};
Sequence *seq;
SEQ_ITERATOR_FOREACH (seq, strips) {
- if (seq_point_image_isect(scene, seq, mouseco_view)) {
+ bool isect = false;
+ if (center) {
+ /* Detect overlapping center points (scaled by the zoom level). */
+ float co[2];
+ SEQ_image_transform_origin_offset_pixelspace_get(scene, seq, co);
+ sub_v2_v2(co, center_co_best);
+ mul_v2_v2(co, center_scale_px);
+ isect = len_squared_v2(co) <= center_dist_sq_eps;
+ }
+ else {
+ isect = seq_point_image_isect(scene, seq, mouseco_view);
+ }
+
+ if (isect) {
BLI_remlink(seqbase, seq);
BLI_addtail(&strips_ordered, seq);
}
@@ -686,14 +731,15 @@ static bool element_already_selected(const Sequence *seq, const int handle_click
static void sequencer_select_strip_impl(const Editing *ed,
Sequence *seq,
const int handle_clicked,
- const bool extend)
+ const bool extend,
+ const bool deselect,
+ const bool toggle)
{
- /* Deselect strip. */
- if (extend && (seq->flag & SELECT) && ed->act_seq == seq) {
+ const bool is_active = (ed->act_seq == seq);
+
+ /* Exception for active strip handles. */
+ if ((handle_clicked != SEQ_SIDE_NONE) && (seq->flag & SELECT) && is_active && toggle) {
switch (handle_clicked) {
- case SEQ_SIDE_NONE:
- seq->flag &= ~SEQ_ALLSEL;
- break;
case SEQ_SIDE_LEFT:
seq->flag ^= SEQ_LEFTSEL;
break;
@@ -701,8 +747,28 @@ static void sequencer_select_strip_impl(const Editing *ed,
seq->flag ^= SEQ_RIGHTSEL;
break;
}
+ return;
}
- else { /* Select strip. */
+
+ /* Select strip. */
+ /* Match object selection behavior. */
+ int action = -1;
+ if (extend) {
+ action = 1;
+ }
+ else if (deselect) {
+ action = 0;
+ }
+ else {
+ if ((seq->flag & SELECT) == 0 || is_active) {
+ action = 1;
+ }
+ else if (toggle) {
+ action = 0;
+ }
+ }
+
+ if (action == 1) {
seq->flag |= SELECT;
if (handle_clicked == SEQ_SIDE_LEFT) {
seq->flag |= SEQ_LEFTSEL;
@@ -711,6 +777,9 @@ static void sequencer_select_strip_impl(const Editing *ed,
seq->flag |= SEQ_RIGHTSEL;
}
}
+ else if (action == 0) {
+ seq->flag &= ~SEQ_ALLSEL;
+ }
}
static int sequencer_select_exec(bContext *C, wmOperator *op)
@@ -718,12 +787,17 @@ s
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list