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