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