Added back rendered animation playback (in a sense), with a
[blender.git] / release / scripts / ui / space_userpref.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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20 import bpy
21
22
23 class USERPREF_HT_header(bpy.types.Header):
24     bl_space_type = 'USER_PREFERENCES'
25
26     def draw(self, context):
27         layout = self.layout
28         layout.template_header(menus=False)
29
30         userpref = context.user_preferences
31
32         layout.operator_context = 'EXEC_AREA'
33         layout.operator("wm.save_homefile", text="Save As Default")
34
35         if userpref.active_section == 'INPUT':
36             layout.operator_context = 'INVOKE_DEFAULT'
37             layout.operator("wm.keyconfig_export", "Export Key Configuration...").path = "keymap.py"
38
39
40 class USERPREF_PT_tabs(bpy.types.Panel):
41     bl_label = ""
42     bl_space_type = 'USER_PREFERENCES'
43     bl_region_type = 'WINDOW'
44     bl_show_header = False
45
46     def draw(self, context):
47         layout = self.layout
48
49         userpref = context.user_preferences
50
51         layout.prop(userpref, "active_section", expand=True)
52
53
54 class USERPREF_PT_interface(bpy.types.Panel):
55     bl_space_type = 'USER_PREFERENCES'
56     bl_label = "Interface"
57     bl_region_type = 'WINDOW'
58     bl_show_header = False
59
60     def poll(self, context):
61         userpref = context.user_preferences
62         return (userpref.active_section == 'INTERFACE')
63
64     def draw(self, context):
65         layout = self.layout
66
67         userpref = context.user_preferences
68         view = userpref.view
69
70         split = layout.split()
71
72         column = split.column()
73         colsplit = column.split(percentage=0.85)
74
75         col = colsplit.column()
76         col.label(text="Display:")
77         col.prop(view, "tooltips")
78         col.prop(view, "display_object_info", text="Object Info")
79         col.prop(view, "use_large_cursors")
80         col.prop(view, "show_view_name", text="View Name")
81         col.prop(view, "show_playback_fps", text="Playback FPS")
82         col.prop(view, "global_scene")
83         col.prop(view, "pin_floating_panels")
84         col.prop(view, "object_origin_size")
85
86         col.separator()
87         col.separator()
88         col.separator()
89
90         col.prop(view, "show_mini_axis", text="Display Mini Axis")
91         sub = col.column()
92         sub.enabled = view.show_mini_axis
93         sub.prop(view, "mini_axis_size", text="Size")
94         sub.prop(view, "mini_axis_brightness", text="Brightness")
95
96         column = split.column()
97         colsplit = column.split(percentage=0.85)
98
99         col = colsplit.column()
100         col.label(text="View Manipulation:")
101         col.prop(view, "auto_depth")
102         col.prop(view, "global_pivot")
103         col.prop(view, "zoom_to_mouse")
104         col.prop(view, "rotate_around_selection")
105
106         col.separator()
107
108         col.prop(view, "auto_perspective")
109         col.prop(view, "smooth_view")
110         col.prop(view, "rotation_angle")
111
112         column = split.column()
113         colsplit = column.split(percentage=0.85)
114         
115         col = colsplit.column()
116         
117         #Toolbox doesn't exist yet
118         #col.label(text="Toolbox:")
119         #col.prop(view, "use_column_layout")
120         #col.label(text="Open Toolbox Delay:")
121         #col.prop(view, "open_left_mouse_delay", text="Hold LMB")
122         #col.prop(view, "open_right_mouse_delay", text="Hold RMB")
123
124         #Manipulator
125         col.prop(view, "use_manipulator")
126         sub = col.column()
127         sub.enabled = view.use_manipulator
128         sub.prop(view, "manipulator_size", text="Size")
129         sub.prop(view, "manipulator_handle_size", text="Handle Size")
130         sub.prop(view, "manipulator_hotspot", text="Hotspot")
131
132         col.separator()
133         col.separator()
134         col.separator()
135
136         col.label(text="Menus:")
137         col.prop(view, "open_mouse_over")
138         col.label(text="Menu Open Delay:")
139         col.prop(view, "open_toplevel_delay", text="Top Level")
140         col.prop(view, "open_sublevel_delay", text="Sub Level")
141
142
143 class USERPREF_PT_edit(bpy.types.Panel):
144     bl_space_type = 'USER_PREFERENCES'
145     bl_label = "Edit"
146     bl_region_type = 'WINDOW'
147     bl_show_header = False
148
149     def poll(self, context):
150         userpref = context.user_preferences
151         return (userpref.active_section == 'EDITING')
152
153     def draw(self, context):
154         layout = self.layout
155
156         userpref = context.user_preferences
157         edit = userpref.edit
158
159         split = layout.split()
160
161         column = split.column()
162         colsplit = column.split(percentage=0.85)
163
164         col = colsplit.column()
165         col.label(text="Link Materials To:")
166         col.row().prop(edit, "material_link", expand=True)
167
168         col.separator()
169         col.separator()
170         col.separator()
171
172         col.label(text="New Objects:")
173         col.prop(edit, "enter_edit_mode")
174         col.label(text="Align To:")
175         col.row().prop(edit, "object_align", expand=True)
176         
177         col.separator()
178         col.separator()
179         col.separator()
180
181         col.label(text="Undo:")
182         col.prop(edit, "global_undo")
183         col.prop(edit, "undo_steps", text="Steps")
184         col.prop(edit, "undo_memory_limit", text="Memory Limit")
185
186         column = split.column()
187         colsplit = column.split(percentage=0.85)
188
189         col = colsplit.column()
190         col.label(text="Snap:")
191         col.prop(edit, "snap_translate", text="Translate")
192         col.prop(edit, "snap_rotate", text="Rotate")
193         col.prop(edit, "snap_scale", text="Scale")
194         col.separator()
195         col.separator()
196         col.separator()
197         col.label(text="Grease Pencil:")
198         col.prop(edit, "grease_pencil_manhattan_distance", text="Manhattan Distance")
199         col.prop(edit, "grease_pencil_euclidean_distance", text="Euclidean Distance")
200         #col.prop(edit, "grease_pencil_simplify_stroke", text="Simplify Stroke")
201         col.prop(edit, "grease_pencil_eraser_radius", text="Eraser Radius")
202         col.prop(edit, "grease_pencil_smooth_stroke", text="Smooth Stroke")
203
204         column = split.column()
205         colsplit = column.split(percentage=0.85)
206
207         col = colsplit.column()
208         col.label(text="Keyframing:")
209         col.prop(edit, "use_visual_keying")
210         col.prop(edit, "keyframe_insert_needed", text="Only Insert Needed")
211
212         col.separator()
213
214         col.label(text="New F-Curve Defaults:")
215         col.prop(edit, "new_interpolation_type", text="Interpolation")
216
217         col.separator()
218
219         col.prop(edit, "auto_keying_enable", text="Auto Keyframing:")
220
221         sub = col.column()
222
223         sub.active = edit.auto_keying_enable
224         sub.prop(edit, "auto_keyframe_insert_keyingset", text="Only Insert for Keying Set")
225         sub.prop(edit, "auto_keyframe_insert_available", text="Only Insert Available")
226
227         col.separator()
228         col.separator()
229         col.separator()
230
231         col.label(text="Transform:")
232         col.prop(edit, "drag_immediately")
233
234         col.separator()
235         col.separator()
236         col.separator()
237
238         column = split.column()
239         colsplit = column.split(percentage=0.85)
240
241         col = colsplit.column()
242         col.label(text="Duplicate Data:")
243         col.prop(edit, "duplicate_mesh", text="Mesh")
244         col.prop(edit, "duplicate_surface", text="Surface")
245         col.prop(edit, "duplicate_curve", text="Curve")
246         col.prop(edit, "duplicate_text", text="Text")
247         col.prop(edit, "duplicate_metaball", text="Metaball")
248         col.prop(edit, "duplicate_armature", text="Armature")
249         col.prop(edit, "duplicate_lamp", text="Lamp")
250         col.prop(edit, "duplicate_material", text="Material")
251         col.prop(edit, "duplicate_texture", text="Texture")
252         col.prop(edit, "duplicate_fcurve", text="F-Curve")
253         col.prop(edit, "duplicate_action", text="Action")
254         col.prop(edit, "duplicate_particle", text="Particle")
255
256
257 class USERPREF_PT_system(bpy.types.Panel):
258     bl_space_type = 'USER_PREFERENCES'
259     bl_label = "System"
260     bl_region_type = 'WINDOW'
261     bl_show_header = False
262
263     def poll(self, context):
264         userpref = context.user_preferences
265         return (userpref.active_section == 'SYSTEM')
266
267     def draw(self, context):
268         layout = self.layout
269
270         userpref = context.user_preferences
271         system = userpref.system
272         lamp0 = system.solid_lights[0]
273         lamp1 = system.solid_lights[1]
274         lamp2 = system.solid_lights[2]
275
276         split = layout.split()
277
278         column = split.column()
279         colsplit = column.split(percentage=0.85)
280
281         col = colsplit.column()
282         col.label(text="General:")
283         col.prop(system, "dpi")
284         col.prop(system, "frame_server_port")
285         col.prop(system, "scrollback", text="Console Scrollback")
286         col.prop(system, "auto_run_python_scripts")
287
288         col.separator()
289         col.separator()
290         col.separator()
291
292         col.label(text="Sound:")
293         col.row().prop(system, "audio_device", expand=True)
294         sub = col.column()
295         sub.active = system.audio_device != 'NONE'
296         #sub.prop(system, "enable_all_codecs")
297         sub.prop(system, "game_sound")
298         sub.prop(system, "audio_channels", text="Channels")
299         sub.prop(system, "audio_mixing_buffer", text="Mixing Buffer")
300         sub.prop(system, "audio_sample_rate", text="Sample Rate")
301         sub.prop(system, "audio_sample_format", text="Sample Format")
302         
303         col.separator()
304         col.separator()
305         col.separator()
306         
307         col.label(text="Weight Colors:")
308         col.prop(system, "use_weight_color_range", text="Use Custom Range")
309         sub = col.column()
310         sub.active = system.use_weight_color_range
311         sub.template_color_ramp(system, "weight_color_range", expand=True)
312
313         #column = split.column()
314         #colsplit = column.split(percentage=0.85)
315
316         # No translation in 2.5 yet
317         #col.prop(system, "language")
318         #col.label(text="Translate:")
319         #col.prop(system, "translate_tooltips", text="Tooltips")
320         #col.prop(system, "translate_buttons", text="Labels")
321         #col.prop(system, "translate_toolbox", text="Toolbox")
322
323         #col.separator()
324
325         #col.prop(system, "use_textured_fonts")
326
327         column = split.column()
328         colsplit = column.split(percentage=0.85)
329
330         col1 = colsplit.column()
331         col1.label(text="Solid OpenGL lights:")
332         
333         col = col1.split()
334
335         sub = col.column()
336         sub.prop(lamp0, "enabled")
337         subsub = sub.column()
338         subsub.active = lamp0.enabled
339         subsub.prop(lamp0, "diffuse_color")
340         subsub.prop(lamp0, "specular_color")
341         subsub.prop(lamp0, "direction")
342
343         sub = col.column()
344         sub.prop(lamp1, "enabled")
345         subsub = sub.column()
346         subsub.active = lamp1.enabled
347         subsub.prop(lamp1, "diffuse_color")
348         subsub.prop(lamp1, "specular_color")
349         subsub.prop(lamp1, "direction")
350
351         sub = col.column()
352         sub.prop(lamp2, "enabled")
353         subsub = sub.column()
354         subsub.active = lamp2.enabled
355         subsub.prop(lamp2, "diffuse_color")
356         subsub.prop(lamp2, "specular_color")
357         subsub.prop(lamp2, "direction")
358         
359         column = split.column()
360         colsplit = column.split(percentage=0.85)
361
362         col = colsplit.column()
363         col.label(text="OpenGL:")
364         col.prop(system, "clip_alpha", slider=True)
365         col.prop(system, "use_mipmaps")
366         col.prop(system, "use_vbos")
367         col.label(text="Window Draw Method:")
368         col.row().prop(system, "window_draw_method", expand=True)
369         col.label(text="Textures:")
370         col.prop(system, "gl_texture_limit", text="Limit Size")
371         col.prop(system, "texture_time_out", text="Time Out")
372         col.prop(system, "texture_collection_rate", text="Collection Rate")
373
374         col.separator()
375         col.separator()
376         col.separator()
377
378         col.label(text="Sequencer:")
379         col.prop(system, "prefetch_frames")
380         col.prop(system, "memory_cache_limit")
381
382
383 class USERPREF_PT_theme(bpy.types.Panel):
384     bl_space_type = 'USER_PREFERENCES'
385     bl_label = "Themes"
386     bl_region_type = 'WINDOW'
387     bl_show_header = False
388
389     def poll(self, context):
390         userpref = context.user_preferences
391         return (userpref.active_section == 'THEMES')
392
393     def draw(self, context):
394         layout = self.layout
395
396         theme = context.user_preferences.themes[0]
397
398         split = layout.split(percentage=0.33)
399         split.prop(theme, "active_theme", text="")
400
401         layout.separator()
402
403         split = layout.split()
404
405         if theme.active_theme == 'VIEW_3D':
406             v3d = theme.view_3d
407
408             col = split.column()
409             col.prop(v3d, "back")
410             col.prop(v3d, "button")
411             col.prop(v3d, "button_title")
412             col.prop(v3d, "button_text")
413             col.prop(v3d, "header")
414
415             col = split.column()
416             col.prop(v3d, "grid")
417             col.prop(v3d, "wire")
418             col.prop(v3d, "lamp", slider=True)
419             col.prop(v3d, "editmesh_active", slider=True)
420
421             col = split.column()
422             col.prop(v3d, "object_selected")
423             col.prop(v3d, "object_active")
424             col.prop(v3d, "object_grouped")
425             col.prop(v3d, "object_grouped_active")
426             col.prop(v3d, "transform")
427
428             col = split.column()
429             col.prop(v3d, "vertex")
430             col.prop(v3d, "face", slider=True)
431             col.prop(v3d, "normal")
432             col.prop(v3d, "bone_solid")
433             col.prop(v3d, "bone_pose")
434             #col.prop(v3d, "edge") Doesn't seem to work
435
436         elif theme.active_theme == 'USER_INTERFACE':
437             ui = theme.user_interface.wcol_regular
438             layout.label(text="Regular:")
439
440             row = layout.row()
441             sub = row.column()
442             sub.prop(ui, "outline")
443             sub.prop(ui, "item", slider=True)
444             sub = row.column()
445             sub.prop(ui, "inner", slider=True)
446             sub.prop(ui, "inner_sel", slider=True)
447             sub = row.column()
448             sub.prop(ui, "text")
449             sub.prop(ui, "text_sel")
450             sub = row.column()
451             sub.prop(ui, "shaded")
452             subsub = sub.column(align=True)
453             subsub.active = ui.shaded
454             subsub.prop(ui, "shadetop")
455             subsub.prop(ui, "shadedown")
456             
457             layout.separator()
458
459             ui = theme.user_interface.wcol_tool
460             layout.label(text="Tool:")
461
462             row = layout.row()
463             sub = row.column()
464             sub.prop(ui, "outline")
465             sub.prop(ui, "item", slider=True)
466             sub = row.column()
467             sub.prop(ui, "inner", slider=True)
468             sub.prop(ui, "inner_sel", slider=True)
469             sub = row.column()
470             sub.prop(ui, "text")
471             sub.prop(ui, "text_sel")
472             sub = row.column()
473             sub.prop(ui, "shaded")
474             subsub = sub.column(align=True)
475             subsub.active = ui.shaded
476             subsub.prop(ui, "shadetop")
477             subsub.prop(ui, "shadedown")
478
479             ui = theme.user_interface.wcol_radio
480             layout.label(text="Radio Buttons:")
481
482             row = layout.row()
483             sub = row.column()
484             sub.prop(ui, "outline")
485             sub.prop(ui, "item", slider=True)
486             sub = row.column()
487             sub.prop(ui, "inner", slider=True)
488             sub.prop(ui, "inner_sel", slider=True)
489             sub = row.column()
490             sub.prop(ui, "text")
491             sub.prop(ui, "text_sel")
492             sub = row.column()
493             sub.prop(ui, "shaded")
494             subsub = sub.column(align=True)
495             subsub.active = ui.shaded
496             subsub.prop(ui, "shadetop")
497             subsub.prop(ui, "shadedown")
498
499             ui = theme.user_interface.wcol_text
500             layout.label(text="Text:")
501
502             row = layout.row()
503             sub = row.column()
504             sub.prop(ui, "outline")
505             sub.prop(ui, "item", slider=True)
506             sub = row.column()
507             sub.prop(ui, "inner", slider=True)
508             sub.prop(ui, "inner_sel", slider=True)
509             sub = row.column()
510             sub.prop(ui, "text")
511             sub.prop(ui, "text_sel")
512             sub = row.column()
513             sub.prop(ui, "shaded")
514             subsub = sub.column(align=True)
515             subsub.active = ui.shaded
516             subsub.prop(ui, "shadetop")
517             subsub.prop(ui, "shadedown")
518
519             ui = theme.user_interface.wcol_option
520             layout.label(text="Option:")
521
522             row = layout.row()
523             sub = row.column()
524             sub.prop(ui, "outline")
525             sub.prop(ui, "item", slider=True)
526             sub = row.column()
527             sub.prop(ui, "inner", slider=True)
528             sub.prop(ui, "inner_sel", slider=True)
529             sub = row.column()
530             sub.prop(ui, "text")
531             sub.prop(ui, "text_sel")
532             sub = row.column()
533             sub.prop(ui, "shaded")
534             subsub = sub.column(align=True)
535             subsub.active = ui.shaded
536             subsub.prop(ui, "shadetop")
537             subsub.prop(ui, "shadedown")
538
539             ui = theme.user_interface.wcol_toggle
540             layout.label(text="Toggle:")
541
542             row = layout.row()
543             sub = row.column()
544             sub.prop(ui, "outline")
545             sub.prop(ui, "item", slider=True)
546             sub = row.column()
547             sub.prop(ui, "inner", slider=True)
548             sub.prop(ui, "inner_sel", slider=True)
549             sub = row.column()
550             sub.prop(ui, "text")
551             sub.prop(ui, "text_sel")
552             sub = row.column()
553             sub.prop(ui, "shaded")
554             subsub = sub.column(align=True)
555             subsub.active = ui.shaded
556             subsub.prop(ui, "shadetop")
557             subsub.prop(ui, "shadedown")
558
559             ui = theme.user_interface.wcol_num
560             layout.label(text="Number Field:")
561
562             row = layout.row()
563             sub = row.column()
564             sub.prop(ui, "outline")
565             sub.prop(ui, "item", slider=True)
566             sub = row.column()
567             sub.prop(ui, "inner", slider=True)
568             sub.prop(ui, "inner_sel", slider=True)
569             sub = row.column()
570             sub.prop(ui, "text")
571             sub.prop(ui, "text_sel")
572             sub = row.column()
573             sub.prop(ui, "shaded")
574             subsub = sub.column(align=True)
575             subsub.active = ui.shaded
576             subsub.prop(ui, "shadetop")
577             subsub.prop(ui, "shadedown")
578
579             ui = theme.user_interface.wcol_numslider
580             layout.label(text="Value Slider:")
581
582             row = layout.row()
583             sub = row.column()
584             sub.prop(ui, "outline")
585             sub.prop(ui, "item", slider=True)
586             sub = row.column()
587             sub.prop(ui, "inner", slider=True)
588             sub.prop(ui, "inner_sel", slider=True)
589             sub = row.column()
590             sub.prop(ui, "text")
591             sub.prop(ui, "text_sel")
592             sub = row.column()
593             sub.prop(ui, "shaded")
594             subsub = sub.column(align=True)
595             subsub.active = ui.shaded
596             subsub.prop(ui, "shadetop")
597             subsub.prop(ui, "shadedown")
598
599             ui = theme.user_interface.wcol_box
600             layout.label(text="Box:")
601
602             row = layout.row()
603             sub = row.column()
604             sub.prop(ui, "outline")
605             sub.prop(ui, "item", slider=True)
606             sub = row.column()
607             sub.prop(ui, "inner", slider=True)
608             sub.prop(ui, "inner_sel", slider=True)
609             sub = row.column()
610             sub.prop(ui, "text")
611             sub.prop(ui, "text_sel")
612             sub = row.column()
613             sub.prop(ui, "shaded")
614             subsub = sub.column(align=True)
615             subsub.active = ui.shaded
616             subsub.prop(ui, "shadetop")
617             subsub.prop(ui, "shadedown")
618
619             ui = theme.user_interface.wcol_menu
620             layout.label(text="Menu:")
621
622             row = layout.row()
623             sub = row.column()
624             sub.prop(ui, "outline")
625             sub.prop(ui, "item", slider=True)
626             sub = row.column()
627             sub.prop(ui, "inner", slider=True)
628             sub.prop(ui, "inner_sel", slider=True)
629             sub = row.column()
630             sub.prop(ui, "text")
631             sub.prop(ui, "text_sel")
632             sub = row.column()
633             sub.prop(ui, "shaded")
634             subsub = sub.column(align=True)
635             subsub.active = ui.shaded
636             subsub.prop(ui, "shadetop")
637             subsub.prop(ui, "shadedown")
638
639             ui = theme.user_interface.wcol_pulldown
640             layout.label(text="Pulldown:")
641
642             row = layout.row()
643             sub = row.column()
644             sub.prop(ui, "outline")
645             sub.prop(ui, "item", slider=True)
646             sub = row.column()
647             sub.prop(ui, "inner", slider=True)
648             sub.prop(ui, "inner_sel", slider=True)
649             sub = row.column()
650             sub.prop(ui, "text")
651             sub.prop(ui, "text_sel")
652             sub = row.column()
653             sub.prop(ui, "shaded")
654             subsub = sub.column(align=True)
655             subsub.active = ui.shaded
656             subsub.prop(ui, "shadetop")
657             subsub.prop(ui, "shadedown")
658
659             ui = theme.user_interface.wcol_menu_back
660             layout.label(text="Menu Back:")
661
662             row = layout.row()
663             sub = row.column()
664             sub.prop(ui, "outline")
665             sub.prop(ui, "item", slider=True)
666             sub = row.column()
667             sub.prop(ui, "inner", slider=True)
668             sub.prop(ui, "inner_sel", slider=True)
669             sub = row.column()
670             sub.prop(ui, "text")
671             sub.prop(ui, "text_sel")
672             sub = row.column()
673             sub.prop(ui, "shaded")
674             subsub = sub.column(align=True)
675             subsub.active = ui.shaded
676             subsub.prop(ui, "shadetop")
677             subsub.prop(ui, "shadedown")
678
679             ui = theme.user_interface.wcol_menu_item
680             layout.label(text="Menu Item:")
681
682             row = layout.row()
683             sub = row.column()
684             sub.prop(ui, "outline")
685             sub.prop(ui, "item", slider=True)
686             sub = row.column()
687             sub.prop(ui, "inner", slider=True)
688             sub.prop(ui, "inner_sel", slider=True)
689             sub = row.column()
690             sub.prop(ui, "text")
691             sub.prop(ui, "text_sel")
692             sub = row.column()
693             sub.prop(ui, "shaded")
694             subsub = sub.column(align=True)
695             subsub.active = ui.shaded
696             subsub.prop(ui, "shadetop")
697             subsub.prop(ui, "shadedown")
698
699             ui = theme.user_interface.wcol_scroll
700             layout.label(text="Scroll Bar:")
701
702             row = layout.row()
703             sub = row.column()
704             sub.prop(ui, "outline")
705             sub.prop(ui, "item", slider=True)
706             sub = row.column()
707             sub.prop(ui, "inner", slider=True)
708             sub.prop(ui, "inner_sel", slider=True)
709             sub = row.column()
710             sub.prop(ui, "text")
711             sub.prop(ui, "text_sel")
712             sub = row.column()
713             sub.prop(ui, "shaded")
714             subsub = sub.column(align=True)
715             subsub.active = ui.shaded
716             subsub.prop(ui, "shadetop")
717             subsub.prop(ui, "shadedown")
718
719             ui = theme.user_interface.wcol_list_item
720             layout.label(text="List Item:")
721
722             row = layout.row()
723             sub = row.column()
724             sub.prop(ui, "outline")
725             sub.prop(ui, "item", slider=True)
726             sub = row.column()
727             sub.prop(ui, "inner", slider=True)
728             sub.prop(ui, "inner_sel", slider=True)
729             sub = row.column()
730             sub.prop(ui, "text")
731             sub.prop(ui, "text_sel")
732             sub = row.column()
733             sub.prop(ui, "shaded")
734             subsub = sub.column(align=True)
735             subsub.active = ui.shaded
736             subsub.prop(ui, "shadetop")
737             subsub.prop(ui, "shadedown")
738
739             ui = theme.user_interface.wcol_state
740             layout.label(text="State:")
741
742             row = layout.row()
743             sub = row.column()
744             sub.prop(ui, "inner_anim")
745             sub.prop(ui, "inner_anim_sel")
746             sub = row.column()
747             sub.prop(ui, "inner_driven")
748             sub.prop(ui, "inner_driven_sel")
749             sub = row.column()
750             sub.prop(ui, "inner_key")
751             sub.prop(ui, "inner_key_sel")
752             sub = row.column()
753             sub.prop(ui, "blend")
754
755             ui = theme.user_interface
756             layout.separator()
757
758             sub = layout.row()
759             sub.prop(ui, "icon_file")
760
761             layout.separator()
762             layout.separator()
763
764
765         elif theme.active_theme == 'GRAPH_EDITOR':
766             graph = theme.graph_editor
767
768             col = split.column()
769             col.prop(graph, "back")
770             col.prop(graph, "button")
771             col.prop(graph, "button_title")
772             col.prop(graph, "button_text")
773
774             col = split.column()
775             col.prop(graph, "header")
776             col.prop(graph, "grid")
777             col.prop(graph, "list")
778             col.prop(graph, "channel_group")
779
780             col = split.column()
781             col.prop(graph, "active_channels_group")
782             col.prop(graph, "dopesheet_channel")
783             col.prop(graph, "dopesheet_subchannel")
784             col.prop(graph, "vertex")
785
786             col = split.column()
787             col.prop(graph, "current_frame")
788             col.prop(graph, "handle_vertex")
789             col.prop(graph, "handle_vertex_select")
790             col.separator()
791             col.prop(graph, "handle_vertex_size")
792
793         elif theme.active_theme == 'FILE_BROWSER':
794             file_browse = theme.file_browser
795
796             col = split.column()
797             col.prop(file_browse, "back")
798             col.prop(file_browse, "text")
799             col.prop(file_browse, "text_hi")
800
801             col = split.column()
802             col.prop(file_browse, "header")
803             col.prop(file_browse, "list")
804
805             col = split.column()
806             col.prop(file_browse, "selected_file")
807             col.prop(file_browse, "tiles")
808
809             col = split.column()
810             col.prop(file_browse, "active_file")
811             col.prop(file_browse, "active_file_text")
812
813         elif theme.active_theme == 'NLA_EDITOR':
814             nla = theme.nla_editor
815
816             col = split.column()
817             col.prop(nla, "back")
818             col.prop(nla, "button")
819             col.prop(nla, "button_title")
820
821             col = split.column()
822             col.prop(nla, "button_text")
823             col.prop(nla, "text")
824             col.prop(nla, "header")
825
826             col = split.column()
827             col.prop(nla, "grid")
828             col.prop(nla, "bars")
829             col.prop(nla, "bars_selected")
830
831             col = split.column()
832             col.prop(nla, "strips")
833             col.prop(nla, "strips_selected")
834             col.prop(nla, "current_frame")
835
836         elif theme.active_theme == 'DOPESHEET_EDITOR':
837             dope = theme.dopesheet_editor
838
839             col = split.column()
840             col.prop(dope, "back")
841             col.prop(dope, "list")
842             col.prop(dope, "text")
843             col.prop(dope, "header")
844
845             col = split.column()
846             col.prop(dope, "grid")
847             col.prop(dope, "channels")
848             col.prop(dope, "channels_selected")
849             col.prop(dope, "channel_group")
850
851             col = split.column()
852             col.prop(dope, "active_channels_group")
853             col.prop(dope, "long_key")
854             col.prop(dope, "long_key_selected")
855
856             col = split.column()
857             col.prop(dope, "current_frame")
858             col.prop(dope, "dopesheet_channel")
859             col.prop(dope, "dopesheet_subchannel")
860
861         elif theme.active_theme == 'IMAGE_EDITOR':
862             image = theme.image_editor
863
864             col = split.column()
865             col.prop(image, "back")
866             col.prop(image, "button")
867
868             col = split.column()
869             col.prop(image, "button_title")
870             col.prop(image, "button_text")
871
872             col = split.column()
873             col.prop(image, "header")
874
875             col = split.column()
876             col.prop(image, "editmesh_active", slider=True)
877
878         elif theme.active_theme == 'SEQUENCE_EDITOR':
879             seq = theme.sequence_editor
880
881             col = split.column()
882             col.prop(seq, "back")
883             col.prop(seq, "button")
884             col.prop(seq, "button_title")
885             col.prop(seq, "button_text")
886             col.prop(seq, "text")
887
888             col = split.column()
889             col.prop(seq, "header")
890             col.prop(seq, "grid")
891             col.prop(seq, "movie_strip")
892             col.prop(seq, "image_strip")
893             col.prop(seq, "scene_strip")
894
895             col = split.column()
896             col.prop(seq, "audio_strip")
897             col.prop(seq, "effect_strip")
898             col.prop(seq, "plugin_strip")
899             col.prop(seq, "transition_strip")
900
901             col = split.column()
902             col.prop(seq, "meta_strip")
903             col.prop(seq, "current_frame")
904             col.prop(seq, "keyframe")
905             col.prop(seq, "draw_action")
906
907         elif theme.active_theme == 'PROPERTIES':
908             prop = theme.properties
909
910             col = split.column()
911             col.prop(prop, "back")
912
913             col = split.column()
914             col.prop(prop, "title")
915
916             col = split.column()
917             col.prop(prop, "text")
918
919             col = split.column()
920             col.prop(prop, "header")
921
922         elif theme.active_theme == 'TEXT_EDITOR':
923             text = theme.text_editor
924
925             col = split.column()
926             col.prop(text, "back")
927             col.prop(text, "button")
928             col.prop(text, "button_title")
929             col.prop(text, "button_text")
930
931             col = split.column()
932             col.prop(text, "text")
933             col.prop(text, "text_hi")
934             col.prop(text, "header")
935             col.prop(text, "line_numbers_background")
936
937             col = split.column()
938             col.prop(text, "selected_text")
939             col.prop(text, "cursor")
940             col.prop(text, "syntax_builtin")
941             col.prop(text, "syntax_special")
942
943             col = split.column()
944             col.prop(text, "syntax_comment")
945             col.prop(text, "syntax_string")
946             col.prop(text, "syntax_numbers")
947
948         elif theme.active_theme == 'TIMELINE':
949             time = theme.timeline
950
951             col = split.column()
952             col.prop(time, "back")
953             col.prop(time, "text")
954
955             col = split.column()
956             col.prop(time, "header")
957
958             col = split.column()
959             col.prop(time, "grid")
960
961             col = split.column()
962             col.prop(time, "current_frame")
963
964         elif theme.active_theme == 'NODE_EDITOR':
965             node = theme.node_editor
966
967             col = split.column()
968             col.prop(node, "back")
969             col.prop(node, "button")
970             col.prop(node, "button_title")
971             col.prop(node, "button_text")
972
973             col = split.column()
974             col.prop(node, "text")
975             col.prop(node, "text_hi")
976             col.prop(node, "header")
977             col.prop(node, "wires")
978
979             col = split.column()
980             col.prop(node, "wire_select")
981             col.prop(node, "selected_text")
982             col.prop(node, "node_backdrop", slider=True)
983             col.prop(node, "in_out_node")
984
985             col = split.column()
986             col.prop(node, "converter_node")
987             col.prop(node, "operator_node")
988             col.prop(node, "group_node")
989
990         elif theme.active_theme == 'LOGIC_EDITOR':
991             logic = theme.logic_editor
992
993             col = split.column()
994             col.prop(logic, "back")
995             col.prop(logic, "button")
996
997             col = split.column()
998             col.prop(logic, "button_title")
999             col.prop(logic, "button_text")
1000
1001             col = split.column()
1002             col.prop(logic, "text")
1003             col.prop(logic, "header")
1004
1005             col = split.column()
1006             col.prop(logic, "panel")
1007
1008         elif theme.active_theme == 'OUTLINER':
1009             out = theme.outliner
1010
1011             col = split.column()
1012             col.prop(out, "back")
1013
1014             col = split.column()
1015             col.prop(out, "text")
1016
1017             col = split.column()
1018             col.prop(out, "text_hi")
1019
1020             col = split.column()
1021             col.prop(out, "header")
1022
1023         elif theme.active_theme == 'INFO':
1024             info = theme.info
1025
1026             col = split.column()
1027             col.prop(info, "back")
1028
1029             col = split.column()
1030             col.prop(info, "header")
1031
1032             col = split.column()
1033             col.prop(info, "header_text")
1034
1035             col = split.column()
1036
1037         elif theme.active_theme == 'USER_PREFERENCES':
1038             prefs = theme.user_preferences
1039
1040             col = split.column()
1041             col.prop(prefs, "back")
1042
1043             col = split.column()
1044             col.prop(prefs, "text")
1045
1046             col = split.column()
1047             col.prop(prefs, "header")
1048
1049             col = split.column()
1050             col.prop(prefs, "header_text")
1051
1052
1053 class USERPREF_PT_file(bpy.types.Panel):
1054     bl_space_type = 'USER_PREFERENCES'
1055     bl_label = "Files"
1056     bl_region_type = 'WINDOW'
1057     bl_show_header = False
1058
1059     def poll(self, context):
1060         userpref = context.user_preferences
1061         return (userpref.active_section == 'FILES')
1062
1063     def draw(self, context):
1064         layout = self.layout
1065
1066         userpref = context.user_preferences
1067         paths = userpref.filepaths
1068
1069         split = layout.split(percentage=0.7)
1070
1071         col = split.column()
1072         col.label(text="File Paths:")
1073         
1074         colsplit = col.split(percentage=0.95)
1075         col1 = colsplit.split(percentage=0.3)
1076         
1077         sub = col1.column()
1078         sub.label(text="Fonts:")
1079         sub.label(text="Textures:")
1080         sub.label(text="Texture Plugins:")
1081         sub.label(text="Sequence Plugins:")
1082         sub.label(text="Render Output:")
1083         sub.label(text="Scripts:")
1084         sub.label(text="Sounds:")
1085         sub.label(text="Temp:")
1086         sub.label(text="Animation Player:")
1087         
1088         sub = col1.column()
1089         sub.prop(paths, "fonts_directory", text="")
1090         sub.prop(paths, "textures_directory", text="")
1091         sub.prop(paths, "texture_plugin_directory", text="")
1092         sub.prop(paths, "sequence_plugin_directory", text="")
1093         sub.prop(paths, "render_output_directory", text="")
1094         sub.prop(paths, "python_scripts_directory", text="")
1095         sub.prop(paths, "sounds_directory", text="")
1096         sub.prop(paths, "temporary_directory", text="")
1097         subsplit = sub.split(percentage=0.3)
1098         subsplit.prop(paths, "animation_player_preset", text="")
1099         subsplit.prop(paths, "animation_player", text="")
1100
1101         col = split.column()
1102         col.label(text="Save & Load:")
1103         col.prop(paths, "use_relative_paths")
1104         col.prop(paths, "compress_file")
1105         col.prop(paths, "load_ui")
1106         col.prop(paths, "filter_file_extensions")
1107         col.prop(paths, "hide_dot_files_datablocks")
1108         
1109         col.separator()
1110         col.separator()
1111
1112         col.label(text="Auto Save:")
1113         col.prop(paths, "save_version")
1114         col.prop(paths, "recent_files")
1115         col.prop(paths, "save_preview_images")
1116         col.prop(paths, "auto_save_temporary_files")
1117         sub = col.column()
1118         sub.enabled = paths.auto_save_temporary_files
1119         sub.prop(paths, "auto_save_time", text="Timer (mins)")
1120
1121
1122 class USERPREF_PT_input(bpy.types.Panel):
1123     bl_space_type = 'USER_PREFERENCES'
1124     bl_label = "Input"
1125     bl_region_type = 'WINDOW'
1126     bl_show_header = False
1127
1128     def poll(self, context):
1129         userpref = context.user_preferences
1130         return (userpref.active_section == 'INPUT')
1131
1132     def draw(self, context):
1133         layout = self.layout
1134
1135         userpref = context.user_preferences
1136         wm = context.manager
1137         #input = userpref.input
1138         #input = userpref
1139         inputs = userpref.inputs
1140
1141         split = layout.split(percentage=0.25)
1142
1143         # General settings
1144         row = split.row()
1145         col = row.column()
1146
1147         sub = col.column()
1148         sub.label(text="Configuration:")
1149         sub.prop_object(wm, "active_keyconfig", wm, "keyconfigs", text="")
1150
1151         col.separator()
1152
1153         sub = col.column()
1154         sub.label(text="Mouse:")
1155         sub1 = sub.column()
1156         sub1.enabled = (inputs.select_mouse == 'RIGHT')
1157         sub1.prop(inputs, "emulate_3_button_mouse")
1158         sub.prop(inputs, "continuous_mouse")
1159
1160         sub.label(text="Select With:")
1161         sub.row().prop(inputs, "select_mouse", expand=True)
1162
1163         sub.separator()
1164
1165         sub.prop(inputs, "emulate_numpad")
1166
1167         sub.separator()
1168
1169         sub.label(text="Orbit Style:")
1170         sub.row().prop(inputs, "view_rotation", expand=True)
1171
1172         sub.label(text="Zoom Style:")
1173         sub.row().prop(inputs, "viewport_zoom_style", expand=True)
1174         if inputs.viewport_zoom_style == 'DOLLY':
1175             sub.row().prop(inputs, "zoom_axis", expand=True)
1176             sub.prop(inputs, "invert_zoom_direction")
1177
1178         #sub.prop(inputs, "use_middle_mouse_paste")
1179
1180         #col.separator()
1181
1182         #sub = col.column()
1183         #sub.label(text="Mouse Wheel:")
1184         #sub.prop(view, "wheel_scroll_lines", text="Scroll Lines")
1185
1186         col.separator()
1187
1188         sub = col.column()
1189         sub.label(text="NDOF Device:")
1190         sub.prop(inputs, "ndof_pan_speed", text="Pan Speed")
1191         sub.prop(inputs, "ndof_rotate_speed", text="Orbit Speed")
1192
1193         col.separator()
1194
1195         sub = col.column()
1196         sub.label(text="Double Click:")
1197         sub.prop(inputs, "double_click_time", text="Speed")
1198
1199         row.separator()
1200
1201         # Keymap Settings
1202         col = split.column()
1203
1204         # kc = wm.active_keyconfig
1205         defkc = wm.default_keyconfig
1206         km = wm.active_keymap
1207
1208         subsplit = col.split()
1209         subsplit.prop_object(wm, "active_keymap", defkc, "keymaps", text="Map:")
1210         if km.user_defined:
1211             row = subsplit.row()
1212             row.operator("WM_OT_keymap_restore", text="Restore")
1213             row.operator("WM_OT_keymap_restore", text="Restore All").all = True
1214         else:
1215             row = subsplit.row()
1216             row.operator("WM_OT_keymap_edit", text="Edit")
1217             row.label()
1218
1219         col.separator()
1220
1221         for kmi in km.items:
1222             subcol = col.column()
1223             subcol.set_context_pointer("keyitem", kmi)
1224
1225             row = subcol.row()
1226
1227             if kmi.expanded:
1228                 row.prop(kmi, "expanded", text="", icon='TRIA_DOWN')
1229             else:
1230                 row.prop(kmi, "expanded", text="", icon='TRIA_RIGHT')
1231
1232             itemrow = row.row()
1233             itemrow.enabled = km.user_defined
1234             if kmi.active:
1235                 itemrow.prop(kmi, "active", text="", icon='CHECKBOX_HLT')
1236             else:
1237                 itemrow.prop(kmi, "active", text="", icon='CHECKBOX_DEHLT')
1238
1239             itemcol = itemrow.column()
1240             itemcol.active = kmi.active
1241             row = itemcol.row()
1242
1243             if km.modal:
1244                 row.prop(kmi, "propvalue", text="")
1245             else:
1246                 row.prop(kmi, "idname", text="")
1247
1248             sub = row.row()
1249             sub.scale_x = 0.6
1250             sub.prop(kmi, "map_type", text="")
1251
1252             sub = row.row(align=True)
1253             if kmi.map_type == 'KEYBOARD':
1254                 sub.prop(kmi, "type", text="", full_event=True)
1255             elif kmi.map_type == 'MOUSE':
1256                 sub.prop(kmi, "type", text="", full_event=True)
1257             elif kmi.map_type == 'TWEAK':
1258                 sub.scale_x = 0.5
1259                 sub.prop(kmi, "type", text="")
1260                 sub.prop(kmi, "value", text="")
1261             elif kmi.map_type == 'TIMER':
1262                 sub.prop(kmi, "type", text="")
1263             else:
1264                 sub.label()
1265
1266             if kmi.expanded:
1267                 if kmi.map_type not in ('TEXTINPUT', 'TIMER'):
1268                     sub = itemcol.row(align=True)
1269
1270                     if kmi.map_type == 'KEYBOARD':
1271                         sub.prop(kmi, "type", text="", event=True)
1272                         sub.prop(kmi, "value", text="")
1273                     elif kmi.map_type == 'MOUSE':
1274                         sub.prop(kmi, "type", text="")
1275                         sub.prop(kmi, "value", text="")
1276                     else:
1277                         sub.label()
1278                         sub.label()
1279
1280                     subrow = sub.row()
1281                     subrow.scale_x = 0.75
1282                     subrow.prop(kmi, "any")
1283                     subrow.prop(kmi, "shift")
1284                     subrow.prop(kmi, "ctrl")
1285                     subrow.prop(kmi, "alt")
1286                     subrow.prop(kmi, "oskey", text="Cmd")
1287                     sub.prop(kmi, "key_modifier", text="", event=True)
1288
1289                 flow = itemcol.column_flow(columns=2)
1290                 props = kmi.properties
1291
1292                 if props is not None:
1293                     for pname in dir(props):
1294                         if not props.is_property_hidden(pname):
1295                             flow.prop(props, pname)
1296
1297                 itemcol.separator()
1298
1299             itemrow.operator("wm.keyitem_remove", text="", icon='ZOOMOUT')
1300
1301         itemrow = col.row()
1302         itemrow.label()
1303         itemrow.operator("wm.keyitem_add", text="", icon='ZOOMIN')
1304         itemrow.enabled = km.user_defined
1305
1306 bpy.types.register(USERPREF_HT_header)
1307 bpy.types.register(USERPREF_PT_tabs)
1308 bpy.types.register(USERPREF_PT_interface)
1309 bpy.types.register(USERPREF_PT_theme)
1310 bpy.types.register(USERPREF_PT_edit)
1311 bpy.types.register(USERPREF_PT_system)
1312 bpy.types.register(USERPREF_PT_file)
1313 bpy.types.register(USERPREF_PT_input)
1314
1315 from bpy.props import *
1316
1317
1318 class WM_OT_keyconfig_export(bpy.types.Operator):
1319     "Export key configuration to a python script."
1320     bl_idname = "wm.keyconfig_export"
1321     bl_label = "Export Key Configuration..."
1322
1323     path = bpy.props.StringProperty(name="File Path", description="File path to write file to.")
1324
1325     def _string_value(self, value):
1326         result = ""
1327         if isinstance(value, str):
1328             if value != "":
1329                 result = "\'%s\'" % value
1330         elif isinstance(value, bool):
1331             if value:
1332                 result = "True"
1333             else:
1334                 result = "False"
1335         elif isinstance(value, float):
1336             result = "%.10f" % value
1337         elif isinstance(value, int):
1338             result = "%d" % value
1339         elif getattr(value, '__len__', False):
1340             if len(value):
1341                 result = "["
1342                 for i in range(0, len(value)):
1343                     result += self._string_value(value[i])
1344                     if i != len(value)-1:
1345                         result += ", "
1346                 result += "]"
1347         else:
1348             print("Export key configuration: can't write ", value)
1349
1350         return result
1351
1352     def execute(self, context):
1353         if not self.properties.path:
1354             raise Exception("File path not set.")
1355
1356         f = open(self.properties.path, "w")
1357         if not f:
1358             raise Exception("Could not open file.")
1359
1360         wm = context.manager
1361         kc = wm.active_keyconfig
1362
1363         f.write('# Configuration %s\n' % kc.name)
1364
1365         f.write("wm = bpy.data.windowmanagers[0]\n")
1366         f.write("kc = wm.add_keyconfig(\'%s\')\n\n" % kc.name)
1367
1368         for km in kc.keymaps:
1369             km = km.active()
1370             f.write("# Map %s\n" % km.name)
1371             f.write("km = kc.add_keymap(\'%s\', space_type=\'%s\', region_type=\'%s\', modal=%s)\n\n" % (km.name, km.space_type, km.region_type, km.modal))
1372             for kmi in km.items:
1373                 if km.modal:
1374                     f.write("kmi = km.add_modal_item(\'%s\', \'%s\', \'%s\'" % (kmi.propvalue, kmi.type, kmi.value))
1375                 else:
1376                     f.write("kmi = km.add_item(\'%s\', \'%s\', \'%s\'" % (kmi.idname, kmi.type, kmi.value))
1377                 if kmi.any:
1378                     f.write(", any=True")
1379                 else:
1380                     if kmi.shift:
1381                         f.write(", shift=True")
1382                     if kmi.ctrl:
1383                         f.write(", ctrl=True")
1384                     if kmi.alt:
1385                         f.write(", alt=True")
1386                     if kmi.oskey:
1387                         f.write(", oskey=True")
1388                 if kmi.key_modifier and kmi.key_modifier != 'NONE':
1389                     f.write(", key_modifier=\'%s\'" % kmi.key_modifier)
1390                 f.write(")\n")
1391
1392                 props = kmi.properties
1393
1394                 if props is not None:
1395                     for pname in dir(props):
1396                         if props.is_property_set(pname) and not props.is_property_hidden(pname):
1397                             value = eval("props.%s" % pname)
1398                             value = self._string_value(value)
1399                             if value != "":
1400                                 f.write("kmi.properties.%s = %s\n" % (pname, value))
1401
1402             f.write("\n")
1403
1404         f.close()
1405
1406         return ('FINISHED',)
1407
1408     def invoke(self, context, event):
1409         wm = context.manager
1410         wm.add_fileselect(self)
1411         return ('RUNNING_MODAL',)
1412
1413
1414 class WM_OT_keymap_edit(bpy.types.Operator):
1415     "Edit key map."
1416     bl_idname = "wm.keymap_edit"
1417     bl_label = "Edit Key Map"
1418
1419     def execute(self, context):
1420         wm = context.manager
1421         km = wm.active_keymap
1422         km.copy_to_user()
1423         return ('FINISHED',)
1424
1425
1426 class WM_OT_keymap_restore(bpy.types.Operator):
1427     "Restore key map(s)."
1428     bl_idname = "wm.keymap_restore"
1429     bl_label = "Restore Key Map(s)"
1430
1431     all = BoolProperty(attr="all", name="All Keymaps", description="Restore all keymaps to default.")
1432
1433     def execute(self, context):
1434         wm = context.manager
1435
1436         if self.properties.all:
1437             for km in wm.default_keyconfig.keymaps:
1438                 km.restore_to_default()
1439         else:
1440             km = wm.active_keymap
1441             km.restore_to_default()
1442
1443         return ('FINISHED',)
1444
1445
1446 class WM_OT_keyitem_add(bpy.types.Operator):
1447     "Add key map item."
1448     bl_idname = "wm.keyitem_add"
1449     bl_label = "Add Key Map Item"
1450
1451     def execute(self, context):
1452         wm = context.manager
1453         km = wm.active_keymap
1454         if km.modal:
1455             km.add_modal_item("", 'A', 'PRESS') # kmi
1456         else:
1457             km.add_item("", 'A', 'PRESS') # kmi
1458         return ('FINISHED',)
1459
1460
1461 class WM_OT_keyitem_remove(bpy.types.Operator):
1462     "Remove key map item."
1463     bl_idname = "wm.keyitem_remove"
1464     bl_label = "Remove Key Map Item"
1465
1466     def execute(self, context):
1467         wm = context.manager
1468         kmi = context.keyitem
1469         km = wm.active_keymap
1470         km.remove_item(kmi)
1471         return ('FINISHED',)
1472
1473 bpy.ops.add(WM_OT_keyconfig_export)
1474 bpy.ops.add(WM_OT_keymap_edit)
1475 bpy.ops.add(WM_OT_keymap_restore)
1476 bpy.ops.add(WM_OT_keyitem_add)
1477 bpy.ops.add(WM_OT_keyitem_remove)