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