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