From d5d81c5078047ba3f01ed1b0091c054b8eef91a2 Mon Sep 17 00:00:00 2001 From: John Kiril Swenson Date: Fri, 18 Oct 2024 05:50:09 +0200 Subject: [PATCH] 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 --- .../keyconfig/keymap_data/blender_default.py | 84 +++++++++---------- .../startup/bl_ui/space_toolsystem_toolbar.py | 30 ++++--- .../blender/blenkernel/BKE_blender_version.h | 2 +- .../blenloader/intern/versioning_400.cc | 11 +++ .../windowmanager/intern/wm_toolsystem.cc | 8 -- 5 files changed, 71 insertions(+), 64 deletions(-) diff --git a/scripts/presets/keyconfig/keymap_data/blender_default.py b/scripts/presets/keyconfig/keymap_data/blender_default.py index e3b9049a0f5..5115e0c9e92 100644 --- a/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -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)), diff --git a/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/scripts/startup/bl_ui/space_toolsystem_toolbar.py index ab88d81de96..0661b671336 100644 --- a/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -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, diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 1c722615b30..4474d002463 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -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 diff --git a/source/blender/blenloader/intern/versioning_400.cc b/source/blender/blenloader/intern/versioning_400.cc index 3dedb3ff457..2f4cc1e8315 100644 --- a/source/blender/blenloader/intern/versioning_400.cc +++ b/source/blender/blenloader/intern/versioning_400.cc @@ -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. */ diff --git a/source/blender/windowmanager/intern/wm_toolsystem.cc b/source/blender/windowmanager/intern/wm_toolsystem.cc index 42efe3575b2..db0ca8dbfb7 100644 --- a/source/blender/windowmanager/intern/wm_toolsystem.cc +++ b/source/blender/windowmanager/intern/wm_toolsystem.cc @@ -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"; } }