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