3cc01a35c1fa402f328bdc92bfe678093e4c414e
[blender.git] / release / ui / space_info.py
1
2 import bpy
3
4 class INFO_HT_header(bpy.types.Header):
5         __space_type__ = "USER_PREFERENCES"
6
7         def draw(self, context):
8                 st = context.space_data
9                 rd = context.scene.render_data
10                 layout = self.layout
11                 
12                 layout.template_header()
13
14                 if context.area.show_menus:
15                         row = layout.row()
16                         row.itemM("INFO_MT_file")
17                         row.itemM("INFO_MT_add")
18                         if rd.use_game_engine:
19                                 row.itemM("INFO_MT_game")
20                         else:
21                                 row.itemM("INFO_MT_render")
22                         row.itemM("INFO_MT_help")
23
24                 layout.template_ID(context.window, "screen") #, new="screen.new", open="scene.unlink")
25                 layout.template_ID(context.screen, "scene") #, new="screen.new", unlink="scene.unlink")
26
27                 if rd.multiple_engines:
28                         layout.itemR(rd, "engine", text="")
29
30                 layout.itemS()
31
32                 layout.template_operator_search()
33                 layout.template_running_jobs()
34                         
35 class INFO_MT_file(bpy.types.Menu):
36         __space_type__ = "USER_PREFERENCES"
37         __label__ = "File"
38
39         def draw(self, context):
40                 layout = self.layout
41
42                 layout.operator_context = "EXEC_AREA"
43                 layout.itemO("wm.read_homefile", text="New")
44                 layout.operator_context = "INVOKE_AREA"
45                 layout.itemO("wm.open_mainfile", text="Open...")
46                 layout.item_menu_enumO("wm.open_recentfile", "file", text="Open Recent")
47                 layout.itemO("wm.recover_last_session")
48
49                 layout.itemS()
50
51                 layout.operator_context = "EXEC_AREA"
52                 layout.itemO("wm.save_mainfile", text="Save")
53                 layout.operator_context = "INVOKE_AREA"
54                 layout.itemO("wm.save_as_mainfile", text="Save As...")
55                 layout.itemO("screen.userpref_show", text="User Preferences...")
56
57                 layout.itemS()
58
59                 layout.itemM("INFO_MT_file_import")
60                 layout.itemM("INFO_MT_file_export")
61
62                 layout.itemS()
63
64                 layout.itemM("INFO_MT_file_external_data")
65
66                 layout.itemS()
67
68                 layout.operator_context = "EXEC_AREA"
69                 layout.itemO("wm.exit_blender", text="Quit")
70
71 class INFO_MT_file_import(bpy.types.Menu):
72         __space_type__ = "USER_PREFERENCES"
73         __label__ = "Import"
74
75         def draw(self, context):
76                 layout = self.layout
77
78 class INFO_MT_file_export(bpy.types.Menu):
79         __space_type__ = "USER_PREFERENCES"
80         __label__ = "Export"
81
82         def draw(self, context):
83                 layout = self.layout
84
85                 layout.itemO("export.ply", text="PLY")
86
87 class INFO_MT_file_external_data(bpy.types.Menu):
88         __space_type__ = "USER_PREFERENCES"
89         __label__ = "External Data"
90
91         def draw(self, context):
92                 layout = self.layout
93
94                 layout.itemO("file.pack_all", text="Pack into .blend file")
95                 layout.itemO("file.unpack_all", text="Unpack into Files...")
96
97                 layout.itemS()
98
99                 layout.itemO("file.make_paths_relative")
100                 layout.itemO("file.make_paths_absolute")
101                 layout.itemO("file.report_missing_files")
102                 layout.itemO("file.find_missing_files")
103
104 class INFO_MT_add(bpy.types.Menu):
105         __space_type__ = "USER_PREFERENCES"
106         __label__ = "Add"
107
108         def draw(self, context):
109                 layout = self.layout
110
111                 layout.operator_context = "EXEC_SCREEN"
112
113                 layout.item_menu_enumO( "OBJECT_OT_mesh_add", "type", text="Mesh", icon="ICON_OUTLINER_OB_MESH")
114                 layout.item_menu_enumO( "OBJECT_OT_curve_add", "type", text="Curve", icon="ICON_OUTLINER_OB_CURVE")
115                 layout.item_menu_enumO( "OBJECT_OT_surface_add", "type", text="Surface", icon="ICON_OUTLINER_OB_SURFACE")
116                 layout.item_enumO("OBJECT_OT_object_add", "type", "META", icon="ICON_OUTLINER_OB_META")
117                 layout.itemO("OBJECT_OT_text_add", text="Text", icon="ICON_OUTLINER_OB_FONT")
118
119                 layout.itemS()
120
121                 layout.itemO("OBJECT_OT_armature_add", text="Armature", icon="ICON_OUTLINER_OB_ARMATURE")
122                 layout.item_enumO("OBJECT_OT_object_add", "type", "LATTICE", icon="ICON_OUTLINER_OB_LATTICE")
123                 layout.item_enumO("OBJECT_OT_object_add", "type", "EMPTY", icon="ICON_OUTLINER_OB_EMPTY")
124
125                 layout.itemS()
126
127                 layout.item_enumO("OBJECT_OT_object_add", "type", "CAMERA", icon="ICON_OUTLINER_OB_CAMERA")
128                 layout.item_enumO("OBJECT_OT_object_add", "type", "LAMP", icon="ICON_OUTLINER_OB_LAMP")
129
130 class INFO_MT_game(bpy.types.Menu):
131         __space_type__ = "USER_PREFERENCES"
132         __label__ = "Game"
133
134         def draw(self, context):
135                 layout = self.layout
136
137                 layout.itemO("view3d.game_start")
138
139 class INFO_MT_render(bpy.types.Menu):
140         __space_type__ = "USER_PREFERENCES"
141         __label__ = "Render"
142
143         def draw(self, context):
144                 layout = self.layout
145                 rd = context.scene.render_data
146
147                 layout.itemO("screen.render", text="Render Image")
148                 layout.item_booleanO("screen.render", "animation", True, text="Render Animation")
149
150                 layout.itemS()
151
152                 layout.itemO("screen.render_view_show")
153
154 class INFO_MT_help(bpy.types.Menu):
155         __space_type__ = "USER_PREFERENCES"
156         __label__ = "Help"
157
158         def draw(self, context):
159                 layout = self.layout
160
161                 layout.itemO("help.manual")
162                 layout.itemO("help.release_logs")
163
164                 layout.itemS()
165
166                 layout.itemO("help.blender_website")
167                 layout.itemO("help.blender_eshop")
168                 layout.itemO("help.developer_community")
169                 layout.itemO("help.user_community")
170
171 class INFO_PT_tabs(bpy.types.Panel):
172         __space_type__ = "USER_PREFERENCES"
173         __show_header__ = False
174
175         def draw(self, context):
176                 layout = self.layout
177                 userpref = context.user_preferences
178
179                 layout.itemR(userpref, "active_section", expand=True)
180
181 class INFO_PT_view(bpy.types.Panel):
182         __space_type__ = "USER_PREFERENCES"
183         __label__ = "View"
184         __show_header__ = False
185
186         def poll(self, context):
187                 userpref = context.user_preferences
188                 return (userpref.active_section == 'VIEW_CONTROLS')
189
190         def draw(self, context):
191                 layout = self.layout
192                 userpref = context.user_preferences
193                 view = userpref.view
194
195                 split = layout.split()
196                 col = split.column()
197                 colsplit = col.split(percentage=0.85)
198                 colsplitcol = colsplit.column()
199                 colsplitcol.itemL(text="Display:")
200                 colsplitcol.itemR(view, "tooltips")
201                 colsplitcol.itemR(view, "display_object_info", text="Object Info")
202                 colsplitcol.itemR(view, "use_large_cursors")
203                 colsplitcol.itemR(view, "show_view_name", text="View Name")
204                 colsplitcol.itemR(view, "show_playback_fps", text="Playback FPS")
205                 colsplitcol.itemR(view, "global_scene")
206                 colsplitcol.itemR(view, "pin_floating_panels")
207                 colsplitcol.itemR(view, "object_center_size")
208                 colsplitcol.itemS()
209                 colsplitcol.itemS()
210                 colsplitcol.itemS()
211                 
212                 colsplitcol.itemR(view, "show_mini_axis")
213                 colsub = colsplitcol.column()
214                 colsub.enabled = view.show_mini_axis
215                 colsub.itemR(view, "mini_axis_size")
216                 colsub.itemR(view, "mini_axis_brightness")
217                 
218
219                 
220                 
221                 col = split.column()
222                 colsplit = col.split(percentage=0.85)
223                 colsplitcol = colsplit.column()
224                 colsplitcol.itemL(text="View Manipulation:")
225                 colsplitcol.itemR(view, "auto_depth")
226                 colsplitcol.itemR(view, "global_pivot")
227                 colsplitcol.itemR(view, "zoom_to_mouse")
228                 colsplitcol.itemR(view, "rotate_around_selection")
229                 colsplitcol.itemL(text="Zoom Style:")
230                 row = colsplitcol.row()
231                 row.itemR(view, "viewport_zoom_style", expand=True)
232                 colsplitcol.itemL(text="Orbit Style:")
233                 row = colsplitcol.row()
234                 row.itemR(view, "view_rotation", expand=True)
235                 colsplitcol.itemR(view, "perspective_orthographic_switch")
236                 colsplitcol.itemR(view, "smooth_view")
237                 colsplitcol.itemR(view, "rotation_angle")
238                 colsplitcol.itemL(text="NDOF Device:")
239                 colsplitcol.itemR(view, "ndof_pan_speed", text="Pan Speed")
240                 colsplitcol.itemR(view, "ndof_rotate_speed", text="Orbit Speed")
241                 
242                 col = split.column()
243                 colsplit = col.split(percentage=0.85)
244                 colsplitcol = colsplit.column()
245                 colsplitcol.itemL(text="Mouse Buttons:")
246                 colsplitcol.itemR(view, "left_mouse_button_select")
247                 colsplitcol.itemR(view, "right_mouse_button_select")
248                 colsplitcol.itemR(view, "emulate_3_button_mouse")
249                 colsplitcol.itemR(view, "use_middle_mouse_paste")
250                 colsplitcol.itemR(view, "middle_mouse_rotate")
251                 colsplitcol.itemR(view, "middle_mouse_pan")
252                 colsplitcol.itemR(view, "wheel_invert_zoom")
253                 colsplitcol.itemR(view, "wheel_scroll_lines")
254                 colsplitcol.itemS()
255                 colsplitcol.itemS()
256                 colsplitcol.itemS()
257                 
258                 colsplitcol.itemL(text="Menus:")
259                 colsplitcol.itemR(view, "open_mouse_over")
260                 colsplitcol.itemL(text="Menu Open Delay:")
261                 colsplitcol.itemR(view, "open_toplevel_delay", text="Top Level")
262                 colsplitcol.itemR(view, "open_sublevel_delay", text="Sub Level")
263
264                 
265                 col = split.column()
266                 colsplit = col.split(percentage=0.85)
267                 colsplitcol = colsplit.column()
268                 #manipulator
269                 colsplitcol.itemR(view, "use_manipulator")
270                 colsub = colsplitcol.column()
271                 colsub.enabled = view.use_manipulator
272                 colsub.itemR(view, "manipulator_size", text="Size")
273                 colsub.itemR(view, "manipulator_handle_size", text="Handle Size")
274                 colsub.itemR(view, "manipulator_hotspot", text="Hotspot")       
275                 colsplitcol.itemS()
276                 colsplitcol.itemS()
277                 colsplitcol.itemS()
278                                 
279                 colsplitcol.itemL(text="Toolbox:")
280                 colsplitcol.itemR(view, "use_column_layout")
281                 colsplitcol.itemL(text="Open Toolbox Delay:")
282                 colsplitcol.itemR(view, "open_left_mouse_delay", text="Hold LMB")
283                 colsplitcol.itemR(view, "open_right_mouse_delay", text="Hold RMB")
284
285                 
286 class INFO_PT_edit(bpy.types.Panel):
287         __space_type__ = "USER_PREFERENCES"
288         __label__ = "Edit"
289         __show_header__ = False
290
291         def poll(self, context):
292                 userpref = context.user_preferences
293                 return (userpref.active_section == 'EDIT_METHODS')
294
295         def draw(self, context):
296                 layout = self.layout
297                 userpref = context.user_preferences
298                 edit = userpref.edit
299                 view = userpref.view
300                 
301                 split = layout.split()
302                 col = split.column()
303                 colsplit = col.split(percentage=0.85)
304                 colsplitcol = colsplit.column()
305
306                 colsplitcol.itemL(text="Materials:")
307                 colsplitcol.itemR(edit, "material_linked_object", text="Linked to Object")
308                 colsplitcol.itemR(edit, "material_linked_obdata", text="Linked to ObData")
309                 colsplitcol.itemS()
310                 colsplitcol.itemS()
311                 colsplitcol.itemS()
312                 
313                 colsplitcol.itemL(text="New Objects:")
314                 colsplitcol.itemR(edit, "enter_edit_mode")
315                 colsplitcol.itemR(edit, "align_to_view")
316                 colsplitcol.itemS()
317                 colsplitcol.itemS()
318                 colsplitcol.itemS()
319                 
320                 colsplitcol.itemL(text="Transform:")
321                 colsplitcol.itemR(edit, "drag_immediately")
322                 
323                 col = split.column()
324                 colsplit = col.split(percentage=0.85)
325                 colsplitcol = colsplit.column()
326                 colsplitcol.itemL(text="Snap:")
327                 colsplitcol.itemR(edit, "snap_translate", text="Translate")
328                 colsplitcol.itemR(edit, "snap_rotate", text="Rotate")
329                 colsplitcol.itemR(edit, "snap_scale", text="Scale")
330                 colsplitcol.itemS()
331                 colsplitcol.itemS()
332                 colsplitcol.itemS()
333                 
334                 colsplitcol.itemL(text="Grease Pencil:")
335                 colsplitcol.itemR(edit, "grease_pencil_manhattan_distance", text="Manhattan Distance")
336                 colsplitcol.itemR(edit, "grease_pencil_euclidean_distance", text="Euclidean Distance")
337                 colsplitcol.itemR(edit, "grease_pencil_smooth_stroke", text="Smooth Stroke")
338                 colsplitcol.itemR(edit, "grease_pencil_simplify_stroke", text="Simplify Stroke")
339                 colsplitcol.itemR(edit, "grease_pencil_eraser_radius", text="Eraser Radius")
340                 
341                 
342                 col = split.column()
343                 colsplit = col.split(percentage=0.85)
344                 colsplitcol = colsplit.column()
345
346                 colsplitcol.itemL(text="Keyframing:")
347                 colsplitcol.itemR(edit, "use_visual_keying")
348                 colsplitcol.itemR(edit, "new_interpolation_type")
349                 colsplitcol.itemR(edit, "auto_keying_enable", text="Auto Keyframing")
350                 colsub = colsplitcol.column()
351                 colsub.enabled = edit.auto_keying_enable
352                 row = colsub.row()
353                 row.itemR(edit, "auto_keying_mode", expand=True)
354                 colsub.itemR(edit, "auto_keyframe_insert_available", text="Only Insert Available")
355                 colsub.itemR(edit, "auto_keyframe_insert_needed", text="Only Insert Needed")
356                 colsplitcol.itemS()
357                 colsplitcol.itemS()
358                 colsplitcol.itemS()
359                 
360                 colsplitcol.itemL(text="Undo:")
361                 colsplitcol.itemR(edit, "global_undo")
362                 colsplitcol.itemR(edit, "undo_steps", text="Steps")
363                 colsplitcol.itemR(edit, "undo_memory_limit", text="Memory Limit")
364                 colsplitcol.itemS()
365                 colsplitcol.itemS()
366                 colsplitcol.itemS()
367
368                 col = split.column()
369                 colsplit = col.split(percentage=0.85)
370                 colsplitcol = colsplit.column()
371                 colsplitcol.itemL(text="Duplicate:")
372                 colsplitcol.itemR(edit, "duplicate_mesh", text="Mesh")
373                 colsplitcol.itemR(edit, "duplicate_surface", text="Surface")
374                 colsplitcol.itemR(edit, "duplicate_curve", text="Curve")
375                 colsplitcol.itemR(edit, "duplicate_text", text="Text")
376                 colsplitcol.itemR(edit, "duplicate_metaball", text="Metaball")
377                 colsplitcol.itemR(edit, "duplicate_armature", text="Armature")
378                 colsplitcol.itemR(edit, "duplicate_lamp", text="Lamp")
379                 colsplitcol.itemR(edit, "duplicate_material", text="Material")
380                 colsplitcol.itemR(edit, "duplicate_texture", text="Texture")
381                 colsplitcol.itemR(edit, "duplicate_ipo", text="F-Curve")
382                 colsplitcol.itemR(edit, "duplicate_action", text="Action")
383                 
384 class INFO_PT_system(bpy.types.Panel):
385         __space_type__ = "USER_PREFERENCES"
386         __label__ = "System"
387         __show_header__ = False
388
389         def poll(self, context):
390                 userpref = context.user_preferences
391                 return (userpref.active_section == 'SYSTEM_OPENGL')
392
393         def draw(self, context):
394                 layout = self.layout
395                 userpref = context.user_preferences
396                 system = userpref.system
397                 lan = userpref.language
398                 
399                 split = layout.split()
400                 col = split.column()
401                 colsplit = col.split(percentage=0.85)
402                 colsplitcol = colsplit.column()
403                 colsplitcol.itemR(system, "emulate_numpad")     
404                 colsplitcol.itemS()
405                 colsplitcol.itemS()
406                 #Weight Colors
407                 colsplitcol.itemL(text="Weight Colors:")
408                 colsplitcol.itemR(system, "use_weight_color_range", text="Use Custom Range")
409                 
410                 colsub = colsplitcol.column()
411                 colsub.active = system.use_weight_color_range
412                 colsub.template_color_ramp(system.weight_color_range, expand=True)
413                 colsplitcol.itemS()
414                 colsplitcol.itemS()
415                 
416                 #sequencer
417                 colsplitcol.itemL(text="Sequencer:")
418                 colsplitcol.itemR(system, "prefetch_frames")
419                 colsplitcol.itemR(system, "memory_cache_limit")
420                 
421                 col = split.column()    
422                 colsplit = col.split(percentage=0.85)
423                 colsplitcol = colsplit.column()
424                 #System
425                 colsplitcol.itemL(text="System:")
426                 colsplitcol.itemR(lan, "dpi")
427                 colsplitcol.itemR(system, "enable_all_codecs")
428                 colsplitcol.itemR(system, "auto_run_python_scripts")
429                 colsplitcol.itemR(system, "frame_server_port")
430                 colsplitcol.itemR(system, "game_sound")
431                 colsplitcol.itemR(system, "filter_file_extensions")
432                 colsplitcol.itemR(system, "hide_dot_files_datablocks")
433                 colsplitcol.itemR(system, "audio_mixing_buffer")
434                 colsplitcol.itemR(lan, "scrollback", text="Console Scrollback")
435                 
436                 col = split.column()
437                 colsplit = col.split(percentage=0.85)
438                 colsplitcol = colsplit.column()
439                 #OpenGL
440                 colsplitcol.itemL(text="OpenGL:")
441                 colsplitcol.itemR(system, "clip_alpha", slider=True)
442                 colsplitcol.itemR(system, "use_mipmaps")
443                 colsplitcol.itemL(text="Window Draw Method:")
444                 row = colsplitcol.row()
445                 row.itemR(system, "window_draw_method", expand=True)
446                 colsplitcol.itemL(text="Textures:")
447                 colsplitcol.itemR(system, "gl_texture_limit", text="Limit Size")
448                 colsplitcol.itemR(system, "texture_time_out", text="Time Out")
449                 colsplitcol.itemR(system, "texture_collection_rate", text="Collection Rate")            
450                 
451 class INFO_PT_filepaths(bpy.types.Panel):
452         __space_type__ = "USER_PREFERENCES"
453         __label__ = "File Paths"
454         __show_header__ = False
455
456         def poll(self, context):
457                 userpref = context.user_preferences
458                 return (userpref.active_section == 'FILE_PATHS')
459
460         def draw(self, context):
461                 layout = self.layout
462                 userpref = context.user_preferences
463                 paths = userpref.filepaths
464                 
465                 split = layout.split()
466                 col = split.column()
467                 col.itemL(text="File Paths:")
468                 splitcol = col.split(percentage=0.3)
469                 
470                 splitcol.itemL(text="Fonts:")
471                 splitcol.itemR(paths, "fonts_directory", text="")
472                 splitcol = col.split(percentage=0.3)
473                 splitcol.itemL(text="Textures:")
474                 splitcol.itemR(paths, "textures_directory", text="")
475                 splitcol = col.split(percentage=0.3)
476                 splitcol.itemL(text="Texture Plugins:")
477                 splitcol.itemR(paths, "texture_plugin_directory", text="")
478                 splitcol = col.split(percentage=0.3)
479                 splitcol.itemL(text="Sequence Plugins:")
480                 splitcol.itemR(paths, "sequence_plugin_directory", text="")
481                 splitcol = col.split(percentage=0.3)
482                 splitcol.itemL(text="Render Output:")
483                 splitcol.itemR(paths, "render_output_directory", text="")
484                 splitcol = col.split(percentage=0.3)
485                 splitcol.itemL(text="Scripts:")
486                 splitcol.itemR(paths, "python_scripts_directory", text="")
487                 splitcol = col.split(percentage=0.3)
488                 splitcol.itemL(text="Sounds:")
489                 splitcol.itemR(paths, "sounds_directory", text="")
490                 splitcol = col.split(percentage=0.3)
491                 splitcol.itemL(text="Temp:")
492                 splitcol.itemR(paths, "temporary_directory", text="")
493                 
494                 col = split.column()
495                 colsplit = col.split(percentage=0.2)
496                 colsplitcol = colsplit.column()
497                 colsplitcol = colsplit.column()
498                 colsplitcol.itemL(text="Save & Load:")
499                 colsplitcol.itemR(paths, "use_relative_paths")
500                 colsplitcol.itemR(paths, "compress_file")
501                 colsplitcol.itemL(text="Auto Save:")
502                 colsplitcol.itemR(paths, "save_version")
503                 colsplitcol.itemR(paths, "recent_files")
504                 colsplitcol.itemR(paths, "save_preview_images")
505                 colsplitcol.itemR(paths, "auto_save_temporary_files")
506                 colsub = colsplitcol.column()
507                 colsub.enabled = paths.auto_save_temporary_files
508                 colsub.itemR(paths, "auto_save_time")
509
510 class INFO_PT_language(bpy.types.Panel):
511         __space_type__ = "USER_PREFERENCES"
512         __label__ = "Language"
513         __show_header__ = False
514
515         def poll(self, context):
516                 userpref = context.user_preferences
517                 return (userpref.active_section == 'LANGUAGE_COLORS')
518
519         def draw(self, context):
520                 layout = self.layout
521                 userpref = context.user_preferences
522                 lan = userpref.language
523                 
524                 split = layout.split()
525                 col = split.column()
526                 
527                 col.itemR(lan, "language")
528                 col.itemR(lan, "translate_tooltips")
529                 col.itemR(lan, "translate_buttons")
530                 col.itemR(lan, "translate_toolbox")
531                 col.itemR(lan, "use_textured_fonts")
532                 
533 class INFO_PT_bottombar(bpy.types.Panel):
534         __space_type__ = "USER_PREFERENCES"
535         __label__ = " "
536         __show_header__ = False
537
538         def draw(self, context):
539                 layout = self.layout
540                 userpref = context.user_preferences
541         
542                 split = layout.split(percentage=0.8)
543                 split.itemL(text="")
544                 layout.operator_context = "EXEC_AREA"
545                 split.itemO("wm.save_homefile", text="Save As Default")
546
547 bpy.types.register(INFO_HT_header)
548 bpy.types.register(INFO_MT_file)
549 bpy.types.register(INFO_MT_file_import)
550 bpy.types.register(INFO_MT_file_export)
551 bpy.types.register(INFO_MT_file_external_data)
552 bpy.types.register(INFO_MT_add)
553 bpy.types.register(INFO_MT_game)
554 bpy.types.register(INFO_MT_render)
555 bpy.types.register(INFO_MT_help)
556 bpy.types.register(INFO_PT_tabs)
557 bpy.types.register(INFO_PT_view)
558 bpy.types.register(INFO_PT_edit)
559 bpy.types.register(INFO_PT_system)
560 bpy.types.register(INFO_PT_filepaths)
561 bpy.types.register(INFO_PT_language)
562 bpy.types.register(INFO_PT_bottombar)
563
564 # Help operators
565
566 import bpy_ops # XXX - should not need to do this
567 del bpy_ops
568
569 class HelpOperator(bpy.types.Operator):
570         def execute(self, context):
571                 try: import webbrowser
572                 except: webbrowser = None
573
574                 if webbrowser:
575                         webbrowser.open(self.__URL__)
576                 else:
577                         raise Exception("Operator requires a full Python installation")
578
579                 return ('FINISHED',)
580
581 class HELP_OT_manual(HelpOperator):
582         __idname__ = "help.manual"
583         __label__ = "Manual"
584         __URL__ = 'http://wiki.blender.org/index.php/Manual'
585
586 class HELP_OT_release_logs(HelpOperator):
587         __idname__ = "help.release_logs"
588         __label__ = "Release Logs"
589         __URL__ = 'http://www.blender.org/development/release-logs/'
590
591 class HELP_OT_blender_website(HelpOperator):
592         __idname__ = "help.blender_website"
593         __label__ = "Blender Website"
594         __URL__ = 'http://www.blender.org/'
595
596 class HELP_OT_blender_eshop(HelpOperator):
597         __idname__ = "help.blender_eshop"
598         __label__ = "Blender e-Shop"
599         __URL__ = 'http://www.blender3d.org/e-shop'
600
601 class HELP_OT_developer_community(HelpOperator):
602         __idname__ = "help.developer_community"
603         __label__ = "Developer Community"
604         __URL__ = 'http://www.blender.org/community/get-involved/'
605
606 class HELP_OT_user_community(HelpOperator):
607         __idname__ = "help.user_community"
608         __label__ = "User Community"
609         __URL__ = 'http://www.blender.org/community/user-community/'
610
611 bpy.ops.add(HELP_OT_manual)
612 bpy.ops.add(HELP_OT_release_logs)
613 bpy.ops.add(HELP_OT_blender_website)
614 bpy.ops.add(HELP_OT_blender_eshop)
615 bpy.ops.add(HELP_OT_developer_community)
616 bpy.ops.add(HELP_OT_user_community)
617