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