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