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