VSE: Switch to box select default for timeline

PR #128051 made some improvements to code by cleaning up properties and
simplifying logic.

However, the default tool in most spaces is box select. By switching to
box select default, there should be more front-facing consistency across
spaces while still retaining near-identical behavior.

This patch would fix the small bug listed in #128671 while keeping the
simplified code benefits from #128051.

Also:
- Move selection keymap items up in the Sequencer (Global) keymap so it
  is more visible (similar to Node Editor ordering).
- Split `side_of_frame` property for ctrl press keymap item into a
  separate keymap item on ctrl click for both LCS and RCS to avoid
  clashing with ctrl+drag for box selects in RCS.

Pull Request: https://projects.blender.org/blender/blender/pulls/129028
This commit is contained in:
John Kiril Swenson
2024-10-18 05:50:09 +02:00
committed by John Kiril Swenson
parent cf2d3d0867
commit d5d81c5078
5 changed files with 71 additions and 64 deletions

View File

@@ -2936,6 +2936,37 @@ def km_sequencer(params):
)
items.extend([
*_template_sequencer_generic_select(
type=params.select_mouse, value=params.select_mouse_value_fallback, legacy=params.legacy,
),
("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
{"properties": [("linked_time", True)]}),
("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True, "shift": True},
{"properties": [("linked_time", True), ("extend", True)]}),
("sequencer.select", {"type": params.select_mouse, "value": 'CLICK', "ctrl": True},
{"properties": [("side_of_frame", True)]}),
("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
{"properties": [("deselect_all", True), ("ignore_connections", True)]}),
("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "alt": True, "shift": True},
{"properties": [("toggle", True), ("ignore_connections", 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),
("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
{"properties": [("extend", True)]}),
("sequencer.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG'},
{"properties": [("mode", 'SET')]}),
("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG', "shift": True},
{"properties": [("mode", 'ADD')]}),
("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG', "ctrl": True},
{"properties": [("mode", 'SUB')]}),
("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG', "alt": True},
{"properties": [("ignore_connections", True), ("mode", 'SET')]}),
("sequencer.select_box", {"type": 'B', "value": 'PRESS'}, None),
("sequencer.select_box", {"type": 'B', "value": 'PRESS', "ctrl": True},
{"properties": [("include_handles", True)]}),
("sequencer.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None),
*_template_items_select_actions(params, "sequencer.select_all"),
("sequencer.split", {"type": 'K', "value": 'PRESS'},
{"properties": [("type", 'SOFT')]}),
@@ -3001,33 +3032,6 @@ def km_sequencer(params):
for i in range(10)
)
),
*_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": [("deselect_all", True), ("ignore_connections", True)]}),
("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "alt": True, "shift": True},
{"properties": [("toggle", True), ("ignore_connections", 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),
("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
{"properties": [("extend", True)]}),
("sequencer.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG'},
{"properties": [("mode", 'SET')]}),
("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG', "shift": True},
{"properties": [("mode", 'ADD')]}),
("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG', "ctrl": True},
{"properties": [("mode", 'SUB')]}),
("sequencer.select_box", {"type": params.select_mouse, "value": 'CLICK_DRAG', "alt": True},
{"properties": [("ignore_connections", True), ("mode", 'SET')]}),
("sequencer.select_box", {"type": 'B', "value": 'PRESS'}, None),
("sequencer.select_box", {"type": 'B', "value": 'PRESS', "ctrl": True},
{"properties": [("include_handles", True)]}),
("sequencer.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None),
op_menu("SEQUENCER_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}),
op_menu("SEQUENCER_MT_change", {"type": 'C', "value": 'PRESS'}),
op_menu_pie("SEQUENCER_MT_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}),
@@ -4682,19 +4686,6 @@ def _template_sequencer_preview_select(*, type, value, legacy):
)]
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 (
(("side_of_frame", "linked_time"), ("ctrl",)),
(("side_of_frame", "linked_time", "extend"), ("ctrl", "shift")),
)]
def km_image_paint(params):
items = []
keymap = (
@@ -8012,14 +8003,21 @@ def km_sequencer_editor_tool_generic_select_timeline_lcs(params):
]
def km_sequencer_editor_tool_generic_select_timeline(params, *, fallback):
def km_sequencer_editor_tool_generic_select_box_timeline(params, *, fallback):
return (
_fallback_id("Sequencer Timeline Tool: Tweak", fallback),
_fallback_id("Sequencer Timeline Tool: Select Box", fallback),
{"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
{"items": [
# Combine the tweak functionality into the select box tool.
# This gives one standard tool for all selection and transform behavior.
*(km_sequencer_editor_tool_generic_select_timeline_rcs(params)
if (params.select_mouse == 'RIGHTMOUSE') else
km_sequencer_editor_tool_generic_select_timeline_lcs(params)),
# Don't use `tool_maybe_tweak_event`, see comment for this slot.
*([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple(
"sequencer.select_box",
**(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else
params.tool_tweak_event))),
]},
)
@@ -8397,7 +8395,7 @@ def generate_keymaps(params=None):
km_3d_view_tool_paint_grease_pencil_primitive_circle(params),
km_3d_view_tool_paint_grease_pencil_primitive_arc(params),
km_3d_view_tool_paint_grease_pencil_primitive_curve(params),
*(km_sequencer_editor_tool_generic_select_timeline(params, fallback=fallback)
*(km_sequencer_editor_tool_generic_select_box_timeline(params, fallback=fallback)
for fallback in (False, True)),
*(km_sequencer_editor_tool_generic_select_preview(params, fallback=fallback)
for fallback in (False, True)),

View File

@@ -3007,16 +3007,6 @@ class _defs_sequencer_generic:
class _defs_sequencer_select:
@ToolDef.from_fn
def select_timeline():
return dict(
idname="builtin.select",
label="Tweak",
icon="ops.generic.select",
widget=None,
keymap="Sequencer Timeline Tool: Tweak",
)
@ToolDef.from_fn
def select_preview():
return dict(
@@ -3027,6 +3017,22 @@ class _defs_sequencer_select:
keymap="Sequencer Preview Tool: Tweak",
)
@ToolDef.from_fn
def box_timeline():
def draw_settings(_context, layout, tool):
props = tool.operator_properties("sequencer.select_box")
row = layout.row()
row.use_property_split = False
row.prop(props, "mode", text="", expand=True, icon_only=True)
return dict(
idname="builtin.select_box",
label="Select Box",
icon="ops.generic.select_box",
widget=None,
keymap="Sequencer Timeline Tool: Select Box",
draw_settings=draw_settings,
)
@ToolDef.from_fn
def box_preview():
def draw_settings(_context, layout, tool):
@@ -3689,11 +3695,11 @@ class SEQUENCER_PT_tools_active(ToolSelectPanelHelper, Panel):
*_tools_annotate,
],
'SEQUENCER': [
_defs_sequencer_select.select_timeline,
_defs_sequencer_select.box_timeline,
_defs_sequencer_generic.blade,
],
'SEQUENCER_PREVIEW': [
_defs_sequencer_select.select_timeline,
_defs_sequencer_select.box_timeline,
*_tools_annotate,
None,
_defs_sequencer_generic.blade,

View File

@@ -31,7 +31,7 @@ extern "C" {
/* Blender file format version. */
#define BLENDER_FILE_VERSION BLENDER_VERSION
#define BLENDER_FILE_SUBVERSION 30
#define BLENDER_FILE_SUBVERSION 31
/* Minimum Blender version that supports reading file written with the current
* version. Older Blender versions will test this and cancel loading the file, showing a warning to

View File

@@ -4918,6 +4918,17 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain)
}
}
if (!MAIN_VERSION_FILE_ATLEAST(bmain, 403, 31)) {
LISTBASE_FOREACH (WorkSpace *, workspace, &bmain->workspaces) {
LISTBASE_FOREACH (bToolRef *, tref, &workspace->tools) {
if (tref->space_type != SPACE_SEQ) {
continue;
}
STRNCPY(tref->idname, "builtin.select_box");
}
}
}
/* Always run this versioning; meshes are written with the legacy format which always needs to
* be converted to the new format on file load. Can be moved to a subversion check in a larger
* breaking release. */

View File

@@ -983,14 +983,6 @@ static const char *toolsystem_default_tool(const bToolKey *tkey)
return "builtin.select_box";
}
case SPACE_SEQ: {
switch (tkey->mode) {
case SEQ_VIEW_SEQUENCE:
return "builtin.select";
case SEQ_VIEW_PREVIEW:
return "builtin.select_box";
case SEQ_VIEW_SEQUENCE_PREVIEW:
return "builtin.select";
}
return "builtin.select_box";
}
}