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