UI: Add shortcuts for grease pencil modifier panels
[blender.git] / release / scripts / presets / keyconfig / keymap_data / blender_default.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19
20 # ------------------------------------------------------------------------------
21 # Configurable Parameters
22
23 class Params:
24     __slots__ = (
25         "apple",
26         "legacy",
27         "select_mouse",
28         "select_mouse_value",
29         "select_tweak",
30         "action_mouse",
31         "action_tweak",
32         "tool_mouse",
33         "tool_tweak",
34         "context_menu_event",
35         "cursor_set_event",
36         "cursor_tweak_event",
37         "use_mouse_emulate_3_button",
38         # Experimental option.
39         "pie_value",
40
41         # User preferences.
42         #
43         # Swap 'Space/Shift-Space'.
44         "spacebar_action",
45         # Key toggles selection with 'A'.
46         "use_select_all_toggle",
47         # Activate gizmo on drag (which support it).
48         "use_gizmo_drag",
49         # Use pie menu for tab by default (swap 'Tab/Ctrl-Tab').
50         "use_v3d_tab_menu",
51         # Use extended pie menu for shading.
52         "use_v3d_shade_ex_pie",
53         # Swap orbit/pan keys (for 2D workflows).
54         "use_v3d_mmb_pan",
55         # Experimental option.
56         "use_pie_click_drag",
57         "v3d_tilde_action",
58         # Alt-MMB axis switching 'RELATIVE' or 'ABSOLUTE' axis switching.
59         "v3d_alt_mmb_drag_action",
60     )
61
62     def __init__(
63             self,
64             *,
65             legacy=False,
66             select_mouse='RIGHT',
67             use_mouse_emulate_3_button=False,
68
69             # User preferences.
70             spacebar_action='TOOL',
71             use_select_all_toggle=False,
72             use_gizmo_drag=True,
73             use_v3d_tab_menu=False,
74             use_v3d_shade_ex_pie=False,
75             use_v3d_mmb_pan=False,
76             use_pie_click_drag=False,
77             v3d_tilde_action='VIEW',
78             v3d_alt_mmb_drag_action='RELATIVE',
79     ):
80         from sys import platform
81         self.apple = (platform == 'darwin')
82         self.legacy = legacy
83
84         if select_mouse == 'RIGHT':
85             # Right mouse select.
86             self.select_mouse = 'RIGHTMOUSE'
87             self.select_mouse_value = 'PRESS'
88             self.select_tweak = 'EVT_TWEAK_R'
89             self.action_mouse = 'LEFTMOUSE'
90             self.action_tweak = 'EVT_TWEAK_L'
91             self.tool_mouse = 'LEFTMOUSE'
92             self.tool_tweak = 'EVT_TWEAK_L'
93             self.context_menu_event = {"type": 'W', "value": 'PRESS'}
94             self.cursor_set_event = {"type": 'LEFTMOUSE', "value": 'CLICK'}
95             self.cursor_tweak_event = None
96         else:
97             # Left mouse select uses Click event for selection. This is a little
98             # less immediate, but is needed to distinguish between click and tweak
99             # events on the same mouse buttons.
100             self.select_mouse = 'LEFTMOUSE'
101             self.select_mouse_value = 'CLICK'
102             self.select_tweak = 'EVT_TWEAK_L'
103             self.action_mouse = 'RIGHTMOUSE'
104             self.action_tweak = 'EVT_TWEAK_R'
105             self.tool_mouse = 'LEFTMOUSE'
106             self.tool_tweak = 'EVT_TWEAK_L'
107
108             if self.legacy:
109                 self.context_menu_event = {"type": 'W', "value": 'PRESS'}
110             else:
111                 self.context_menu_event = {"type": 'RIGHTMOUSE', "value": 'PRESS'}
112
113             self.cursor_set_event = {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}
114             self.cursor_tweak_event = {"type": 'EVT_TWEAK_R', "value": 'ANY', "shift": True}
115
116         self.use_mouse_emulate_3_button = use_mouse_emulate_3_button
117
118         # User preferences
119         self.spacebar_action = spacebar_action
120
121         self.use_gizmo_drag = use_gizmo_drag
122         self.use_select_all_toggle = use_select_all_toggle
123         self.use_v3d_tab_menu = use_v3d_tab_menu
124         self.use_v3d_shade_ex_pie = use_v3d_shade_ex_pie
125         self.use_v3d_mmb_pan = use_v3d_mmb_pan
126         self.v3d_tilde_action = v3d_tilde_action
127         self.v3d_alt_mmb_drag_action = v3d_alt_mmb_drag_action
128
129         self.use_pie_click_drag = use_pie_click_drag
130         if not use_pie_click_drag:
131             self.pie_value = 'PRESS'
132         else:
133             self.pie_value = 'CLICK_DRAG'
134
135
136 # ------------------------------------------------------------------------------
137 # Constants
138
139
140 # Physical layout.
141 NUMBERS_1 = ('ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE', 'ZERO')
142 # Numeric order.
143 NUMBERS_0 = ('ZERO', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE')
144
145
146 # ------------------------------------------------------------------------------
147 # Keymap Item Wrappers
148
149 def op_menu(menu, kmi_args):
150     return ("wm.call_menu", kmi_args, {"properties": [("name", menu)]})
151
152
153 def op_menu_pie(menu, kmi_args):
154     return ("wm.call_menu_pie", kmi_args, {"properties": [("name", menu)]})
155
156
157 def op_panel(menu, kmi_args, kmi_data=()):
158     return ("wm.call_panel", kmi_args, {"properties": [("name", menu), *kmi_data]})
159
160
161 def op_tool(tool, kmi_args):
162     return ("wm.tool_set_by_id", kmi_args, {"properties": [("name", tool)]})
163
164
165 def op_tool_cycle(tool, kmi_args):
166     return ("wm.tool_set_by_id", kmi_args, {"properties": [("name", tool), ("cycle", True)]})
167
168
169 # ------------------------------------------------------------------------------
170 # Keymap Templates
171
172 def _template_items_context_menu(menu, key_args_primary):
173     return [
174         op_menu(menu, kmi_args)
175         for kmi_args in (key_args_primary, {"type": 'APP', "value": 'PRESS'})
176     ]
177
178
179 def _template_items_context_panel(menu, key_args_primary):
180     return [
181         op_panel(menu, kmi_args)
182         for kmi_args in (key_args_primary, {"type": 'APP', "value": 'PRESS'})
183     ]
184
185
186 def _template_space_region_type_toggle(*, toolbar_key=None, sidebar_key=None):
187     items = []
188     if toolbar_key is not None:
189         items.append(
190             ("wm.context_toggle", toolbar_key,
191              {"properties": [("data_path", 'space_data.show_region_toolbar')]})
192         )
193     if sidebar_key is not None:
194         items.append(
195             ("wm.context_toggle", sidebar_key,
196              {"properties": [("data_path", 'space_data.show_region_ui')]}),
197         )
198     return items
199
200
201 def _template_items_select_actions(params, operator):
202     if not params.use_select_all_toggle:
203         return [
204             (operator, {"type": 'A', "value": 'PRESS'}, {"properties": [("action", 'SELECT')]}),
205             (operator, {"type": 'A', "value": 'PRESS', "alt": True}, {"properties": [("action", 'DESELECT')]}),
206             (operator, {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}),
207             (operator, {"type": 'A', "value": 'DOUBLE_CLICK'}, {"properties": [("action", 'DESELECT')]}),
208         ]
209     elif params.legacy:
210         # Alt+A is for playback in legacy keymap.
211         return [
212             (operator, {"type": 'A', "value": 'PRESS'}, {"properties": [("action", 'TOGGLE')]}),
213             (operator, {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}),
214         ]
215     else:
216         return [
217             (operator, {"type": 'A', "value": 'PRESS'}, {"properties": [("action", 'TOGGLE')]}),
218             (operator, {"type": 'A', "value": 'PRESS', "alt": True}, {"properties": [("action", 'DESELECT')]}),
219             (operator, {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}),
220         ]
221
222
223 def _template_items_object_subdivision_set():
224     return [
225         ("object.subdivision_set",
226          {"type": NUMBERS_0[i], "value": 'PRESS', "ctrl": True},
227          {"properties": [("level", i), ("relative", False)]})
228         for i in range(6)
229     ]
230
231
232 def _template_items_gizmo_tweak_value():
233     return [
234         ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
235     ]
236
237
238 def _template_items_gizmo_tweak_value_click_drag():
239     return [
240         ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'CLICK', "any": True}, None),
241         ("gizmogroup.gizmo_tweak", {"type": 'EVT_TWEAK_L', "value": 'ANY', "any": True}, None),
242     ]
243
244
245 def _template_items_gizmo_tweak_value_drag():
246     return [
247         ("gizmogroup.gizmo_tweak", {"type": 'EVT_TWEAK_L', "value": 'ANY', "any": True}, None),
248     ]
249
250
251 def _template_items_editmode_mesh_select_mode(params):
252     if params.legacy:
253         return [
254             op_menu("VIEW3D_MT_edit_mesh_select_mode", {"type": 'TAB', "value": 'PRESS', "ctrl": True}),
255         ]
256     else:
257         return [
258             (
259                 "mesh.select_mode",
260                 {"type": k, "value": 'PRESS', **key_expand, **key_extend},
261                 {"properties": [*prop_extend, *prop_expand, ("type", e)]}
262             )
263             for key_expand, prop_expand in (({}, ()), ({"ctrl": True}, (("use_expand", True),)))
264             for key_extend, prop_extend in (({}, ()), ({"shift": True}, (("use_extend", True),)))
265             for k, e in (('ONE', 'VERT'), ('TWO', 'EDGE'), ('THREE', 'FACE'))
266         ]
267
268 def _template_items_uv_select_mode(params):
269     if params.legacy:
270         return [
271             op_menu("IMAGE_MT_uvs_select_mode", {"type": 'TAB', "value": 'PRESS', "ctrl": True}),
272         ]
273     else:
274         return [
275             *_template_items_editmode_mesh_select_mode(params),
276             ("mesh.select_mode", {"type": 'FOUR', "value": 'PRESS'}, None),
277             ("wm.context_set_enum", {"type": 'ONE', "value": 'PRESS'},
278              {"properties": [("data_path", 'tool_settings.uv_select_mode'), ("value", 'VERTEX')]}),
279             ("wm.context_set_enum", {"type": 'TWO', "value": 'PRESS'},
280              {"properties": [("data_path", 'tool_settings.uv_select_mode'), ("value", 'EDGE')]}),
281             ("wm.context_set_enum", {"type": 'THREE', "value": 'PRESS'},
282              {"properties": [("data_path", 'tool_settings.uv_select_mode'), ("value", 'FACE')]}),
283             ("wm.context_set_enum", {"type": 'FOUR', "value": 'PRESS'},
284              {"properties": [("data_path", 'tool_settings.uv_select_mode'), ("value", 'ISLAND')]}),
285         ]
286
287 def _template_items_proportional_editing(*, connected=False):
288     return [
289         op_menu_pie("VIEW3D_MT_proportional_editing_falloff_pie", {"type": 'O', "value": 'PRESS', "shift": True}),
290         ("wm.context_toggle", {"type": 'O', "value": 'PRESS'},
291          {"properties": [("data_path", 'tool_settings.use_proportional_edit')]}),
292         *(() if not connected else (
293             ("wm.context_toggle", {"type": 'O', "value": 'PRESS', "alt": True},
294              {"properties": [("data_path", 'tool_settings.use_proportional_connected')]}),
295         ))
296     ]
297
298
299 def _template_items_change_frame(params):
300     if params.select_mouse == 'LEFTMOUSE' and not params.legacy:
301         return [
302             ("anim.change_frame", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}, None),
303         ]
304     else:
305         return [
306             ("anim.change_frame", {"type": params.action_mouse, "value": 'PRESS'}, None),
307         ]
308
309
310 # Tool System Templates
311
312 def _template_items_tool_select(params, operator, cursor_operator, *, extend):
313     if params.select_mouse == 'LEFTMOUSE':
314         # Immediate select without quick delay.
315         return [
316             (operator, {"type": 'LEFTMOUSE', "value": 'PRESS'},
317              {"properties": [("deselect_all", True)]}),
318             (operator, {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
319              {"properties": [(extend, True)]}),
320         ]
321     else:
322         # For right mouse, set the cursor.
323         return [
324             (cursor_operator, {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
325             ("transform.translate", {"type": 'EVT_TWEAK_L', "value": 'ANY'},
326              {"properties": [("release_confirm", True), ("cursor_transform", True)]}),
327         ]
328
329
330 def _template_items_tool_select_actions(operator, *, type, value):
331     kmi_args = {"type": type, "value": value}
332     return [
333         (operator, kmi_args, None),
334         (operator, {**kmi_args, "shift": True},
335          {"properties": [("mode", 'ADD')]}),
336         (operator, {**kmi_args, "ctrl": True},
337          {"properties": [("mode", 'SUB')]}),
338         (operator, {**kmi_args, "shift": True, "ctrl": True},
339          {"properties": [("mode", 'AND')]}),
340     ]
341
342
343 # This could have a more generic name, for now use for circle select.
344 def _template_items_tool_select_actions_simple(operator, *, type, value, properties=[]):
345     kmi_args = {"type": type, "value": value}
346     return [
347         # Don't define 'SET' here, take from the tool options.
348         (operator, kmi_args,
349          {"properties": properties}),
350         (operator, {**kmi_args, "shift": True},
351          {"properties": [*properties, ("mode", 'ADD')]}),
352         (operator, {**kmi_args, "ctrl": True},
353          {"properties": [*properties, ("mode", 'SUB')]}),
354     ]
355
356
357 def _template_items_legacy_tools_from_numbers():
358     return [
359         ("wm.tool_set_by_index",
360          {"type": NUMBERS_1[i % 10], "value": 'PRESS', "shift": i >= 10},
361          {"properties": [("index", i)]})
362         for i in range(20)
363     ]
364
365
366 # ------------------------------------------------------------------------------
367 # Window, Screen, Areas, Regions
368
369 def km_window(params):
370     items = []
371     keymap = (
372         "Window",
373         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
374         {"items": items},
375     )
376
377     if params.legacy:
378         # Old shortcuts
379         items.extend([
380             ("wm.save_homefile", {"type": 'U', "value": 'PRESS', "ctrl": True}, None),
381             ("wm.open_mainfile", {"type": 'F1', "value": 'PRESS'}, None),
382             ("wm.link", {"type": 'O', "value": 'PRESS', "ctrl": True, "alt": True}, None),
383             ("wm.append", {"type": 'F1', "value": 'PRESS', "shift": True}, None),
384             ("wm.save_mainfile", {"type": 'W', "value": 'PRESS', "ctrl": True}, None),
385             ("wm.save_as_mainfile", {"type": 'F2', "value": 'PRESS'}, None),
386             ("wm.save_as_mainfile", {"type": 'S', "value": 'PRESS', "ctrl": True, "alt": True},
387              {"properties": [("copy", True)]}),
388             ("wm.window_new", {"type": 'W', "value": 'PRESS', "ctrl": True, "alt": True}, None),
389             ("wm.window_fullscreen_toggle", {"type": 'F11', "value": 'PRESS', "alt": True}, None),
390             ("wm.doc_view_manual_ui_context", {"type": 'F1', "value": 'PRESS', "alt": True}, None),
391             ("wm.search_menu", {"type": 'SPACE', "value": 'PRESS'}, None),
392             ("wm.redraw_timer", {"type": 'T', "value": 'PRESS', "ctrl": True, "alt": True}, None),
393             ("wm.debug_menu", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True}, None),
394         ])
395
396     items.extend([
397         # File operations
398         op_menu("TOPBAR_MT_file_new", {"type": 'N', "value": 'PRESS', "ctrl": True}),
399         op_menu("TOPBAR_MT_file_open_recent", {"type": 'O', "value": 'PRESS', "shift": True, "ctrl": True}),
400         ("wm.open_mainfile", {"type": 'O', "value": 'PRESS', "ctrl": True}, None),
401         ("wm.save_mainfile", {"type": 'S', "value": 'PRESS', "ctrl": True}, None),
402         ("wm.save_as_mainfile", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True}, None),
403         ("wm.quit_blender", {"type": 'Q', "value": 'PRESS', "ctrl": True}, None),
404
405         # Quick menu and toolbar
406         op_menu("SCREEN_MT_user_menu", {"type": 'Q', "value": 'PRESS'}),
407
408         # Fast editor switching
409         *(
410             ("screen.space_type_set_or_cycle",
411              {"type": k, "value": 'PRESS', "shift": True},
412              {"properties": [("space_type", t)]})
413             for k, t in (
414                 ('F1', 'FILE_BROWSER'),
415                 ('F2', 'CLIP_EDITOR'),
416                 ('F3', 'NODE_EDITOR'),
417                 ('F4', 'CONSOLE'),
418                 ('F5', 'VIEW_3D'),
419                 ('F6', 'GRAPH_EDITOR'),
420                 ('F7', 'PROPERTIES'),
421                 ('F8', 'SEQUENCE_EDITOR'),
422                 ('F9', 'OUTLINER'),
423                 ('F10', 'IMAGE_EDITOR'),
424                 ('F11', 'TEXT_EDITOR'),
425                 ('F12', 'DOPESHEET_EDITOR'),
426             )
427         ),
428
429         # NDOF settings
430         op_panel("USERPREF_PT_ndof_settings", {"type": 'NDOF_BUTTON_MENU', "value": 'PRESS'}),
431         ("wm.context_scale_float", {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS'},
432          {"properties": [("data_path", 'preferences.inputs.ndof_sensitivity'), ("value", 1.1)]}),
433         ("wm.context_scale_float", {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS'},
434          {"properties": [("data_path", 'preferences.inputs.ndof_sensitivity'), ("value", 1.0 / 1.1)]}),
435         ("wm.context_scale_float", {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS', "shift": True},
436          {"properties": [("data_path", 'preferences.inputs.ndof_sensitivity'), ("value", 1.5)]}),
437         ("wm.context_scale_float", {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS', "shift": True},
438          {"properties": [("data_path", 'preferences.inputs.ndof_sensitivity'), ("value", 2.0 / 3.0)]}),
439         ("info.reports_display_update", {"type": 'TIMER_REPORT', "value": 'ANY', "any": True}, None),
440     ])
441
442     if not params.legacy:
443         # New shortcuts
444         items.extend([
445             ("wm.doc_view_manual_ui_context", {"type": 'F1', "value": 'PRESS'}, None),
446             op_panel("TOPBAR_PT_name", {"type": 'F2', "value": 'PRESS'}, [("keep_open", False)]),
447             ("wm.batch_rename", {"type": 'F2', "value": 'PRESS', "ctrl": True}, None),
448             ("wm.search_menu", {"type": 'F3', "value": 'PRESS'}, None),
449             op_menu("TOPBAR_MT_file_context_menu", {"type": 'F4', "value": 'PRESS'}),
450             # Pass through when when no tool-system exists or the fallback isn't available.
451             ("wm.toolbar_fallback_pie", {"type": 'W', "value": 'PRESS', "alt": True}, None),
452             # Alt as "Leader-Key".
453             ("wm.toolbar_prompt", {"type": 'LEFT_ALT', "value": 'CLICK'}, None),
454             ("wm.toolbar_prompt", {"type": 'RIGHT_ALT', "value": 'CLICK'}, None),
455         ])
456
457         if params.spacebar_action == 'TOOL':
458             items.append(
459                 ("wm.toolbar", {"type": 'SPACE', "value": 'PRESS'}, None),
460             )
461         elif params.spacebar_action == 'PLAY':
462             items.append(
463                 ("wm.toolbar", {"type": 'SPACE', "value": 'PRESS', "shift": True}, None),
464             )
465         elif params.spacebar_action == 'SEARCH':
466             items.append(
467                 ("wm.search_menu", {"type": 'SPACE', "value": 'PRESS'}, None),
468             )
469         else:
470             assert False
471
472     return keymap
473
474
475 def km_screen(params):
476     items = []
477     keymap = (
478         "Screen",
479         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
480         {"items": items},
481     )
482
483     items.extend([
484         # Animation
485         ("screen.animation_step", {"type": 'TIMER0', "value": 'ANY', "any": True}, None),
486         ("screen.region_blend", {"type": 'TIMERREGION', "value": 'ANY', "any": True}, None),
487         # Full screen and cycling
488         ("screen.space_context_cycle", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
489          {"properties": [("direction", 'NEXT')]}),
490         ("screen.space_context_cycle", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
491          {"properties": [("direction", 'PREV')]}),
492         ("screen.workspace_cycle", {"type": 'PAGE_DOWN', "value": 'PRESS', "ctrl": True},
493          {"properties": [("direction", 'NEXT')]}),
494         ("screen.workspace_cycle", {"type": 'PAGE_UP', "value": 'PRESS', "ctrl": True},
495          {"properties": [("direction", 'PREV')]}),
496         # Quad view
497         ("screen.region_quadview", {"type": 'Q', "value": 'PRESS', "ctrl": True, "alt": True}, None),
498         # Repeat last
499         ("screen.repeat_last", {"type": 'R', "value": 'PRESS', "shift": True}, None),
500         # Files
501         ("file.execute", {"type": 'RET', "value": 'PRESS'}, None),
502         ("file.execute", {"type": 'NUMPAD_ENTER', "value": 'PRESS'}, None),
503         ("file.cancel", {"type": 'ESC', "value": 'PRESS'}, None),
504         # Undo
505         ("ed.undo", {"type": 'Z', "value": 'PRESS', "ctrl": True}, None),
506         ("ed.redo", {"type": 'Z', "value": 'PRESS', "shift": True, "ctrl": True}, None),
507         # Render
508         ("render.render", {"type": 'F12', "value": 'PRESS'},
509          {"properties": [("use_viewport", True)]}),
510         ("render.render", {"type": 'F12', "value": 'PRESS', "ctrl": True},
511          {"properties": [("animation", True), ("use_viewport", True)]}),
512         ("render.view_cancel", {"type": 'ESC', "value": 'PRESS'}, None),
513         ("render.view_show", {"type": 'F11', "value": 'PRESS'}, None),
514         ("render.play_rendered_anim", {"type": 'F11', "value": 'PRESS', "ctrl": True}, None),
515     ])
516
517     if not params.legacy:
518         items.extend([
519             ("screen.screen_full_area", {"type": 'SPACE', "value": 'PRESS', "ctrl": True}, None),
520             ("screen.screen_full_area", {"type": 'SPACE', "value": 'PRESS', "ctrl": True, "alt": True},
521              {"properties": [("use_hide_panels", True)]}),
522             ("screen.redo_last", {"type": 'F9', "value": 'PRESS'}, None),
523         ])
524     else:
525         # Old keymap
526         items.extend([
527             ("ed.undo_history", {"type": 'Z', "value": 'PRESS', "ctrl": True, "alt": True}, None),
528             ("screen.screen_full_area", {"type": 'UP_ARROW', "value": 'PRESS', "ctrl": True}, None),
529             ("screen.screen_full_area", {"type": 'DOWN_ARROW', "value": 'PRESS', "ctrl": True}, None),
530             ("screen.screen_set", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
531              {"properties": [("delta", 1)]}),
532             ("screen.screen_set", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
533              {"properties": [("delta", -1)]}),
534             ("screen.screenshot", {"type": 'F3', "value": 'PRESS', "ctrl": True}, None),
535             ("screen.repeat_history", {"type": 'R', "value": 'PRESS', "ctrl": True, "alt": True}, None),
536             ("screen.region_flip", {"type": 'F5', "value": 'PRESS'}, None),
537             ("screen.redo_last", {"type": 'F6', "value": 'PRESS'}, None),
538             ("script.reload", {"type": 'F8', "value": 'PRESS'}, None),
539             ("screen.userpref_show", {"type": 'U', "value": 'PRESS', "ctrl": True, "alt": True}, None),
540         ])
541
542     if params.apple:
543         # Apple undo and user prefs
544         items.extend([
545             ("screen.userpref_show", {"type": 'COMMA', "value": 'PRESS', "oskey": True}, None),
546         ])
547
548     return keymap
549
550
551 def km_screen_editing(params):
552     items = []
553     keymap = ("Screen Editing",
554               {"space_type": 'EMPTY', "region_type": 'WINDOW'},
555               {"items": items})
556
557     items.extend([
558         # Action zones
559         ("screen.actionzone", {"type": 'LEFTMOUSE', "value": 'PRESS'},
560          {"properties": [("modifier", 0)]}),
561         ("screen.actionzone", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
562          {"properties": [("modifier", 1)]}),
563         ("screen.actionzone", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
564          {"properties": [("modifier", 2)]}),
565         # Screen tools
566         ("screen.area_split", {"type": 'ACTIONZONE_AREA', "value": 'ANY'}, None),
567         ("screen.area_join", {"type": 'ACTIONZONE_AREA', "value": 'ANY'}, None),
568         ("screen.area_dupli", {"type": 'ACTIONZONE_AREA', "value": 'ANY', "shift": True}, None),
569         ("screen.area_swap", {"type": 'ACTIONZONE_AREA', "value": 'ANY', "ctrl": True}, None),
570         ("screen.region_scale", {"type": 'ACTIONZONE_REGION', "value": 'ANY'}, None),
571         ("screen.screen_full_area", {"type": 'ACTIONZONE_FULLSCREEN', "value": 'ANY'},
572          {"properties": [("use_hide_panels", True)]}),
573         # Area move after action zones
574         ("screen.area_move", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
575         ("screen.area_options", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
576     ])
577
578     if params.legacy:
579         items.extend([
580             ("wm.context_toggle", {"type": 'F9', "value": 'PRESS', "alt": True},
581              {"properties": [("data_path", 'space_data.show_region_header')]})
582         ])
583
584     return keymap
585
586
587 def km_screen_region_context_menu(_params):
588     items = []
589     keymap = (
590         "Region Context Menu",
591         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
592         {"items": items},
593     )
594
595     items.extend([
596         ("screen.region_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
597     ])
598
599     return keymap
600
601
602 def km_view2d(_params):
603     items = []
604     keymap = (
605         "View2D",
606         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
607         {"items": items},
608     )
609
610     items.extend([
611         # Scrollbars
612         ("view2d.scroller_activate", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
613         ("view2d.scroller_activate", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
614         # Pan/scroll
615         ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
616         ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
617         ("view2d.pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
618         ("view2d.scroll_right", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True}, None),
619         ("view2d.scroll_left", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True}, None),
620         ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True}, None),
621         ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True}, None),
622         ("view2d.ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
623         # Zoom with single step
624         ("view2d.zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None),
625         ("view2d.zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None),
626         ("view2d.zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
627         ("view2d.zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
628         ("view2d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
629         ("view2d.smoothview", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
630         # Scroll up/down, only when zoom is not available.
631         ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
632         ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
633         ("view2d.scroll_right", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
634         ("view2d.scroll_left", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
635         # Zoom with drag and border
636         ("view2d.zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
637         ("view2d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
638         ("view2d.zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None),
639     ])
640
641     return keymap
642
643
644 def km_view2d_buttons_list(_params):
645     items = []
646     keymap = (
647         "View2D Buttons List",
648         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
649         {"items": items},
650     )
651
652     items.extend([
653         # Scrollbars
654         ("view2d.scroller_activate", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
655         ("view2d.scroller_activate", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
656         # Pan scroll
657         ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
658         ("view2d.pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
659         ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
660         ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
661         ("view2d.scroll_down", {"type": 'PAGE_DOWN', "value": 'PRESS'},
662          {"properties": [("page", True)]}),
663         ("view2d.scroll_up", {"type": 'PAGE_UP', "value": 'PRESS'},
664          {"properties": [("page", True)]}),
665         # Zoom
666         ("view2d.zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
667         ("view2d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
668         ("view2d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
669         ("view2d.zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
670         ("view2d.zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
671         ("view2d.reset", {"type": 'HOME', "value": 'PRESS'}, None),
672     ])
673
674     return keymap
675
676
677 def km_user_interface(_params):
678     items = []
679     keymap = (
680         "User Interface",
681         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
682         {"items": items},
683     )
684
685     items.extend([
686         # Eyedroppers all have the same event, and pass it through until
687         # a suitable eyedropper handles it.
688         ("ui.eyedropper_color", {"type": 'E', "value": 'PRESS'}, None),
689         ("ui.eyedropper_colorramp", {"type": 'E', "value": 'PRESS'}, None),
690         ("ui.eyedropper_colorramp_point", {"type": 'E', "value": 'PRESS', "alt": True}, None),
691         ("ui.eyedropper_id", {"type": 'E', "value": 'PRESS'}, None),
692         ("ui.eyedropper_depth", {"type": 'E', "value": 'PRESS'}, None),
693         # Copy data path
694         ("ui.copy_data_path_button", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True}, None),
695         ("ui.copy_data_path_button", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
696          {"properties": [("full_path", True)]}),
697         # Keyframes and drivers
698         ("anim.keyframe_insert_button", {"type": 'I', "value": 'PRESS'},
699          {"properties": [("all", True)]}),
700         ("anim.keyframe_delete_button", {"type": 'I', "value": 'PRESS', "alt": True},
701          {"properties": [("all", True)]}),
702         ("anim.keyframe_clear_button", {"type": 'I', "value": 'PRESS', "shift": True, "alt": True},
703          {"properties": [("all", True)]}),
704         ("anim.driver_button_add", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
705         ("anim.driver_button_remove", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True}, None),
706         ("anim.keyingset_button_add", {"type": 'K', "value": 'PRESS'}, None),
707         ("anim.keyingset_button_remove", {"type": 'K', "value": 'PRESS', "alt": True}, None),
708     ])
709
710     return keymap
711
712
713 # ------------------------------------------------------------------------------
714 # Editors
715
716
717 def km_property_editor(_params):
718     items = []
719     keymap = (
720         "Property Editor",
721         {"space_type": 'PROPERTIES', "region_type": 'WINDOW'},
722         {"items": items},
723     )
724
725     items.extend([
726         ("buttons.context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
727         ("screen.space_context_cycle", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True},
728          {"properties": [("direction", 'PREV'), ], },),
729         ("screen.space_context_cycle", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
730          {"properties": [("direction", 'NEXT'), ], },),
731         # Modifier panels
732         ("object.modifier_remove", {"type": 'X', "value": 'PRESS'}, {"properties": [("report", True)]}),
733         ("object.modifier_remove", {"type": 'DEL', "value": 'PRESS'}, {"properties": [("report", True)]}),
734         ("object.modifier_copy", {"type": 'D', "value": 'PRESS', "shift": True}, None),
735         ("object.modifier_apply", {"type": 'A', "value": 'PRESS', "ctrl": True}, {"properties": [("report", True)]}),
736         # Grease pencil modifier panels
737         ("object.gpencil_modifier_remove", {"type": 'X', "value": 'PRESS'}, {"properties": [("report", True)]}),
738         ("object.gpencil_modifier_remove", {"type": 'DEL', "value": 'PRESS'}, {"properties": [("report", True)]}),
739         ("object.gpencil_modifier_copy", {"type": 'D', "value": 'PRESS', "shift": True}, None),
740         ("object.gpencil_modifier_apply", {"type": 'A', "value": 'PRESS', "ctrl": True}, {"properties": [("report", True)]}),
741     ])
742
743     return keymap
744
745
746 def km_outliner(params):
747     items = []
748     keymap = (
749         "Outliner",
750         {"space_type": 'OUTLINER', "region_type": 'WINDOW'},
751         {"items": items},
752     )
753
754     items.extend([
755         ("outliner.highlight_update", {"type": 'MOUSEMOVE', "value": 'ANY', "any": True}, None),
756         ("outliner.item_rename", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
757         ("outliner.item_rename", {"type": 'F2', "value": 'PRESS'}, None),
758         ("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK'},
759          {"properties": [("extend", False), ("deselect_all", not params.legacy)]}),
760         ("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True},
761          {"properties": [("extend", True), ("deselect_all", not params.legacy)]}),
762         ("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
763          {"properties": [("extend", False), ("extend_range", True), ("deselect_all", not params.legacy)]}),
764         ("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True, "shift": True},
765          {"properties": [("extend", True), ("extend_range", True), ("deselect_all", not params.legacy)]}),
766         ("outliner.select_box", {"type": 'B', "value": 'PRESS'}, None),
767         ("outliner.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, {"properties": [("tweak", True)]}),
768         ("outliner.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True},
769          {"properties": [("tweak", True), ("mode", "ADD")]}),
770         ("outliner.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "ctrl": True},
771          {"properties": [("tweak", True), ("mode", "SUB")]}),
772         ("outliner.select_walk", {"type": 'UP_ARROW', "value": 'PRESS'}, {"properties": [("direction", 'UP')]}),
773         ("outliner.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
774          {"properties": [("direction", 'UP'), ("extend", True)]}),
775         ("outliner.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS'}, {"properties": [("direction", 'DOWN')]}),
776         ("outliner.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
777          {"properties": [("direction", 'DOWN'), ("extend", True)]}),
778         ("outliner.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS'}, {"properties": [("direction", 'LEFT')]}),
779         ("outliner.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
780          {"properties": [("direction", 'LEFT'), ("toggle_all", True)]}),
781         ("outliner.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS'}, {"properties": [("direction", 'RIGHT')]}),
782         ("outliner.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
783          {"properties": [("direction", 'RIGHT'), ("toggle_all", True)]}),
784         ("outliner.item_openclose", {"type": 'LEFTMOUSE', "value": 'CLICK'},
785          {"properties": [("all", False)]}),
786         ("outliner.item_openclose", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
787          {"properties": [("all", True)]}),
788         ("outliner.item_openclose", {"type": 'EVT_TWEAK_L', "value": 'ANY'},
789          {"properties": [("all", False)]}),
790         # Fall through to generic context menu if the item(s) selected have no type specific actions.
791         ("outliner.operation", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
792         op_menu("OUTLINER_MT_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}),
793         ("outliner.item_drag_drop", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
794         ("outliner.item_drag_drop", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True}, None),
795         ("outliner.show_hierarchy", {"type": 'HOME', "value": 'PRESS'}, None),
796         ("outliner.show_active", {"type": 'PERIOD', "value": 'PRESS'}, None),
797         ("outliner.show_active", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
798         ("outliner.scroll_page", {"type": 'PAGE_DOWN', "value": 'PRESS'},
799          {"properties": [("up", False)]}),
800         ("outliner.scroll_page", {"type": 'PAGE_UP', "value": 'PRESS'},
801          {"properties": [("up", True)]}),
802         ("outliner.show_one_level", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
803         ("outliner.show_one_level", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
804          {"properties": [("open", False)]}),
805         *_template_items_select_actions(params, "outliner.select_all"),
806         ("outliner.expanded_toggle", {"type": 'A', "value": 'PRESS', "shift": True}, None),
807         ("outliner.keyingset_add_selected", {"type": 'K', "value": 'PRESS'}, None),
808         ("outliner.keyingset_remove_selected", {"type": 'K', "value": 'PRESS', "alt": True}, None),
809         ("anim.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
810         ("anim.keyframe_delete", {"type": 'I', "value": 'PRESS', "alt": True}, None),
811         ("outliner.drivers_add_selected", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
812         ("outliner.drivers_delete_selected", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True}, None),
813         ("outliner.collection_new", {"type": 'C', "value": 'PRESS'}, None),
814         ("outliner.delete", {"type": 'X', "value": 'PRESS'}, None),
815         ("outliner.delete", {"type": 'DEL', "value": 'PRESS'}, None),
816         ("object.move_to_collection", {"type": 'M', "value": 'PRESS'}, None),
817         ("object.link_to_collection", {"type": 'M', "value": 'PRESS', "shift": True}, None),
818         ("outliner.collection_exclude_set", {"type": 'E', "value": 'PRESS'}, None),
819         ("outliner.collection_exclude_clear", {"type": 'E', "value": 'PRESS', "alt": True}, None),
820         ("outliner.hide", {"type": 'H', "value": 'PRESS'}, None),
821         ("outliner.unhide_all", {"type": 'H', "value": 'PRESS', "alt": True}, None),
822         # Copy/paste.
823         ("outliner.id_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
824         ("outliner.id_paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
825     ])
826
827     return keymap
828
829
830 def km_uv_editor(params):
831     items = []
832     keymap = (
833         "UV Editor",
834         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
835         {"items": items},
836     )
837
838     items.extend([
839         # Selection modes.
840         *_template_items_uv_select_mode(params),
841         ("uv.mark_seam", {"type": 'E', "value": 'PRESS', "ctrl": True}, None),
842         ("uv.select", {"type": params.select_mouse, "value": params.select_mouse_value},
843          {"properties": [("extend", False), ("deselect_all", not params.legacy)]}),
844         ("uv.select", {"type": params.select_mouse, "value": params.select_mouse_value, "shift": True},
845          {"properties": [("extend", True)]}),
846         ("uv.select_loop", {"type": params.select_mouse, "value": params.select_mouse_value, "alt": True},
847          {"properties": [("extend", False)]}),
848         ("uv.select_loop", {"type": params.select_mouse, "value": params.select_mouse_value, "shift": True, "alt": True},
849          {"properties": [("extend", True)]}),
850         ("uv.select_split", {"type": 'Y', "value": 'PRESS'}, None),
851         ("uv.select_box", {"type": 'B', "value": 'PRESS'},
852          {"properties": [("pinned", False)]}),
853         ("uv.select_box", {"type": 'B', "value": 'PRESS', "ctrl": True},
854          {"properties": [("pinned", True)]}),
855         ("uv.select_circle", {"type": 'C', "value": 'PRESS'}, None),
856         ("uv.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True},
857          {"properties": [("mode", 'ADD')]}),
858         ("uv.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True},
859          {"properties": [("mode", 'SUB')]}),
860         ("uv.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
861         ("uv.select_linked_pick", {"type": 'L', "value": 'PRESS'},
862          {"properties": [("extend", True), ("deselect", False)]}),
863         ("uv.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
864          {"properties": [("extend", False), ("deselect", True)]}),
865         ("uv.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
866         ("uv.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
867         *_template_items_select_actions(params, "uv.select_all"),
868         ("uv.select_pinned", {"type": 'P', "value": 'PRESS', "shift": True}, None),
869         op_menu("IMAGE_MT_uvs_weldalign", {"type": 'W', "value": 'PRESS', "shift": True}),
870         ("uv.stitch", {"type": 'V', "value": 'PRESS'}, None),
871         ("uv.pin", {"type": 'P', "value": 'PRESS'},
872          {"properties": [("clear", False)]}),
873         ("uv.pin", {"type": 'P', "value": 'PRESS', "alt": True},
874          {"properties": [("clear", True)]}),
875         ("uv.unwrap", {"type": 'U', "value": 'PRESS'}, None),
876         ("uv.hide", {"type": 'H', "value": 'PRESS'},
877          {"properties": [("unselected", False)]}),
878         ("uv.hide", {"type": 'H', "value": 'PRESS', "shift": True},
879          {"properties": [("unselected", True)]}),
880         ("uv.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
881         op_menu_pie("IMAGE_MT_uvs_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
882         op_menu("IMAGE_MT_uvs_select_mode", {"type": 'TAB', "value": 'PRESS', "ctrl": True}),
883         *_template_items_proportional_editing(connected=False),
884         ("transform.translate", {"type": 'G', "value": 'PRESS', "repeat": False}, None),
885         ("transform.translate", {"type": params.select_tweak, "value": 'ANY'}, None),
886         ("transform.rotate", {"type": 'R', "value": 'PRESS', "repeat": False}, None),
887         ("transform.resize", {"type": 'S', "value": 'PRESS', "repeat": False}, None),
888         ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True, "repeat": False}, None),
889         ("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True, "repeat": False}, None),
890         ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True},
891          {"properties": [("data_path", 'tool_settings.use_snap')]}),
892         ("wm.context_menu_enum", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
893          {"properties": [("data_path", 'tool_settings.snap_uv_element')]}),
894         *_template_items_context_menu("IMAGE_MT_uvs_context_menu", params.context_menu_event),
895     ])
896
897     # Fallback for MMB emulation
898     if params.use_mouse_emulate_3_button and params.select_mouse == 'LEFTMOUSE':
899         items.extend([
900             ("uv.select_loop", {"type": params.select_mouse, "value": 'DOUBLE_CLICK'},
901              {"properties": [("extend", False)]}),
902             ("uv.select_loop", {"type": params.select_mouse, "value": 'DOUBLE_CLICK', "alt": True},
903              {"properties": [("extend", True)]}),
904         ])
905
906     # 3D cursor
907     if params.cursor_tweak_event:
908         items.extend([
909             ("uv.cursor_set", params.cursor_set_event, None),
910             ("transform.translate", params.cursor_tweak_event,
911              {"properties": [("release_confirm", True), ("cursor_transform", True)]}),
912         ])
913     else:
914         items.extend([
915             ("uv.cursor_set", params.cursor_set_event, None),
916         ])
917
918     if params.legacy:
919         items.extend([
920             ("uv.minimize_stretch", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
921             ("uv.pack_islands", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
922             ("uv.average_islands_scale", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
923         ])
924
925     if params.select_mouse == 'LEFTMOUSE' and not params.legacy:
926         # Quick switch to select tool, since left select can't easily
927         # select with any tool active.
928         items.extend([
929             op_tool_cycle("builtin.select_box", {"type": 'W', "value": 'PRESS'}),
930         ])
931
932     return keymap
933
934
935 # 3D View: all regions.
936 def km_view3d_generic(_params):
937     items = []
938     keymap = (
939         "3D View Generic",
940         {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
941         {"items": items},
942     )
943
944     items.extend([
945         *_template_space_region_type_toggle(
946             toolbar_key={"type": 'T', "value": 'PRESS'},
947             sidebar_key={"type": 'N', "value": 'PRESS'},
948         )
949     ])
950
951     return keymap
952
953
954 # 3D View: main region.
955 def km_view3d(params):
956     items = []
957     keymap = (
958         "3D View",
959         {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
960         {"items": items},
961     )
962
963     # 3D cursor
964     if params.cursor_tweak_event:
965         items.extend([
966             ("view3d.cursor3d", params.cursor_set_event, None),
967             ("transform.translate", params.cursor_tweak_event,
968              {"properties": [("release_confirm", True), ("cursor_transform", True)]}),
969         ])
970     else:
971         items.extend([
972             ("view3d.cursor3d", params.cursor_set_event, None),
973         ])
974
975     items.extend([
976         # Visibility.
977         ("view3d.localview", {"type": 'NUMPAD_SLASH', "value": 'PRESS'}, None),
978         ("view3d.localview", {"type": 'SLASH', "value": 'PRESS'}, None),
979         ("view3d.localview", {"type": 'MOUSESMARTZOOM', "value": 'ANY'}, None),
980         ("view3d.localview_remove_from", {"type": 'M', "value": 'PRESS'}, None),
981         # Navigation.
982         *((
983             ("view3d.rotate", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
984             ("view3d.move", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
985         ) if params.use_v3d_mmb_pan else (
986             ("view3d.rotate", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
987             ("view3d.move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
988         )),
989         ("view3d.zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
990         ("view3d.dolly", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None),
991         ("view3d.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "ctrl": True},
992          {"properties": [("use_all_regions", True)]}),
993         ("view3d.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'},
994          {"properties": [("use_all_regions", False)]}),
995         ("view3d.smoothview", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
996         ("view3d.rotate", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
997         ("view3d.rotate", {"type": 'MOUSEROTATE', "value": 'ANY'}, None),
998         ("view3d.move", {"type": 'TRACKPADPAN', "value": 'ANY', "shift": True}, None),
999         ("view3d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
1000         ("view3d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
1001         ("view3d.zoom", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
1002          {"properties": [("delta", 1)]}),
1003         ("view3d.zoom", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
1004          {"properties": [("delta", -1)]}),
1005         ("view3d.zoom", {"type": 'EQUAL', "value": 'PRESS', "ctrl": True},
1006          {"properties": [("delta", 1)]}),
1007         ("view3d.zoom", {"type": 'MINUS', "value": 'PRESS', "ctrl": True},
1008          {"properties": [("delta", -1)]}),
1009         ("view3d.zoom", {"type": 'WHEELINMOUSE', "value": 'PRESS'},
1010          {"properties": [("delta", 1)]}),
1011         ("view3d.zoom", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'},
1012          {"properties": [("delta", -1)]}),
1013         ("view3d.dolly", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
1014          {"properties": [("delta", 1)]}),
1015         ("view3d.dolly", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
1016          {"properties": [("delta", -1)]}),
1017         ("view3d.dolly", {"type": 'EQUAL', "value": 'PRESS', "shift": True, "ctrl": True},
1018          {"properties": [("delta", 1)]}),
1019         ("view3d.dolly", {"type": 'MINUS', "value": 'PRESS', "shift": True, "ctrl": True},
1020          {"properties": [("delta", -1)]}),
1021         ("view3d.view_center_camera", {"type": 'HOME', "value": 'PRESS'}, None),
1022         ("view3d.view_center_lock", {"type": 'HOME', "value": 'PRESS'}, None),
1023         ("view3d.view_all", {"type": 'HOME', "value": 'PRESS'},
1024          {"properties": [("center", False)]}),
1025         ("view3d.view_all", {"type": 'HOME', "value": 'PRESS', "ctrl": True},
1026          {"properties": [("use_all_regions", True), ("center", False)]}),
1027         ("view3d.view_all", {"type": 'C', "value": 'PRESS', "shift": True},
1028          {"properties": [("center", True)]}),
1029         op_menu_pie(
1030             "VIEW3D_MT_view_pie" if params.v3d_tilde_action == 'VIEW' else "VIEW3D_MT_transform_gizmo_pie",
1031             {"type": 'ACCENT_GRAVE', "value": params.pie_value},
1032         ),
1033         *(() if not params.use_pie_click_drag else
1034           (("view3d.navigate", {"type": 'ACCENT_GRAVE', "value": 'CLICK'}, None),)),
1035         ("view3d.navigate", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "shift": True}, None),
1036         # Numpad views.
1037         ("view3d.view_camera", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
1038         ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS'},
1039          {"properties": [("type", 'FRONT')]}),
1040         ("view3d.view_orbit", {"type": 'NUMPAD_2', "value": 'PRESS'},
1041          {"properties": [("type", 'ORBITDOWN')]}),
1042         ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS'},
1043          {"properties": [("type", 'RIGHT')]}),
1044         ("view3d.view_orbit", {"type": 'NUMPAD_4', "value": 'PRESS'},
1045          {"properties": [("type", 'ORBITLEFT')]}),
1046         ("view3d.view_persportho", {"type": 'NUMPAD_5', "value": 'PRESS'}, None),
1047         ("view3d.view_orbit", {"type": 'NUMPAD_6', "value": 'PRESS'},
1048          {"properties": [("type", 'ORBITRIGHT')]}),
1049         ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS'},
1050          {"properties": [("type", 'TOP')]}),
1051         ("view3d.view_orbit", {"type": 'NUMPAD_8', "value": 'PRESS'},
1052          {"properties": [("type", 'ORBITUP')]}),
1053         ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS', "ctrl": True},
1054          {"properties": [("type", 'BACK')]}),
1055         ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS', "ctrl": True},
1056          {"properties": [("type", 'LEFT')]}),
1057         ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS', "ctrl": True},
1058          {"properties": [("type", 'BOTTOM')]}),
1059         ("view3d.view_pan", {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True},
1060          {"properties": [("type", 'PANDOWN')]}),
1061         ("view3d.view_pan", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True},
1062          {"properties": [("type", 'PANLEFT')]}),
1063         ("view3d.view_pan", {"type": 'NUMPAD_6', "value": 'PRESS', "ctrl": True},
1064          {"properties": [("type", 'PANRIGHT')]}),
1065         ("view3d.view_pan", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True},
1066          {"properties": [("type", 'PANUP')]}),
1067         ("view3d.view_roll", {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True},
1068          {"properties": [("type", 'LEFT')]}),
1069         ("view3d.view_roll", {"type": 'NUMPAD_6', "value": 'PRESS', "shift": True},
1070          {"properties": [("type", 'RIGHT')]}),
1071         ("view3d.view_orbit", {"type": 'NUMPAD_9', "value": 'PRESS'},
1072          {"properties": [("angle", 3.1415927), ("type", 'ORBITRIGHT')]}),
1073         ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True},
1074          {"properties": [("type", 'FRONT'), ("align_active", True)]}),
1075         ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True},
1076          {"properties": [("type", 'RIGHT'), ("align_active", True)]}),
1077         ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS', "shift": True},
1078          {"properties": [("type", 'TOP'), ("align_active", True)]}),
1079         ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True, "ctrl": True},
1080          {"properties": [("type", 'BACK'), ("align_active", True)]}),
1081         ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True, "ctrl": True},
1082          {"properties": [("type", 'LEFT'), ("align_active", True)]}),
1083         ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS', "shift": True, "ctrl": True},
1084          {"properties": [("type", 'BOTTOM'), ("align_active", True)]}),
1085         *((
1086             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'NORTH', "alt": True},
1087              {"properties": [("type", 'TOP'), ("relative", True)]}),
1088             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'SOUTH', "alt": True},
1089              {"properties": [("type", 'BOTTOM'), ("relative", True)]}),
1090             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'EAST', "alt": True},
1091              {"properties": [("type", 'RIGHT'), ("relative", True)]}),
1092             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'WEST', "alt": True},
1093              {"properties": [("type", 'LEFT'), ("relative", True)]}),
1094         ) if params.v3d_alt_mmb_drag_action == 'RELATIVE' else (
1095             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'NORTH', "alt": True},
1096              {"properties": [("type", 'TOP')]}),
1097             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'SOUTH', "alt": True},
1098              {"properties": [("type", 'BOTTOM')]}),
1099             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'EAST', "alt": True},
1100              {"properties": [("type", 'RIGHT')]}),
1101             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'WEST', "alt": True},
1102              {"properties": [("type", 'LEFT')]}),
1103             # Match the pie menu.
1104             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'NORTH_WEST', "alt": True},
1105              {"properties": [("type", 'FRONT')]}),
1106             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'NORTH_EAST', "alt": True},
1107              {"properties": [("type", 'BACK')]}),
1108         )),
1109         ("view3d.view_center_pick", {"type": 'MIDDLEMOUSE', "value": 'CLICK', "alt": True}, None),
1110         ("view3d.ndof_orbit_zoom", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
1111         ("view3d.ndof_orbit", {"type": 'NDOF_MOTION', "value": 'ANY', "ctrl": True}, None),
1112         ("view3d.ndof_pan", {"type": 'NDOF_MOTION', "value": 'ANY', "shift": True}, None),
1113         ("view3d.ndof_all", {"type": 'NDOF_MOTION', "value": 'ANY', "shift": True, "ctrl": True}, None),
1114         ("view3d.view_selected", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'},
1115          {"properties": [("use_all_regions", False)]}),
1116         ("view3d.view_roll", {"type": 'NDOF_BUTTON_ROLL_CCW', "value": 'PRESS'},
1117          {"properties": [("type", 'LEFT')]}),
1118         ("view3d.view_roll", {"type": 'NDOF_BUTTON_ROLL_CCW', "value": 'PRESS'},
1119          {"properties": [("type", 'RIGHT')]}),
1120         ("view3d.view_axis", {"type": 'NDOF_BUTTON_FRONT', "value": 'PRESS'},
1121          {"properties": [("type", 'FRONT')]}),
1122         ("view3d.view_axis", {"type": 'NDOF_BUTTON_BACK', "value": 'PRESS'},
1123          {"properties": [("type", 'BACK')]}),
1124         ("view3d.view_axis", {"type": 'NDOF_BUTTON_LEFT', "value": 'PRESS'},
1125          {"properties": [("type", 'LEFT')]}),
1126         ("view3d.view_axis", {"type": 'NDOF_BUTTON_RIGHT', "value": 'PRESS'},
1127          {"properties": [("type", 'RIGHT')]}),
1128         ("view3d.view_axis", {"type": 'NDOF_BUTTON_TOP', "value": 'PRESS'},
1129          {"properties": [("type", 'TOP')]}),
1130         ("view3d.view_axis", {"type": 'NDOF_BUTTON_BOTTOM', "value": 'PRESS'},
1131          {"properties": [("type", 'BOTTOM')]}),
1132         ("view3d.view_axis", {"type": 'NDOF_BUTTON_FRONT', "value": 'PRESS', "shift": True},
1133          {"properties": [("type", 'FRONT'), ("align_active", True)]}),
1134         ("view3d.view_axis", {"type": 'NDOF_BUTTON_RIGHT', "value": 'PRESS', "shift": True},
1135          {"properties": [("type", 'RIGHT'), ("align_active", True)]}),
1136         ("view3d.view_axis", {"type": 'NDOF_BUTTON_TOP', "value": 'PRESS', "shift": True},
1137          {"properties": [("type", 'TOP'), ("align_active", True)]}),
1138         # Selection.
1139         *((
1140             "view3d.select",
1141             {"type": params.select_mouse, "value": params.select_mouse_value, **{m: True for m in mods}},
1142             {"properties": [(c, True) for c in props]},
1143         ) for props, mods in (
1144             (("deselect_all",) if not params.legacy else (), ()),
1145             (("toggle",), ("shift",)),
1146             (("center", "object"), ("ctrl",)),
1147             (("enumerate",), ("alt",)),
1148             (("toggle", "center"), ("shift", "ctrl")),
1149             (("center", "enumerate"), ("ctrl", "alt")),
1150             (("toggle", "enumerate"), ("shift", "alt")),
1151             (("toggle", "center", "enumerate"), ("shift", "ctrl", "alt")),
1152         )),
1153         ("view3d.select_box", {"type": 'B', "value": 'PRESS'}, None),
1154         ("view3d.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True},
1155          {"properties": [("mode", 'ADD')]}),
1156         ("view3d.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True},
1157          {"properties": [("mode", 'SUB')]}),
1158         ("view3d.select_circle", {"type": 'C', "value": 'PRESS'}, None),
1159         # Borders.
1160         ("view3d.clip_border", {"type": 'B', "value": 'PRESS', "alt": True}, None),
1161         ("view3d.zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None),
1162         ("view3d.render_border", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
1163         ("view3d.clear_render_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None),
1164         # Cameras.
1165         ("view3d.camera_to_view", {"type": 'NUMPAD_0', "value": 'PRESS', "ctrl": True, "alt": True}, None),
1166         ("view3d.object_as_camera", {"type": 'NUMPAD_0', "value": 'PRESS', "ctrl": True}, None),
1167         # Copy/paste.
1168         ("view3d.copybuffer", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
1169         ("view3d.pastebuffer", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
1170         # Transform.
1171         ("transform.translate", {"type": 'G', "value": 'PRESS', "repeat": False}, None),
1172         ("transform.translate", {"type": params.select_tweak, "value": 'ANY'}, None),
1173         ("transform.rotate", {"type": 'R', "value": 'PRESS', "repeat": False}, None),
1174         ("transform.resize", {"type": 'S', "value": 'PRESS', "repeat": False}, None),
1175         ("transform.bend", {"type": 'W', "value": 'PRESS', "shift": True, "repeat": False}, None),
1176         ("transform.tosphere", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True, "repeat": False}, None),
1177         ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True, "repeat": False}, None),
1178         ("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True, "repeat": False}, None),
1179         ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True},
1180          {"properties": [("data_path", 'tool_settings.use_snap')]}),
1181         op_panel("VIEW3D_PT_snapping", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True}, [("keep_open", False)]),
1182         ("object.transform_axis_target", {"type": 'T', "value": 'PRESS', "shift": True}, None),
1183         ("transform.skin_resize", {"type": 'A', "value": 'PRESS', "ctrl": True, "repeat": False}, None),
1184     ])
1185
1186     if not params.legacy:
1187         # New pie menus.
1188         items.extend([
1189             op_menu_pie("VIEW3D_MT_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
1190             ("wm.context_toggle", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True},
1191              {"properties": [("data_path", 'space_data.show_gizmo')]}),
1192             op_menu_pie("VIEW3D_MT_pivot_pie", {"type": 'PERIOD', "value": 'PRESS'}),
1193             op_menu_pie("VIEW3D_MT_orientations_pie", {"type": 'COMMA', "value": 'PRESS'}),
1194             op_menu_pie(
1195                 "VIEW3D_MT_shading_pie" if not params.use_v3d_shade_ex_pie else
1196                 "VIEW3D_MT_shading_ex_pie",
1197                 {"type": 'Z', "value": params.pie_value}),
1198             *(() if not params.use_pie_click_drag else
1199               (("view3d.toggle_shading", {"type": 'Z', "value": 'CLICK'},
1200                 {"properties": [("type", 'WIREFRAME')]}),)),
1201             ("view3d.toggle_shading", {"type": 'Z', "value": 'PRESS', "shift": True},
1202              {"properties": [("type", 'WIREFRAME')]}),
1203             ("view3d.toggle_xray", {"type": 'Z', "value": 'PRESS', "alt": True}, None),
1204             ("wm.context_toggle", {"type": 'Z', "value": 'PRESS', "alt": True, "shift": True},
1205              {"properties": [("data_path", "space_data.overlay.show_overlays")]}),
1206         ])
1207     else:
1208         items.extend([
1209             # Old navigation.
1210             op_menu("VIEW3D_MT_snap", {"type": 'S', "value": 'PRESS', "shift": True}),
1211             ("view3d.view_lock_to_active", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "shift": True}, None),
1212             ("view3d.view_lock_clear", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "alt": True}, None),
1213             ("view3d.navigate", {"type": 'F', "value": 'PRESS', "shift": True}, None),
1214             ("view3d.zoom_camera_1_to_1", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "shift": True}, None),
1215             ("view3d.view_center_cursor", {"type": 'HOME', "value": 'PRESS', "alt": True}, None),
1216             ("view3d.view_center_pick", {"type": 'F', "value": 'PRESS', "alt": True}, None),
1217             ("view3d.view_pan", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True},
1218              {"properties": [("type", 'PANRIGHT')]}),
1219             ("view3d.view_pan", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
1220              {"properties": [("type", 'PANLEFT')]}),
1221             ("view3d.view_pan", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True},
1222              {"properties": [("type", 'PANUP')]}),
1223             ("view3d.view_pan", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True},
1224              {"properties": [("type", 'PANDOWN')]}),
1225             ("view3d.view_orbit", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
1226              {"properties": [("type", 'ORBITLEFT')]}),
1227             ("view3d.view_orbit", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
1228              {"properties": [("type", 'ORBITRIGHT')]}),
1229             ("view3d.view_orbit", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True, "alt": True},
1230              {"properties": [("type", 'ORBITUP')]}),
1231             ("view3d.view_orbit", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True, "alt": True},
1232              {"properties": [("type", 'ORBITDOWN')]}),
1233             ("view3d.view_roll", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
1234              {"properties": [("type", 'LEFT')]}),
1235             ("view3d.view_roll", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
1236              {"properties": [("type", 'RIGHT')]}),
1237             ("transform.create_orientation", {"type": 'SPACE', "value": 'PRESS', "ctrl": True, "alt": True},
1238              {"properties": [("use", True)]}),
1239             ("transform.translate", {"type": 'T', "value": 'PRESS', "shift": True, "repeat": False},
1240              {"properties": [("texture_space", True)]}),
1241             ("transform.resize", {"type": 'T', "value": 'PRESS', "shift": True, "alt": True, "repeat": False},
1242              {"properties": [("texture_space", True)]}),
1243             # Old pivot.
1244             ("wm.context_set_enum", {"type": 'COMMA', "value": 'PRESS'},
1245              {"properties": [("data_path", 'tool_settings.transform_pivot_point'), ("value", 'BOUNDING_BOX_CENTER')]}),
1246             ("wm.context_set_enum", {"type": 'COMMA', "value": 'PRESS', "ctrl": True},
1247              {"properties": [("data_path", 'tool_settings.transform_pivot_point'), ("value", 'MEDIAN_POINT')]}),
1248             ("wm.context_toggle", {"type": 'COMMA', "value": 'PRESS', "alt": True},
1249              {"properties": [("data_path", 'tool_settings.use_transform_pivot_point_align')]}),
1250             ("wm.context_toggle", {"type": 'SPACE', "value": 'PRESS', "ctrl": True},
1251              {"properties": [("data_path", 'space_data.show_gizmo_context')]}),
1252             ("wm.context_set_enum", {"type": 'PERIOD', "value": 'PRESS'},
1253              {"properties": [("data_path", 'tool_settings.transform_pivot_point'), ("value", 'CURSOR')]}),
1254             ("wm.context_set_enum", {"type": 'PERIOD', "value": 'PRESS', "ctrl": True},
1255              {"properties": [("data_path", 'tool_settings.transform_pivot_point'), ("value", 'INDIVIDUAL_ORIGINS')]}),
1256             ("wm.context_set_enum", {"type": 'PERIOD', "value": 'PRESS', "alt": True},
1257              {"properties": [("data_path", 'tool_settings.transform_pivot_point'), ("value", 'ACTIVE_ELEMENT')]}),
1258             # Old shading.
1259             ("wm.context_toggle_enum", {"type": 'Z', "value": 'PRESS'},
1260              {"properties": [("data_path", 'space_data.shading.type'), ("value_1", 'WIREFRAME'), ("value_2", 'SOLID')]}),
1261             ("wm.context_toggle_enum", {"type": 'Z', "value": 'PRESS', "shift": True},
1262              {"properties": [("data_path", 'space_data.shading.type'), ("value_1", 'RENDERED'), ("value_2", 'SOLID')]}),
1263             ("wm.context_toggle_enum", {"type": 'Z', "value": 'PRESS', "alt": True},
1264              {"properties": [("data_path", 'space_data.shading.type'), ("value_1", 'MATERIAL'), ("value_2", 'SOLID')]}),
1265         ])
1266
1267     if params.select_mouse == 'LEFTMOUSE' and not params.legacy:
1268         # Quick switch to select tool, since left select can't easily
1269         # select with any tool active.
1270         items.extend([
1271             op_tool_cycle("builtin.select_box", {"type": 'W', "value": 'PRESS'}),
1272         ])
1273
1274     return keymap
1275
1276
1277 def km_mask_editing(params):
1278     items = []
1279     keymap = (
1280         "Mask Editing",
1281         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
1282         {"items": items},
1283     )
1284
1285     if params.select_mouse == 'RIGHTMOUSE':
1286         # mask.slide_point performs mostly the same function, so for the left
1287         # click select keymap it's fine to have the context menu instead.
1288         items.extend([
1289             ("mask.select", {"type": 'RIGHTMOUSE', "value": 'PRESS'},
1290              {"properties": [
1291                  ("extend", False), ("deselect", False), ("toggle", False),
1292                  ("deselect_all", not params.legacy)]}),
1293             ("transform.translate", {"type": 'EVT_TWEAK_R', "value": 'ANY'}, None),
1294         ])
1295
1296     items.extend([
1297         ("mask.new", {"type": 'N', "value": 'PRESS', "alt": True}, None),
1298         op_menu("MASK_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}),
1299         op_menu_pie("VIEW3D_MT_proportional_editing_falloff_pie", {"type": 'O', "value": 'PRESS', "shift": True}),
1300         ("wm.context_toggle", {"type": 'O', "value": 'PRESS'},
1301          {"properties": [("data_path", 'tool_settings.use_proportional_edit_mask')]}),
1302         ("mask.add_vertex_slide", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
1303         ("mask.add_feather_vertex_slide", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None),
1304         ("mask.delete", {"type": 'X', "value": 'PRESS'}, None),
1305         ("mask.delete", {"type": 'DEL', "value": 'PRESS'}, None),
1306         ("mask.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
1307          {"properties": [("extend", False), ("deselect", False), ("toggle", True)]}),
1308         *_template_items_select_actions(params, "mask.select_all"),
1309         ("mask.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
1310         ("mask.select_linked_pick", {"type": 'L', "value": 'PRESS'},
1311          {"properties": [("deselect", False)]}),
1312         ("mask.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
1313          {"properties": [("deselect", True)]}),
1314         ("mask.select_box", {"type": 'B', "value": 'PRESS'}, None),
1315         ("mask.select_circle", {"type": 'C', "value": 'PRESS'}, None),
1316         ("mask.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True, "alt": True},
1317          {"properties": [("mode", 'ADD')]}),
1318         ("mask.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
1319          {"properties": [("mode", 'SUB')]}),
1320         ("mask.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
1321         ("mask.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
1322         ("mask.hide_view_clear", {"type": 'H', "value": 'PRESS', "alt": True}, None),
1323         ("mask.hide_view_set", {"type": 'H', "value": 'PRESS'},
1324          {"properties": [("unselected", False)]}),
1325         ("mask.hide_view_set", {"type": 'H', "value": 'PRESS', "shift": True},
1326          {"properties": [("unselected", True)]}),
1327         ("clip.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
1328          {"properties": [("extend", False)]}),
1329         ("mask.cyclic_toggle", {"type": 'C', "value": 'PRESS', "alt": True}, None),
1330         ("mask.slide_point", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
1331         ("mask.slide_spline_curvature", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
1332         ("mask.handle_type_set", {"type": 'V', "value": 'PRESS'}, None),
1333         ("mask.normals_make_consistent", {"type": 'N', "value": 'PRESS', "ctrl" if params.legacy else "shift": True}, None),
1334         ("mask.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
1335         ("mask.parent_clear", {"type": 'P', "value": 'PRESS', "alt": True}, None),
1336         ("mask.shape_key_insert", {"type": 'I', "value": 'PRESS'}, None),
1337         ("mask.shape_key_clear", {"type": 'I', "value": 'PRESS', "alt": True}, None),
1338         ("mask.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
1339         ("mask.copy_splines", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
1340         ("mask.paste_splines", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
1341         ("transform.translate", {"type": 'G', "value": 'PRESS', "repeat": False}, None),
1342         ("transform.resize", {"type": 'S', "value": 'PRESS', "repeat": False}, None),
1343         ("transform.rotate", {"type": 'R', "value": 'PRESS', "repeat": False}, None),
1344         ("transform.transform", {"type": 'S', "value": 'PRESS', "alt": True, "repeat": False},
1345          {"properties": [("mode", 'MASK_SHRINKFATTEN')]}),
1346     ])
1347
1348     # 3D cursor
1349     if params.cursor_tweak_event:
1350         items.extend([
1351             ("uv.cursor_set", params.cursor_set_event, None),
1352             ("transform.translate", params.cursor_tweak_event,
1353              {"properties": [("release_confirm", True), ("cursor_transform", True)]}),
1354         ])
1355     else:
1356         items.extend([
1357             ("uv.cursor_set", params.cursor_set_event, None),
1358         ])
1359
1360     return keymap
1361
1362
1363 def km_markers(params):
1364     items = []
1365     keymap = (
1366         "Markers",
1367         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
1368         {"items": items},
1369     )
1370
1371     items.extend([
1372         ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
1373         ("marker.move", {"type": params.select_tweak, "value": 'ANY'},
1374          {"properties": [("tweak", True)]}),
1375         ("marker.duplicate", {"type": 'D', "value": 'PRESS', "shift": True}, None),
1376         ("marker.select", {"type": params.select_mouse, "value": 'PRESS'}, None),
1377         ("marker.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
1378          {"properties": [("extend", True)]}),
1379         ("marker.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
1380          {"properties": [("extend", False), ("camera", True)]}),
1381         ("marker.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
1382          {"properties": [("extend", True), ("camera", True)]}),
1383         ("marker.select_box", {"type": params.select_tweak, "value": 'ANY'},
1384          {"properties": [("tweak", True)]}),
1385         ("marker.select_box", {"type": 'B', "value": 'PRESS'}, None),
1386         *_template_items_select_actions(params, "marker.select_all"),
1387         ("marker.delete", {"type": 'X', "value": 'PRESS'}, None),
1388         ("marker.delete", {"type": 'DEL', "value": 'PRESS'}, None),
1389         ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
1390         ("marker.move", {"type": 'G', "value": 'PRESS'}, None),
1391         ("marker.camera_bind", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
1392     ])
1393
1394     return keymap
1395
1396
1397 def km_time_scrub(_params):
1398     items = []
1399     keymap = (
1400         "Time Scrub",
1401         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
1402         {"items": items},
1403     )
1404
1405     items.extend([
1406         ("anim.change_frame", {"type": "LEFTMOUSE", "value": 'PRESS'}, None),
1407     ])
1408
1409     return keymap
1410
1411 def km_time_scrub_clip(_params):
1412     items = []
1413     keymap = (
1414         "Clip Time Scrub",
1415         {"space_type": 'CLIP_EDITOR', "region_type": 'PREVIEW'},
1416         {"items": items},
1417     )
1418
1419     items.extend([
1420         ("clip.change_frame", {"type": "LEFTMOUSE", "value": 'PRESS'}, None),
1421     ])
1422
1423     return keymap
1424
1425
1426 def km_graph_editor_generic(_params):
1427     items = []
1428     keymap = (
1429         "Graph Editor Generic",
1430         {"space_type": 'GRAPH_EDITOR', "region_type": 'WINDOW'},
1431         {"items": items},
1432     )
1433
1434     items.extend([
1435         *_template_space_region_type_toggle(
1436             sidebar_key={"type": 'N', "value": 'PRESS'},
1437         ),
1438         ("graph.extrapolation_type", {"type": 'E', "value": 'PRESS', "shift": True}, None),
1439         ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
1440         ("graph.hide", {"type": 'H', "value": 'PRESS'},
1441          {"properties": [("unselected", False)]}),
1442         ("graph.hide", {"type": 'H', "value": 'PRESS', "shift": True},
1443          {"properties": [("unselected", True)]}),
1444         ("graph.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
1445         ("wm.context_set_enum", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
1446          {"properties": [("data_path", 'area.type'), ("value", 'DOPESHEET_EDITOR')]}),
1447     ])
1448
1449     return keymap
1450
1451
1452 def km_graph_editor(params):
1453     items = []
1454     keymap = (
1455         "Graph Editor",
1456         {"space_type": 'GRAPH_EDITOR', "region_type": 'WINDOW'},
1457         {"items": items},
1458     )
1459
1460     items.extend([
1461         ("wm.context_toggle", {"type": 'H', "value": 'PRESS', "ctrl": True},
1462          {"properties": [("data_path", 'space_data.show_handles')]}),
1463         ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS'},
1464          {"properties": [
1465              ("extend", False), ("deselect_all", not params.legacy),
1466              ("column", False), ("curves", False)]}),
1467         ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
1468          {"properties": [("extend", False), ("column", True), ("curves", False)]}),
1469         ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
1470          {"properties": [("extend", True), ("column", False), ("curves", False)]}),
1471         ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
1472          {"properties": [("extend", True), ("column", True), ("curves", False)]}),
1473         ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True, "alt": True},
1474          {"properties": [("extend", False), ("column", False), ("curves", True)]}),
1475         ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
1476          {"properties": [("extend", True), ("column", False), ("curves", True)]}),
1477         ("graph.select_leftright",
1478          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True},
1479          {"properties": [("mode", 'CHECK'), ("extend", False)]}),
1480         ("graph.select_leftright",
1481          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True, "shift": True},
1482          {"properties": [("mode", 'CHECK'), ("extend", True)]}),
1483         ("graph.select_leftright", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
1484          {"properties": [("mode", 'LEFT'), ("extend", False)]}),
1485         ("graph.select_leftright", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
1486          {"properties": [("mode", 'RIGHT'), ("extend", False)]}),
1487         *_template_items_select_actions(params, "graph.select_all"),
1488         ("graph.select_box", {"type": 'B', "value": 'PRESS'}, None),
1489         ("graph.select_box", {"type": 'B', "value": 'PRESS', "alt": True},
1490          {"properties": [("axis_range", True)]}),
1491         ("graph.select_box", {"type": params.select_tweak, "value": 'ANY'},
1492          {"properties": [("tweak", True), ("mode", 'SET')]}),
1493         ("graph.select_box", {"type": params.select_tweak, "value": 'ANY', "shift": True},
1494          {"properties": [("tweak", True), ("mode", 'ADD')]}),
1495         ("graph.select_box", {"type": params.select_tweak, "value": 'ANY', "ctrl": True},
1496          {"properties": [("tweak", True), ("mode", 'SUB')]}),
1497         ("graph.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True},
1498          {"properties": [("mode", 'ADD')]}),
1499         ("graph.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True},
1500          {"properties": [("mode", 'SUB')]}),
1501         ("graph.select_circle", {"type": 'C', "value": 'PRESS'}, None),
1502         ("graph.select_column", {"type": 'K', "value": 'PRESS'},
1503          {"properties": [("mode", 'KEYS')]}),
1504         ("graph.select_column", {"type": 'K', "value": 'PRESS', "ctrl": True},
1505          {"properties": [("mode", 'CFRA')]}),
1506         ("graph.select_column", {"type": 'K', "value": 'PRESS', "shift": True},
1507          {"properties": [("mode", 'MARKERS_COLUMN')]}),
1508         ("graph.select_column", {"type": 'K', "value": 'PRESS', "alt": True},
1509          {"properties": [("mode", 'MARKERS_BETWEEN')]}),
1510         ("graph.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
1511         ("graph.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
1512         ("graph.select_linked", {"type": 'L', "value": 'PRESS'}, None),
1513         ("graph.frame_jump", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
1514         op_menu_pie("GRAPH_MT_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
1515         ("graph.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
1516         ("graph.handle_type", {"type": 'V', "value": 'PRESS'}, None),
1517         ("graph.interpolation_type", {"type": 'T', "value": 'PRESS'}, None),
1518         ("graph.easing_type", {"type": 'E', "value": 'PRESS', "ctrl": True}, None),
1519         ("graph.smooth", {"type": 'O', "value": 'PRESS', "alt": True}, None),
1520         ("graph.sample", {"type": 'O', "value": 'PRESS', "shift": True, "alt": True}, None),
1521         ("graph.bake", {"type": 'C', "value": 'PRESS', "alt": True}, None),
1522         op_menu("GRAPH_MT_delete", {"type": 'X', "value": 'PRESS'}),
1523         op_menu("GRAPH_MT_delete", {"type": 'DEL', "value": 'PRESS'}),
1524         ("graph.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
1525         ("graph.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
1526         ("graph.click_insert", {"type": params.action_mouse, "value": 'CLICK', "ctrl": True},
1527          {"properties": [("extend", False)]}),
1528         ("graph.click_insert", {"type": params.action_mouse, "value": 'CLICK', "shift": True, "ctrl": True},
1529          {"properties": [("extend", True)]}),
1530         ("graph.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
1531         ("graph.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
1532         ("graph.paste", {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True},
1533          {"properties": [("flipped", True)]}),
1534         ("graph.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None),
1535         ("graph.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
1536         ("graph.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
1537         ("graph.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
1538         ("graph.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
1539         ("graph.fmodifier_add", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True},
1540          {"properties": [("only_active", False)]}),
1541         ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
1542         ("transform.translate", {"type": 'G', "value": 'PRESS', "repeat": False}, None),
1543         ("transform.translate", {"type": params.select_tweak, "value": 'ANY'}, None),
1544         ("transform.transform", {"type": 'E', "value": 'PRESS', "repeat": False},
1545          {"properties": [("mode", 'TIME_EXTEND')]}),
1546         ("transform.rotate", {"type": 'R', "value": 'PRESS', "repeat": False}, None),
1547         ("transform.resize", {"type": 'S', "value": 'PRESS', "repeat": False}, None),
1548         ("wm.context_toggle", {"type": 'O', "value": 'PRESS'},
1549          {"properties": [("data_path", 'tool_settings.use_proportional_fcurve')]}),
1550         op_menu_pie("VIEW3D_MT_proportional_editing_falloff_pie", {"type": 'O', "value": 'PRESS', "shift": True}),
1551         op_menu_pie("GRAPH_MT_pivot_pie", {"type": 'PERIOD', "value": 'PRESS'}),
1552         ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
1553         ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
1554         *_template_items_context_menu("GRAPH_MT_context_menu", params.context_menu_event),
1555     ])
1556
1557     if params.select_mouse == 'LEFTMOUSE' and not params.legacy:
1558         items.extend([
1559             ("graph.cursor_set", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}, None),
1560         ])
1561     else:
1562         items.extend([
1563             ("graph.cursor_set", {"type": params.action_mouse, "value": 'PRESS'}, None),
1564         ])
1565
1566     return keymap
1567
1568
1569 def km_image_generic(_params):
1570     items = []
1571     keymap = (
1572         "Image Generic",
1573         {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
1574         {"items": items},
1575     )
1576
1577     items.extend([
1578         *_template_space_region_type_toggle(
1579             toolbar_key={"type": 'T', "value": 'PRESS'},
1580             sidebar_key={"type": 'N', "value": 'PRESS'},
1581         ),
1582         ("image.new", {"type": 'N', "value": 'PRESS', "alt": True}, None),
1583         ("image.open", {"type": 'O', "value": 'PRESS', "alt": True}, None),
1584         ("image.reload", {"type": 'R', "value": 'PRESS', "alt": True}, None),
1585         ("image.read_viewlayers", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
1586         ("image.save", {"type": 'S', "value": 'PRESS', "alt": True}, None),
1587         ("image.save_as", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True}, None),
1588         ("image.cycle_render_slot", {"type": 'J', "value": 'PRESS'}, None),
1589         ("image.cycle_render_slot", {"type": 'J', "value": 'PRESS', "alt": True},
1590          {"properties": [("reverse", True)]}),
1591     ])
1592
1593     return keymap
1594
1595
1596 def km_image(params):
1597     items = []
1598     keymap = (
1599         "Image",
1600         {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
1601         {"items": items},
1602     )
1603
1604     items.extend([
1605         ("image.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
1606         ("image.view_all", {"type": 'HOME', "value": 'PRESS', "shift": True},
1607          {"properties": [("fit_view", True)]}),
1608         ("image.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
1609         ("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
1610         ("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
1611         ("image.view_pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
1612         ("image.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
1613         ("image.view_ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
1614         ("image.view_zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None),
1615         ("image.view_zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None),
1616         ("image.view_zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
1617         ("image.view_zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
1618         ("image.view_zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
1619         ("image.view_zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
1620         ("image.view_zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
1621         ("image.view_zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None),
1622         ("image.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True},
1623          {"properties": [("ratio", 8.0)]}),
1624         ("image.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True},
1625          {"properties": [("ratio", 4.0)]}),
1626         ("image.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True},
1627          {"properties": [("ratio", 2.0)]}),
1628         ("image.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "shift": True},
1629          {"properties": [("ratio", 8.0)]}),
1630         ("image.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True},
1631          {"properties": [("ratio", 4.0)]}),
1632         ("image.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "shift": True},
1633          {"properties": [("ratio", 2.0)]}),
1634         ("image.view_zoom_ratio", {"type": 'NUMPAD_1', "value": 'PRESS'},
1635          {"properties": [("ratio", 1.0)]}),
1636         ("image.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS'},
1637          {"properties": [("ratio", 0.5)]}),
1638         ("image.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS'},
1639          {"properties": [("ratio", 0.25)]}),
1640         ("image.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS'},
1641          {"properties": [("ratio", 0.125)]}),
1642         ("image.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
1643         ("image.sample", {"type": params.action_mouse, "value": 'PRESS'}, None),
1644         ("image.curves_point_set", {"type": params.action_mouse, "value": 'PRESS', "ctrl": True},
1645          {"properties": [("point", 'BLACK_POINT')]}),
1646         ("image.curves_point_set", {"type": params.action_mouse, "value": 'PRESS', "shift": True},
1647          {"properties": [("point", 'WHITE_POINT')]}),
1648         ("object.mode_set", {"type": 'TAB', "value": 'PRESS'},
1649          {"properties": [("mode", 'EDIT'), ("toggle", True)]}),
1650         *(
1651             (("wm.context_set_int",
1652               {"type": NUMBERS_1[i], "value": 'PRESS'},
1653               {"properties": [("data_path", 'space_data.image.render_slots.active_index'), ("value", i)]})
1654              for i in range(9)
1655              )
1656         ),
1657         op_menu_pie("IMAGE_MT_pivot_pie", {"type": 'PERIOD', "value": 'PRESS'}),
1658         ("image.render_border", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
1659         ("image.clear_render_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None),
1660         *_template_items_context_menu("IMAGE_MT_mask_context_menu", params.context_menu_event),
1661     ])
1662
1663     if params.legacy:
1664         items.extend([
1665             ("image.view_center_cursor", {"type": 'HOME', "value": 'PRESS', "alt": True}, None),
1666         ])
1667
1668     return keymap
1669
1670
1671 def km_node_generic(_params):
1672     items = []
1673     keymap = (
1674         "Node Generic",
1675         {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
1676         {"items": items},
1677     )
1678
1679     items.extend([
1680         *_template_space_region_type_toggle(
1681             toolbar_key={"type": 'T', "value": 'PRESS'},
1682             sidebar_key={"type": 'N', "value": 'PRESS'},
1683         ),
1684     ])
1685
1686     return keymap
1687
1688
1689 def km_node_editor(params):
1690     items = []
1691     keymap = (
1692         "Node Editor",
1693         {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
1694         {"items": items},
1695     )
1696
1697     def node_select_ops(select_mouse):
1698         return [
1699             ("node.select", {"type": select_mouse, "value": 'PRESS'},
1700              {"properties": [("extend", False), ("deselect_all", True)]}),
1701             ("node.select", {"type": select_mouse, "value": 'PRESS', "ctrl": True},
1702              {"properties": [("extend", False)]}),
1703             ("node.select", {"type": select_mouse, "value": 'PRESS', "alt": True},
1704              {"properties": [("extend", False)]}),
1705             ("node.select", {"type": select_mouse, "value": 'PRESS', "ctrl": True, "alt": True},
1706              {"properties": [("extend", False)]}),
1707             ("node.select", {"type": select_mouse, "value": 'PRESS', "shift": True},
1708              {"properties": [("extend", True)]}),
1709             ("node.select", {"type": select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
1710              {"properties": [("extend", True)]}),
1711             ("node.select", {"type": select_mouse, "value": 'PRESS', "shift": True, "alt": True},
1712              {"properties": [("extend", True)]}),
1713             ("node.select", {"type": select_mouse, "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
1714              {"properties": [("extend", True)]}),
1715         ]
1716
1717     # Allow node selection with both for RMB select
1718     if params.select_mouse == 'RIGHTMOUSE':
1719         items.extend(node_select_ops('LEFTMOUSE'))
1720         items.extend(node_select_ops('RIGHTMOUSE'))
1721     else:
1722         items.extend(node_select_ops('LEFTMOUSE'))
1723
1724     items.extend([
1725         ("node.select_box", {"type": params.select_tweak, "value": 'ANY'},
1726          {"properties": [("tweak", True)]}),
1727         ("node.select_lasso", {"type": 'EVT_TWEAK_L', "value": 'ANY', "ctrl": True, "alt": True},
1728          {"properties": [("mode", 'ADD')]}),
1729         ("node.select_lasso", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
1730          {"properties": [("mode", 'SUB')]}),
1731         ("node.select_circle", {"type": 'C', "value": 'PRESS'}, None),
1732         ("node.link", {"type": 'EVT_TWEAK_L', "value": 'ANY'},
1733          {"properties": [("detach", False)]}),
1734         ("node.link", {"type": 'EVT_TWEAK_L', "value": 'ANY', "ctrl": True},
1735          {"properties": [("detach", True)]}),
1736         ("node.resize", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
1737         ("node.add_reroute", {"type": 'EVT_TWEAK_R', "value": 'ANY', "shift": True}, None),
1738         ("node.links_cut", {"type": 'EVT_TWEAK_R', "value": 'ANY', "ctrl": True}, None),
1739         ("node.select_link_viewer", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None),
1740         ("node.backimage_move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None),
1741         ("node.backimage_zoom", {"type": 'V', "value": 'PRESS'},
1742          {"properties": [("factor", 1.0 / 1.2)]}),
1743         ("node.backimage_zoom", {"type": 'V', "value": 'PRESS', "alt": True},
1744          {"properties": [("factor", 1.2)]}),
1745         ("node.backimage_fit", {"type": 'HOME', "value": 'PRESS', "alt": True}, None),
1746         ("node.backimage_sample", {"type": params.action_mouse, "value": 'PRESS', "alt": True}, None),
1747         ("node.link_make", {"type": 'F', "value": 'PRESS'},
1748          {"properties": [("replace", False)]}),
1749         ("node.link_make", {"type": 'F', "value": 'PRESS', "shift": True},
1750          {"properties": [("replace", True)]}),
1751         op_menu("NODE_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}),
1752         ("node.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
1753         ("node.duplicate_move_keep_inputs", {"type": 'D', "value": 'PRESS', "shift": True, "ctrl": True}, None),
1754         ("node.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
1755         ("node.detach", {"type": 'P', "value": 'PRESS', "alt": True}, None),
1756         ("node.join", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
1757         ("node.hide_toggle", {"type": 'H', "value": 'PRESS'}, None),
1758         ("node.mute_toggle", {"type": 'M', "value": 'PRESS'}, None),
1759         ("node.preview_toggle", {"type": 'H', "value": 'PRESS', "shift": True}, None),
1760         ("node.hide_socket_toggle", {"type": 'H', "value": 'PRESS', "ctrl": True}, None),
1761         ("node.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
1762         ("node.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
1763         ("node.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
1764         ("node.select_box", {"type": 'B', "value": 'PRESS'},
1765          {"properties": [("tweak", False)]}),
1766         ("node.delete", {"type": 'X', "value": 'PRESS'}, None),
1767         ("node.delete", {"type": 'DEL', "value": 'PRESS'}, None),
1768         ("node.delete_reconnect", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
1769         ("node.delete_reconnect", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None),
1770         *_template_items_select_actions(params, "node.select_all"),
1771         ("node.select_linked_to", {"type": 'L', "value": 'PRESS', "shift": True}, None),
1772         ("node.select_linked_from", {"type": 'L', "value": 'PRESS'}, None),
1773         ("node.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True},
1774          {"properties": [("extend", False)]}),
1775         ("node.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True},
1776          {"properties": [("extend", True)]}),
1777         ("node.select_same_type_step", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True},
1778          {"properties": [("prev", False)]}),
1779         ("node.select_same_type_step", {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True},
1780          {"properties": [("prev", True)]}),
1781         ("node.find_node", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
1782         ("node.group_make", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
1783         ("node.group_ungroup", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None),
1784         ("node.group_separate", {"type": 'P', "value": 'PRESS'}, None),
1785         ("node.group_edit", {"type": 'TAB', "value": 'PRESS'},
1786          {"properties": [("exit", False)]}),
1787         ("node.group_edit", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
1788          {"properties": [("exit", True)]}),
1789         ("node.read_viewlayers", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
1790         ("node.render_changed", {"type": 'Z', "value": 'PRESS'}, None),
1791         ("node.clipboard_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
1792         ("node.clipboard_paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
1793         ("node.viewer_border", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
1794         ("node.clear_viewer_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None),
1795         ("node.translate_attach", {"type": 'G', "value": 'PRESS'}, None),
1796         ("node.translate_attach", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
1797         ("node.translate_attach", {"type": params.select_tweak, "value": 'ANY'}, None),
1798         ("transform.translate", {"type": 'G', "value": 'PRESS', "repeat": False}, None),
1799         ("transform.translate", {"type": 'EVT_TWEAK_L', "value": 'ANY'},
1800          {"properties": [("release_confirm", True)]}),
1801         ("transform.translate", {"type": params.select_tweak, "value": 'ANY'},
1802          {"properties": [("release_confirm", True)]}),
1803         ("transform.rotate", {"type": 'R', "value": 'PRESS', "repeat": False}, None),
1804         ("transform.resize", {"type": 'S', "value": 'PRESS', "repeat": False}, None),
1805         ("node.move_detach_links", {"type": 'D', "value": 'PRESS', "alt": True}, None),
1806         ("node.move_detach_links_release", {"type": params.action_tweak, "value": 'ANY', "alt": True}, None),
1807         ("node.move_detach_links", {"type": params.select_tweak, "value": 'ANY', "alt": True}, None),
1808         ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True},
1809          {"properties": [("data_path", 'tool_settings.use_snap')]}),
1810         ("wm.context_menu_enum", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
1811          {"properties": [("data_path", 'tool_settings.snap_node_element')]}),
1812         *_template_items_context_menu("NODE_MT_context_menu", params.context_menu_event),
1813     ])
1814
1815     return keymap
1816
1817
1818 def km_info(params):
1819     items = []
1820     keymap = (
1821         "Info",
1822         {"space_type": 'INFO', "region_type": 'WINDOW'},
1823         {"items": items},
1824     )
1825
1826     items.extend([
1827         ("info.select_pick", {"type": 'LEFTMOUSE', "value": 'CLICK'}, None),
1828         ("info.select_pick", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
1829          {"properties": [("extend", True)]}),
1830         ("info.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY'},
1831          {"properties": [("wait_for_input", False)]}),
1832         *_template_items_select_actions(params, "info.select_all"),
1833         ("info.select_box", {"type": 'B', "value": 'PRESS'}, None),
1834         ("info.report_replay", {"type": 'R', "value": 'PRESS'}, None),
1835         ("info.report_delete", {"type": 'X', "value": 'PRESS'}, None),
1836         ("info.report_delete", {"type": 'DEL', "value": 'PRESS'}, None),
1837         ("info.report_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
1838         *_template_items_context_menu("INFO_MT_context_menu", params.context_menu_event),
1839     ])
1840
1841     return keymap
1842
1843
1844 def km_file_browser(params):
1845     items = []
1846     keymap = (
1847         "File Browser",
1848         {"space_type": 'FILE_BROWSER', "region_type": 'WINDOW'},
1849         {"items": items},
1850     )
1851
1852     items.extend([
1853         *_template_space_region_type_toggle(
1854             toolbar_key={"type": 'T', "value": 'PRESS'},
1855         ),
1856         ("screen.region_toggle", {"type": 'N', "value": 'PRESS'},
1857          {"properties": [("region_type", 'TOOL_PROPS')]}),
1858         ("file.parent", {"type": 'UP_ARROW', "value": 'PRESS', "alt": True}, None),
1859         ("file.previous", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True}, None),
1860         ("file.next", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True}, None),
1861         ("file.refresh", {"type": 'R', "value": 'PRESS'}, None),
1862         ("file.parent", {"type": 'P', "value": 'PRESS'}, None),
1863         ("file.previous", {"type": 'BACK_SPACE', "value": 'PRESS'}, None),
1864         ("file.next", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None),
1865         ("wm.context_toggle", {"type": 'H', "value": 'PRESS'},
1866          {"properties": [("data_path", 'space_data.params.show_hidden')]}),
1867         ("file.directory_new", {"type": 'I', "value": 'PRESS'},
1868          {"properties": [("confirm", False)]}),
1869         ("file.rename", {"type": 'F2', "value": 'PRESS'}, None),
1870         ("file.delete", {"type": 'X', "value": 'PRESS'}, None),
1871         ("file.delete", {"type": 'DEL', "value": 'PRESS'}, None),
1872         ("file.smoothscroll", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
1873         ("file.bookmark_add", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
1874         ("file.start_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
1875         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
1876          {"properties": [("increment", 1)]}),
1877         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
1878          {"properties": [("increment", 10)]}),
1879         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
1880          {"properties": [("increment", 100)]}),
1881         ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
1882          {"properties": [("increment", -1)]}),
1883         ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
1884          {"properties": [("increment", -10)]}),
1885         ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
1886          {"properties": [("increment", -100)]}),
1887         *_template_items_context_menu("FILEBROWSER_MT_context_menu", params.context_menu_event),
1888     ])
1889
1890     return keymap
1891
1892
1893 def km_file_browser_main(params):
1894     items = []
1895     keymap = (
1896         "File Browser Main",
1897         {"space_type": 'FILE_BROWSER', "region_type": 'WINDOW'},
1898         {"items": items},
1899     )
1900
1901     items.extend([
1902         ("file.execute", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'},
1903          {"properties": [("need_active", True)]}),
1904         ("file.refresh", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
1905         ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK'},
1906          {"properties": [("open", False), ("deselect_all", not params.legacy)]}),
1907         ("file.select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
1908         ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True},
1909          {"properties": [("extend", True)]}),
1910         ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
1911          {"properties": [("extend", True), ("fill", True), ("open", False)]}),
1912         ("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS'},
1913          {"properties": [("direction", 'UP')]}),
1914         ("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
1915          {"properties": [("direction", 'UP'), ("extend", True)]}),
1916         ("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
1917          {"properties": [("direction", 'UP'), ("extend", True), ("fill", True)]}),
1918         ("file.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS'},
1919          {"properties": [("direction", 'DOWN')]}),
1920         ("file.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
1921          {"properties": [("direction", 'DOWN'), ("extend", True)]}),
1922         ("file.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
1923          {"properties": [("direction", 'DOWN'), ("extend", True), ("fill", True)]}),
1924         ("file.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS'},
1925          {"properties": [("direction", 'LEFT')]}),
1926         ("file.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
1927          {"properties": [("direction", 'LEFT'), ("extend", True)]}),
1928         ("file.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
1929          {"properties": [("direction", 'LEFT'), ("extend", True), ("fill", True)]}),
1930         ("file.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS'},
1931          {"properties": [("direction", 'RIGHT')]}),
1932         ("file.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
1933          {"properties": [("direction", 'RIGHT'), ("extend", True)]}),
1934         ("file.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
1935          {"properties": [("direction", 'RIGHT'), ("extend", True), ("fill", True)]}),
1936         ("file.previous", {"type": 'BUTTON4MOUSE', "value": 'CLICK'}, None),
1937         ("file.next", {"type": 'BUTTON5MOUSE', "value": 'CLICK'}, None),
1938         *_template_items_select_actions(params, "file.select_all"),
1939         ("file.select_box", {"type": 'B', "value": 'PRESS'}, None),
1940         ("file.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
1941         ("file.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True},
1942          {"properties": [("mode", 'ADD')]}),
1943         ("file.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "ctrl": True},
1944          {"properties": [("mode", 'SUB')]}),
1945         ("file.highlight", {"type": 'MOUSEMOVE', "value": 'ANY', "any": True}, None),
1946         ("file.sort_column_ui_context", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
1947     ])
1948
1949     return keymap
1950
1951
1952 def km_file_browser_buttons(_params):
1953     items = []
1954     keymap = (
1955         "File Browser Buttons",
1956         {"space_type": 'FILE_BROWSER', "region_type": 'WINDOW'},
1957         {"items": items},
1958     )
1959
1960     items.extend([
1961         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
1962          {"properties": [("increment", 1)]}),
1963         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
1964          {"properties": [("increment", 10)]}),
1965         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
1966          {"properties": [("increment", 100)]}),
1967         ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
1968          {"properties": [("increment", -1)]}),
1969         ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
1970          {"properties": [("increment", -10)]}),
1971         ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
1972          {"properties": [("increment", -100)]}),
1973     ])
1974
1975     return keymap
1976
1977
1978 def km_dopesheet_generic(_params):
1979     items = []
1980     keymap = (
1981         "Dopesheet Generic",
1982         {"space_type": 'DOPESHEET_EDITOR', "region_type": 'WINDOW'},
1983         {"items": items},
1984     )
1985
1986     items.extend([
1987         *_template_space_region_type_toggle(
1988             sidebar_key={"type": 'N', "value": 'PRESS'},
1989         ),
1990         ("wm.context_set_enum", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
1991          {"properties": [("data_path", 'area.type'), ("value", 'GRAPH_EDITOR')]}),
1992         ("action.extrapolation_type", {"type": 'E', "value": 'PRESS', "shift": True}, None),
1993     ])
1994
1995     return keymap
1996
1997
1998 def km_dopesheet(params):
1999     items = []
2000     keymap = (
2001         "Dopesheet",
2002         {"space_type": 'DOPESHEET_EDITOR', "region_type": 'WINDOW'},
2003         {"items": items},
2004     )
2005
2006     items.extend([
2007         ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS'},
2008          {"properties": [
2009              ("extend", False), ("deselect_all", not params.legacy),
2010              ("column", False), ("channel", False)]}),
2011         ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
2012          {"properties": [("extend", False), ("column", True), ("channel", False)]}),
2013         ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
2014          {"properties": [("extend", True), ("column", False), ("channel", False)]}),
2015         ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
2016          {"properties": [("extend", True), ("column", True), ("channel", False)]}),
2017         ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True, "alt": True},
2018          {"properties": [("extend", False), ("column", False), ("channel", True)]}),
2019         ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
2020          {"properties": [("extend", True), ("column", False), ("channel", True)]}),
2021         ("action.select_leftright",
2022          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True},
2023          {"properties": [("mode", 'CHECK'), ("extend", False)]}),
2024         ("action.select_leftright",
2025          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True, "shift": True},
2026          {"properties": [("mode", 'CHECK'), ("extend", True)]}),
2027         ("action.select_leftright", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
2028          {"properties": [("mode", 'LEFT'), ("extend", False)]}),
2029         ("action.select_leftright", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
2030          {"properties": [("mode", 'RIGHT'), ("extend", False)]}),
2031         *_template_items_select_actions(params, "action.select_all"),
2032         ("action.select_box", {"type": 'B', "value": 'PRESS'},
2033          {"properties": [("axis_range", False)]}),
2034         ("action.select_box", {"type": 'B', "value": 'PRESS', "alt": True},
2035          {"properties": [("axis_range", True)]}),
2036         ("action.select_box", {"type": params.select_tweak, "value": 'ANY'},
2037          {"properties": [("tweak", True), ("mode", 'SET')]}),
2038         ("action.select_box", {"type": params.select_tweak, "value": 'ANY', "shift": True},
2039          {"properties": [("tweak", True), ("mode", 'ADD')]}),
2040         ("action.select_box", {"type": params.select_tweak, "value": 'ANY', "ctrl": True},
2041          {"properties": [("tweak", True), ("mode", 'SUB')]}),
2042         ("action.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True},
2043          {"properties": [("mode", 'ADD')]}),
2044         ("action.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True},
2045          {"properties": [("mode", 'SUB')]}),
2046         ("action.select_circle", {"type": 'C', "value": 'PRESS'}, None),
2047         ("action.select_column", {"type": 'K', "value": 'PRESS'},
2048          {"properties": [("mode", 'KEYS')]}),
2049         ("action.select_column", {"type": 'K', "value": 'PRESS', "ctrl": True},
2050          {"properties": [("mode", 'CFRA')]}),
2051         ("action.select_column", {"type": 'K', "value": 'PRESS', "shift": True},
2052          {"properties": [("mode", 'MARKERS_COLUMN')]}),
2053         ("action.select_column", {"type": 'K', "value": 'PRESS', "alt": True},
2054          {"properties": [("mode", 'MARKERS_BETWEEN')]}),
2055         ("action.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
2056         ("action.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
2057         ("action.select_linked", {"type": 'L', "value": 'PRESS'}, None),
2058         ("action.frame_jump", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
2059         op_menu_pie("DOPESHEET_MT_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
2060         ("action.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
2061         ("action.handle_type", {"type": 'V', "value": 'PRESS'}, None),
2062         ("action.interpolation_type", {"type": 'T', "value": 'PRESS'}, None),
2063         ("action.extrapolation_type", {"type": 'E', "value": 'PRESS', "shift": True}, None),
2064         ("action.easing_type", {"type": 'E', "value": 'PRESS', "ctrl": True}, None),
2065         ("action.keyframe_type", {"type": 'R', "value": 'PRESS'}, None),
2066         ("action.sample", {"type": 'O', "value": 'PRESS', "shift": True, "alt": True}, None),
2067         op_menu("DOPESHEET_MT_delete", {"type": 'X', "value": 'PRESS'}),
2068         op_menu("DOPESHEET_MT_delete", {"type": 'DEL', "value": 'PRESS'}),
2069         ("action.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
2070         ("action.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
2071         ("action.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
2072         ("action.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
2073         ("action.paste", {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True},
2074          {"properties": [("flipped", True)]}),
2075         ("action.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None),
2076         ("action.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
2077         ("action.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
2078         ("action.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
2079         ("action.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
2080         ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
2081         ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
2082         ("transform.transform", {"type": 'G', "value": 'PRESS', "repeat": False},
2083          {"properties": [("mode", 'TIME_TRANSLATE')]}),
2084         ("transform.transform", {"type": params.select_tweak, "value": 'ANY'},
2085          {"properties": [("mode", 'TIME_TRANSLATE')]}),
2086         ("transform.transform", {"type": 'E', "value": 'PRESS', "repeat": False},
2087          {"properties": [("mode", 'TIME_EXTEND')]}),
2088         ("transform.transform", {"type": 'S', "value": 'PRESS', "repeat": False},
2089          {"properties": [("mode", 'TIME_SCALE')]}),
2090         ("transform.transform", {"type": 'T', "value": 'PRESS', "shift": True, "repeat": False},
2091          {"properties": [("mode", 'TIME_SLIDE')]}),
2092         ("wm.context_toggle", {"type": 'O', "value": 'PRESS'},
2093          {"properties": [("data_path", 'tool_settings.use_proportional_action')]}),
2094         op_menu_pie("VIEW3D_MT_proportional_editing_falloff_pie", {"type": 'O', "value": 'PRESS', "shift": True}),
2095         ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
2096         ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
2097         ("marker.camera_bind", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
2098         *_template_items_context_menu("DOPESHEET_MT_context_menu", params.context_menu_event),
2099         *_template_items_change_frame(params),
2100     ])
2101
2102     return keymap
2103
2104
2105 def km_nla_generic(_params):
2106     items = []
2107     keymap = (
2108         "NLA Generic",
2109         {"space_type": 'NLA_EDITOR', "region_type": 'WINDOW'},
2110         {"items": items},
2111     )
2112
2113     items.extend([
2114         *_template_space_region_type_toggle(
2115             sidebar_key={"type": 'N', "value": 'PRESS'},
2116         ),
2117         ("nla.tweakmode_enter", {"type": 'TAB', "value": 'PRESS'}, None),
2118         ("nla.tweakmode_exit", {"type": 'TAB', "value": 'PRESS'}, None),
2119         ("nla.tweakmode_enter", {"type": 'TAB', "value": 'PRESS', "shift": True},
2120          {"properties": [("isolate_action", True)]}),
2121         ("nla.tweakmode_exit", {"type": 'TAB', "value": 'PRESS', "shift": True},
2122          {"properties": [("isolate_action", True)]}),
2123         ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
2124     ])
2125
2126     return keymap
2127
2128
2129 def km_nla_channels(params):
2130     items = []
2131     keymap = (
2132         "NLA Channels",
2133         {"space_type": 'NLA_EDITOR', "region_type": 'WINDOW'},
2134         {"items": items},
2135     )
2136
2137     items.extend([
2138         ("nla.channels_click", {"type": 'LEFTMOUSE', "value": 'PRESS'},
2139          {"properties": [("extend", False)]}),
2140         ("nla.channels_click", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
2141          {"properties": [("extend", True)]}),
2142         ("nla.tracks_add", {"type": 'A', "value": 'PRESS', "shift": True},
2143          {"properties": [("above_selected", False)]}),
2144         ("nla.tracks_add", {"type": 'A', "value": 'PRESS', "shift": True, "ctrl": True},
2145          {"properties": [("above_selected", True)]}),
2146         ("nla.tracks_delete", {"type": 'X', "value": 'PRESS'}, None),
2147         ("nla.tracks_delete", {"type": 'DEL', "value": 'PRESS'}, None),
2148         *_template_items_context_menu("NLA_MT_channel_context_menu", params.context_menu_event),
2149     ])
2150
2151     return keymap
2152
2153
2154 def km_nla_editor(params):
2155     items = []
2156     keymap = (
2157         "NLA Editor",
2158         {"space_type": 'NLA_EDITOR', "region_type": 'WINDOW'},
2159         {"items": items},
2160     )
2161
2162     items.extend([
2163         ("nla.click_select", {"type": params.select_mouse, "value": 'PRESS'},
2164          {"properties": [("extend", False), ("deselect_all", not params.legacy)]}),
2165         ("nla.click_select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
2166          {"properties": [("extend", True)]}),
2167         ("nla.select_leftright",
2168          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True},
2169          {"properties": [("mode", 'CHECK'), ("extend", False)]}),
2170         ("nla.select_leftright",
2171          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True, "shift": True},
2172          {"properties": [("mode", 'CHECK'), ("extend", True)]}),
2173         ("nla.select_leftright", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
2174          {"properties": [("mode", 'LEFT'), ("extend", False)]}),
2175         ("nla.select_leftright", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
2176          {"properties": [("mode", 'RIGHT'), ("extend", False)]}),
2177         *_template_items_select_actions(params, "nla.select_all"),
2178         ("nla.select_box", {"type": 'B', "value": 'PRESS'},
2179          {"properties": [("axis_range", False)]}),
2180         ("nla.select_box", {"type": 'B', "value": 'PRESS', "alt": True},
2181          {"properties": [("axis_range", True)]}),
2182         ("nla.select_box", {"type": params.select_tweak, "value": 'ANY'},
2183          {"properties": [("tweak", True), ("mode", 'SET')]}),
2184         ("nla.select_box", {"type": params.select_tweak, "value": 'ANY', "shift": True},
2185          {"properties": [("tweak", True), ("mode", 'ADD')]}),
2186         ("nla.select_box", {"type": params.select_tweak, "value": 'ANY', "ctrl": True},
2187          {"properties": [("tweak", True), ("mode", 'SUB')]}),
2188         ("nla.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None),
2189         ("nla.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
2190         ("nla.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
2191         ("nla.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
2192         ("nla.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
2193         ("nla.actionclip_add", {"type": 'A', "value": 'PRESS', "shift": True}, None),
2194         ("nla.transition_add", {"type": 'T', "value": 'PRESS', "shift": True}, None),
2195         ("nla.soundclip_add", {"type": 'K', "value": 'PRESS', "shift": True}, None),
2196         ("nla.meta_add", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
2197         ("nla.meta_remove", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None),
2198         ("nla.duplicate", {"type": 'D', "value": 'PRESS', "shift": True},
2199          {"properties": [("linked", False)]}),
2200         ("nla.duplicate", {"type": 'D', "value": 'PRESS', "alt": True},
2201          {"properties": [("linked", True)]}),
2202         ("nla.make_single_user", {"type": 'U', "value": 'PRESS'}, None),
2203         ("nla.delete", {"type": 'X', "value": 'PRESS'}, None),
2204         ("nla.delete", {"type": 'DEL', "value": 'PRESS'}, None),
2205         ("nla.split", {"type": 'Y', "value": 'PRESS'}, None),
2206         ("nla.mute_toggle", {"type": 'H', "value": 'PRESS'}, None),
2207         ("nla.swap", {"type": 'F', "value": 'PRESS', "alt": True}, None),
2208         ("nla.move_up", {"type": 'PAGE_UP', "value": 'PRESS'}, None),
2209         ("nla.move_down", {"type": 'PAGE_DOWN', "value": 'PRESS'}, None),
2210         ("nla.apply_scale", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
2211         ("nla.clear_scale", {"type": 'S', "value": 'PRESS', "alt": True}, None),
2212         op_menu_pie("NLA_MT_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
2213         ("nla.fmodifier_add", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, None),
2214         ("transform.transform", {"type": 'G', "value": 'PRESS', "repeat": False},
2215          {"properties": [("mode", 'TRANSLATION')]}),
2216         ("transform.transform", {"type": params.select_tweak, "value": 'ANY'},
2217          {"properties": [("mode", 'TRANSLATION')]}),
2218         ("transform.transform", {"type": 'E', "value": 'PRESS', "repeat": False},
2219          {"properties": [("mode", 'TIME_EXTEND')]}),
2220         ("transform.transform", {"type": 'S', "value": 'PRESS', "repeat": False},
2221          {"properties": [("mode", 'TIME_SCALE')]}),
2222         ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
2223         ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
2224         *_template_items_context_menu("NLA_MT_context_menu", params.context_menu_event),
2225         *_template_items_change_frame(params),
2226     ])
2227
2228     return keymap
2229
2230
2231 def km_text_generic(_params):
2232     items = []
2233     keymap = (
2234         "Text Generic",
2235         {"space_type": 'TEXT_EDITOR', "region_type": 'WINDOW'},
2236         {"items": items},
2237     )
2238
2239     items.extend([
2240         *_template_space_region_type_toggle(
2241             sidebar_key={"type": 'T', "value": 'PRESS', "ctrl": True},
2242         ),
2243         ("text.start_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
2244         ("text.jump", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
2245         ("text.find_set_selected", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
2246         ("text.replace", {"type": 'H', "value": 'PRESS', "ctrl": True}, None),
2247     ])
2248
2249     return keymap
2250
2251
2252 def km_text(params):
2253     items = []
2254     keymap = (
2255         "Text",
2256         {"space_type": 'TEXT_EDITOR', "region_type": 'WINDOW'},
2257         {"items": items},
2258     )
2259
2260     items.extend([
2261         ("wm.context_cycle_int", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True},
2262          {"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
2263         ("wm.context_cycle_int", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
2264          {"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
2265         ("wm.context_cycle_int", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
2266          {"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
2267         ("wm.context_cycle_int", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
2268          {"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
2269     ])
2270
2271     if not params.legacy:
2272         items.extend([
2273             ("text.new", {"type": 'N', "value": 'PRESS', "alt": True}, None),
2274         ])
2275     else:
2276         items.extend([
2277             ("text.new", {"type": 'N', "value": 'PRESS', "ctrl": True}, None),
2278
2279             ("text.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
2280              {"properties": [("type", 'PREVIOUS_WORD')]}),
2281             ("text.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
2282              {"properties": [("type", 'NEXT_WORD')]}),
2283         ])
2284
2285     items.extend([
2286         ("text.open", {"type": 'O', "value": 'PRESS', "alt": True}, None),
2287         ("text.reload", {"type": 'R', "value": 'PRESS', "alt": True}, None),
2288         ("text.save", {"type": 'S', "value": 'PRESS', "alt": True}, None),
2289         ("text.save_as", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
2290         ("text.run_script", {"type": 'P', "value": 'PRESS', "alt": True}, None),
2291         ("text.cut", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
2292         ("text.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
2293         ("text.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
2294         ("text.cut", {"type": 'DEL', "value": 'PRESS', "shift": True}, None),
2295         ("text.copy", {"type": 'INSERT', "value": 'PRESS', "ctrl": True}, None),
2296         ("text.paste", {"type": 'INSERT', "value": 'PRESS', "shift": True}, None),
2297         ("text.duplicate_line", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
2298         ("text.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
2299         ("text.select_line", {"type": 'A', "value": 'PRESS', "shift": True, "ctrl": True}, None),
2300         ("text.select_word", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
2301         ("text.move_lines", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
2302          {"properties": [("direction", 'UP')]}),
2303         ("text.move_lines", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
2304          {"properties": [("direction", 'DOWN')]}),
2305         ("text.indent_or_autocomplete", {"type": 'TAB', "value": 'PRESS'}, None),
2306         ("text.unindent", {"type": 'TAB', "value": 'PRESS', "shift": True}, None),
2307         ("text.comment_toggle", {"type": 'SLASH', "value": 'PRESS', "ctrl": True}, None),
2308         ("text.move", {"type": 'HOME', "value": 'PRESS'},
2309          {"properties": [("type", 'LINE_BEGIN')]}),
2310         ("text.move", {"type": 'END', "value": 'PRESS'},
2311          {"properties": [("type", 'LINE_END')]}),
2312         ("text.move", {"type": 'E', "value": 'PRESS', "ctrl": True},
2313          {"properties": [("type", 'LINE_END')]}),
2314         ("text.move", {"type": 'E', "value": 'PRESS', "shift": True, "ctrl": True},
2315          {"properties": [("type", 'LINE_END')]}),
2316         ("text.move", {"type": 'LEFT_ARROW', "value": 'PRESS'},
2317          {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
2318         ("text.move", {"type": 'RIGHT_ARROW', "value": 'PRESS'},
2319          {"properties": [("type", 'NEXT_CHARACTER')]}),
2320         ("text.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
2321          {"properties": [("type", 'PREVIOUS_WORD')]}),
2322         ("text.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
2323          {"properties": [("type", 'NEXT_WORD')]}),
2324         ("text.move", {"type": 'UP_ARROW', "value": 'PRESS'},
2325          {"properties": [("type", 'PREVIOUS_LINE')]}),
2326         ("text.move", {"type": 'DOWN_ARROW', "value": 'PRESS'},
2327          {"properties": [("type", 'NEXT_LINE')]}),
2328         ("text.move", {"type": 'PAGE_UP', "value": 'PRESS'},
2329          {"properties": [("type", 'PREVIOUS_PAGE')]}),
2330         ("text.move", {"type": 'PAGE_DOWN', "value": 'PRESS'},
2331          {"properties": [("type", 'NEXT_PAGE')]}),
2332         ("text.move", {"type": 'HOME', "value": 'PRESS', "ctrl": True},
2333          {"properties": [("type", 'FILE_TOP')]}),
2334         ("text.move", {"type": 'END', "value": 'PRESS', "ctrl": True},
2335          {"properties": [("type", 'FILE_BOTTOM')]}),
2336         ("text.move_select", {"type": 'HOME', "value": 'PRESS', "shift": True},
2337          {"properties": [("type", 'LINE_BEGIN')]}),
2338         ("text.move_select", {"type": 'END', "value": 'PRESS', "shift": True},
2339          {"properties": [("type", 'LINE_END')]}),
2340         ("text.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
2341          {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
2342         ("text.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
2343          {"properties": [("type", 'NEXT_CHARACTER')]}),
2344         ("text.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
2345          {"properties": [("type", 'PREVIOUS_WORD')]}),
2346         ("text.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
2347          {"properties": [("type", 'NEXT_WORD')]}),
2348         ("text.move_select", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
2349          {"properties": [("type", 'PREVIOUS_LINE')]}),
2350         ("text.move_select", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
2351          {"properties": [("type", 'NEXT_LINE')]}),
2352         ("text.move_select", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True},
2353          {"properties": [("type", 'PREVIOUS_PAGE')]}),
2354         ("text.move_select", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True},
2355          {"properties": [("type", 'NEXT_PAGE')]}),
2356         ("text.move_select", {"type": 'HOME', "value": 'PRESS', "shift": True, "ctrl": True},
2357          {"properties": [("type", 'FILE_TOP')]}),
2358         ("text.move_select", {"type": 'END', "value": 'PRESS', "shift": True, "ctrl": True},
2359          {"properties": [("type", 'FILE_BOTTOM')]}),
2360         ("text.delete", {"type": 'DEL', "value": 'PRESS'},
2361          {"properties": [("type", 'NEXT_CHARACTER')]}),
2362         ("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS'},
2363          {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
2364         ("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
2365          {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
2366         ("text.delete", {"type": 'DEL', "value": 'PRESS', "ctrl": True},
2367          {"properties": [("type", 'NEXT_WORD')]}),
2368         ("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True},
2369          {"properties": [("type", 'PREVIOUS_WORD')]}),
2370         ("text.overwrite_toggle", {"type": 'INSERT', "value": 'PRESS'}, None),
2371         ("text.scroll_bar", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
2372         ("text.scroll_bar", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
2373         ("text.scroll", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
2374         ("text.scroll", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
2375         ("text.selection_set", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
2376         ("text.cursor_set", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
2377         ("text.selection_set", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, None),
2378         ("text.scroll", {"type": 'WHEELUPMOUSE', "value": 'PRESS'},
2379          {"properties": [("lines", -1)]}),
2380         ("text.scroll", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'},
2381          {"properties": [("lines", 1)]}),
2382         ("text.line_break", {"type": 'RET', "value": 'PRESS'}, None),
2383         ("text.line_break", {"type": 'NUMPAD_ENTER', "value": 'PRESS'}, None),
2384         ("text.line_number", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
2385         op_menu("TEXT_MT_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}),
2386         ("text.insert", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
2387     ])
2388
2389     return keymap
2390
2391
2392 def km_sequencercommon(_params):
2393     items = []
2394     keymap = (
2395         "SequencerCommon",
2396         {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
2397         {"items": items},
2398     )
2399
2400     items.extend([
2401         *_template_space_region_type_toggle(
2402             toolbar_key={"type": 'T', "value": 'PRESS'},
2403             sidebar_key={"type": 'N', "value": 'PRESS'},
2404         ),
2405         ("wm.context_toggle", {"type": 'O', "value": 'PRESS', "shift": True},
2406          {"properties": [("data_path", 'scene.sequence_editor.show_overlay')]}),
2407         ("wm.context_toggle_enum", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
2408          {"properties": [("data_path", 'space_data.view_type'), ("value_1", 'SEQUENCER'), ("value_2", 'PREVIEW')]}),
2409     ])
2410
2411     if _params.select_mouse == 'LEFTMOUSE' and not _params.legacy:
2412         # Quick switch to select tool, since left select can't easily
2413         # select with any tool active.
2414         items.extend([
2415             op_tool_cycle("builtin.select_box", {"type": 'W', "value": 'PRESS'}),
2416         ])
2417
2418     return keymap
2419
2420
2421 def km_sequencer(params):
2422     items = []
2423     keymap = (
2424         "Sequencer",
2425         {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
2426         {"items": items},
2427     )
2428
2429     items.extend([
2430         *_template_items_select_actions(params, "sequencer.select_all"),
2431         ("sequencer.split", {"type": 'K', "value": 'PRESS'},
2432          {"properties": [("type", 'SOFT')]}),
2433         ("sequencer.split", {"type": 'K', "value": 'PRESS', "shift": True},
2434          {"properties": [("type", 'HARD')]}),
2435         ("sequencer.mute", {"type": 'H', "value": 'PRESS'},
2436          {"properties": [("unselected", False)]}),
2437         ("sequencer.mute", {"type": 'H', "value": 'PRESS', "shift": True},
2438          {"properties": [("unselected", True)]}),
2439         ("sequencer.unmute", {"type": 'H', "value": 'PRESS', "alt": True},
2440          {"properties": [("unselected", False)]}),
2441         ("sequencer.unmute", {"type": 'H', "value": 'PRESS', "shift": True, "alt": True},
2442          {"properties": [("unselected", True)]}),
2443         ("sequencer.lock", {"type": 'L', "value": 'PRESS', "shift": True}, None),
2444         ("sequencer.unlock", {"type": 'L', "value": 'PRESS', "shift": True, "alt": True}, None),
2445         ("sequencer.reassign_inputs", {"type": 'R', "value": 'PRESS'}, None),
2446         ("sequencer.reload", {"type": 'R', "value": 'PRESS', "alt": True}, None),
2447         ("sequencer.reload", {"type": 'R', "value": 'PRESS', "shift": True, "alt": True},
2448          {"properties": [("adjust_length", True)]}),
2449         ("sequencer.refresh_all", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
2450         ("sequencer.offset_clear", {"type": 'O', "value": 'PRESS', "alt": True}, None),
2451         ("sequencer.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
2452         ("sequencer.delete", {"type": 'X', "value": 'PRESS'}, None),
2453         ("sequencer.delete", {"type": 'DEL', "value": 'PRESS'}, None),
2454         ("sequencer.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
2455         ("sequencer.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
2456         ("sequencer.images_separate", {"type": 'Y', "value": 'PRESS'}, None),
2457         ("sequencer.meta_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
2458         ("sequencer.meta_make", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
2459         ("sequencer.meta_separate", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None),
2460         ("sequencer.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
2461         ("sequencer.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
2462         ("sequencer.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
2463         ("sequencer.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
2464         ("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS'},
2465          {"properties": [("next", True), ("center", False)]}),
2466         ("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS'},
2467          {"properties": [("next", False), ("center", False)]}),
2468         ("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS', "alt": True},
2469          {"properties": [("next", True), ("center", True)]}),
2470         ("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS', "alt": True},
2471          {"properties": [("next", False), ("center", True)]}),
2472         ("sequencer.swap", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
2473          {"properties": [("side", 'LEFT')]}),
2474         ("sequencer.swap", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
2475          {"properties": [("side", 'RIGHT')]}),
2476         ("sequencer.gap_remove", {"type": 'BACK_SPACE', "value": 'PRESS'},
2477          {"properties": [("all", False)]}),
2478         ("sequencer.gap_remove", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
2479          {"properties": [("all", True)]}),
2480         ("sequencer.gap_insert", {"type": 'EQUAL', "value": 'PRESS', "shift": True}, None),
2481         ("sequencer.snap", {"type": 'S', "value": 'PRESS', "shift": True}, None),
2482         ("sequencer.swap_inputs", {"type": 'S', "value": 'PRESS', "alt": True}, None),
2483         *(
2484             (("sequencer.split_multicam",
2485               {"type": NUMBERS_1[i], "value": 'PRESS'},
2486               {"properties": [("camera", i + 1)]})
2487              for i in range(10)
2488              )
2489         ),
2490         ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS'},
2491          {"properties": [("deselect_all", True)]}),
2492         ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
2493          {"properties": [("extend", True)]}),
2494         ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
2495          {"properties": [("linked_handle", True)]}),
2496         ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
2497          {"properties": [("extend", True), ("linked_handle", True)]}),
2498         ("sequencer.select",
2499          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True},
2500          {"properties": [("side_of_frame", True), ("linked_time", True)]}),
2501         ("sequencer.select",
2502          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True, "shift": True},
2503          {"properties": [("side_of_frame", True), ("linked_time", True), ("extend", True)]}),
2504         ("sequencer.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
2505         ("sequencer.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
2506         ("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS'},
2507          {"properties": [("extend", False)]}),
2508         ("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
2509          {"properties": [("extend", True)]}),
2510         ("sequencer.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
2511         ("sequencer.select_box", {"type": params.select_tweak, "value": 'ANY'},
2512          {"properties": [("tweak", True), ("mode", 'SET')]}),
2513         ("sequencer.select_box", {"type": params.select_tweak, "value": 'ANY', "shift": True},
2514          {"properties": [("tweak", True), ("mode", 'ADD')]}),
2515         ("sequencer.select_box", {"type": params.select_tweak, "value": 'ANY', "ctrl": True},
2516          {"properties": [("tweak", True), ("mode", 'SUB')]}),
2517         ("sequencer.select_box", {"type": 'B', "value": 'PRESS'}, None),
2518         ("sequencer.select_box", {"type": 'B', "value": 'PRESS', "ctrl": True},
2519          {"properties": [("include_handles", True)]}),
2520         ("sequencer.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None),
2521         op_menu("SEQUENCER_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}),
2522         op_menu("SEQUENCER_MT_change", {"type": 'C', "value": 'PRESS'}),
2523         ("sequencer.slip", {"type": 'S', "value": 'PRESS'}, None),
2524         ("wm.context_set_int", {"type": 'O', "value": 'PRESS'},
2525          {"properties": [("data_path", 'scene.sequence_editor.overlay_frame'), ("value", 0)]}),
2526         ("transform.seq_slide", {"type": 'G', "value": 'PRESS', "repeat": False}, None),
2527         ("transform.seq_slide", {"type": params.select_tweak, "value": 'ANY'}, None),
2528         ("transform.transform", {"type": 'E', "value": 'PRESS', "repeat": False},
2529          {"properties": [("mode", 'TIME_EXTEND')]}),
2530         ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
2531         ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
2532         ("sequencer.select_side_of_frame", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
2533          {"properties": [("side", 'LEFT')]}),
2534         ("sequencer.select_side_of_frame", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
2535          {"properties": [("side", 'RIGHT')]}),
2536
2537         *_template_items_context_menu("SEQUENCER_MT_context_menu", params.context_menu_event),
2538     ])
2539
2540     return keymap
2541
2542
2543 def km_sequencerpreview(params):
2544     items = []
2545     keymap = (
2546         "SequencerPreview",
2547         {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
2548         {"items": items},
2549     )
2550
2551     items.extend([
2552         ("sequencer.view_all_preview", {"type": 'HOME', "value": 'PRESS'}, None),
2553         ("sequencer.view_all_preview", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
2554         ("sequencer.view_ghost_border", {"type": 'O', "value": 'PRESS'}, None),
2555         ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True},
2556          {"properties": [("ratio", 8.0)]}),
2557         ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True},
2558          {"properties": [("ratio", 4.0)]}),
2559         ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True},
2560          {"properties": [("ratio", 2.0)]}),
2561         ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_1', "value": 'PRESS'},
2562          {"properties": [("ratio", 1.0)]}),
2563         ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS'},
2564          {"properties": [("ratio", 0.5)]}),
2565         ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS'},
2566          {"properties": [("ratio", 0.25)]}),
2567         ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS'},
2568          {"properties": [("ratio", 0.125)]}),
2569         ("sequencer.sample", {"type": params.action_mouse, "value": 'PRESS'}, None),
2570     ])
2571
2572     return keymap
2573
2574
2575 def km_console(_params):
2576     items = []
2577     keymap = (
2578         "Console",
2579         {"space_type": 'CONSOLE', "region_type": 'WINDOW'},
2580         {"items": items},
2581     )
2582
2583     items.extend([
2584         ("console.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
2585          {"properties": [("type", 'PREVIOUS_WORD')]}),
2586         ("console.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
2587          {"properties": [("type", 'NEXT_WORD')]}),
2588         ("console.move", {"type": 'HOME', "value": 'PRESS'},
2589          {"properties": [("type", 'LINE_BEGIN')]}),
2590         ("console.move", {"type": 'END', "value": 'PRESS'},
2591          {"properties": [("type", 'LINE_END')]}),
2592         ("wm.context_cycle_int", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True},
2593          {"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
2594         ("wm.context_cycle_int", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
2595          {"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
2596         ("wm.context_cycle_int", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
2597          {"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
2598         ("wm.context_cycle_int", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
2599          {"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
2600         ("console.move", {"type": 'LEFT_ARROW', "value": 'PRESS'},
2601          {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
2602         ("console.move", {"type": 'RIGHT_ARROW', "value": 'PRESS'},
2603          {"properties": [("type", 'NEXT_CHARACTER')]}),
2604         ("console.history_cycle", {"type": 'UP_ARROW', "value": 'PRESS'},
2605          {"properties": [("reverse", True)]}),
2606         ("console.history_cycle", {"type": 'DOWN_ARROW', "value": 'PRESS'},
2607          {"properties": [("reverse", False)]}),
2608         ("console.delete", {"type": 'DEL', "value": 'PRESS'},
2609          {"properties": [("type", 'NEXT_CHARACTER')]}),
2610         ("console.delete", {"type": 'BACK_SPACE', "value": 'PRESS'},
2611          {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
2612         ("console.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
2613          {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
2614         ("console.delete", {"type": 'DEL', "value": 'PRESS', "ctrl": True},
2615          {"properties": [("type", 'NEXT_WORD')]}),
2616         ("console.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True},
2617          {"properties": [("type", 'PREVIOUS_WORD')]}),
2618         ("console.clear_line", {"type": 'RET', "value": 'PRESS', "shift": True}, None),
2619         ("console.clear_line", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "shift": True}, None),
2620         ("console.execute", {"type": 'RET', "value": 'PRESS'},
2621          {"properties": [("interactive", True)]}),
2622         ("console.execute", {"type": 'NUMPAD_ENTER', "value": 'PRESS'},
2623          {"properties": [("interactive", True)]}),
2624         ("console.copy_as_script", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True}, None),
2625         ("console.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
2626         ("console.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
2627         ("console.select_set", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
2628         ("console.select_word", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
2629         ("console.insert", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
2630          {"properties": [("text", '\t')]}),
2631         ("console.indent_or_autocomplete", {"type": 'TAB', "value": 'PRESS'}, None),
2632         ("console.unindent", {"type": 'TAB', "value": 'PRESS', "shift": True}, None),
2633         *_template_items_context_menu("CONSOLE_MT_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}),
2634         ("console.insert", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
2635     ])
2636
2637     return keymap
2638
2639
2640 def km_clip(_params):
2641     items = []
2642     keymap = (
2643         "Clip",
2644         {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
2645         {"items": items},
2646     )
2647
2648     items.extend([
2649         *_template_space_region_type_toggle(
2650             toolbar_key={"type": 'T', "value": 'PRESS'},
2651             sidebar_key={"type": 'N', "value": 'PRESS'},
2652         ),
2653         ("clip.open", {"type": 'O', "value": 'PRESS', "alt": True}, None),
2654         ("clip.track_markers", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
2655          {"properties": [("backwards", True), ("sequence", False)]}),
2656         ("clip.track_markers", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
2657          {"properties": [("backwards", False), ("sequence", False)]}),
2658         ("clip.track_markers", {"type": 'T', "value": 'PRESS', "ctrl": True},
2659          {"properties": [("backwards", False), ("sequence", True)]}),
2660         ("clip.track_markers", {"type": 'T', "value": 'PRESS', "shift": True, "ctrl": True},
2661          {"properties": [("backwards", True), ("sequence", True)]}),
2662         ("wm.context_toggle_enum", {"type": 'TAB', "value": 'PRESS'},
2663          {"properties": [("data_path", 'space_data.mode'), ("value_1", 'TRACKING'), ("value_2", 'MASK')]}),
2664         ("clip.prefetch", {"type": 'P', "value": 'PRESS'}, None),
2665         op_menu_pie("CLIP_MT_tracking_pie", {"type": 'E', "value": 'PRESS'}),
2666         op_menu_pie("CLIP_MT_solving_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
2667         op_menu_pie("CLIP_MT_marker_pie", {"type": 'E', "value": 'PRESS', "shift": True}),
2668         op_menu_pie("CLIP_MT_reconstruction_pie", {"type": 'W', "value": 'PRESS', "shift": True}),
2669     ])
2670
2671     return keymap
2672
2673
2674 def km_clip_editor(params):
2675     items = []
2676     keymap = (
2677         "Clip Editor",
2678         {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
2679         {"items": items},
2680     )
2681
2682     items.extend([
2683         ("clip.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
2684         ("clip.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
2685         ("clip.view_pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
2686         ("clip.view_zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
2687         ("clip.view_zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
2688         ("clip.view_zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
2689         ("clip.view_zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None),
2690         ("clip.view_zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None),
2691         ("clip.view_zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
2692         ("clip.view_zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
2693         ("clip.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True},
2694          {"properties": [("ratio", 8.0)]}),
2695         ("clip.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True},
2696          {"properties": [("ratio", 4.0)]}),
2697         ("clip.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True},
2698          {"properties": [("ratio", 2.0)]}),
2699         ("clip.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "shift": True},
2700          {"properties": [("ratio", 8.0)]}),
2701         ("clip.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True},
2702          {"properties": [("ratio", 4.0)]}),
2703         ("clip.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "shift": True},
2704          {"properties": [("ratio", 2.0)]}),
2705         ("clip.view_zoom_ratio", {"type": 'NUMPAD_1', "value": 'PRESS'},
2706          {"properties": [("ratio", 1.0)]}),
2707         ("clip.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS'},
2708          {"properties": [("ratio", 0.5)]}),
2709         ("clip.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS'},
2710          {"properties": [("ratio", 0.25)]}),
2711         ("clip.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS'},
2712          {"properties": [("ratio", 0.125)]}),
2713         ("clip.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
2714         ("clip.view_all", {"type": 'F', "value": 'PRESS'},
2715          {"properties": [("fit_view", True)]}),
2716         ("clip.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
2717         ("clip.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
2718         ("clip.view_ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
2719         ("clip.frame_jump", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
2720          {"properties": [("position", 'PATHSTART')]}),
2721         ("clip.frame_jump", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
2722          {"properties": [("position", 'PATHEND')]}),
2723         ("clip.frame_jump", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "alt": True},
2724          {"properties": [("position", 'FAILEDPREV')]}),
2725         ("clip.frame_jump", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "alt": True},
2726          {"properties": [("position", 'PATHSTART')]}),
2727         ("clip.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
2728         ("clip.select", {"type": params.select_mouse, "value": 'PRESS'},
2729          {"properties": [("extend", False), ("deselect_all", not params.legacy)]}),
2730         ("clip.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
2731          {"properties": [("extend", True)]}),
2732         *_template_items_select_actions(params, "clip.select_all"),
2733         ("clip.select_box", {"type": 'B', "value": 'PRESS'}, None),
2734         ("clip.select_circle", {"type": 'C', "value": 'PRESS'}, None),
2735         op_menu("CLIP_MT_select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}),
2736         ("clip.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True, "alt": True},
2737          {"properties": [("mode", 'ADD')]}),
2738         ("clip.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
2739          {"properties": [("mode", 'SUB')]}),
2740         ("clip.add_marker_slide", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
2741         ("clip.delete_marker", {"type": 'X', "value": 'PRESS', "shift": True}, None),
2742         ("clip.delete_marker", {"type": 'DEL', "value": 'PRESS', "shift": True}, None),
2743         ("clip.slide_marker", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
2744         ("clip.disable_markers", {"type": 'D', "value": 'PRESS', "shift": True},
2745          {"properties": [("action", 'TOGGLE')]}),
2746         ("clip.delete_track", {"type": 'X', "value": 'PRESS'}, None),
2747         ("clip.delete_track", {"type": 'DEL', "value": 'PRESS'}, None),
2748         ("clip.lock_tracks", {"type": 'L', "value": 'PRESS', "ctrl": True},
2749          {"properties": [("action", 'LOCK')]}),
2750         ("clip.lock_tracks", {"type": 'L', "value": 'PRESS', "alt": True},
2751          {"properties": [("action", 'UNLOCK')]}),
2752         ("clip.hide_tracks", {"type": 'H', "value": 'PRESS'},
2753          {"properties": [("unselected", False)]}),
2754         ("clip.hide_tracks", {"type": 'H', "value": 'PRESS', "shift": True},
2755          {"properties": [("unselected", True)]}),
2756         ("clip.hide_tracks_clear", {"type": 'H', "value": 'PRESS', "alt": True}, None),
2757         ("clip.slide_plane_marker", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None),
2758         ("clip.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
2759         ("clip.keyframe_delete", {"type": 'I', "value": 'PRESS', "alt": True}, None),
2760         ("clip.join_tracks", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
2761         ("clip.lock_selection_toggle", {"type": 'L', "value": 'PRESS'}, None),
2762         ("wm.context_toggle", {"type": 'D', "value": 'PRESS', "alt": True},
2763          {"properties": [("data_path", 'space_data.show_disabled')]}),
2764         ("wm.context_toggle", {"type": 'S', "value": 'PRESS', "alt": True},
2765          {"properties": [("data_path", 'space_data.show_marker_search')]}),
2766         ("wm.context_toggle", {"type": 'M', "value": 'PRESS'},
2767          {"properties": [("data_path", 'space_data.use_mute_footage')]}),
2768         ("transform.translate", {"type": 'G', "value": 'PRESS', "repeat": False}, None),
2769         ("transform.translate", {"type": params.select_tweak, "value": 'ANY'}, None),
2770         ("transform.resize", {"type": 'S', "value": 'PRESS', "repeat": False}, None),
2771         ("transform.rotate", {"type": 'R', "value": 'PRESS', "repeat": False}, None),
2772         ("clip.clear_track_path", {"type": 'T', "value": 'PRESS', "alt": True},
2773          {"properties": [("action", 'REMAINED'), ("clear_active", False)]}),
2774         ("clip.clear_track_path", {"type": 'T', "value": 'PRESS', "shift": True},
2775          {"properties": [("action", 'UPTO'), ("clear_active", False)]}),
2776         ("clip.clear_track_path", {"type": 'T', "value": 'PRESS', "shift": True, "alt": True},
2777          {"properties": [("action", 'ALL'), ("clear_active", False)]}),
2778         ("clip.cursor_set", params.cursor_set_event, None),
2779         op_menu_pie("CLIP_MT_pivot_pie", {"type": 'PERIOD', "value": 'PRESS'}),
2780         ("clip.copy_tracks", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
2781         ("clip.paste_tracks", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
2782         *_template_items_context_menu("CLIP_MT_tracking_context_menu", params.context_menu_event),
2783     ])