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