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