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