forked from bartvdbraak/blender
ca81aa704e
Patch Tracker: http://projects.blender.org/tracker/?func=detail&aid=22339&group_id=9&atid=127 This patch implements the proposal outlined here: http://wiki.blender.org/index.php/Dev:2.5/Source/Installation/Proposal Original patch by Matt Ebb. Contributions by Nathan Letwory, Damien Plisson and Andrea Weikert NOTE: This is a work in progress commit, some work still needs to be done on the SCons and CMake files for this to work properly, but at least should compile and the files should be created in the right directory. Commit discussed on IRC with Ton and Campbell.
384 lines
14 KiB
Python
384 lines
14 KiB
Python
# ##### BEGIN GPL LICENSE BLOCK #####
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
#
|
|
# ##### END GPL LICENSE BLOCK #####
|
|
|
|
# <pep8 compliant>
|
|
import bpy
|
|
|
|
|
|
class INFO_HT_header(bpy.types.Header):
|
|
bl_space_type = 'INFO'
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
wm = context.manager
|
|
if wm and len(wm.operators):
|
|
last_op = wm.operators[-1]
|
|
else:
|
|
last_op = None
|
|
window = context.window
|
|
scene = context.scene
|
|
rd = scene.render
|
|
|
|
row = layout.row(align=True)
|
|
row.template_header()
|
|
|
|
if context.area.show_menus:
|
|
sub = row.row(align=True)
|
|
sub.menu("INFO_MT_file")
|
|
sub.menu("INFO_MT_add")
|
|
if rd.use_game_engine:
|
|
sub.menu("INFO_MT_game")
|
|
else:
|
|
sub.menu("INFO_MT_render")
|
|
sub.menu("INFO_MT_help")
|
|
|
|
if window.screen.fullscreen:
|
|
layout.operator("screen.back_to_previous", icon='SCREEN_BACK', text="Back to Previous")
|
|
layout.separator()
|
|
else:
|
|
layout.template_ID(context.window, "screen", new="screen.new", unlink="screen.delete")
|
|
|
|
layout.template_ID(context.screen, "scene", new="scene.new", unlink="scene.delete")
|
|
|
|
layout.separator()
|
|
|
|
if rd.multiple_engines:
|
|
layout.prop(rd, "engine", text="")
|
|
|
|
layout.separator()
|
|
|
|
layout.template_running_jobs()
|
|
|
|
layout.template_reports_banner()
|
|
|
|
layout.label(text=scene.statistics())
|
|
|
|
# XXX: this should be right-aligned to the RHS of the region
|
|
layout.operator("wm.window_fullscreen_toggle", icon='FULLSCREEN_ENTER', text="")
|
|
|
|
|
|
class INFO_MT_file(bpy.types.Menu):
|
|
bl_label = "File"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
layout.operator_context = 'EXEC_AREA'
|
|
layout.operator("wm.read_homefile", text="New", icon='NEW')
|
|
layout.operator_context = 'INVOKE_AREA'
|
|
layout.operator("wm.open_mainfile", text="Open...", icon='FILE_FOLDER')
|
|
layout.menu("INFO_MT_file_open_recent")
|
|
layout.operator("wm.recover_last_session", icon='RECOVER_LAST')
|
|
layout.operator("wm.recover_auto_save", text="Recover Auto Save...")
|
|
|
|
layout.separator()
|
|
|
|
layout.operator_context = 'INVOKE_AREA'
|
|
layout.operator("wm.save_mainfile", text="Save", icon='FILE_TICK').check_existing = False
|
|
layout.operator_context = 'INVOKE_AREA'
|
|
layout.operator("wm.save_as_mainfile", text="Save As...")
|
|
|
|
layout.separator()
|
|
|
|
layout.operator("screen.userpref_show", text="User Preferences...", icon='PREFERENCES')
|
|
|
|
layout.operator_context = 'EXEC_AREA'
|
|
layout.operator("wm.read_homefile", text="Load Factory Settings").factory = True
|
|
|
|
layout.separator()
|
|
|
|
layout.operator_context = 'INVOKE_AREA'
|
|
layout.operator("wm.link_append", text="Link")
|
|
props = layout.operator("wm.link_append", text="Append")
|
|
props.link = False
|
|
props.instance_groups = False
|
|
|
|
layout.separator()
|
|
|
|
layout.menu("INFO_MT_file_import")
|
|
layout.menu("INFO_MT_file_export")
|
|
|
|
layout.separator()
|
|
|
|
layout.menu("INFO_MT_file_external_data")
|
|
|
|
layout.separator()
|
|
|
|
layout.operator_context = 'EXEC_AREA'
|
|
layout.operator("wm.exit_blender", text="Quit", icon='QUIT')
|
|
|
|
|
|
class INFO_MT_file_import(bpy.types.Menu):
|
|
bl_idname = "INFO_MT_file_import"
|
|
bl_label = "Import"
|
|
|
|
def draw(self, context):
|
|
if "collada_import" in dir(bpy.ops.wm):
|
|
self.layout.operator("wm.collada_import", text="COLLADA (.dae)")
|
|
|
|
|
|
class INFO_MT_file_export(bpy.types.Menu):
|
|
bl_idname = "INFO_MT_file_export"
|
|
bl_label = "Export"
|
|
|
|
def draw(self, context):
|
|
if "collada_export" in dir(bpy.ops.wm):
|
|
self.layout.operator("wm.collada_export", text="COLLADA (.dae)")
|
|
|
|
|
|
class INFO_MT_file_external_data(bpy.types.Menu):
|
|
bl_label = "External Data"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
layout.operator("file.pack_all", text="Pack into .blend file")
|
|
layout.operator("file.unpack_all", text="Unpack into Files")
|
|
|
|
layout.separator()
|
|
|
|
layout.operator("file.make_paths_relative")
|
|
layout.operator("file.make_paths_absolute")
|
|
layout.operator("file.report_missing_files")
|
|
layout.operator("file.find_missing_files")
|
|
|
|
|
|
class INFO_MT_mesh_add(bpy.types.Menu):
|
|
bl_idname = "INFO_MT_mesh_add"
|
|
bl_label = "Mesh"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("mesh.primitive_plane_add", icon='MESH_PLANE', text="Plane")
|
|
layout.operator("mesh.primitive_cube_add", icon='MESH_CUBE', text="Cube")
|
|
layout.operator("mesh.primitive_circle_add", icon='MESH_CIRCLE', text="Circle")
|
|
layout.operator("mesh.primitive_uv_sphere_add", icon='MESH_UVSPHERE', text="UV Sphere")
|
|
layout.operator("mesh.primitive_ico_sphere_add", icon='MESH_ICOSPHERE', text="Icosphere")
|
|
layout.operator("mesh.primitive_tube_add", icon='MESH_TUBE', text="Tube")
|
|
layout.operator("mesh.primitive_cone_add", icon='MESH_CONE', text="Cone")
|
|
layout.separator()
|
|
layout.operator("mesh.primitive_grid_add", icon='MESH_GRID', text="Grid")
|
|
layout.operator("mesh.primitive_monkey_add", icon='MESH_MONKEY', text="Monkey")
|
|
|
|
|
|
class INFO_MT_curve_add(bpy.types.Menu):
|
|
bl_idname = "INFO_MT_curve_add"
|
|
bl_label = "Curve"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("curve.primitive_bezier_curve_add", icon='CURVE_BEZCURVE', text="Bezier")
|
|
layout.operator("curve.primitive_bezier_circle_add", icon='CURVE_BEZCIRCLE', text="Circle")
|
|
layout.operator("curve.primitive_nurbs_curve_add", icon='CURVE_NCURVE', text="Nurbs Curve")
|
|
layout.operator("curve.primitive_nurbs_circle_add", icon='CURVE_NCIRCLE', text="Nurbs Circle")
|
|
layout.operator("curve.primitive_nurbs_path_add", icon='CURVE_PATH', text="Path")
|
|
|
|
class INFO_MT_surface_add(bpy.types.Menu):
|
|
bl_idname = "INFO_MT_surface_add"
|
|
bl_label = "Surface"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("surface.primitive_nurbs_surface_curve_add", icon='SURFACE_NCURVE', text="NURBS Curve")
|
|
layout.operator("surface.primitive_nurbs_surface_circle_add", icon='SURFACE_NCIRCLE', text="NURBS Circle")
|
|
layout.operator("surface.primitive_nurbs_surface_surface_add", icon='SURFACE_NSURFACE', text="NURBS Surface")
|
|
layout.operator("surface.primitive_nurbs_surface_tube_add", icon='SURFACE_NTUBE', text="NURBS Tube")
|
|
layout.operator("surface.primitive_nurbs_surface_sphere_add", icon='SURFACE_NSPHERE', text="NURBS Sphere")
|
|
layout.operator("surface.primitive_nurbs_surface_donut_add", icon='SURFACE_NDONUT', text="NURBS Torus")
|
|
|
|
class INFO_MT_armature_add(bpy.types.Menu):
|
|
bl_idname = "INFO_MT_armature_add"
|
|
bl_label = "Armature"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.operator("object.armature_add", text="Single Bone", icon='BONE_DATA')
|
|
|
|
|
|
class INFO_MT_add(bpy.types.Menu):
|
|
bl_label = "Add"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
layout.operator_context = 'EXEC_SCREEN'
|
|
|
|
#layout.operator_menu_enum("object.mesh_add", "type", text="Mesh", icon='OUTLINER_OB_MESH')
|
|
layout.menu("INFO_MT_mesh_add", icon='OUTLINER_OB_MESH')
|
|
|
|
#layout.operator_menu_enum("object.curve_add", "type", text="Curve", icon='OUTLINER_OB_CURVE')
|
|
layout.menu("INFO_MT_curve_add", icon='OUTLINER_OB_CURVE')
|
|
#layout.operator_menu_enum("object.surface_add", "type", text="Surface", icon='OUTLINER_OB_SURFACE')
|
|
layout.menu("INFO_MT_surface_add", icon='OUTLINER_OB_SURFACE')
|
|
layout.operator_menu_enum("object.metaball_add", "type", text="Metaball", icon='OUTLINER_OB_META')
|
|
layout.operator("object.text_add", text="Text", icon='OUTLINER_OB_FONT')
|
|
layout.separator()
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
layout.menu("INFO_MT_armature_add", icon='OUTLINER_OB_ARMATURE')
|
|
layout.operator("object.add", text="Lattice", icon='OUTLINER_OB_LATTICE').type = 'LATTICE'
|
|
layout.operator("object.add", text="Empty", icon='OUTLINER_OB_EMPTY').type = 'EMPTY'
|
|
layout.separator()
|
|
|
|
layout.operator("object.camera_add", text="Camera", icon='OUTLINER_OB_CAMERA')
|
|
layout.operator_context = 'EXEC_SCREEN'
|
|
layout.operator_menu_enum("object.lamp_add", "type", text="Lamp", icon='OUTLINER_OB_LAMP')
|
|
layout.separator()
|
|
|
|
layout.operator_menu_enum("object.effector_add", "type", text="Force Field", icon='OUTLINER_OB_EMPTY')
|
|
layout.separator()
|
|
|
|
if(len(bpy.data.groups) > 10):
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
|
layout.operator("object.group_instance_add", text="Group Instance...", icon='OUTLINER_OB_EMPTY')
|
|
else:
|
|
layout.operator_menu_enum("object.group_instance_add", "group", text="Group Instance", icon='OUTLINER_OB_EMPTY')
|
|
|
|
|
|
class INFO_MT_game(bpy.types.Menu):
|
|
bl_label = "Game"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
gs = context.scene.game_data
|
|
|
|
layout.operator("view3d.game_start")
|
|
|
|
layout.separator()
|
|
|
|
layout.prop(gs, "show_debug_properties")
|
|
layout.prop(gs, "show_framerate_profile")
|
|
layout.prop(gs, "show_physics_visualization")
|
|
layout.prop(gs, "use_deprecation_warnings")
|
|
layout.prop(gs, "use_animation_record")
|
|
layout.separator()
|
|
layout.prop(gs, "auto_start")
|
|
|
|
|
|
class INFO_MT_render(bpy.types.Menu):
|
|
bl_label = "Render"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
# rd = context.scene.render
|
|
|
|
layout.operator("render.render", text="Render Image", icon='RENDER_STILL')
|
|
layout.operator("render.render", text="Render Animation", icon='RENDER_ANIMATION').animation = True
|
|
|
|
layout.separator()
|
|
|
|
layout.operator("render.opengl", text="OpenGL Render Image")
|
|
layout.operator("render.opengl", text="OpenGL Render Animation").animation = True
|
|
|
|
layout.separator()
|
|
|
|
layout.operator("render.view_show")
|
|
layout.operator("render.play_rendered_anim")
|
|
|
|
|
|
class INFO_MT_help(bpy.types.Menu):
|
|
bl_label = "Help"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
layout.operator("wm.url_open", text="Manual", icon='HELP').url = 'http://wiki.blender.org/index.php/Doc:Manual'
|
|
layout.operator("wm.url_open", text="Release Log", icon='URL').url = 'http://www.blender.org/development/release-logs/blender-250/'
|
|
|
|
layout.separator()
|
|
|
|
layout.operator("wm.url_open", text="Blender Website", icon='URL').url = 'http://www.blender.org/'
|
|
layout.operator("wm.url_open", text="Blender e-Shop", icon='URL').url = 'http://www.blender.org/e-shop'
|
|
layout.operator("wm.url_open", text="Developer Community", icon='URL').url = 'http://www.blender.org/community/get-involved/'
|
|
layout.operator("wm.url_open", text="User Community", icon='URL').url = 'http://www.blender.org/community/user-community/'
|
|
layout.separator()
|
|
layout.operator("wm.url_open", text="Report a Bug", icon='URL').url = 'http://projects.blender.org/tracker/?atid=498&group_id=9&func=browse'
|
|
layout.separator()
|
|
layout.operator("wm.url_open", text="Python API Reference", icon='URL').url = 'http://www.blender.org/documentation/250PythonDoc/contents.html'
|
|
layout.operator("help.operator_cheat_sheet")
|
|
layout.separator()
|
|
layout.operator("wm.splash")
|
|
|
|
|
|
# Help operators
|
|
|
|
|
|
class HELP_OT_operator_cheat_sheet(bpy.types.Operator):
|
|
bl_idname = "help.operator_cheat_sheet"
|
|
bl_label = "Operator Cheat Sheet (new textblock)"
|
|
|
|
def execute(self, context):
|
|
op_strings = []
|
|
tot = 0
|
|
for op_module_name in dir(bpy.ops):
|
|
op_module = getattr(bpy.ops, op_module_name)
|
|
for op_submodule_name in dir(op_module):
|
|
op = getattr(op_module, op_submodule_name)
|
|
text = repr(op)
|
|
if text.startswith('bpy.ops.'):
|
|
op_strings.append(text)
|
|
tot += 1
|
|
|
|
op_strings.append('')
|
|
|
|
textblock = bpy.data.texts.new("OperatorList.txt")
|
|
textblock.write('# %d Operators\n\n' % tot)
|
|
textblock.write('\n'.join(op_strings))
|
|
self.report({'INFO'}, "See OperatorList.txt textblock")
|
|
return {'FINISHED'}
|
|
|
|
|
|
classes = [
|
|
INFO_HT_header,
|
|
INFO_MT_file,
|
|
INFO_MT_file_import,
|
|
INFO_MT_file_export,
|
|
INFO_MT_file_external_data,
|
|
INFO_MT_add,
|
|
INFO_MT_mesh_add,
|
|
INFO_MT_curve_add,
|
|
INFO_MT_surface_add,
|
|
INFO_MT_armature_add,
|
|
INFO_MT_game,
|
|
INFO_MT_render,
|
|
INFO_MT_help,
|
|
|
|
HELP_OT_operator_cheat_sheet]
|
|
|
|
|
|
def register():
|
|
register = bpy.types.register
|
|
for cls in classes:
|
|
register(cls)
|
|
|
|
|
|
def unregister():
|
|
unregister = bpy.types.unregister
|
|
for cls in classes:
|
|
unregister(cls)
|
|
|
|
if __name__ == "__main__":
|
|
register()
|