diff options
author | Benoit Bolsee <benoit.bolsee@online.be> | 2011-09-07 19:34:04 +0400 |
---|---|---|
committer | Benoit Bolsee <benoit.bolsee@online.be> | 2011-09-07 19:34:04 +0400 |
commit | dbd6658d737b1592a633ddf6397be14e50e434d9 (patch) | |
tree | 57081721d70622a3c3141909b258f9bce8a5b1e3 /release/scripts/startup/bl_ui | |
parent | b5bd86e5907c3fa98546dabeda9703dfb15862f4 (diff) | |
parent | 884fc84793be1c5fdd6643ad267331381f8e1c6b (diff) |
svn merge -r 37306:39975 https://svn.blender.org/svnroot/bf-blender/trunk/blender
Diffstat (limited to 'release/scripts/startup/bl_ui')
45 files changed, 1480 insertions, 954 deletions
diff --git a/release/scripts/startup/bl_ui/__init__.py b/release/scripts/startup/bl_ui/__init__.py index bf63c6071b9..778571632b2 100644 --- a/release/scripts/startup/bl_ui/__init__.py +++ b/release/scripts/startup/bl_ui/__init__.py @@ -36,6 +36,7 @@ _modules = ( "properties_data_mesh", "properties_data_metaball", "properties_data_modifier", + "properties_data_speaker", "properties_game", "properties_material", "properties_object_constraint", @@ -102,7 +103,10 @@ def register(): items.extend([(cat, cat, "") for cat in sorted(items_unique)]) return items - WindowManager.addon_search = StringProperty(name="Search", description="Search within the selected filter") + WindowManager.addon_search = StringProperty( + name="Search", + description="Search within the selected filter", + ) WindowManager.addon_filter = EnumProperty( items=addon_filter_items, name="Category", diff --git a/release/scripts/startup/bl_ui/properties_animviz.py b/release/scripts/startup/bl_ui/properties_animviz.py index eb1bbfd2fb1..3b33a7ccc61 100644 --- a/release/scripts/startup/bl_ui/properties_animviz.py +++ b/release/scripts/startup/bl_ui/properties_animviz.py @@ -94,4 +94,5 @@ class OnionSkinButtonsPanel(): col.prop(arm, "show_only_ghost_selected", text="Selected Only") if __name__ == "__main__": # only for live edit. + import bpy bpy.utils.register_module(__name__) diff --git a/release/scripts/startup/bl_ui/properties_data_armature.py b/release/scripts/startup/bl_ui/properties_data_armature.py index 9477dc866ab..463ba84470f 100644 --- a/release/scripts/startup/bl_ui/properties_data_armature.py +++ b/release/scripts/startup/bl_ui/properties_data_armature.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel, Menu from rna_prop_ui import PropertyPanel @@ -31,7 +32,7 @@ class ArmatureButtonsPanel(): return context.armature -class DATA_PT_context_arm(ArmatureButtonsPanel, bpy.types.Panel): +class DATA_PT_context_arm(ArmatureButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} @@ -48,7 +49,7 @@ class DATA_PT_context_arm(ArmatureButtonsPanel, bpy.types.Panel): layout.template_ID(space, "pin_id") -class DATA_PT_skeleton(ArmatureButtonsPanel, bpy.types.Panel): +class DATA_PT_skeleton(ArmatureButtonsPanel, Panel): bl_label = "Skeleton" def draw(self, context): @@ -70,8 +71,10 @@ class DATA_PT_skeleton(ArmatureButtonsPanel, bpy.types.Panel): flow.prop(arm, "use_deform_envelopes", text="Envelopes") flow.prop(arm, "use_deform_preserve_volume", text="Quaternion") + if context.scene.render.engine == "BLENDER_GAME": + layout.row().prop(arm, "vert_deformer", expand=True) -class DATA_PT_display(ArmatureButtonsPanel, bpy.types.Panel): +class DATA_PT_display(ArmatureButtonsPanel, Panel): bl_label = "Display" def draw(self, context): @@ -96,7 +99,16 @@ class DATA_PT_display(ArmatureButtonsPanel, bpy.types.Panel): col.prop(arm, "use_deform_delay", text="Delay Refresh") -class DATA_PT_bone_groups(ArmatureButtonsPanel, bpy.types.Panel): +class DATA_PT_bone_group_specials(Menu): + bl_label = "Bone Group Specials" + + def draw(self, context): + layout = self.layout + + layout.operator("pose.group_sort", icon='SORTALPHA') + + +class DATA_PT_bone_groups(ArmatureButtonsPanel, Panel): bl_label = "Bone Groups" @classmethod @@ -108,16 +120,25 @@ class DATA_PT_bone_groups(ArmatureButtonsPanel, bpy.types.Panel): ob = context.object pose = ob.pose + group = pose.bone_groups.active row = layout.row() - row.template_list(pose, "bone_groups", pose.bone_groups, "active_index", rows=2) + + rows = 2 + if group: + rows = 5 + row.template_list(pose, "bone_groups", pose.bone_groups, "active_index", rows=rows) col = row.column(align=True) col.active = (ob.proxy is None) col.operator("pose.group_add", icon='ZOOMIN', text="") col.operator("pose.group_remove", icon='ZOOMOUT', text="") + col.menu("DATA_PT_bone_group_specials", icon='DOWNARROW_HLT', text="") + if group: + col.separator() + col.operator("pose.group_move", icon='TRIA_UP', text="").direction = 'UP' + col.operator("pose.group_move", icon='TRIA_DOWN', text="").direction = 'DOWN' - group = pose.bone_groups.active if group: col = layout.column() col.active = (ob.proxy is None) @@ -147,7 +168,7 @@ class DATA_PT_bone_groups(ArmatureButtonsPanel, bpy.types.Panel): sub.operator("pose.group_deselect", text="Deselect") -class DATA_PT_pose_library(ArmatureButtonsPanel, bpy.types.Panel): +class DATA_PT_pose_library(ArmatureButtonsPanel, Panel): bl_label = "Pose Library" bl_options = {'DEFAULT_CLOSED'} @@ -164,9 +185,13 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, bpy.types.Panel): layout.template_ID(ob, "pose_library", new="poselib.new", unlink="poselib.unlink") if poselib: + + # list of poses in pose library row = layout.row() row.template_list(poselib, "pose_markers", poselib.pose_markers, "active_index", rows=5) - + + # column of operators for active pose + # - goes beside list col = row.column(align=True) col.active = (poselib.library is None) @@ -181,12 +206,16 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, bpy.types.Panel): if pose_marker_active is not None: col.operator("poselib.pose_remove", icon='ZOOMOUT', text="").pose = pose_marker_active.name col.operator("poselib.apply_pose", icon='ZOOM_SELECTED', text="").pose_index = poselib.pose_markers.active_index - - layout.operator("poselib.action_sanitise") + + col.operator("poselib.action_sanitise", icon='HELP', text="") # XXX: put in menu? + + # properties for active marker + if pose_marker_active is not None: + layout.prop(pose_marker_active, "name") # TODO: this panel will soon be depreceated too -class DATA_PT_ghost(ArmatureButtonsPanel, bpy.types.Panel): +class DATA_PT_ghost(ArmatureButtonsPanel, Panel): bl_label = "Ghost" def draw(self, context): @@ -213,7 +242,7 @@ class DATA_PT_ghost(ArmatureButtonsPanel, bpy.types.Panel): col.prop(arm, "show_only_ghost_selected", text="Selected Only") -class DATA_PT_iksolver_itasc(ArmatureButtonsPanel, bpy.types.Panel): +class DATA_PT_iksolver_itasc(ArmatureButtonsPanel, Panel): bl_label = "iTaSC parameters" bl_options = {'DEFAULT_CLOSED'} @@ -266,7 +295,7 @@ from bl_ui.properties_animviz import ( ) -class DATA_PT_motion_paths(MotionPathButtonsPanel, bpy.types.Panel): +class DATA_PT_motion_paths(MotionPathButtonsPanel, Panel): #bl_label = "Bones Motion Paths" bl_context = "data" @@ -289,7 +318,7 @@ class DATA_PT_motion_paths(MotionPathButtonsPanel, bpy.types.Panel): split.operator("pose.paths_clear", text="Clear Paths") -class DATA_PT_onion_skinning(OnionSkinButtonsPanel): # , bpy.types.Panel): # inherit from panel when ready +class DATA_PT_onion_skinning(OnionSkinButtonsPanel): # , Panel): # inherit from panel when ready #bl_label = "Bones Onion Skinning" bl_context = "data" @@ -299,14 +328,11 @@ class DATA_PT_onion_skinning(OnionSkinButtonsPanel): # , bpy.types.Panel): # in return (context.object) and (context.armature) def draw(self, context): - layout = self.layout - ob = context.object - self.draw_settings(context, ob.pose.animation_visualisation, bones=True) -class DATA_PT_custom_props_arm(ArmatureButtonsPanel, PropertyPanel, bpy.types.Panel): +class DATA_PT_custom_props_arm(ArmatureButtonsPanel, PropertyPanel, Panel): COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} _context_path = "object.data" _property_type = bpy.types.Armature diff --git a/release/scripts/startup/bl_ui/properties_data_bone.py b/release/scripts/startup/bl_ui/properties_data_bone.py index 9fc055e9343..b3eaf88d5bf 100644 --- a/release/scripts/startup/bl_ui/properties_data_bone.py +++ b/release/scripts/startup/bl_ui/properties_data_bone.py @@ -19,6 +19,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel from rna_prop_ui import PropertyPanel @@ -32,7 +33,7 @@ class BoneButtonsPanel(): return (context.bone or context.edit_bone) -class BONE_PT_context_bone(BoneButtonsPanel, bpy.types.Panel): +class BONE_PT_context_bone(BoneButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} @@ -48,7 +49,7 @@ class BONE_PT_context_bone(BoneButtonsPanel, bpy.types.Panel): row.prop(bone, "name", text="") -class BONE_PT_transform(BoneButtonsPanel, bpy.types.Panel): +class BONE_PT_transform(BoneButtonsPanel, Panel): bl_label = "Transform" @classmethod @@ -102,7 +103,7 @@ class BONE_PT_transform(BoneButtonsPanel, bpy.types.Panel): sub.prop(bone, "lock") -class BONE_PT_transform_locks(BoneButtonsPanel, bpy.types.Panel): +class BONE_PT_transform_locks(BoneButtonsPanel, Panel): bl_label = "Transform Locks" bl_options = {'DEFAULT_CLOSED'} @@ -135,7 +136,7 @@ class BONE_PT_transform_locks(BoneButtonsPanel, bpy.types.Panel): row.column().prop(pchan, "lock_scale") -class BONE_PT_relations(BoneButtonsPanel, bpy.types.Panel): +class BONE_PT_relations(BoneButtonsPanel, Panel): bl_label = "Relations" def draw(self, context): @@ -180,7 +181,7 @@ class BONE_PT_relations(BoneButtonsPanel, bpy.types.Panel): sub.prop(bone, "use_local_location", text="Local Location") -class BONE_PT_display(BoneButtonsPanel, bpy.types.Panel): +class BONE_PT_display(BoneButtonsPanel, Panel): bl_label = "Display" @classmethod @@ -217,7 +218,7 @@ class BONE_PT_display(BoneButtonsPanel, bpy.types.Panel): col.prop_search(pchan, "custom_shape_transform", ob.pose, "bones", text="At") -class BONE_PT_inverse_kinematics(BoneButtonsPanel, bpy.types.Panel): +class BONE_PT_inverse_kinematics(BoneButtonsPanel, Panel): bl_label = "Inverse Kinematics" bl_options = {'DEFAULT_CLOSED'} @@ -308,7 +309,7 @@ class BONE_PT_inverse_kinematics(BoneButtonsPanel, bpy.types.Panel): #row.prop(pchan, "ik_linear_weight", text="Weight", slider=True) -class BONE_PT_deform(BoneButtonsPanel, bpy.types.Panel): +class BONE_PT_deform(BoneButtonsPanel, Panel): bl_label = "Deform" bl_options = {'DEFAULT_CLOSED'} @@ -357,7 +358,7 @@ class BONE_PT_deform(BoneButtonsPanel, bpy.types.Panel): col.prop(bone, "use_cyclic_offset") -class BONE_PT_custom_props(BoneButtonsPanel, PropertyPanel, bpy.types.Panel): +class BONE_PT_custom_props(BoneButtonsPanel, PropertyPanel, Panel): COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} _property_type = bpy.types.Bone, bpy.types.EditBone, bpy.types.PoseBone diff --git a/release/scripts/startup/bl_ui/properties_data_camera.py b/release/scripts/startup/bl_ui/properties_data_camera.py index 80cd5227fca..5255af40951 100644 --- a/release/scripts/startup/bl_ui/properties_data_camera.py +++ b/release/scripts/startup/bl_ui/properties_data_camera.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel from rna_prop_ui import PropertyPanel @@ -32,7 +33,7 @@ class CameraButtonsPanel(): return context.camera and (engine in cls.COMPAT_ENGINES) -class DATA_PT_context_camera(CameraButtonsPanel, bpy.types.Panel): +class DATA_PT_context_camera(CameraButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -53,7 +54,7 @@ class DATA_PT_context_camera(CameraButtonsPanel, bpy.types.Panel): split.separator() -class DATA_PT_camera(CameraButtonsPanel, bpy.types.Panel): +class DATA_PT_camera(CameraButtonsPanel, Panel): bl_label = "Lens" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -106,12 +107,12 @@ class DATA_PT_camera(CameraButtonsPanel, bpy.types.Panel): col = split.column() - if cam.dof_object != None: + if cam.dof_object is not None: col.enabled = False col.prop(cam, "dof_distance", text="Distance") -class DATA_PT_camera_display(CameraButtonsPanel, bpy.types.Panel): +class DATA_PT_camera_display(CameraButtonsPanel, Panel): bl_label = "Display" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -138,7 +139,7 @@ class DATA_PT_camera_display(CameraButtonsPanel, bpy.types.Panel): sub.prop(cam, "passepartout_alpha", text="Alpha", slider=True) -class DATA_PT_custom_props_camera(CameraButtonsPanel, PropertyPanel, bpy.types.Panel): +class DATA_PT_custom_props_camera(CameraButtonsPanel, PropertyPanel, Panel): COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} _context_path = "object.data" _property_type = bpy.types.Camera diff --git a/release/scripts/startup/bl_ui/properties_data_curve.py b/release/scripts/startup/bl_ui/properties_data_curve.py index 11a129377e8..6448b9a5229 100644 --- a/release/scripts/startup/bl_ui/properties_data_curve.py +++ b/release/scripts/startup/bl_ui/properties_data_curve.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel from rna_prop_ui import PropertyPanel @@ -48,7 +49,7 @@ class CurveButtonsPanelActive(CurveButtonsPanel): return (curve and type(curve) is not bpy.types.TextCurve and curve.splines.active) -class DATA_PT_context_curve(CurveButtonsPanel, bpy.types.Panel): +class DATA_PT_context_curve(CurveButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} @@ -65,7 +66,7 @@ class DATA_PT_context_curve(CurveButtonsPanel, bpy.types.Panel): layout.template_ID(space, "pin_id") # XXX: broken -class DATA_PT_shape_curve(CurveButtonsPanel, bpy.types.Panel): +class DATA_PT_shape_curve(CurveButtonsPanel, Panel): bl_label = "Shape" def draw(self, context): @@ -108,21 +109,32 @@ class DATA_PT_shape_curve(CurveButtonsPanel, bpy.types.Panel): if (is_curve or is_text): col.label(text="Fill:") sub = col.column() - sub.active = (curve.bevel_object is None) + sub.active = (curve.dimensions == '2D' or (curve.bevel_object is None and curve.dimensions == '3D')) sub.prop(curve, "use_fill_front") sub.prop(curve, "use_fill_back") col.prop(curve, "use_fill_deform", text="Fill Deformed") - col.label(text="Textures:") - col.prop(curve, "use_uv_as_generated") - col.prop(curve, "use_auto_texspace") - + +class DATA_PT_curve_texture_space(CurveButtonsPanel, Panel): + bl_label = "Texture Space" + bl_options = {'DEFAULT_CLOSED'} + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} + + def draw(self, context): + layout = self.layout + + curve = context.curve + + row = layout.row() + row.prop(curve, "use_auto_texspace") + row.prop(curve, "use_uv_as_generated") + row = layout.row() - row.column().prop(curve, "texspace_location") - row.column().prop(curve, "texspace_size") + row.column().prop(curve, "texspace_location", text="Location") + row.column().prop(curve, "texspace_size", text="Size") -class DATA_PT_geometry_curve(CurveButtonsPanel, bpy.types.Panel): +class DATA_PT_geometry_curve(CurveButtonsPanel, Panel): bl_label = "Geometry" @classmethod @@ -155,7 +167,7 @@ class DATA_PT_geometry_curve(CurveButtonsPanel, bpy.types.Panel): col.prop(curve, "bevel_object", text="") -class DATA_PT_pathanim(CurveButtonsPanelCurve, bpy.types.Panel): +class DATA_PT_pathanim(CurveButtonsPanelCurve, Panel): bl_label = "Path Animation" def draw_header(self, context): @@ -186,7 +198,7 @@ class DATA_PT_pathanim(CurveButtonsPanelCurve, bpy.types.Panel): col.prop(curve, "use_time_offset", text="Offset Children") -class DATA_PT_active_spline(CurveButtonsPanelActive, bpy.types.Panel): +class DATA_PT_active_spline(CurveButtonsPanelActive, Panel): bl_label = "Active Spline" def draw(self, context): @@ -257,7 +269,7 @@ class DATA_PT_active_spline(CurveButtonsPanelActive, bpy.types.Panel): layout.prop(act_spline, "use_smooth") -class DATA_PT_font(CurveButtonsPanel, bpy.types.Panel): +class DATA_PT_font(CurveButtonsPanel, Panel): bl_label = "Font" @classmethod @@ -321,7 +333,7 @@ class DATA_PT_font(CurveButtonsPanel, bpy.types.Panel): row.prop(char, "use_small_caps") -class DATA_PT_paragraph(CurveButtonsPanel, bpy.types.Panel): +class DATA_PT_paragraph(CurveButtonsPanel, Panel): bl_label = "Paragraph" @classmethod @@ -350,7 +362,7 @@ class DATA_PT_paragraph(CurveButtonsPanel, bpy.types.Panel): col.prop(text, "offset_y", text="Y") -class DATA_PT_textboxes(CurveButtonsPanel, bpy.types.Panel): +class DATA_PT_text_boxes(CurveButtonsPanel, Panel): bl_label = "Text Boxes" @classmethod @@ -390,7 +402,7 @@ class DATA_PT_textboxes(CurveButtonsPanel, bpy.types.Panel): row.operator("font.textbox_remove", text='', icon='X', emboss=False).index = i -class DATA_PT_custom_props_curve(CurveButtonsPanel, PropertyPanel, bpy.types.Panel): +class DATA_PT_custom_props_curve(CurveButtonsPanel, PropertyPanel, Panel): COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} _context_path = "object.data" _property_type = bpy.types.Curve diff --git a/release/scripts/startup/bl_ui/properties_data_empty.py b/release/scripts/startup/bl_ui/properties_data_empty.py index 5a0d327f90d..c781873e16c 100644 --- a/release/scripts/startup/bl_ui/properties_data_empty.py +++ b/release/scripts/startup/bl_ui/properties_data_empty.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel class DataButtonsPanel(): @@ -30,7 +31,7 @@ class DataButtonsPanel(): return (context.object and context.object.type == 'EMPTY') -class DATA_PT_empty(DataButtonsPanel, bpy.types.Panel): +class DATA_PT_empty(DataButtonsPanel, Panel): bl_label = "Empty" def draw(self, context): @@ -41,11 +42,9 @@ class DATA_PT_empty(DataButtonsPanel, bpy.types.Panel): layout.prop(ob, "empty_draw_type", text="Display") if ob.empty_draw_type == 'IMAGE': - # layout.template_image(ob, "data", None) layout.template_ID(ob, "data", open="image.open", unlink="image.unlink") - row = layout.row(align=True) - row.prop(ob, "color", text="Transparency", index=3, slider=True) + layout.prop(ob, "color", text="Transparency", index=3, slider=True) row = layout.row(align=True) row.prop(ob, "empty_image_offset", text="Offset X", index=0) row.prop(ob, "empty_image_offset", text="Offset Y", index=1) diff --git a/release/scripts/startup/bl_ui/properties_data_lamp.py b/release/scripts/startup/bl_ui/properties_data_lamp.py index 36010c8b511..4ff180f74fb 100644 --- a/release/scripts/startup/bl_ui/properties_data_lamp.py +++ b/release/scripts/startup/bl_ui/properties_data_lamp.py @@ -18,15 +18,16 @@ # <pep8 compliant> import bpy +from bpy.types import Menu, Panel from rna_prop_ui import PropertyPanel -class LAMP_MT_sunsky_presets(bpy.types.Menu): +class LAMP_MT_sunsky_presets(Menu): bl_label = "Sun & Sky Presets" preset_subdir = "sunsky" preset_operator = "script.execute_preset" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} - draw = bpy.types.Menu.draw_preset + draw = Menu.draw_preset class DataButtonsPanel(): @@ -40,7 +41,7 @@ class DataButtonsPanel(): return context.lamp and (engine in cls.COMPAT_ENGINES) -class DATA_PT_context_lamp(DataButtonsPanel, bpy.types.Panel): +class DATA_PT_context_lamp(DataButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -65,7 +66,7 @@ class DATA_PT_context_lamp(DataButtonsPanel, bpy.types.Panel): split.label(text=str(texture_count), icon='TEXTURE') -class DATA_PT_preview(DataButtonsPanel, bpy.types.Panel): +class DATA_PT_preview(DataButtonsPanel, Panel): bl_label = "Preview" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -73,7 +74,7 @@ class DATA_PT_preview(DataButtonsPanel, bpy.types.Panel): self.layout.template_preview(context.lamp) -class DATA_PT_lamp(DataButtonsPanel, bpy.types.Panel): +class DATA_PT_lamp(DataButtonsPanel, Panel): bl_label = "Lamp" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -115,7 +116,7 @@ class DATA_PT_lamp(DataButtonsPanel, bpy.types.Panel): col.prop(lamp, "use_diffuse") -class DATA_PT_sunsky(DataButtonsPanel, bpy.types.Panel): +class DATA_PT_sunsky(DataButtonsPanel, Panel): bl_label = "Sky & Atmosphere" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -187,7 +188,7 @@ class DATA_PT_sunsky(DataButtonsPanel, bpy.types.Panel): sub.prop(lamp, "atmosphere_extinction", slider=True, text="Extinction") -class DATA_PT_shadow(DataButtonsPanel, bpy.types.Panel): +class DATA_PT_shadow(DataButtonsPanel, Panel): bl_label = "Shadow" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -302,7 +303,7 @@ class DATA_PT_shadow(DataButtonsPanel, bpy.types.Panel): sub.prop(lamp, "shadow_buffer_clip_end", text=" Clip End") -class DATA_PT_area(DataButtonsPanel, bpy.types.Panel): +class DATA_PT_area(DataButtonsPanel, Panel): bl_label = "Area Shape" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -328,7 +329,7 @@ class DATA_PT_area(DataButtonsPanel, bpy.types.Panel): sub.prop(lamp, "size_y", text="Size Y") -class DATA_PT_spot(DataButtonsPanel, bpy.types.Panel): +class DATA_PT_spot(DataButtonsPanel, Panel): bl_label = "Spot Shape" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -362,7 +363,7 @@ class DATA_PT_spot(DataButtonsPanel, bpy.types.Panel): sub.prop(lamp, "halo_step", text="Step") -class DATA_PT_falloff_curve(DataButtonsPanel, bpy.types.Panel): +class DATA_PT_falloff_curve(DataButtonsPanel, Panel): bl_label = "Falloff Curve" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -380,7 +381,7 @@ class DATA_PT_falloff_curve(DataButtonsPanel, bpy.types.Panel): self.layout.template_curve_mapping(lamp, "falloff_curve") -class DATA_PT_custom_props_lamp(DataButtonsPanel, PropertyPanel, bpy.types.Panel): +class DATA_PT_custom_props_lamp(DataButtonsPanel, PropertyPanel, Panel): COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} _context_path = "object.data" _property_type = bpy.types.Lamp diff --git a/release/scripts/startup/bl_ui/properties_data_lattice.py b/release/scripts/startup/bl_ui/properties_data_lattice.py index cd719b6fe84..14d6ea66894 100644 --- a/release/scripts/startup/bl_ui/properties_data_lattice.py +++ b/release/scripts/startup/bl_ui/properties_data_lattice.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel from rna_prop_ui import PropertyPanel @@ -31,7 +32,7 @@ class DataButtonsPanel(): return context.lattice -class DATA_PT_context_lattice(DataButtonsPanel, bpy.types.Panel): +class DATA_PT_context_lattice(DataButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} @@ -51,7 +52,7 @@ class DATA_PT_context_lattice(DataButtonsPanel, bpy.types.Panel): split.separator() -class DATA_PT_lattice(DataButtonsPanel, bpy.types.Panel): +class DATA_PT_lattice(DataButtonsPanel, Panel): bl_label = "Lattice" def draw(self, context): @@ -76,7 +77,7 @@ class DATA_PT_lattice(DataButtonsPanel, bpy.types.Panel): row.prop_search(lat, "vertex_group", context.object, "vertex_groups", text="") -class DATA_PT_custom_props_lattice(DataButtonsPanel, PropertyPanel, bpy.types.Panel): +class DATA_PT_custom_props_lattice(DataButtonsPanel, PropertyPanel, Panel): COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} _context_path = "object.data" _property_type = bpy.types.Lattice diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py index e2c88413177..75df7dad5f2 100644 --- a/release/scripts/startup/bl_ui/properties_data_mesh.py +++ b/release/scripts/startup/bl_ui/properties_data_mesh.py @@ -18,10 +18,11 @@ # <pep8 compliant> import bpy +from bpy.types import Menu, Panel from rna_prop_ui import PropertyPanel -class MESH_MT_vertex_group_specials(bpy.types.Menu): +class MESH_MT_vertex_group_specials(Menu): bl_label = "Vertex Group Specials" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -36,7 +37,7 @@ class MESH_MT_vertex_group_specials(bpy.types.Menu): layout.operator("object.vertex_group_remove", icon='X', text="Delete All").all = True -class MESH_MT_shape_key_specials(bpy.types.Menu): +class MESH_MT_shape_key_specials(Menu): bl_label = "Shape Key Specials" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -61,7 +62,7 @@ class MeshButtonsPanel(): return context.mesh and (engine in cls.COMPAT_ENGINES) -class DATA_PT_context_mesh(MeshButtonsPanel, bpy.types.Panel): +class DATA_PT_context_mesh(MeshButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -79,7 +80,7 @@ class DATA_PT_context_mesh(MeshButtonsPanel, bpy.types.Panel): layout.template_ID(space, "pin_id") -class DATA_PT_normals(MeshButtonsPanel, bpy.types.Panel): +class DATA_PT_normals(MeshButtonsPanel, Panel): bl_label = "Normals" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -99,7 +100,7 @@ class DATA_PT_normals(MeshButtonsPanel, bpy.types.Panel): split.prop(mesh, "show_double_sided") -class DATA_PT_texture_space(MeshButtonsPanel, bpy.types.Panel): +class DATA_PT_texture_space(MeshButtonsPanel, Panel): bl_label = "Texture Space" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -118,7 +119,8 @@ class DATA_PT_texture_space(MeshButtonsPanel, bpy.types.Panel): row.column().prop(mesh, "texspace_location", text="Location") row.column().prop(mesh, "texspace_size", text="Size") -class DATA_PT_vertex_groups(MeshButtonsPanel, bpy.types.Panel): + +class DATA_PT_vertex_groups(MeshButtonsPanel, Panel): bl_label = "Vertex Groups" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -167,7 +169,7 @@ class DATA_PT_vertex_groups(MeshButtonsPanel, bpy.types.Panel): layout.prop(context.tool_settings, "vertex_group_weight", text="Weight") -class DATA_PT_shape_keys(MeshButtonsPanel, bpy.types.Panel): +class DATA_PT_shape_keys(MeshButtonsPanel, Panel): bl_label = "Shape Keys" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -260,7 +262,7 @@ class DATA_PT_shape_keys(MeshButtonsPanel, bpy.types.Panel): row.prop(key, "slurph") -class DATA_PT_uv_texture(MeshButtonsPanel, bpy.types.Panel): +class DATA_PT_uv_texture(MeshButtonsPanel, Panel): bl_label = "UV Texture" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -283,15 +285,14 @@ class DATA_PT_uv_texture(MeshButtonsPanel, bpy.types.Panel): layout.prop(lay, "name") -class DATA_PT_texface(MeshButtonsPanel, bpy.types.Panel): +class DATA_PT_texface(MeshButtonsPanel, Panel): bl_label = "Texture Face" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @classmethod def poll(cls, context): - ob = context.active_object - - return (context.mode == 'EDIT_MESH') and ob and ob.type == 'MESH' + obj = context.object + return (context.mode == 'EDIT_MESH') and obj and obj.type == 'MESH' def draw(self, context): layout = self.layout @@ -331,7 +332,7 @@ class DATA_PT_texface(MeshButtonsPanel, bpy.types.Panel): col.label(text="No UV Texture") -class DATA_PT_vertex_colors(MeshButtonsPanel, bpy.types.Panel): +class DATA_PT_vertex_colors(MeshButtonsPanel, Panel): bl_label = "Vertex Colors" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -354,7 +355,7 @@ class DATA_PT_vertex_colors(MeshButtonsPanel, bpy.types.Panel): layout.prop(lay, "name") -class DATA_PT_custom_props_mesh(MeshButtonsPanel, PropertyPanel, bpy.types.Panel): +class DATA_PT_custom_props_mesh(MeshButtonsPanel, PropertyPanel, Panel): COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} _context_path = "object.data" _property_type = bpy.types.Mesh diff --git a/release/scripts/startup/bl_ui/properties_data_metaball.py b/release/scripts/startup/bl_ui/properties_data_metaball.py index c568d10b3b0..cd894e60dbb 100644 --- a/release/scripts/startup/bl_ui/properties_data_metaball.py +++ b/release/scripts/startup/bl_ui/properties_data_metaball.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel from rna_prop_ui import PropertyPanel @@ -31,7 +32,7 @@ class DataButtonsPanel(): return context.meta_ball -class DATA_PT_context_metaball(DataButtonsPanel, bpy.types.Panel): +class DATA_PT_context_metaball(DataButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} @@ -48,7 +49,7 @@ class DATA_PT_context_metaball(DataButtonsPanel, bpy.types.Panel): layout.template_ID(space, "pin_id") -class DATA_PT_metaball(DataButtonsPanel, bpy.types.Panel): +class DATA_PT_metaball(DataButtonsPanel, Panel): bl_label = "Metaball" def draw(self, context): @@ -70,13 +71,26 @@ class DATA_PT_metaball(DataButtonsPanel, bpy.types.Panel): layout.label(text="Update:") layout.prop(mball, "update_method", expand=True) - + + +class DATA_PT_mball_texture_space(DataButtonsPanel, Panel): + bl_label = "Texture Space" + bl_options = {'DEFAULT_CLOSED'} + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} + + def draw(self, context): + layout = self.layout + + mball = context.meta_ball + + layout.prop(mball, "use_auto_texspace") + row = layout.row() - row.column().prop(mball, "texspace_location") - row.column().prop(mball, "texspace_size") + row.column().prop(mball, "texspace_location", text="Location") + row.column().prop(mball, "texspace_size", text="Size") -class DATA_PT_metaball_element(DataButtonsPanel, bpy.types.Panel): +class DATA_PT_metaball_element(DataButtonsPanel, Panel): bl_label = "Active Element" @classmethod @@ -116,7 +130,7 @@ class DATA_PT_metaball_element(DataButtonsPanel, bpy.types.Panel): col.prop(metaelem, "size_y", text="Y") -class DATA_PT_custom_props_metaball(DataButtonsPanel, PropertyPanel, bpy.types.Panel): +class DATA_PT_custom_props_metaball(DataButtonsPanel, PropertyPanel, Panel): COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} _context_path = "object.data" _property_type = bpy.types.MetaBall diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 6fd5890590d..dc6b5401168 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel class ModifierButtonsPanel(): @@ -26,7 +27,7 @@ class ModifierButtonsPanel(): bl_context = "modifier" -class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel): +class DATA_PT_modifiers(ModifierButtonsPanel, Panel): bl_label = "Modifiers" def draw(self, context): @@ -402,6 +403,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel): col.operator("object.multires_higher_levels_delete", text="Delete Higher") col.operator("object.multires_reshape", text="Reshape") col.operator("object.multires_base_apply", text="Apply Base") + col.prop(md, "use_subsurf_uv") col.prop(md, "show_only_control_edges") layout.separator() @@ -491,11 +493,10 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel): col.label(text="Mode:") col.prop(md, "wrap_method", text="") - split = layout.split(percentage=0.25) - - col = split.column() - if md.wrap_method == 'PROJECT': + split = layout.split(percentage=0.25) + + col = split.column() col.label(text="Axis:") col.prop(md, "use_project_x") col.prop(md, "use_project_y") @@ -507,7 +508,6 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel): col.prop(md, "use_positive_direction") col = split.column() - col.label(text="Cull Faces:") col.prop(md, "cull_face", expand=True) @@ -585,13 +585,13 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel): sub = col.column() sub.active = bool(md.vertex_group) sub.prop(md, "invert_vertex_group", text="Invert") + sub.prop(md, "thickness_vertex_group", text="Factor") col.prop(md, "use_even_offset") col.prop(md, "use_quality_normals") col.prop(md, "use_rim") sub = col.column() - sub.label() row = sub.split(align=True, percentage=0.4) row.prop(md, "material_offset", text="") row = row.row() diff --git a/release/scripts/startup/bl_ui/properties_data_speaker.py b/release/scripts/startup/bl_ui/properties_data_speaker.py new file mode 100644 index 00000000000..657c0fe652a --- /dev/null +++ b/release/scripts/startup/bl_ui/properties_data_speaker.py @@ -0,0 +1,125 @@ +# ##### 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 +from rna_prop_ui import PropertyPanel + + +class DataButtonsPanel(): + bl_space_type = 'PROPERTIES' + bl_region_type = 'WINDOW' + bl_context = "data" + + @classmethod + def poll(cls, context): + engine = context.scene.render.engine + return context.speaker and (engine in cls.COMPAT_ENGINES) + + +class DATA_PT_context_speaker(DataButtonsPanel, bpy.types.Panel): + bl_label = "" + bl_options = {'HIDE_HEADER'} + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} + + def draw(self, context): + layout = self.layout + + ob = context.object + speaker = context.speaker + space = context.space_data + + split = layout.split(percentage=0.65) + + if ob: + split.template_ID(ob, "data") + elif speaker: + split.template_ID(space, "pin_id") + + +class DATA_PT_speaker(DataButtonsPanel, bpy.types.Panel): + bl_label = "Sound" + COMPAT_ENGINES = {'BLENDER_RENDER'} + + def draw(self, context): + layout = self.layout + + speaker = context.speaker + + split = layout.split(percentage=0.75) + + split.template_ID(speaker, "sound", open="sound.open_mono") + split.prop(speaker, "muted") + + row = layout.row() + row.prop(speaker, "volume") + row.prop(speaker, "pitch") + + +class DATA_PT_distance(DataButtonsPanel, bpy.types.Panel): + bl_label = "Distance" + COMPAT_ENGINES = {'BLENDER_RENDER'} + + def draw(self, context): + layout = self.layout + + speaker = context.speaker + + split = layout.split() + + col = split.column() + col.label("Volume:") + col.prop(speaker, "volume_min", text="Minimum") + col.prop(speaker, "volume_max", text="Maximum") + col.prop(speaker, "attenuation") + + col = split.column() + col.label("Distance:") + col.prop(speaker, "distance_max", text="Maximum") + col.prop(speaker, "distance_reference", text="Reference") + + +class DATA_PT_cone(DataButtonsPanel, bpy.types.Panel): + bl_label = "Cone" + COMPAT_ENGINES = {'BLENDER_RENDER'} + + def draw(self, context): + layout = self.layout + + speaker = context.speaker + + split = layout.split() + col = split.column() + + col.label("Angle:") + col.prop(speaker, "cone_angle_outer", text="Outer") + col.prop(speaker, "cone_angle_inner", text="Inner") + + col = split.column() + + col.label("Volume:") + col.prop(speaker, "cone_volume_outer", text="Outer") + + +class DATA_PT_custom_props_speaker(DataButtonsPanel, PropertyPanel, bpy.types.Panel): + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} + _context_path = "object.data" + _property_type = bpy.types.Speaker + +if __name__ == "__main__": # only for live edit. + bpy.utils.register_module(__name__) diff --git a/release/scripts/startup/bl_ui/properties_game.py b/release/scripts/startup/bl_ui/properties_game.py index 6952f3c31db..16c7adbe5ff 100644 --- a/release/scripts/startup/bl_ui/properties_game.py +++ b/release/scripts/startup/bl_ui/properties_game.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel class PhysicsButtonsPanel(): @@ -26,7 +27,7 @@ class PhysicsButtonsPanel(): bl_context = "physics" -class PHYSICS_PT_game_physics(PhysicsButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_game_physics(PhysicsButtonsPanel, Panel): bl_label = "Physics" COMPAT_ENGINES = {'BLENDER_GAME'} @@ -167,7 +168,7 @@ class PHYSICS_PT_game_physics(PhysicsButtonsPanel, bpy.types.Panel): layout.prop(ob, "hide_render", text="Invisible") -class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel, Panel): bl_label = "Collision Bounds" COMPAT_ENGINES = {'BLENDER_GAME'} @@ -231,7 +232,7 @@ class RenderButtonsPanel(): return (rd.engine in cls.COMPAT_ENGINES) -class RENDER_PT_game(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_game(RenderButtonsPanel, Panel): bl_label = "Game" COMPAT_ENGINES = {'BLENDER_GAME'} @@ -243,7 +244,7 @@ class RENDER_PT_game(RenderButtonsPanel, bpy.types.Panel): row.label() -class RENDER_PT_game_player(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_game_player(RenderButtonsPanel, Panel): bl_label = "Standalone Player" COMPAT_ENGINES = {'BLENDER_GAME'} @@ -276,7 +277,7 @@ class RENDER_PT_game_player(RenderButtonsPanel, bpy.types.Panel): col.prop(gs, "frame_color", text="") -class RENDER_PT_game_stereo(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_game_stereo(RenderButtonsPanel, Panel): bl_label = "Stereo" COMPAT_ENGINES = {'BLENDER_GAME'} @@ -330,7 +331,7 @@ class RENDER_PT_game_stereo(RenderButtonsPanel, bpy.types.Panel): layout.prop(gs, "dome_text") -class RENDER_PT_game_shading(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_game_shading(RenderButtonsPanel, Panel): bl_label = "Shading" COMPAT_ENGINES = {'BLENDER_GAME'} @@ -356,7 +357,7 @@ class RENDER_PT_game_shading(RenderButtonsPanel, bpy.types.Panel): col.prop(gs, "use_glsl_extra_textures", text="Extra Textures") -class RENDER_PT_game_performance(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_game_performance(RenderButtonsPanel, Panel): bl_label = "Performance" COMPAT_ENGINES = {'BLENDER_GAME'} @@ -364,12 +365,15 @@ class RENDER_PT_game_performance(RenderButtonsPanel, bpy.types.Panel): layout = self.layout gs = context.scene.game_settings - row = layout.row() + col = layout.column() + row = col.row() row.prop(gs, "use_frame_rate") row.prop(gs, "use_display_lists") + + col.prop(gs, "restrict_animation_updates") -class RENDER_PT_game_display(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_game_display(RenderButtonsPanel, Panel): bl_label = "Display" COMPAT_ENGINES = {'BLENDER_GAME'} @@ -385,28 +389,13 @@ class RENDER_PT_game_display(RenderButtonsPanel, bpy.types.Panel): flow.prop(gs, "show_mouse", text="Mouse Cursor") -class RENDER_PT_game_sound(RenderButtonsPanel, bpy.types.Panel): - bl_label = "Sound" - COMPAT_ENGINES = {'BLENDER_GAME'} - - def draw(self, context): - layout = self.layout - - scene = context.scene - - layout.prop(scene, "audio_distance_model") - - layout.prop(scene, "audio_doppler_speed", text="Speed") - layout.prop(scene, "audio_doppler_factor") - - class WorldButtonsPanel(): bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_context = "world" -class WORLD_PT_game_context_world(WorldButtonsPanel, bpy.types.Panel): +class WORLD_PT_game_context_world(WorldButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} COMPAT_ENGINES = {'BLENDER_GAME'} @@ -430,7 +419,7 @@ class WORLD_PT_game_context_world(WorldButtonsPanel, bpy.types.Panel): split.template_ID(space, "pin_id") -class WORLD_PT_game_world(WorldButtonsPanel, bpy.types.Panel): +class WORLD_PT_game_world(WorldButtonsPanel, Panel): bl_label = "World" COMPAT_ENGINES = {'BLENDER_GAME'} @@ -449,7 +438,7 @@ class WORLD_PT_game_world(WorldButtonsPanel, bpy.types.Panel): row.column().prop(world, "ambient_color") -class WORLD_PT_game_mist(WorldButtonsPanel, bpy.types.Panel): +class WORLD_PT_game_mist(WorldButtonsPanel, Panel): bl_label = "Mist" COMPAT_ENGINES = {'BLENDER_GAME'} @@ -475,7 +464,7 @@ class WORLD_PT_game_mist(WorldButtonsPanel, bpy.types.Panel): row.prop(world.mist_settings, "depth") -class WORLD_PT_game_physics(WorldButtonsPanel, bpy.types.Panel): +class WORLD_PT_game_physics(WorldButtonsPanel, Panel): bl_label = "Physics" COMPAT_ENGINES = {'BLENDER_GAME'} diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py index 52d6b5f1376..13ce92f084c 100644 --- a/release/scripts/startup/bl_ui/properties_material.py +++ b/release/scripts/startup/bl_ui/properties_material.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Menu, Panel from rna_prop_ui import PropertyPanel @@ -50,14 +51,14 @@ def simple_material(mat): return False -class MATERIAL_MT_sss_presets(bpy.types.Menu): +class MATERIAL_MT_sss_presets(Menu): bl_label = "SSS Presets" preset_subdir = "sss" preset_operator = "script.execute_preset" - draw = bpy.types.Menu.draw_preset + draw = Menu.draw_preset -class MATERIAL_MT_specials(bpy.types.Menu): +class MATERIAL_MT_specials(Menu): bl_label = "Material Specials" def draw(self, context): @@ -79,7 +80,7 @@ class MaterialButtonsPanel(): return context.material and (context.scene.render.engine in cls.COMPAT_ENGINES) -class MATERIAL_PT_context_material(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_context_material(MaterialButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -144,7 +145,7 @@ class MATERIAL_PT_context_material(MaterialButtonsPanel, bpy.types.Panel): row.label(text="No material node selected") -class MATERIAL_PT_preview(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_preview(MaterialButtonsPanel, Panel): bl_label = "Preview" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -152,7 +153,7 @@ class MATERIAL_PT_preview(MaterialButtonsPanel, bpy.types.Panel): self.layout.template_preview(context.material) -class MATERIAL_PT_pipeline(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_pipeline(MaterialButtonsPanel, Panel): bl_label = "Render Pipeline Options" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -174,6 +175,7 @@ class MATERIAL_PT_pipeline(MaterialButtonsPanel, bpy.types.Panel): row.prop(mat, "use_transparency") sub = row.column() sub.prop(mat, "offset_z") + sub.active = mat_type and mat.use_transparency and mat.transparency_method == 'Z_TRANSPARENCY' row = layout.row() @@ -199,9 +201,10 @@ class MATERIAL_PT_pipeline(MaterialButtonsPanel, bpy.types.Panel): col.prop(mat, "shadow_cast_alpha", text="Casting Alpha") col.prop(mat, "use_cast_buffer_shadows") col.prop(mat, "use_cast_approximate") + col.prop(mat, "pass_index") -class MATERIAL_PT_diffuse(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_diffuse(MaterialButtonsPanel, Panel): bl_label = "Diffuse" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -245,18 +248,20 @@ class MATERIAL_PT_diffuse(MaterialButtonsPanel, bpy.types.Panel): row.prop(mat, "diffuse_fresnel_factor", text="Factor") if mat.use_diffuse_ramp: - layout.separator() - layout.template_color_ramp(mat, "diffuse_ramp", expand=True) - layout.separator() + col = layout.column() + col.active = (not mat.use_shadeless) + col.separator() + col.template_color_ramp(mat, "diffuse_ramp", expand=True) + col.separator() - row = layout.row() + row = col.row() row.prop(mat, "diffuse_ramp_input", text="Input") row.prop(mat, "diffuse_ramp_blend", text="Blend") - layout.prop(mat, "diffuse_ramp_factor", text="Factor") + col.prop(mat, "diffuse_ramp_factor", text="Factor") -class MATERIAL_PT_specular(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_specular(MaterialButtonsPanel, Panel): bl_label = "Specular" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -309,7 +314,7 @@ class MATERIAL_PT_specular(MaterialButtonsPanel, bpy.types.Panel): layout.prop(mat, "specular_ramp_factor", text="Factor") -class MATERIAL_PT_shading(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_shading(MaterialButtonsPanel, Panel): bl_label = "Shading" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -343,7 +348,7 @@ class MATERIAL_PT_shading(MaterialButtonsPanel, bpy.types.Panel): sub.prop(mat, "use_cubic") -class MATERIAL_PT_transp(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_transp(MaterialButtonsPanel, Panel): bl_label = "Transparency" # bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -409,7 +414,7 @@ class MATERIAL_PT_transp(MaterialButtonsPanel, bpy.types.Panel): sub.prop(rayt, "gloss_samples", text="Samples") -class MATERIAL_PT_mirror(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_mirror(MaterialButtonsPanel, Panel): bl_label = "Mirror" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -467,7 +472,7 @@ class MATERIAL_PT_mirror(MaterialButtonsPanel, bpy.types.Panel): sub.prop(raym, "gloss_anisotropic", text="Anisotropic") -class MATERIAL_PT_sss(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_sss(MaterialButtonsPanel, Panel): bl_label = "Subsurface Scattering" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -519,7 +524,7 @@ class MATERIAL_PT_sss(MaterialButtonsPanel, bpy.types.Panel): col.prop(sss, "error_threshold", text="Error") -class MATERIAL_PT_halo(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_halo(MaterialButtonsPanel, Panel): bl_label = "Halo" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -572,7 +577,7 @@ class MATERIAL_PT_halo(MaterialButtonsPanel, bpy.types.Panel): number_but(col, "use_star", "star_tip_count", "Star tips", "") -class MATERIAL_PT_flare(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_flare(MaterialButtonsPanel, Panel): bl_label = "Flare" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -607,7 +612,7 @@ class MATERIAL_PT_flare(MaterialButtonsPanel, bpy.types.Panel): col.prop(halo, "flare_subflare_size", text="Subsize") -class MATERIAL_PT_physics(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_physics(MaterialButtonsPanel, Panel): bl_label = "Physics" COMPAT_ENGINES = {'BLENDER_GAME'} @@ -637,7 +642,7 @@ class MATERIAL_PT_physics(MaterialButtonsPanel, bpy.types.Panel): row.prop(phys, "use_fh_normal") -class MATERIAL_PT_strand(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_strand(MaterialButtonsPanel, Panel): bl_label = "Strand" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -684,7 +689,7 @@ class MATERIAL_PT_strand(MaterialButtonsPanel, bpy.types.Panel): sub.prop(tan, "blend_distance", text="Distance") -class MATERIAL_PT_options(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_options(MaterialButtonsPanel, Panel): bl_label = "Options" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -729,9 +734,11 @@ class MATERIAL_PT_options(MaterialButtonsPanel, bpy.types.Panel): col.prop(mat, "use_vertex_color_paint") col.prop(mat, "use_vertex_color_light") col.prop(mat, "use_object_color") + if simple_material(base_mat): + col.prop(mat, "pass_index") -class MATERIAL_PT_shadow(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_shadow(MaterialButtonsPanel, Panel): bl_label = "Shadow" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -775,7 +782,7 @@ class MATERIAL_PT_shadow(MaterialButtonsPanel, bpy.types.Panel): col.prop(mat, "use_cast_approximate") -class MATERIAL_PT_transp_game(MaterialButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_transp_game(MaterialButtonsPanel, Panel): bl_label = "Transparency" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_GAME'} @@ -818,7 +825,7 @@ class VolumeButtonsPanel(): return mat and (mat.type == 'VOLUME') and (engine in cls.COMPAT_ENGINES) -class MATERIAL_PT_volume_density(VolumeButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_volume_density(VolumeButtonsPanel, Panel): bl_label = "Density" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -832,7 +839,7 @@ class MATERIAL_PT_volume_density(VolumeButtonsPanel, bpy.types.Panel): row.prop(vol, "density_scale") -class MATERIAL_PT_volume_shading(VolumeButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_volume_shading(VolumeButtonsPanel, Panel): bl_label = "Shading" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -857,7 +864,7 @@ class MATERIAL_PT_volume_shading(VolumeButtonsPanel, bpy.types.Panel): sub.prop(vol, "reflection_color", text="") -class MATERIAL_PT_volume_lighting(VolumeButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_volume_lighting(VolumeButtonsPanel, Panel): bl_label = "Lighting" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -883,7 +890,7 @@ class MATERIAL_PT_volume_lighting(VolumeButtonsPanel, bpy.types.Panel): sub = col.column() sub.enabled = True sub.active = False - sub.prop(vol, "use_light_cache") + sub.label("Light Cache Enabled") col.prop(vol, "cache_resolution") sub = col.column(align=True) @@ -892,7 +899,7 @@ class MATERIAL_PT_volume_lighting(VolumeButtonsPanel, bpy.types.Panel): sub.prop(vol, "ms_intensity") -class MATERIAL_PT_volume_transp(VolumeButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_volume_transp(VolumeButtonsPanel, Panel): bl_label = "Transparency" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -910,7 +917,7 @@ class MATERIAL_PT_volume_transp(VolumeButtonsPanel, bpy.types.Panel): layout.prop(mat, "transparency_method", expand=True) -class MATERIAL_PT_volume_integration(VolumeButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_volume_integration(VolumeButtonsPanel, Panel): bl_label = "Integration" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -932,7 +939,7 @@ class MATERIAL_PT_volume_integration(VolumeButtonsPanel, bpy.types.Panel): col.prop(vol, "depth_threshold") -class MATERIAL_PT_volume_options(VolumeButtonsPanel, bpy.types.Panel): +class MATERIAL_PT_volume_options(VolumeButtonsPanel, Panel): bl_label = "Options" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} bl_options = {'DEFAULT_CLOSED'} @@ -964,7 +971,7 @@ class MATERIAL_PT_volume_options(VolumeButtonsPanel, bpy.types.Panel): row.prop(mat, "use_light_group_exclusive", text="Exclusive") -class MATERIAL_PT_custom_props(MaterialButtonsPanel, PropertyPanel, bpy.types.Panel): +class MATERIAL_PT_custom_props(MaterialButtonsPanel, PropertyPanel, Panel): COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} _context_path = "material" _property_type = bpy.types.Material diff --git a/release/scripts/startup/bl_ui/properties_object.py b/release/scripts/startup/bl_ui/properties_object.py index ae66642e903..0779debb102 100644 --- a/release/scripts/startup/bl_ui/properties_object.py +++ b/release/scripts/startup/bl_ui/properties_object.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel from rna_prop_ui import PropertyPanel @@ -27,14 +28,13 @@ class ObjectButtonsPanel(): bl_context = "object" -class OBJECT_PT_context_object(ObjectButtonsPanel, bpy.types.Panel): +class OBJECT_PT_context_object(ObjectButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} def draw(self, context): layout = self.layout space = context.space_data - ob = context.object if space.use_pin_id: layout.template_ID(space, "pin_id") @@ -43,7 +43,7 @@ class OBJECT_PT_context_object(ObjectButtonsPanel, bpy.types.Panel): row.template_ID(context.scene.objects, "active") -class OBJECT_PT_transform(ObjectButtonsPanel, bpy.types.Panel): +class OBJECT_PT_transform(ObjectButtonsPanel, Panel): bl_label = "Transform" def draw(self, context): @@ -69,7 +69,7 @@ class OBJECT_PT_transform(ObjectButtonsPanel, bpy.types.Panel): layout.prop(ob, "rotation_mode") -class OBJECT_PT_delta_transform(ObjectButtonsPanel, bpy.types.Panel): +class OBJECT_PT_delta_transform(ObjectButtonsPanel, Panel): bl_label = "Delta Transform" bl_options = {'DEFAULT_CLOSED'} @@ -95,7 +95,7 @@ class OBJECT_PT_delta_transform(ObjectButtonsPanel, bpy.types.Panel): row.column().prop(ob, "delta_scale") -class OBJECT_PT_transform_locks(ObjectButtonsPanel, bpy.types.Panel): +class OBJECT_PT_transform_locks(ObjectButtonsPanel, Panel): bl_label = "Transform Locks" bl_options = {'DEFAULT_CLOSED'} @@ -121,7 +121,7 @@ class OBJECT_PT_transform_locks(ObjectButtonsPanel, bpy.types.Panel): row.column().prop(ob, "lock_scale", text="Scale") -class OBJECT_PT_relations(ObjectButtonsPanel, bpy.types.Panel): +class OBJECT_PT_relations(ObjectButtonsPanel, Panel): bl_label = "Relations" def draw(self, context): @@ -148,7 +148,7 @@ class OBJECT_PT_relations(ObjectButtonsPanel, bpy.types.Panel): sub.active = (parent is not None) -class OBJECT_PT_groups(ObjectButtonsPanel, bpy.types.Panel): +class OBJECT_PT_groups(ObjectButtonsPanel, Panel): bl_label = "Groups" def draw(self, context): @@ -187,7 +187,7 @@ class OBJECT_PT_groups(ObjectButtonsPanel, bpy.types.Panel): index += 1 -class OBJECT_PT_display(ObjectButtonsPanel, bpy.types.Panel): +class OBJECT_PT_display(ObjectButtonsPanel, Panel): bl_label = "Display" def draw(self, context): @@ -221,7 +221,7 @@ class OBJECT_PT_display(ObjectButtonsPanel, bpy.types.Panel): col.prop(ob, "show_transparent", text="Transparency") -class OBJECT_PT_duplication(ObjectButtonsPanel, bpy.types.Panel): +class OBJECT_PT_duplication(ObjectButtonsPanel, Panel): bl_label = "Duplication" def draw(self, context): @@ -259,7 +259,7 @@ class OBJECT_PT_duplication(ObjectButtonsPanel, bpy.types.Panel): # XXX: the following options are all quite buggy, ancient hacks that should be dropped -class OBJECT_PT_animation(ObjectButtonsPanel, bpy.types.Panel): +class OBJECT_PT_animation(ObjectButtonsPanel, Panel): bl_label = "Animation Hacks" bl_options = {'DEFAULT_CLOSED'} @@ -294,7 +294,7 @@ from bl_ui.properties_animviz import ( ) -class OBJECT_PT_motion_paths(MotionPathButtonsPanel, bpy.types.Panel): +class OBJECT_PT_motion_paths(MotionPathButtonsPanel, Panel): #bl_label = "Object Motion Paths" bl_context = "object" @@ -316,7 +316,7 @@ class OBJECT_PT_motion_paths(MotionPathButtonsPanel, bpy.types.Panel): row.operator("object.paths_clear", text="Clear Paths") -class OBJECT_PT_onion_skinning(OnionSkinButtonsPanel): # , bpy.types.Panel): # inherit from panel when ready +class OBJECT_PT_onion_skinning(OnionSkinButtonsPanel): # , Panel): # inherit from panel when ready #bl_label = "Object Onion Skinning" bl_context = "object" @@ -330,7 +330,7 @@ class OBJECT_PT_onion_skinning(OnionSkinButtonsPanel): # , bpy.types.Panel): # self.draw_settings(context, ob.animation_visualisation) -class OBJECT_PT_custom_props(ObjectButtonsPanel, PropertyPanel, bpy.types.Panel): +class OBJECT_PT_custom_props(ObjectButtonsPanel, PropertyPanel, Panel): COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} _context_path = "object" _property_type = bpy.types.Object diff --git a/release/scripts/startup/bl_ui/properties_object_constraint.py b/release/scripts/startup/bl_ui/properties_object_constraint.py index 03823ad7345..05fac2026a0 100644 --- a/release/scripts/startup/bl_ui/properties_object_constraint.py +++ b/release/scripts/startup/bl_ui/properties_object_constraint.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel class ConstraintButtonsPanel(): @@ -234,7 +235,6 @@ class ConstraintButtonsPanel(): row.label() def LIMIT_ROTATION(self, context, layout, con): - split = layout.split() col = split.column(align=True) @@ -258,9 +258,7 @@ class ConstraintButtonsPanel(): sub.prop(con, "min_z", text="Min") sub.prop(con, "max_z", text="Max") - row = layout.row() - row.prop(con, "use_transform_limit") - row.label() + layout.prop(con, "use_transform_limit") row = layout.row() row.label(text="Convert:") @@ -476,6 +474,10 @@ class ConstraintButtonsPanel(): row.label(text="Clamp Region:") row.prop(con, "limit_mode", text="") + row = layout.row() + row.prop(con, "use_transform_limit") + row.label() + def STRETCH_TO(self, context, layout, con): self.target_template(layout, con) @@ -655,8 +657,8 @@ class ConstraintButtonsPanel(): row = col.row() row.label(text="Source to Destination Mapping:") - # note: chr(187) is the ASCII arrow ( >> ). Blender Text Editor can't - # open it. Thus we are using the hardcoded value instead. + # note: chr(187) is the ASCII arrow ( >> ). Blender Text Editor can't + # open it. Thus we are using the hardcoded value instead. row = col.row() row.prop(con, "map_to_x_from", expand=False, text="") row.label(text=" %s X" % chr(187)) @@ -755,7 +757,7 @@ class ConstraintButtonsPanel(): layout.label("Blender 2.5 has no py-constraints") -class OBJECT_PT_constraints(ConstraintButtonsPanel, bpy.types.Panel): +class OBJECT_PT_constraints(ConstraintButtonsPanel, Panel): bl_label = "Object Constraints" bl_context = "constraint" @@ -779,7 +781,7 @@ class OBJECT_PT_constraints(ConstraintButtonsPanel, bpy.types.Panel): self.draw_constraint(context, con) -class BONE_PT_constraints(ConstraintButtonsPanel, bpy.types.Panel): +class BONE_PT_constraints(ConstraintButtonsPanel, Panel): bl_label = "Bone Constraints" bl_context = "bone_constraint" diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py index 63333083cb2..6f58f060504 100644 --- a/release/scripts/startup/bl_ui/properties_particle.py +++ b/release/scripts/startup/bl_ui/properties_particle.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel from rna_prop_ui import PropertyPanel from bl_ui.properties_physics_common import ( @@ -72,7 +73,7 @@ class ParticleButtonsPanel(): return particle_panel_poll(cls, context) -class PARTICLE_PT_context_particles(ParticleButtonsPanel, bpy.types.Panel): +class PARTICLE_PT_context_particles(ParticleButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -155,7 +156,7 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel, bpy.types.Panel): if part: split = layout.split(percentage=0.65) if part.type == 'HAIR': - if psys != None and psys.is_edited: + if psys is not None and psys.is_edited: split.operator("particle.edited_clear", text="Free Edit") else: row = split.row() @@ -165,18 +166,18 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel, bpy.types.Panel): row = split.row() row.enabled = particle_panel_enabled(context, psys) row.prop(part, "hair_step") - if psys != None and psys.is_edited: + if psys is not None and psys.is_edited: if psys.is_global_hair: layout.operator("particle.connect_hair") else: layout.operator("particle.disconnect_hair") - elif psys != None and part.type == 'REACTOR': + elif psys is not None and part.type == 'REACTOR': split.enabled = particle_panel_enabled(context, psys) split.prop(psys, "reactor_target_object") split.prop(psys, "reactor_target_particle_system", text="Particle System") -class PARTICLE_PT_emission(ParticleButtonsPanel, bpy.types.Panel): +class PARTICLE_PT_emission(ParticleButtonsPanel, Panel): bl_label = "Emission" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -245,7 +246,7 @@ class PARTICLE_PT_emission(ParticleButtonsPanel, bpy.types.Panel): row.prop(part, "grid_random", text="Random", slider=True) -class PARTICLE_PT_hair_dynamics(ParticleButtonsPanel, bpy.types.Panel): +class PARTICLE_PT_hair_dynamics(ParticleButtonsPanel, Panel): bl_label = "Hair dynamics" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -301,7 +302,7 @@ class PARTICLE_PT_hair_dynamics(ParticleButtonsPanel, bpy.types.Panel): col.prop(cloth, "quality", text="Steps", slider=True) -class PARTICLE_PT_cache(ParticleButtonsPanel, bpy.types.Panel): +class PARTICLE_PT_cache(ParticleButtonsPanel, Panel): bl_label = "Cache" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -327,7 +328,7 @@ class PARTICLE_PT_cache(ParticleButtonsPanel, bpy.types.Panel): point_cache_ui(self, context, psys.point_cache, True, 'HAIR' if (psys.settings.type == 'HAIR') else 'PSYS') -class PARTICLE_PT_velocity(ParticleButtonsPanel, bpy.types.Panel): +class PARTICLE_PT_velocity(ParticleButtonsPanel, Panel): bl_label = "Velocity" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -377,7 +378,7 @@ class PARTICLE_PT_velocity(ParticleButtonsPanel, bpy.types.Panel): # sub.prop(part, "reaction_shape", slider=True) -class PARTICLE_PT_rotation(ParticleButtonsPanel, bpy.types.Panel): +class PARTICLE_PT_rotation(ParticleButtonsPanel, Panel): bl_label = "Rotation" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -426,7 +427,7 @@ class PARTICLE_PT_rotation(ParticleButtonsPanel, bpy.types.Panel): col.prop(part, "angular_velocity_factor", text="") -class PARTICLE_PT_physics(ParticleButtonsPanel, bpy.types.Panel): +class PARTICLE_PT_physics(ParticleButtonsPanel, Panel): bl_label = "Physics" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -462,7 +463,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel, bpy.types.Panel): col.prop(part, "mass") col.prop(part, "use_multiply_size_mass", text="Multiply mass with size") - if part.physics_type in ('NEWTON', 'FLUID'): + if part.physics_type in {'NEWTON', 'FLUID'}: split = layout.split() col = split.column() @@ -641,7 +642,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel, bpy.types.Panel): sub.prop(key, "system", text="System") -class PARTICLE_PT_boidbrain(ParticleButtonsPanel, bpy.types.Panel): +class PARTICLE_PT_boidbrain(ParticleButtonsPanel, Panel): bl_label = "Boid Brain" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -653,7 +654,7 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel, bpy.types.Panel): if settings is None: return False - if psys != None and psys.point_cache.use_external: + if psys is not None and psys.point_cache.use_external: return False return settings.physics_type == 'BOIDS' and engine in cls.COMPAT_ENGINES @@ -742,7 +743,7 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel, bpy.types.Panel): row.prop(rule, "flee_distance") -class PARTICLE_PT_render(ParticleButtonsPanel, bpy.types.Panel): +class PARTICLE_PT_render(ParticleButtonsPanel, Panel): bl_label = "Render" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -879,6 +880,15 @@ class PARTICLE_PT_render(ParticleButtonsPanel, bpy.types.Panel): col = row.column() col.prop(part, "billboard_offset") + row = layout.row() + col = row.column() + col.prop(part, "billboard_size", text="Scale") + if part.billboard_align == 'VEL': + col = row.column(align=True) + col.label("Velocity Scale:") + col.prop(part, "billboard_velocity_head", text="Head") + col.prop(part, "billboard_velocity_tail", text="Tail") + if psys: col = layout.column() col.prop_search(psys, "billboard_normal_uv", ob.data, "uv_textures") @@ -912,13 +922,13 @@ class PARTICLE_PT_render(ParticleButtonsPanel, bpy.types.Panel): col = row.column() col.label(text="") - if part.render_type in ('OBJECT', 'GROUP') and not part.use_advanced_hair: + if part.render_type in {'OBJECT', 'GROUP'} and not part.use_advanced_hair: row = layout.row(align=True) row.prop(part, "particle_size") row.prop(part, "size_random", slider=True) -class PARTICLE_PT_draw(ParticleButtonsPanel, bpy.types.Panel): +class PARTICLE_PT_draw(ParticleButtonsPanel, Panel): bl_label = "Display" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -980,7 +990,7 @@ class PARTICLE_PT_draw(ParticleButtonsPanel, bpy.types.Panel): col.prop(part, "draw_step") -class PARTICLE_PT_children(ParticleButtonsPanel, bpy.types.Panel): +class PARTICLE_PT_children(ParticleButtonsPanel, Panel): bl_label = "Children" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -1080,7 +1090,7 @@ class PARTICLE_PT_children(ParticleButtonsPanel, bpy.types.Panel): sub.prop(part, "kink_shape", slider=True) -class PARTICLE_PT_field_weights(ParticleButtonsPanel, bpy.types.Panel): +class PARTICLE_PT_field_weights(ParticleButtonsPanel, Panel): bl_label = "Field Weights" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -1101,7 +1111,7 @@ class PARTICLE_PT_field_weights(ParticleButtonsPanel, bpy.types.Panel): row.prop(part, "effect_hair", slider=True) -class PARTICLE_PT_force_fields(ParticleButtonsPanel, bpy.types.Panel): +class PARTICLE_PT_force_fields(ParticleButtonsPanel, Panel): bl_label = "Force Field Settings" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -1135,7 +1145,7 @@ class PARTICLE_PT_force_fields(ParticleButtonsPanel, bpy.types.Panel): basic_force_field_falloff_ui(self, context, part.force_field_2) -class PARTICLE_PT_vertexgroups(ParticleButtonsPanel, bpy.types.Panel): +class PARTICLE_PT_vertexgroups(ParticleButtonsPanel, Panel): bl_label = "Vertexgroups" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -1206,7 +1216,7 @@ class PARTICLE_PT_vertexgroups(ParticleButtonsPanel, bpy.types.Panel): # row.prop(psys, "invert_vertex_group_field", text="") -class PARTICLE_PT_custom_props(ParticleButtonsPanel, PropertyPanel, bpy.types.Panel): +class PARTICLE_PT_custom_props(ParticleButtonsPanel, PropertyPanel, Panel): COMPAT_ENGINES = {'BLENDER_RENDER'} _context_path = "particle_system.settings" _property_type = bpy.types.ParticleSettings diff --git a/release/scripts/startup/bl_ui/properties_physics_cloth.py b/release/scripts/startup/bl_ui/properties_physics_cloth.py index bce6ab993a7..d5427d8bae8 100644 --- a/release/scripts/startup/bl_ui/properties_physics_cloth.py +++ b/release/scripts/startup/bl_ui/properties_physics_cloth.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Menu, Panel from bl_ui.properties_physics_common import ( @@ -30,14 +31,14 @@ def cloth_panel_enabled(md): return md.point_cache.is_baked is False -class CLOTH_MT_presets(bpy.types.Menu): +class CLOTH_MT_presets(Menu): ''' Creates the menu items by scanning scripts/templates ''' bl_label = "Cloth Presets" preset_subdir = "cloth" preset_operator = "script.execute_preset" - draw = bpy.types.Menu.draw_preset + draw = Menu.draw_preset class PhysicButtonsPanel(): @@ -52,7 +53,7 @@ class PhysicButtonsPanel(): return (ob and ob.type == 'MESH') and (not rd.use_game_engine) and (context.cloth) -class PHYSICS_PT_cloth(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_cloth(PhysicButtonsPanel, Panel): bl_label = "Cloth" def draw(self, context): @@ -117,7 +118,7 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel, bpy.types.Panel): col.prop_search(cloth, "rest_shape_key", key, "key_blocks", text="") -class PHYSICS_PT_cloth_cache(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_cloth_cache(PhysicButtonsPanel, Panel): bl_label = "Cloth Cache" bl_options = {'DEFAULT_CLOSED'} @@ -130,7 +131,7 @@ class PHYSICS_PT_cloth_cache(PhysicButtonsPanel, bpy.types.Panel): point_cache_ui(self, context, md.point_cache, cloth_panel_enabled(md), 'CLOTH') -class PHYSICS_PT_cloth_collision(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_cloth_collision(PhysicButtonsPanel, Panel): bl_label = "Cloth Collision" bl_options = {'DEFAULT_CLOSED'} @@ -171,7 +172,7 @@ class PHYSICS_PT_cloth_collision(PhysicButtonsPanel, bpy.types.Panel): layout.prop(cloth, "group") -class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel, Panel): bl_label = "Cloth Stiffness Scaling" bl_options = {'DEFAULT_CLOSED'} @@ -207,7 +208,7 @@ class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel, bpy.types.Panel): col.prop(cloth, "bending_stiffness_max", text="Max") -class PHYSICS_PT_cloth_field_weights(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_cloth_field_weights(PhysicButtonsPanel, Panel): bl_label = "Cloth Field Weights" bl_options = {'DEFAULT_CLOSED'} diff --git a/release/scripts/startup/bl_ui/properties_physics_common.py b/release/scripts/startup/bl_ui/properties_physics_common.py index f7cf8da1840..204e25d9f01 100644 --- a/release/scripts/startup/bl_ui/properties_physics_common.py +++ b/release/scripts/startup/bl_ui/properties_physics_common.py @@ -19,6 +19,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel class PhysicButtonsPanel(): @@ -44,7 +45,7 @@ def physics_add(self, layout, md, name, type, typeicon, toggles): sub.operator("object.modifier_add", text=name, icon=typeicon).type = type -class PHYSICS_PT_add(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_add(PhysicButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} diff --git a/release/scripts/startup/bl_ui/properties_physics_field.py b/release/scripts/startup/bl_ui/properties_physics_field.py index 9f96f0a5b9f..e1dc4d04378 100644 --- a/release/scripts/startup/bl_ui/properties_physics_field.py +++ b/release/scripts/startup/bl_ui/properties_physics_field.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel from bl_ui.properties_physics_common import ( @@ -37,7 +38,7 @@ class PhysicButtonsPanel(): return (context.object) and (not rd.use_game_engine) -class PHYSICS_PT_field(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_field(PhysicButtonsPanel, Panel): bl_label = "Force Fields" @classmethod @@ -164,7 +165,7 @@ class PHYSICS_PT_field(PhysicButtonsPanel, bpy.types.Panel): sub.prop(field, "radial_max", text="Distance") -class PHYSICS_PT_collision(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_collision(PhysicButtonsPanel, Panel): bl_label = "Collision" #bl_options = {'DEFAULT_CLOSED'} diff --git a/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py index 5da89d0090a..46893af3582 100644 --- a/release/scripts/startup/bl_ui/properties_physics_fluid.py +++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel class PhysicButtonsPanel(): @@ -32,7 +33,7 @@ class PhysicButtonsPanel(): return (ob and ob.type == 'MESH') and (not rd.use_game_engine) and (context.fluid) -class PHYSICS_PT_fluid(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_fluid(PhysicButtonsPanel, Panel): bl_label = "Fluid" def draw(self, context): @@ -186,7 +187,7 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel, bpy.types.Panel): sub.prop(fluid, "velocity_radius", text="Radius") -class PHYSICS_PT_domain_gravity(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_domain_gravity(PhysicButtonsPanel, Panel): bl_label = "Domain World" bl_options = {'DEFAULT_CLOSED'} @@ -236,7 +237,7 @@ class PHYSICS_PT_domain_gravity(PhysicButtonsPanel, bpy.types.Panel): col.prop(fluid, "compressibility", slider=True) -class PHYSICS_PT_domain_boundary(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_domain_boundary(PhysicButtonsPanel, Panel): bl_label = "Domain Boundary" bl_options = {'DEFAULT_CLOSED'} @@ -257,6 +258,7 @@ class PHYSICS_PT_domain_boundary(PhysicButtonsPanel, bpy.types.Panel): col.prop(fluid, "slip_type", text="") if fluid.slip_type == 'PARTIALSLIP': col.prop(fluid, "partial_slip_factor", slider=True, text="Amount") + col.prop(fluid, "surface_noobs") col = split.column() col.label(text="Surface:") @@ -264,7 +266,7 @@ class PHYSICS_PT_domain_boundary(PhysicButtonsPanel, bpy.types.Panel): col.prop(fluid, "surface_subdivisions", text="Subdivisions") -class PHYSICS_PT_domain_particles(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_domain_particles(PhysicButtonsPanel, Panel): bl_label = "Domain Particles" bl_options = {'DEFAULT_CLOSED'} diff --git a/release/scripts/startup/bl_ui/properties_physics_smoke.py b/release/scripts/startup/bl_ui/properties_physics_smoke.py index 61d8d2e3825..771a778380d 100644 --- a/release/scripts/startup/bl_ui/properties_physics_smoke.py +++ b/release/scripts/startup/bl_ui/properties_physics_smoke.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel from bl_ui.properties_physics_common import ( @@ -38,7 +39,7 @@ class PhysicButtonsPanel(): return (ob and ob.type == 'MESH') and (not rd.use_game_engine) and (context.smoke) -class PHYSICS_PT_smoke(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_smoke(PhysicButtonsPanel, Panel): bl_label = "Smoke" def draw(self, context): @@ -103,7 +104,7 @@ class PHYSICS_PT_smoke(PhysicButtonsPanel, bpy.types.Panel): sub.prop(flow, "temperature") -class PHYSICS_PT_smoke_groups(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_smoke_groups(PhysicButtonsPanel, Panel): bl_label = "Smoke Groups" bl_options = {'DEFAULT_CLOSED'} @@ -131,7 +132,7 @@ class PHYSICS_PT_smoke_groups(PhysicButtonsPanel, bpy.types.Panel): col.prop(group, "collision_group", text="") -class PHYSICS_PT_smoke_highres(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_smoke_highres(PhysicButtonsPanel, Panel): bl_label = "Smoke High Resolution" bl_options = {'DEFAULT_CLOSED'} @@ -168,7 +169,7 @@ class PHYSICS_PT_smoke_highres(PhysicButtonsPanel, bpy.types.Panel): layout.prop(md, "show_high_resolution") -class PHYSICS_PT_smoke_cache(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_smoke_cache(PhysicButtonsPanel, Panel): bl_label = "Smoke Cache" bl_options = {'DEFAULT_CLOSED'} @@ -189,7 +190,7 @@ class PHYSICS_PT_smoke_cache(PhysicButtonsPanel, bpy.types.Panel): point_cache_ui(self, context, cache, (cache.is_baked is False), 'SMOKE') -class PHYSICS_PT_smoke_field_weights(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_smoke_field_weights(PhysicButtonsPanel, Panel): bl_label = "Smoke Field Weights" bl_options = {'DEFAULT_CLOSED'} diff --git a/release/scripts/startup/bl_ui/properties_physics_softbody.py b/release/scripts/startup/bl_ui/properties_physics_softbody.py index 61115a0590e..0b55ccf9516 100644 --- a/release/scripts/startup/bl_ui/properties_physics_softbody.py +++ b/release/scripts/startup/bl_ui/properties_physics_softbody.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Panel from bl_ui.properties_physics_common import ( @@ -44,7 +45,7 @@ class PhysicButtonsPanel(): return (ob and (ob.type == 'MESH' or ob.type == 'LATTICE'or ob.type == 'CURVE')) and (not rd.use_game_engine) and (context.soft_body) -class PHYSICS_PT_softbody(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_softbody(PhysicButtonsPanel, Panel): bl_label = "Soft Body" def draw(self, context): @@ -71,7 +72,7 @@ class PHYSICS_PT_softbody(PhysicButtonsPanel, bpy.types.Panel): col.prop(softbody, "speed") -class PHYSICS_PT_softbody_cache(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_softbody_cache(PhysicButtonsPanel, Panel): bl_label = "Soft Body Cache" bl_options = {'DEFAULT_CLOSED'} @@ -84,7 +85,7 @@ class PHYSICS_PT_softbody_cache(PhysicButtonsPanel, bpy.types.Panel): point_cache_ui(self, context, md.point_cache, softbody_panel_enabled(md), 'SOFTBODY') -class PHYSICS_PT_softbody_goal(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_softbody_goal(PhysicButtonsPanel, Panel): bl_label = "Soft Body Goal" bl_options = {'DEFAULT_CLOSED'} @@ -127,7 +128,7 @@ class PHYSICS_PT_softbody_goal(PhysicButtonsPanel, bpy.types.Panel): layout.prop_search(softbody, "vertex_group_goal", ob, "vertex_groups", text="Vertex Group") -class PHYSICS_PT_softbody_edge(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_softbody_edge(PhysicButtonsPanel, Panel): bl_label = "Soft Body Edges" bl_options = {'DEFAULT_CLOSED'} @@ -180,7 +181,7 @@ class PHYSICS_PT_softbody_edge(PhysicButtonsPanel, bpy.types.Panel): col.prop(softbody, "use_face_collision", text="Face") -class PHYSICS_PT_softbody_collision(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_softbody_collision(PhysicButtonsPanel, Panel): bl_label = "Soft Body Self Collision" bl_options = {'DEFAULT_CLOSED'} @@ -212,7 +213,7 @@ class PHYSICS_PT_softbody_collision(PhysicButtonsPanel, bpy.types.Panel): col.prop(softbody, "ball_damp", text="Dampening") -class PHYSICS_PT_softbody_solver(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_softbody_solver(PhysicButtonsPanel, Panel): bl_label = "Soft Body Solver" bl_options = {'DEFAULT_CLOSED'} @@ -248,7 +249,7 @@ class PHYSICS_PT_softbody_solver(PhysicButtonsPanel, bpy.types.Panel): layout.prop(softbody, "use_estimate_matrix") -class PHYSICS_PT_softbody_field_weights(PhysicButtonsPanel, bpy.types.Panel): +class PHYSICS_PT_softbody_field_weights(PhysicButtonsPanel, Panel): bl_label = "Soft Body Field Weights" bl_options = {'DEFAULT_CLOSED'} diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py index 4e1c1b34363..395cfc6934e 100644 --- a/release/scripts/startup/bl_ui/properties_render.py +++ b/release/scripts/startup/bl_ui/properties_render.py @@ -18,27 +18,28 @@ # <pep8 compliant> import bpy +from bpy.types import Menu, Panel -class RENDER_MT_presets(bpy.types.Menu): +class RENDER_MT_presets(Menu): bl_label = "Render Presets" preset_subdir = "render" preset_operator = "script.execute_preset" - draw = bpy.types.Menu.draw_preset + draw = Menu.draw_preset -class RENDER_MT_ffmpeg_presets(bpy.types.Menu): +class RENDER_MT_ffmpeg_presets(Menu): bl_label = "FFMPEG Presets" preset_subdir = "ffmpeg" preset_operator = "script.python_file_run" - draw = bpy.types.Menu.draw_preset + draw = Menu.draw_preset -class RENDER_MT_framerate_presets(bpy.types.Menu): +class RENDER_MT_framerate_presets(Menu): bl_label = "Frame Rate Presets" preset_subdir = "framerate" preset_operator = "script.execute_preset" - draw = bpy.types.Menu.draw_preset + draw = Menu.draw_preset class RenderButtonsPanel(): @@ -53,7 +54,7 @@ class RenderButtonsPanel(): return (context.scene and rd.use_game_engine is False) and (rd.engine in cls.COMPAT_ENGINES) -class RENDER_PT_render(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_render(RenderButtonsPanel, Panel): bl_label = "Render" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -69,7 +70,7 @@ class RENDER_PT_render(RenderButtonsPanel, bpy.types.Panel): layout.prop(rd, "display_mode", text="Display") -class RENDER_PT_layers(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_layers(RenderButtonsPanel, Panel): bl_label = "Layers" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -141,6 +142,7 @@ class RENDER_PT_layers(RenderButtonsPanel, bpy.types.Panel): col.prop(rl, "use_pass_uv") col.prop(rl, "use_pass_mist") col.prop(rl, "use_pass_object_index") + col.prop(rl, "use_pass_material_index") col.prop(rl, "use_pass_color") col = split.column() @@ -172,7 +174,7 @@ class RENDER_PT_layers(RenderButtonsPanel, bpy.types.Panel): row.prop(rl, "exclude_refraction", text="") -class RENDER_PT_dimensions(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_dimensions(RenderButtonsPanel, Panel): bl_label = "Dimensions" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -239,7 +241,7 @@ class RENDER_PT_dimensions(RenderButtonsPanel, bpy.types.Panel): subrow.prop(rd, "frame_map_new", text="New") -class RENDER_PT_antialiasing(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_antialiasing(RenderButtonsPanel, Panel): bl_label = "Anti-Aliasing" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -267,7 +269,7 @@ class RENDER_PT_antialiasing(RenderButtonsPanel, bpy.types.Panel): col.prop(rd, "filter_size", text="Size") -class RENDER_PT_motion_blur(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_motion_blur(RenderButtonsPanel, Panel): bl_label = "Sampled Motion Blur" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -293,7 +295,7 @@ class RENDER_PT_motion_blur(RenderButtonsPanel, bpy.types.Panel): row.prop(rd, "motion_blur_shutter") -class RENDER_PT_shading(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_shading(RenderButtonsPanel, Panel): bl_label = "Shading" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -317,7 +319,7 @@ class RENDER_PT_shading(RenderButtonsPanel, bpy.types.Panel): col.prop(rd, "alpha_mode", text="Alpha") -class RENDER_PT_performance(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_performance(RenderButtonsPanel, Panel): bl_label = "Performance" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -360,7 +362,7 @@ class RENDER_PT_performance(RenderButtonsPanel, bpy.types.Panel): sub.prop(rd, "use_local_coords", text="Local Coordinates") -class RENDER_PT_post_processing(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_post_processing(RenderButtonsPanel, Panel): bl_label = "Post Processing" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -376,8 +378,7 @@ class RENDER_PT_post_processing(RenderButtonsPanel, bpy.types.Panel): col.prop(rd, "use_compositing") col.prop(rd, "use_sequencer") - col = split.column() - col.prop(rd, "dither_intensity", text="Dither", slider=True) + split.prop(rd, "dither_intensity", text="Dither", slider=True) layout.separator() @@ -398,7 +399,7 @@ class RENDER_PT_post_processing(RenderButtonsPanel, bpy.types.Panel): sub.prop(rd, "edge_color", text="") -class RENDER_PT_stamp(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_stamp(RenderButtonsPanel, Panel): bl_label = "Stamp" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -443,7 +444,7 @@ class RENDER_PT_stamp(RenderButtonsPanel, bpy.types.Panel): sub.prop(rd, "stamp_note_text", text="") -class RENDER_PT_output(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_output(RenderButtonsPanel, Panel): bl_label = "Output" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -543,7 +544,7 @@ class RENDER_PT_output(RenderButtonsPanel, bpy.types.Panel): col.prop(rd, "quicktime_audio_resampling_hq") -class RENDER_PT_encoding(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_encoding(RenderButtonsPanel, Panel): bl_label = "Encoding" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -591,16 +592,12 @@ class RENDER_PT_encoding(RenderButtonsPanel, bpy.types.Panel): if rd.ffmpeg_format not in {'MP3'}: layout.prop(rd, "ffmpeg_audio_codec", text="Audio Codec") - split = layout.split() - - col = split.column() - col.prop(rd, "ffmpeg_audio_bitrate") - col.prop(rd, "ffmpeg_audio_mixrate") - - split.prop(rd, "ffmpeg_audio_volume", slider=True) + row = layout.row() + row.prop(rd, "ffmpeg_audio_bitrate") + row.prop(rd, "ffmpeg_audio_volume", slider=True) -class RENDER_PT_bake(RenderButtonsPanel, bpy.types.Panel): +class RENDER_PT_bake(RenderButtonsPanel, Panel): bl_label = "Bake" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py index ce5ac0c62d3..001897c222f 100644 --- a/release/scripts/startup/bl_ui/properties_scene.py +++ b/release/scripts/startup/bl_ui/properties_scene.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Operator, Panel from rna_prop_ui import PropertyPanel @@ -31,7 +32,7 @@ class SceneButtonsPanel(): return context.scene -class SCENE_PT_scene(SceneButtonsPanel, bpy.types.Panel): +class SCENE_PT_scene(SceneButtonsPanel, Panel): bl_label = "Scene" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -43,7 +44,35 @@ class SCENE_PT_scene(SceneButtonsPanel, bpy.types.Panel): layout.prop(scene, "background_set", text="Background") -class SCENE_PT_unit(SceneButtonsPanel, bpy.types.Panel): +class SCENE_PT_audio(SceneButtonsPanel, Panel): + bl_label = "Audio" + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} + + def draw(self, context): + layout = self.layout + scene = context.scene + rd = context.scene.render + + layout.prop(scene, "audio_volume") + layout.operator("sound.bake_animation") + + split = layout.split() + + col = split.column() + col.label("Listener:") + col.prop(scene, "audio_distance_model", text="") + col.prop(scene, "audio_doppler_speed", text="Speed") + col.prop(scene, "audio_doppler_factor", text="Doppler") + + col = split.column() + col.label("Format:") + col.prop(rd, "ffmpeg_audio_channels", text="") + col.prop(rd, "ffmpeg_audio_mixrate", text="Rate") + + layout.operator("sound.mixdown") + + +class SCENE_PT_unit(SceneButtonsPanel, Panel): bl_label = "Units" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -61,7 +90,7 @@ class SCENE_PT_unit(SceneButtonsPanel, bpy.types.Panel): row.prop(unit, "use_separate") -class SCENE_PT_keying_sets(SceneButtonsPanel, bpy.types.Panel): +class SCENE_PT_keying_sets(SceneButtonsPanel, Panel): bl_label = "Keying Sets" def draw(self, context): @@ -94,7 +123,7 @@ class SCENE_PT_keying_sets(SceneButtonsPanel, bpy.types.Panel): col.prop(ks, "bl_options") -class SCENE_PT_keying_set_paths(SceneButtonsPanel, bpy.types.Panel): +class SCENE_PT_keying_set_paths(SceneButtonsPanel, Panel): bl_label = "Active Keying Set" @classmethod @@ -144,7 +173,7 @@ class SCENE_PT_keying_set_paths(SceneButtonsPanel, bpy.types.Panel): col.prop(ksp, "bl_options") -class SCENE_PT_physics(SceneButtonsPanel, bpy.types.Panel): +class SCENE_PT_physics(SceneButtonsPanel, Panel): bl_label = "Gravity" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -161,7 +190,7 @@ class SCENE_PT_physics(SceneButtonsPanel, bpy.types.Panel): layout.prop(scene, "gravity", text="") -class SCENE_PT_simplify(SceneButtonsPanel, bpy.types.Panel): +class SCENE_PT_simplify(SceneButtonsPanel, Panel): bl_label = "Simplify" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -190,7 +219,7 @@ class SCENE_PT_simplify(SceneButtonsPanel, bpy.types.Panel): col.prop(rd, "simplify_ao_sss", text="AO and SSS") -class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, bpy.types.Panel): +class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, Panel): COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} _context_path = "scene" _property_type = bpy.types.Scene @@ -198,7 +227,7 @@ class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, bpy.types.Panel): # XXX, move operator to op/ dir -class ANIM_OT_keying_set_export(bpy.types.Operator): +class ANIM_OT_keying_set_export(Operator): "Export Keying Set to a python script." bl_idname = "anim.keying_set_export" bl_label = "Export Keying Set..." diff --git a/release/scripts/startup/bl_ui/properties_texture.py b/release/scripts/startup/bl_ui/properties_texture.py index 01890bc3c99..34f5a948ee7 100644 --- a/release/scripts/startup/bl_ui/properties_texture.py +++ b/release/scripts/startup/bl_ui/properties_texture.py @@ -18,10 +18,11 @@ # <pep8 compliant> import bpy +from bpy.types import Menu, Panel from rna_prop_ui import PropertyPanel -class TEXTURE_MT_specials(bpy.types.Menu): +class TEXTURE_MT_specials(Menu): bl_label = "Texture Specials" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -32,7 +33,7 @@ class TEXTURE_MT_specials(bpy.types.Menu): layout.operator("texture.slot_paste", icon='PASTEDOWN') -class TEXTURE_MT_envmap_specials(bpy.types.Menu): +class TEXTURE_MT_envmap_specials(Menu): bl_label = "Environment Map Specials" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -80,7 +81,7 @@ class TextureButtonsPanel(): return tex and (tex.type != 'NONE' or tex.use_nodes) and (context.scene.render.engine in cls.COMPAT_ENGINES) -class TEXTURE_PT_context_texture(TextureButtonsPanel, bpy.types.Panel): +class TEXTURE_PT_context_texture(TextureButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -88,15 +89,15 @@ class TEXTURE_PT_context_texture(TextureButtonsPanel, bpy.types.Panel): @classmethod def poll(cls, context): engine = context.scene.render.engine - if not hasattr(context, "texture_slot"): + if not (hasattr(context, "texture_slot") or hasattr(context, "texture_node")): return False return ((context.material or context.world or context.lamp or context.brush or context.texture or context.particle_system or isinstance(context.space_data.pin_id, bpy.types.ParticleSettings)) and (engine in cls.COMPAT_ENGINES)) def draw(self, context): layout = self.layout - slot = context.texture_slot - node = context.texture_node + slot = getattr(context, "texture_slot", None) + node = getattr(context, "texture_node", None) space = context.space_data tex = context.texture idblock = context_tex_datablock(context) @@ -150,7 +151,7 @@ class TEXTURE_PT_context_texture(TextureButtonsPanel, bpy.types.Panel): split.prop(tex, "type", text="") -class TEXTURE_PT_preview(TextureButtonsPanel, bpy.types.Panel): +class TEXTURE_PT_preview(TextureButtonsPanel, Panel): bl_label = "Preview" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -167,7 +168,7 @@ class TEXTURE_PT_preview(TextureButtonsPanel, bpy.types.Panel): layout.template_preview(tex, slot=slot) -class TEXTURE_PT_colors(TextureButtonsPanel, bpy.types.Panel): +class TEXTURE_PT_colors(TextureButtonsPanel, Panel): bl_label = "Colors" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -208,7 +209,7 @@ class TextureSlotPanel(TextureButtonsPanel): return False engine = context.scene.render.engine - return TextureButtonsPanel.poll(self, context) and (engine in cls.COMPAT_ENGINES) + return TextureButtonsPanel.poll(cls, context) and (engine in cls.COMPAT_ENGINES) # Texture Type Panels # @@ -223,7 +224,7 @@ class TextureTypePanel(TextureButtonsPanel): return tex and ((tex.type == cls.tex_type and not tex.use_nodes) and (engine in cls.COMPAT_ENGINES)) -class TEXTURE_PT_clouds(TextureTypePanel, bpy.types.Panel): +class TEXTURE_PT_clouds(TextureTypePanel, Panel): bl_label = "Clouds" tex_type = 'CLOUDS' COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -247,7 +248,7 @@ class TEXTURE_PT_clouds(TextureTypePanel, bpy.types.Panel): split.prop(tex, "nabla", text="Nabla") -class TEXTURE_PT_wood(TextureTypePanel, bpy.types.Panel): +class TEXTURE_PT_wood(TextureTypePanel, Panel): bl_label = "Wood" tex_type = 'WOOD' COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -276,7 +277,7 @@ class TEXTURE_PT_wood(TextureTypePanel, bpy.types.Panel): split.prop(tex, "nabla") -class TEXTURE_PT_marble(TextureTypePanel, bpy.types.Panel): +class TEXTURE_PT_marble(TextureTypePanel, Panel): bl_label = "Marble" tex_type = 'MARBLE' COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -303,7 +304,7 @@ class TEXTURE_PT_marble(TextureTypePanel, bpy.types.Panel): col.prop(tex, "nabla") -class TEXTURE_PT_magic(TextureTypePanel, bpy.types.Panel): +class TEXTURE_PT_magic(TextureTypePanel, Panel): bl_label = "Magic" tex_type = 'MAGIC' COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -318,7 +319,7 @@ class TEXTURE_PT_magic(TextureTypePanel, bpy.types.Panel): row.prop(tex, "turbulence") -class TEXTURE_PT_blend(TextureTypePanel, bpy.types.Panel): +class TEXTURE_PT_blend(TextureTypePanel, Panel): bl_label = "Blend" tex_type = 'BLEND' COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -336,7 +337,7 @@ class TEXTURE_PT_blend(TextureTypePanel, bpy.types.Panel): sub.prop(tex, "use_flip_axis", expand=True) -class TEXTURE_PT_stucci(TextureTypePanel, bpy.types.Panel): +class TEXTURE_PT_stucci(TextureTypePanel, Panel): bl_label = "Stucci" tex_type = 'STUCCI' COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -356,7 +357,7 @@ class TEXTURE_PT_stucci(TextureTypePanel, bpy.types.Panel): row.prop(tex, "turbulence") -class TEXTURE_PT_image(TextureTypePanel, bpy.types.Panel): +class TEXTURE_PT_image(TextureTypePanel, Panel): bl_label = "Image" tex_type = 'IMAGE' COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -382,7 +383,7 @@ def texture_filter_common(tex, layout): layout.prop(tex, "use_filter_size_min") -class TEXTURE_PT_image_sampling(TextureTypePanel, bpy.types.Panel): +class TEXTURE_PT_image_sampling(TextureTypePanel, Panel): bl_label = "Image Sampling" bl_options = {'DEFAULT_CLOSED'} tex_type = 'IMAGE' @@ -393,7 +394,7 @@ class TEXTURE_PT_image_sampling(TextureTypePanel, bpy.types.Panel): idblock = context_tex_datablock(context) tex = context.texture - slot = context.texture_slot + slot = getattr(context, "texture_slot", None) split = layout.split() @@ -408,12 +409,16 @@ class TEXTURE_PT_image_sampling(TextureTypePanel, bpy.types.Panel): col = split.column() #Only for Material based textures, not for Lamp/World... - if isinstance(idblock, bpy.types.Material): + if slot and isinstance(idblock, bpy.types.Material): col.prop(tex, "use_normal_map") row = col.row() row.active = tex.use_normal_map row.prop(slot, "normal_map_space", text="") + row = col.row() + row.active = not tex.use_normal_map + row.prop(tex, "use_derivative_map") + col.prop(tex, "use_mipmap") row = col.row() row.active = tex.use_mipmap @@ -423,7 +428,7 @@ class TEXTURE_PT_image_sampling(TextureTypePanel, bpy.types.Panel): texture_filter_common(tex, col) -class TEXTURE_PT_image_mapping(TextureTypePanel, bpy.types.Panel): +class TEXTURE_PT_image_mapping(TextureTypePanel, Panel): bl_label = "Image Mapping" bl_options = {'DEFAULT_CLOSED'} tex_type = 'IMAGE' @@ -479,7 +484,7 @@ class TEXTURE_PT_image_mapping(TextureTypePanel, bpy.types.Panel): col.prop(tex, "crop_max_y", text="Y") -class TEXTURE_PT_envmap(TextureTypePanel, bpy.types.Panel): +class TEXTURE_PT_envmap(TextureTypePanel, Panel): bl_label = "Environment Map" tex_type = 'ENVIRONMENT_MAP' COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -517,7 +522,7 @@ class TEXTURE_PT_envmap(TextureTypePanel, bpy.types.Panel): col.prop(env, "clip_end", text="End") -class TEXTURE_PT_envmap_sampling(TextureTypePanel, bpy.types.Panel): +class TEXTURE_PT_envmap_sampling(TextureTypePanel, Panel): bl_label = "Environment Map Sampling" bl_options = {'DEFAULT_CLOSED'} tex_type = 'ENVIRONMENT_MAP' @@ -531,7 +536,7 @@ class TEXTURE_PT_envmap_sampling(TextureTypePanel, bpy.types.Panel): texture_filter_common(tex, layout) -class TEXTURE_PT_musgrave(TextureTypePanel, bpy.types.Panel): +class TEXTURE_PT_musgrave(TextureTypePanel, Panel): bl_label = "Musgrave" tex_type = 'MUSGRAVE' COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -568,7 +573,7 @@ class TEXTURE_PT_musgrave(TextureTypePanel, bpy.types.Panel): row.prop(tex, "nabla") -class TEXTURE_PT_voronoi(TextureTypePanel, bpy.types.Panel): +class TEXTURE_PT_voronoi(TextureTypePanel, Panel): bl_label = "Voronoi" tex_type = 'VORONOI' COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -604,7 +609,7 @@ class TEXTURE_PT_voronoi(TextureTypePanel, bpy.types.Panel): row.prop(tex, "nabla") -class TEXTURE_PT_distortednoise(TextureTypePanel, bpy.types.Panel): +class TEXTURE_PT_distortednoise(TextureTypePanel, Panel): bl_label = "Distorted Noise" tex_type = 'DISTORTED_NOISE' COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -626,7 +631,7 @@ class TEXTURE_PT_distortednoise(TextureTypePanel, bpy.types.Panel): split.prop(tex, "nabla") -class TEXTURE_PT_voxeldata(TextureButtonsPanel, bpy.types.Panel): +class TEXTURE_PT_voxeldata(TextureButtonsPanel, Panel): bl_label = "Voxel Data" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -666,7 +671,7 @@ class TEXTURE_PT_voxeldata(TextureButtonsPanel, bpy.types.Panel): layout.prop(vd, "intensity") -class TEXTURE_PT_pointdensity(TextureButtonsPanel, bpy.types.Panel): +class TEXTURE_PT_pointdensity(TextureButtonsPanel, Panel): bl_label = "Point Density" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -732,7 +737,7 @@ class TEXTURE_PT_pointdensity(TextureButtonsPanel, bpy.types.Panel): col.template_curve_mapping(pd, "falloff_curve", brush=False) -class TEXTURE_PT_pointdensity_turbulence(TextureButtonsPanel, bpy.types.Panel): +class TEXTURE_PT_pointdensity_turbulence(TextureButtonsPanel, Panel): bl_label = "Turbulence" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -769,7 +774,7 @@ class TEXTURE_PT_pointdensity_turbulence(TextureButtonsPanel, bpy.types.Panel): col.prop(pd, "turbulence_strength") -class TEXTURE_PT_mapping(TextureSlotPanel, bpy.types.Panel): +class TEXTURE_PT_mapping(TextureSlotPanel, Panel): bl_label = "Mapping" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -857,7 +862,7 @@ class TEXTURE_PT_mapping(TextureSlotPanel, bpy.types.Panel): row.column().prop(tex, "scale") -class TEXTURE_PT_influence(TextureSlotPanel, bpy.types.Panel): +class TEXTURE_PT_influence(TextureSlotPanel, Panel): bl_label = "Influence" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} @@ -1024,16 +1029,18 @@ class TEXTURE_PT_influence(TextureSlotPanel, bpy.types.Panel): # only show bump settings if activated but not for normalmap images row = layout.row() - row.active = (tex.use_map_normal or tex.use_map_warp) and not (tex.texture.type == 'IMAGE' and tex.texture.use_normal_map) - row.prop(tex, "bump_method", text="Method") + sub = row.row() + sub.active = (tex.use_map_normal or tex.use_map_warp) and not (tex.texture.type == 'IMAGE' and (tex.texture.use_normal_map or tex.texture.use_derivative_map)) + sub.prop(tex, "bump_method", text="Method") + # the space setting is supported for: derivmaps + bumpmaps (DEFAULT,BEST_QUALITY), not for normalmaps sub = row.row() - sub.active = tex.bump_method in {'BUMP_DEFAULT', 'BUMP_BEST_QUALITY'} + sub.active = (tex.use_map_normal or tex.use_map_warp) and not (tex.texture.type == 'IMAGE' and tex.texture.use_normal_map) and ((tex.bump_method in {'BUMP_DEFAULT', 'BUMP_BEST_QUALITY'}) or (tex.texture.type == 'IMAGE' and tex.texture.use_derivative_map)) sub.prop(tex, "bump_objectspace", text="Space") -class TEXTURE_PT_custom_props(TextureButtonsPanel, PropertyPanel, bpy.types.Panel): +class TEXTURE_PT_custom_props(TextureButtonsPanel, PropertyPanel, Panel): COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} _context_path = "texture" _property_type = bpy.types.Texture diff --git a/release/scripts/startup/bl_ui/properties_world.py b/release/scripts/startup/bl_ui/properties_world.py index 4f398c9fbd9..71ee03296a0 100644 --- a/release/scripts/startup/bl_ui/properties_world.py +++ b/release/scripts/startup/bl_ui/properties_world.py @@ -18,10 +18,9 @@ # <pep8 compliant> import bpy +from bpy.types import Panel from rna_prop_ui import PropertyPanel -# TODO, "color_range" not in the UI - class WorldButtonsPanel(): bl_space_type = 'PROPERTIES' @@ -34,7 +33,7 @@ class WorldButtonsPanel(): return (context.world and context.scene.render.engine in cls.COMPAT_ENGINES) -class WORLD_PT_context_world(WorldButtonsPanel, bpy.types.Panel): +class WORLD_PT_context_world(WorldButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -63,7 +62,7 @@ class WORLD_PT_context_world(WorldButtonsPanel, bpy.types.Panel): split.label(text=str(texture_count), icon='TEXTURE') -class WORLD_PT_preview(WorldButtonsPanel, bpy.types.Panel): +class WORLD_PT_preview(WorldButtonsPanel, Panel): bl_label = "Preview" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -76,7 +75,7 @@ class WORLD_PT_preview(WorldButtonsPanel, bpy.types.Panel): self.layout.template_preview(context.world) -class WORLD_PT_world(WorldButtonsPanel, bpy.types.Panel): +class WORLD_PT_world(WorldButtonsPanel, Panel): bl_label = "World" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -96,8 +95,12 @@ class WORLD_PT_world(WorldButtonsPanel, bpy.types.Panel): col.active = world.use_sky_blend row.column().prop(world, "ambient_color") + row = layout.row() + row.prop(world, "exposure") + row.prop(world, "color_range") + -class WORLD_PT_ambient_occlusion(WorldButtonsPanel, bpy.types.Panel): +class WORLD_PT_ambient_occlusion(WorldButtonsPanel, Panel): bl_label = "Ambient Occlusion" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -116,7 +119,7 @@ class WORLD_PT_ambient_occlusion(WorldButtonsPanel, bpy.types.Panel): split.prop(light, "ao_blend_type", text="") -class WORLD_PT_environment_lighting(WorldButtonsPanel, bpy.types.Panel): +class WORLD_PT_environment_lighting(WorldButtonsPanel, Panel): bl_label = "Environment Lighting" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -135,7 +138,7 @@ class WORLD_PT_environment_lighting(WorldButtonsPanel, bpy.types.Panel): split.prop(light, "environment_color", text="") -class WORLD_PT_indirect_lighting(WorldButtonsPanel, bpy.types.Panel): +class WORLD_PT_indirect_lighting(WorldButtonsPanel, Panel): bl_label = "Indirect Lighting" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -157,7 +160,7 @@ class WORLD_PT_indirect_lighting(WorldButtonsPanel, bpy.types.Panel): layout.label(text="Only works with Approximate gather method") -class WORLD_PT_gather(WorldButtonsPanel, bpy.types.Panel): +class WORLD_PT_gather(WorldButtonsPanel, Panel): bl_label = "Gather" COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -205,7 +208,7 @@ class WORLD_PT_gather(WorldButtonsPanel, bpy.types.Panel): col.prop(light, "correction") -class WORLD_PT_mist(WorldButtonsPanel, bpy.types.Panel): +class WORLD_PT_mist(WorldButtonsPanel, Panel): bl_label = "Mist" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -234,7 +237,7 @@ class WORLD_PT_mist(WorldButtonsPanel, bpy.types.Panel): layout.prop(world.mist_settings, "falloff") -class WORLD_PT_stars(WorldButtonsPanel, bpy.types.Panel): +class WORLD_PT_stars(WorldButtonsPanel, Panel): bl_label = "Stars" bl_options = {'DEFAULT_CLOSED'} COMPAT_ENGINES = {'BLENDER_RENDER'} @@ -261,7 +264,7 @@ class WORLD_PT_stars(WorldButtonsPanel, bpy.types.Panel): col.prop(world.star_settings, "average_separation", text="Separation") -class WORLD_PT_custom_props(WorldButtonsPanel, PropertyPanel, bpy.types.Panel): +class WORLD_PT_custom_props(WorldButtonsPanel, PropertyPanel, Panel): COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} _context_path = "world" _property_type = bpy.types.World diff --git a/release/scripts/startup/bl_ui/space_console.py b/release/scripts/startup/bl_ui/space_console.py index da6c102100b..cbbefa01a3c 100644 --- a/release/scripts/startup/bl_ui/space_console.py +++ b/release/scripts/startup/bl_ui/space_console.py @@ -18,32 +18,30 @@ # <pep8 compliant> import bpy +from bpy.types import Header, Menu, Operator from bpy.props import StringProperty -class CONSOLE_HT_header(bpy.types.Header): +class CONSOLE_HT_header(Header): bl_space_type = 'CONSOLE' def draw(self, context): - layout = self.layout + layout = self.layout.row(align=True) - row = layout.row(align=True) - row.template_header() + layout.template_header() if context.area.show_menus: - sub = row.row(align=True) - sub.menu("CONSOLE_MT_console") + layout.menu("CONSOLE_MT_console") - row = layout.row(align=True) - row.operator("console.autocomplete", text="Autocomplete") + layout.operator("console.autocomplete", text="Autocomplete") -class CONSOLE_MT_console(bpy.types.Menu): +class CONSOLE_MT_console(Menu): bl_label = "Console" def draw(self, context): layout = self.layout - layout.column() + layout.operator("console.clear") layout.operator("console.copy") layout.operator("console.paste") @@ -55,7 +53,7 @@ class CONSOLE_MT_console(bpy.types.Menu): layout.operator("screen.screen_full_area") -class CONSOLE_MT_language(bpy.types.Menu): +class CONSOLE_MT_language(Menu): bl_label = "Languages..." def draw(self, context): @@ -82,7 +80,7 @@ def add_scrollback(text, text_type): type=text_type) -class ConsoleExec(bpy.types.Operator): +class ConsoleExec(Operator): '''Execute the current console line as a python expression''' bl_idname = "console.execute" bl_label = "Console Execute" @@ -100,7 +98,7 @@ class ConsoleExec(bpy.types.Operator): return {'FINISHED'} -class ConsoleAutocomplete(bpy.types.Operator): +class ConsoleAutocomplete(Operator): '''Evaluate the namespace up until the cursor and give a list of options or complete the name if there is only one''' bl_idname = "console.autocomplete" bl_label = "Console Autocomplete" @@ -117,7 +115,7 @@ class ConsoleAutocomplete(bpy.types.Operator): return {'FINISHED'} -class ConsoleBanner(bpy.types.Operator): +class ConsoleBanner(Operator): '''Print a message whem the terminal initializes''' bl_idname = "console.banner" bl_label = "Console Banner" @@ -139,11 +137,15 @@ class ConsoleBanner(bpy.types.Operator): return {'FINISHED'} -class ConsoleLanguage(bpy.types.Operator): +class ConsoleLanguage(Operator): '''Set the current language for this console''' bl_idname = "console.language" bl_label = "Console Language" - language = StringProperty(name="Language", maxlen=32, default="") + + language = StringProperty( + name="Language", + maxlen=32, + ) def execute(self, context): sc = context.space_data diff --git a/release/scripts/startup/bl_ui/space_dopesheet.py b/release/scripts/startup/bl_ui/space_dopesheet.py index 930a2029d32..90dcc99e6d7 100644 --- a/release/scripts/startup/bl_ui/space_dopesheet.py +++ b/release/scripts/startup/bl_ui/space_dopesheet.py @@ -19,6 +19,7 @@ # <pep8 compliant> import bpy +from bpy.types import Header, Menu ####################################### @@ -33,41 +34,10 @@ def dopesheet_filter(layout, context, genericFiltersOnly=False): row.prop(dopesheet, "show_only_selected", text="") row.prop(dopesheet, "show_hidden", text="") - if not genericFiltersOnly: - row = layout.row(align=True) - row.prop(dopesheet, "show_transforms", text="") - - if is_nla: - row.prop(dopesheet, "show_missing_nla", text="") - - row = layout.row(align=True) - row.prop(dopesheet, "show_scenes", text="") - row.prop(dopesheet, "show_worlds", text="") - row.prop(dopesheet, "show_nodes", text="") - - if bpy.data.meshes: - row.prop(dopesheet, "show_meshes", text="") - if bpy.data.shape_keys: - row.prop(dopesheet, "show_shapekeys", text="") - if bpy.data.materials: - row.prop(dopesheet, "show_materials", text="") - if bpy.data.lamps: - row.prop(dopesheet, "show_lamps", text="") - if bpy.data.textures: - row.prop(dopesheet, "show_textures", text="") - if bpy.data.cameras: - row.prop(dopesheet, "show_cameras", text="") - if bpy.data.curves: - row.prop(dopesheet, "show_curves", text="") - if bpy.data.metaballs: - row.prop(dopesheet, "show_metaballs", text="") - if bpy.data.lattices: - row.prop(dopesheet, "show_lattices", text="") - if bpy.data.armatures: - row.prop(dopesheet, "show_armatures", text="") - if bpy.data.particles: - row.prop(dopesheet, "show_particles", text="") + if is_nla: + row.prop(dopesheet, "show_missing_nla", text="") + if not genericFiltersOnly: if bpy.data.groups: row = layout.row(align=True) row.prop(dopesheet, "show_only_group_objects", text="") @@ -80,11 +50,47 @@ def dopesheet_filter(layout, context, genericFiltersOnly=False): if dopesheet.show_only_matching_fcurves: row.prop(dopesheet, "filter_fcurve_name", text="") + if not genericFiltersOnly: + row = layout.row(align=True) + row.prop(dopesheet, "show_datablock_filters", text="Filters") + + if dopesheet.show_datablock_filters: + row.prop(dopesheet, "show_scenes", text="") + row.prop(dopesheet, "show_worlds", text="") + row.prop(dopesheet, "show_nodes", text="") + + row.prop(dopesheet, "show_transforms", text="") + + if bpy.data.meshes: + row.prop(dopesheet, "show_meshes", text="") + if bpy.data.shape_keys: + row.prop(dopesheet, "show_shapekeys", text="") + if bpy.data.materials: + row.prop(dopesheet, "show_materials", text="") + if bpy.data.lamps: + row.prop(dopesheet, "show_lamps", text="") + if bpy.data.textures: + row.prop(dopesheet, "show_textures", text="") + if bpy.data.cameras: + row.prop(dopesheet, "show_cameras", text="") + if bpy.data.curves: + row.prop(dopesheet, "show_curves", text="") + if bpy.data.metaballs: + row.prop(dopesheet, "show_metaballs", text="") + if bpy.data.lattices: + row.prop(dopesheet, "show_lattices", text="") + if bpy.data.armatures: + row.prop(dopesheet, "show_armatures", text="") + if bpy.data.particles: + row.prop(dopesheet, "show_particles", text="") + if bpy.data.speakers: + row.prop(dopesheet, "show_speakers", text="") + ####################################### # DopeSheet Editor - General/Standard UI -class DOPESHEET_HT_header(bpy.types.Header): +class DOPESHEET_HT_header(Header): bl_space_type = 'DOPESHEET_EDITOR' def draw(self, context): @@ -96,21 +102,19 @@ class DOPESHEET_HT_header(bpy.types.Header): row.template_header() if context.area.show_menus: - sub = row.row(align=True) + row.menu("DOPESHEET_MT_view") + row.menu("DOPESHEET_MT_select") + row.menu("DOPESHEET_MT_marker") - sub.menu("DOPESHEET_MT_view") - sub.menu("DOPESHEET_MT_select") - sub.menu("DOPESHEET_MT_marker") - - if st.mode == 'DOPESHEET' or (st.mode == 'ACTION' and st.action != None): - sub.menu("DOPESHEET_MT_channel") + if st.mode == 'DOPESHEET' or (st.mode == 'ACTION' and st.action is not None): + row.menu("DOPESHEET_MT_channel") elif st.mode == 'GPENCIL': - sub.menu("DOPESHEET_MT_gpencil_channel") + row.menu("DOPESHEET_MT_gpencil_channel") if st.mode != 'GPENCIL': - sub.menu("DOPESHEET_MT_key") + row.menu("DOPESHEET_MT_key") else: - sub.menu("DOPESHEET_MT_gpencil_frame") + row.menu("DOPESHEET_MT_gpencil_frame") layout.prop(st, "mode", text="") layout.prop(st.dopesheet, "show_summary", text="Summary") @@ -134,7 +138,7 @@ class DOPESHEET_HT_header(bpy.types.Header): row.operator("action.paste", text="", icon='PASTEDOWN') -class DOPESHEET_MT_view(bpy.types.Menu): +class DOPESHEET_MT_view(Menu): bl_label = "View" def draw(self, context): @@ -142,8 +146,6 @@ class DOPESHEET_MT_view(bpy.types.Menu): st = context.space_data - layout.column() - layout.prop(st, "use_realtime_update") layout.prop(st, "show_frame_indicator") layout.prop(st, "show_sliders") @@ -170,13 +172,12 @@ class DOPESHEET_MT_view(bpy.types.Menu): layout.operator("screen.screen_full_area") -class DOPESHEET_MT_select(bpy.types.Menu): +class DOPESHEET_MT_select(Menu): bl_label = "Select" def draw(self, context): layout = self.layout - layout.column() # This is a bit misleading as the operator's default text is "Select All" while it actually *toggles* All/None layout.operator("action.select_all_toggle") layout.operator("action.select_all_toggle", text="Invert Selection").invert = True @@ -206,7 +207,7 @@ class DOPESHEET_MT_select(bpy.types.Menu): layout.operator("action.select_linked") -class DOPESHEET_MT_marker(bpy.types.Menu): +class DOPESHEET_MT_marker(Menu): bl_label = "Marker" def draw(self, context): @@ -216,7 +217,6 @@ class DOPESHEET_MT_marker(bpy.types.Menu): #layout.operator_context = 'EXEC_REGION_WIN' - layout.column() layout.operator("marker.add", "Add Marker") layout.operator("marker.duplicate", text="Duplicate Marker") layout.operator("marker.delete", text="Delete Marker") @@ -237,7 +237,7 @@ class DOPESHEET_MT_marker(bpy.types.Menu): ####################################### # Keyframe Editing -class DOPESHEET_MT_channel(bpy.types.Menu): +class DOPESHEET_MT_channel(Menu): bl_label = "Channel" def draw(self, context): @@ -245,7 +245,6 @@ class DOPESHEET_MT_channel(bpy.types.Menu): layout.operator_context = 'INVOKE_REGION_CHANNELS' - layout.column() layout.operator("anim.channels_delete") layout.separator() @@ -268,13 +267,12 @@ class DOPESHEET_MT_channel(bpy.types.Menu): layout.operator("anim.channels_fcurves_enable") -class DOPESHEET_MT_key(bpy.types.Menu): +class DOPESHEET_MT_key(Menu): bl_label = "Key" def draw(self, context): layout = self.layout - layout.column() layout.menu("DOPESHEET_MT_key_transform", text="Transform") layout.operator_menu_enum("action.snap", "type", text="Snap") @@ -284,7 +282,7 @@ class DOPESHEET_MT_key(bpy.types.Menu): layout.operator("action.keyframe_insert") layout.separator() - layout.operator("action.duplicate") + layout.operator("action.duplicate_move") layout.operator("action.delete") layout.separator() @@ -301,13 +299,12 @@ class DOPESHEET_MT_key(bpy.types.Menu): layout.operator("action.paste") -class DOPESHEET_MT_key_transform(bpy.types.Menu): +class DOPESHEET_MT_key_transform(Menu): bl_label = "Transform" def draw(self, context): layout = self.layout - layout.column() layout.operator("transform.transform", text="Grab/Move").mode = 'TIME_TRANSLATE' layout.operator("transform.transform", text="Extend").mode = 'TIME_EXTEND' layout.operator("transform.transform", text="Slide").mode = 'TIME_SLIDE' @@ -317,7 +314,7 @@ class DOPESHEET_MT_key_transform(bpy.types.Menu): ####################################### # Grease Pencil Editing -class DOPESHEET_MT_gpencil_channel(bpy.types.Menu): +class DOPESHEET_MT_gpencil_channel(Menu): bl_label = "Channel" def draw(self, context): @@ -325,7 +322,6 @@ class DOPESHEET_MT_gpencil_channel(bpy.types.Menu): layout.operator_context = 'INVOKE_REGION_CHANNELS' - layout.column() layout.operator("anim.channels_delete") layout.separator() @@ -345,13 +341,12 @@ class DOPESHEET_MT_gpencil_channel(bpy.types.Menu): #layout.operator_menu_enum("anim.channels_move", "direction", text="Move...") -class DOPESHEET_MT_gpencil_frame(bpy.types.Menu): +class DOPESHEET_MT_gpencil_frame(Menu): bl_label = "Frame" def draw(self, context): layout = self.layout - layout.column() layout.menu("DOPESHEET_MT_key_transform", text="Transform") #layout.operator_menu_enum("action.snap", "type", text="Snap") diff --git a/release/scripts/startup/bl_ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py index 73fe1a97252..cf0d10c5844 100644 --- a/release/scripts/startup/bl_ui/space_filebrowser.py +++ b/release/scripts/startup/bl_ui/space_filebrowser.py @@ -18,9 +18,10 @@ # <pep8 compliant> import bpy +from bpy.types import Header -class FILEBROWSER_HT_header(bpy.types.Header): +class FILEBROWSER_HT_header(Header): bl_space_type = 'FILE_BROWSER' def draw(self, context): diff --git a/release/scripts/startup/bl_ui/space_graph.py b/release/scripts/startup/bl_ui/space_graph.py index bfc1a0e3a23..d4b8c415a7f 100644 --- a/release/scripts/startup/bl_ui/space_graph.py +++ b/release/scripts/startup/bl_ui/space_graph.py @@ -19,9 +19,10 @@ # <pep8 compliant> import bpy +from bpy.types import Header, Menu -class GRAPH_HT_header(bpy.types.Header): +class GRAPH_HT_header(Header): bl_space_type = 'GRAPH_EDITOR' def draw(self, context): @@ -35,13 +36,11 @@ class GRAPH_HT_header(bpy.types.Header): row.template_header() if context.area.show_menus: - sub = row.row(align=True) - - sub.menu("GRAPH_MT_view") - sub.menu("GRAPH_MT_select") - sub.menu("GRAPH_MT_marker") - sub.menu("GRAPH_MT_channel") - sub.menu("GRAPH_MT_key") + row.menu("GRAPH_MT_view") + row.menu("GRAPH_MT_select") + row.menu("GRAPH_MT_marker") + row.menu("GRAPH_MT_channel") + row.menu("GRAPH_MT_key") layout.prop(st, "mode", text="") @@ -61,7 +60,7 @@ class GRAPH_HT_header(bpy.types.Header): row.operator("graph.ghost_curves_create", text="", icon='GHOST_ENABLED') -class GRAPH_MT_view(bpy.types.Menu): +class GRAPH_MT_view(Menu): bl_label = "View" def draw(self, context): @@ -69,8 +68,6 @@ class GRAPH_MT_view(bpy.types.Menu): st = context.space_data - layout.column() - layout.operator("graph.properties", icon='MENU_PANEL') layout.separator() @@ -81,7 +78,7 @@ class GRAPH_MT_view(bpy.types.Menu): layout.prop(st, "use_auto_merge_keyframes") layout.separator() - layout.prop(st, "use_fancy_drawing") + layout.prop(st, "use_beauty_drawing") layout.separator() if st.show_handles: @@ -107,13 +104,12 @@ class GRAPH_MT_view(bpy.types.Menu): layout.operator("screen.screen_full_area") -class GRAPH_MT_select(bpy.types.Menu): +class GRAPH_MT_select(Menu): bl_label = "Select" def draw(self, context): layout = self.layout - layout.column() # This is a bit misleading as the operator's default text is "Select All" while it actually *toggles* All/None layout.operator("graph.select_all_toggle") layout.operator("graph.select_all_toggle", text="Invert Selection").invert = True @@ -142,7 +138,7 @@ class GRAPH_MT_select(bpy.types.Menu): layout.operator("graph.select_linked") -class GRAPH_MT_marker(bpy.types.Menu): +class GRAPH_MT_marker(Menu): bl_label = "Marker" def draw(self, context): @@ -150,7 +146,6 @@ class GRAPH_MT_marker(bpy.types.Menu): #layout.operator_context = 'EXEC_REGION_WIN' - layout.column() layout.operator("marker.add", "Add Marker") layout.operator("marker.duplicate", text="Duplicate Marker") layout.operator("marker.delete", text="Delete Marker") @@ -163,7 +158,7 @@ class GRAPH_MT_marker(bpy.types.Menu): # TODO: pose markers for action edit mode only? -class GRAPH_MT_channel(bpy.types.Menu): +class GRAPH_MT_channel(Menu): bl_label = "Channel" def draw(self, context): @@ -171,7 +166,6 @@ class GRAPH_MT_channel(bpy.types.Menu): layout.operator_context = 'INVOKE_REGION_CHANNELS' - layout.column() layout.operator("anim.channels_delete") layout.separator() @@ -195,13 +189,12 @@ class GRAPH_MT_channel(bpy.types.Menu): layout.operator("anim.channels_fcurves_enable") -class GRAPH_MT_key(bpy.types.Menu): +class GRAPH_MT_key(Menu): bl_label = "Key" def draw(self, context): layout = self.layout - layout.column() layout.menu("GRAPH_MT_key_transform", text="Transform") layout.operator_menu_enum("graph.snap", "type", text="Snap") @@ -213,7 +206,7 @@ class GRAPH_MT_key(bpy.types.Menu): layout.operator("graph.sound_bake") layout.separator() - layout.operator("graph.duplicate") + layout.operator("graph.duplicate_move") layout.operator("graph.delete") layout.separator() @@ -234,13 +227,12 @@ class GRAPH_MT_key(bpy.types.Menu): layout.operator("graph.euler_filter", text="Discontinuity (Euler) Filter") -class GRAPH_MT_key_transform(bpy.types.Menu): +class GRAPH_MT_key_transform(Menu): bl_label = "Transform" def draw(self, context): layout = self.layout - layout.column() layout.operator("transform.translate", text="Grab/Move") layout.operator("transform.transform", text="Extend").mode = 'TIME_EXTEND' layout.operator("transform.rotate", text="Rotate") diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py index 9f69ca17076..97b5d8457e0 100644 --- a/release/scripts/startup/bl_ui/space_image.py +++ b/release/scripts/startup/bl_ui/space_image.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Header, Menu, Panel class BrushButtonsPanel(): @@ -31,7 +32,7 @@ class BrushButtonsPanel(): return sima.show_paint and toolsettings.brush -class IMAGE_MT_view(bpy.types.Menu): +class IMAGE_MT_view(Menu): bl_label = "View" def draw(self, context): @@ -79,7 +80,7 @@ class IMAGE_MT_view(bpy.types.Menu): layout.operator("screen.screen_full_area") -class IMAGE_MT_select(bpy.types.Menu): +class IMAGE_MT_select(Menu): bl_label = "Select" def draw(self, context): @@ -100,7 +101,7 @@ class IMAGE_MT_select(bpy.types.Menu): layout.operator("uv.select_linked") -class IMAGE_MT_image(bpy.types.Menu): +class IMAGE_MT_image(Menu): bl_label = "Image" def draw(self, context): @@ -151,7 +152,7 @@ class IMAGE_MT_image(bpy.types.Menu): layout.prop(sima, "use_image_paint") -class IMAGE_MT_image_invert(bpy.types.Menu): +class IMAGE_MT_image_invert(Menu): bl_label = "Invert" def draw(self, context): @@ -177,7 +178,7 @@ class IMAGE_MT_image_invert(bpy.types.Menu): op.invert_a = True -class IMAGE_MT_uvs_showhide(bpy.types.Menu): +class IMAGE_MT_uvs_showhide(Menu): bl_label = "Show/Hide Faces" def draw(self, context): @@ -188,7 +189,7 @@ class IMAGE_MT_uvs_showhide(bpy.types.Menu): layout.operator("uv.hide", text="Hide Unselected").unselected = True -class IMAGE_MT_uvs_transform(bpy.types.Menu): +class IMAGE_MT_uvs_transform(Menu): bl_label = "Transform" def draw(self, context): @@ -198,8 +199,12 @@ class IMAGE_MT_uvs_transform(bpy.types.Menu): layout.operator("transform.rotate") layout.operator("transform.resize") + layout.separator() + + layout.operator("transform.shear") + -class IMAGE_MT_uvs_snap(bpy.types.Menu): +class IMAGE_MT_uvs_snap(Menu): bl_label = "Snap" def draw(self, context): @@ -216,7 +221,7 @@ class IMAGE_MT_uvs_snap(bpy.types.Menu): layout.operator("uv.snap_cursor", text="Cursor to Selected").target = 'SELECTED' -class IMAGE_MT_uvs_mirror(bpy.types.Menu): +class IMAGE_MT_uvs_mirror(Menu): bl_label = "Mirror" def draw(self, context): @@ -227,7 +232,7 @@ class IMAGE_MT_uvs_mirror(bpy.types.Menu): layout.operator("transform.mirror", text="Y Axis").constraint_axis[1] = True -class IMAGE_MT_uvs_weldalign(bpy.types.Menu): +class IMAGE_MT_uvs_weldalign(Menu): bl_label = "Weld/Align" def draw(self, context): @@ -237,7 +242,7 @@ class IMAGE_MT_uvs_weldalign(bpy.types.Menu): layout.operator_enum("uv.align", "axis") # W, 2/3/4 -class IMAGE_MT_uvs(bpy.types.Menu): +class IMAGE_MT_uvs(Menu): bl_label = "UVs" def draw(self, context): @@ -282,7 +287,7 @@ class IMAGE_MT_uvs(bpy.types.Menu): layout.menu("IMAGE_MT_uvs_showhide") -class IMAGE_MT_uvs_select_mode(bpy.types.Menu): +class IMAGE_MT_uvs_select_mode(Menu): bl_label = "UV Select Mode" def draw(self, context): @@ -324,7 +329,7 @@ class IMAGE_MT_uvs_select_mode(bpy.types.Menu): prop.data_path = "tool_settings.uv_select_mode" -class IMAGE_HT_header(bpy.types.Header): +class IMAGE_HT_header(Header): bl_space_type = 'IMAGE_EDITOR' def draw(self, context): @@ -382,7 +387,7 @@ class IMAGE_HT_header(bpy.types.Header): row = layout.row(align=True) row.prop(toolsettings, "use_snap", text="") - row.prop(toolsettings, "snap_element", text="", icon_only=True) + row.prop(toolsettings, "snap_target", text="") mesh = context.edit_object.data layout.prop_search(mesh.uv_textures, "active", mesh, "uv_textures", text="") @@ -408,7 +413,7 @@ class IMAGE_HT_header(bpy.types.Header): layout.prop(sima, "use_realtime_update", text="", icon_only=True, icon='LOCKED') -class IMAGE_PT_image_properties(bpy.types.Panel): +class IMAGE_PT_image_properties(Panel): bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_label = "Image" @@ -427,14 +432,13 @@ class IMAGE_PT_image_properties(bpy.types.Panel): layout.template_image(sima, "image", iuser) -class IMAGE_PT_game_properties(bpy.types.Panel): +class IMAGE_PT_game_properties(Panel): bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_label = "Game Properties" @classmethod def poll(cls, context): - rd = context.scene.render sima = context.space_data # display even when not in game mode because these settings effect the 3d view return (sima and sima.image) # and (rd.engine == 'BLENDER_GAME') @@ -449,14 +453,12 @@ class IMAGE_PT_game_properties(bpy.types.Panel): col = split.column() + col.prop(ima, "use_animation") sub = col.column(align=True) - sub.prop(ima, "use_animation") - - subsub = sub.column() - subsub.active = ima.use_animation - subsub.prop(ima, "frame_start", text="Start") - subsub.prop(ima, "frame_end", text="End") - subsub.prop(ima, "fps", text="Speed") + sub.active = ima.use_animation + sub.prop(ima, "frame_start", text="Start") + sub.prop(ima, "frame_end", text="End") + sub.prop(ima, "fps", text="Speed") col.prop(ima, "use_tiles") sub = col.column(align=True) @@ -472,7 +474,7 @@ class IMAGE_PT_game_properties(bpy.types.Panel): col.prop(ima, "mapping", expand=True) -class IMAGE_PT_view_histogram(bpy.types.Panel): +class IMAGE_PT_view_histogram(Panel): bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'PREVIEW' bl_label = "Histogram" @@ -491,7 +493,7 @@ class IMAGE_PT_view_histogram(bpy.types.Panel): layout.prop(sima.scopes.histogram, "mode", icon_only=True) -class IMAGE_PT_view_waveform(bpy.types.Panel): +class IMAGE_PT_view_waveform(Panel): bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'PREVIEW' bl_label = "Waveform" @@ -505,13 +507,14 @@ class IMAGE_PT_view_waveform(bpy.types.Panel): layout = self.layout sima = context.space_data + layout.template_waveform(sima, "scopes") - sub = layout.row().split(percentage=0.75) - sub.prop(sima.scopes, "waveform_alpha") - sub.prop(sima.scopes, "waveform_mode", text="", icon_only=True) + row = layout.split(percentage=0.75) + row.prop(sima.scopes, "waveform_alpha") + row.prop(sima.scopes, "waveform_mode", text="", icon_only=True) -class IMAGE_PT_view_vectorscope(bpy.types.Panel): +class IMAGE_PT_view_vectorscope(Panel): bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'PREVIEW' bl_label = "Vectorscope" @@ -529,7 +532,7 @@ class IMAGE_PT_view_vectorscope(bpy.types.Panel): layout.prop(sima.scopes, "vectorscope_alpha") -class IMAGE_PT_sample_line(bpy.types.Panel): +class IMAGE_PT_sample_line(Panel): bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'PREVIEW' bl_label = "Sample Line" @@ -541,13 +544,15 @@ class IMAGE_PT_sample_line(bpy.types.Panel): def draw(self, context): layout = self.layout - layout.operator("image.sample_line") + sima = context.space_data + + layout.operator("image.sample_line") layout.template_histogram(sima, "sample_histogram") layout.prop(sima.sample_histogram, "mode") -class IMAGE_PT_scope_sample(bpy.types.Panel): +class IMAGE_PT_scope_sample(Panel): bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'PREVIEW' bl_label = "Scope Samples" @@ -559,16 +564,17 @@ class IMAGE_PT_scope_sample(bpy.types.Panel): def draw(self, context): layout = self.layout + sima = context.space_data - split = layout.split() - row = split.row() + + row = layout.row() row.prop(sima.scopes, "use_full_resolution") - row = split.row() - row.active = not sima.scopes.use_full_resolution - row.prop(sima.scopes, "accuracy") + sub = row.row() + sub.active = not sima.scopes.use_full_resolution + sub.prop(sima.scopes, "accuracy") -class IMAGE_PT_view_properties(bpy.types.Panel): +class IMAGE_PT_view_properties(Panel): bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_label = "Display" @@ -605,21 +611,20 @@ class IMAGE_PT_view_properties(bpy.types.Panel): if show_uvedit: col = layout.column() - col.label("Cursor Location") - row = col.row() - row.prop(uvedit, "cursor_location", text="") + col.label("Cursor Location:") + col.row().prop(uvedit, "cursor_location", text="") + + col.separator() - col = layout.column() col.label(text="UVs:") - row = col.row() - row.prop(uvedit, "edge_draw_type", expand=True) + col.row().prop(uvedit, "edge_draw_type", expand=True) split = layout.split() + col = split.column() + col.prop(uvedit, "show_faces") col.prop(uvedit, "show_smooth_edges", text="Smooth") col.prop(uvedit, "show_modified_edges", text="Modified") - #col.prop(uvedit, "show_edges") - #col.prop(uvedit, "show_faces") col = split.column() col.prop(uvedit, "show_stretch", text="Stretch") @@ -628,7 +633,7 @@ class IMAGE_PT_view_properties(bpy.types.Panel): sub.row().prop(uvedit, "draw_stretch_type", expand=True) -class IMAGE_PT_paint(bpy.types.Panel): +class IMAGE_PT_paint(Panel): bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_label = "Paint" @@ -644,9 +649,8 @@ class IMAGE_PT_paint(bpy.types.Panel): toolsettings = context.tool_settings.image_paint brush = toolsettings.brush - col = layout.split().column() - row = col.row() - col.template_ID_preview(toolsettings, "brush", new="brush.add", rows=3, cols=8) + col = layout.column() + col.template_ID_preview(toolsettings, "brush", new="brush.add", rows=2, cols=6) if brush: col = layout.column() @@ -673,7 +677,7 @@ class IMAGE_PT_paint(bpy.types.Panel): col.prop(brush, "clone_alpha", text="Alpha") -class IMAGE_PT_tools_brush_texture(BrushButtonsPanel, bpy.types.Panel): +class IMAGE_PT_tools_brush_texture(BrushButtonsPanel, Panel): bl_label = "Texture" bl_options = {'DEFAULT_CLOSED'} @@ -688,7 +692,7 @@ class IMAGE_PT_tools_brush_texture(BrushButtonsPanel, bpy.types.Panel): col.prop(brush, "use_fixed_texture") -class IMAGE_PT_tools_brush_tool(BrushButtonsPanel, bpy.types.Panel): +class IMAGE_PT_tools_brush_tool(BrushButtonsPanel, Panel): bl_label = "Tool" bl_options = {'DEFAULT_CLOSED'} @@ -697,9 +701,7 @@ class IMAGE_PT_tools_brush_tool(BrushButtonsPanel, bpy.types.Panel): settings = context.tool_settings.image_paint brush = settings.brush - col = layout.column(align=True) - - col.prop(brush, "image_tool", expand=False, text="") + layout.prop(brush, "image_tool", text="") row = layout.row(align=True) row.prop(brush, "use_paint_sculpt", text="", icon='SCULPTMODE_HLT') @@ -708,7 +710,7 @@ class IMAGE_PT_tools_brush_tool(BrushButtonsPanel, bpy.types.Panel): row.prop(brush, "use_paint_image", text="", icon='TPAINT_HLT') -class IMAGE_PT_paint_stroke(BrushButtonsPanel, bpy.types.Panel): +class IMAGE_PT_paint_stroke(BrushButtonsPanel, Panel): bl_label = "Paint Stroke" bl_options = {'DEFAULT_CLOSED'} @@ -719,9 +721,9 @@ class IMAGE_PT_paint_stroke(BrushButtonsPanel, bpy.types.Panel): brush = toolsettings.brush layout.prop(brush, "use_airbrush") - col = layout.column() - col.active = brush.use_airbrush - col.prop(brush, "rate", slider=True) + row = layout.row() + row.active = brush.use_airbrush + row.prop(brush, "rate", slider=True) layout.prop(brush, "use_space") row = layout.row(align=True) @@ -732,7 +734,7 @@ class IMAGE_PT_paint_stroke(BrushButtonsPanel, bpy.types.Panel): layout.prop(brush, "use_wrap") -class IMAGE_PT_paint_curve(BrushButtonsPanel, bpy.types.Panel): +class IMAGE_PT_paint_curve(BrushButtonsPanel, Panel): bl_label = "Paint Curve" bl_options = {'DEFAULT_CLOSED'} diff --git a/release/scripts/startup/bl_ui/space_info.py b/release/scripts/startup/bl_ui/space_info.py index 1fb2e5b735e..7f5a5f231cf 100644 --- a/release/scripts/startup/bl_ui/space_info.py +++ b/release/scripts/startup/bl_ui/space_info.py @@ -18,9 +18,10 @@ # <pep8 compliant> import bpy +from bpy.types import Header, Menu, Operator -class INFO_HT_header(bpy.types.Header): +class INFO_HT_header(Header): bl_space_type = 'INFO' def draw(self, context): @@ -61,7 +62,9 @@ class INFO_HT_header(bpy.types.Header): layout.template_reports_banner() - layout.label(text=scene.statistics()) + row = layout.row(align=True) + row.operator("wm.splash", text="", icon='BLENDER', emboss=False) + row.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="") @@ -84,19 +87,19 @@ class INFO_HT_header(bpy.types.Header): """ -class INFO_MT_report(bpy.types.Menu): +class INFO_MT_report(Menu): bl_label = "Report" def draw(self, context): layout = self.layout - layout.column() + layout.operator("console.select_all_toggle") layout.operator("console.select_border") layout.operator("console.report_delete") layout.operator("console.report_copy") -class INFO_MT_file(bpy.types.Menu): +class INFO_MT_file(Menu): bl_label = "File" def draw(self, context): @@ -150,7 +153,7 @@ class INFO_MT_file(bpy.types.Menu): layout.operator("wm.quit_blender", text="Quit", icon='QUIT') -class INFO_MT_file_import(bpy.types.Menu): +class INFO_MT_file_import(Menu): bl_idname = "INFO_MT_file_import" bl_label = "Import" @@ -159,7 +162,7 @@ class INFO_MT_file_import(bpy.types.Menu): self.layout.operator("wm.collada_import", text="COLLADA (.dae)") -class INFO_MT_file_export(bpy.types.Menu): +class INFO_MT_file_export(Menu): bl_idname = "INFO_MT_file_export" bl_label = "Export" @@ -168,7 +171,7 @@ class INFO_MT_file_export(bpy.types.Menu): self.layout.operator("wm.collada_export", text="COLLADA (.dae)") -class INFO_MT_file_external_data(bpy.types.Menu): +class INFO_MT_file_external_data(Menu): bl_label = "External Data" def draw(self, context): @@ -185,12 +188,13 @@ class INFO_MT_file_external_data(bpy.types.Menu): layout.operator("file.find_missing_files") -class INFO_MT_mesh_add(bpy.types.Menu): +class INFO_MT_mesh_add(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") @@ -205,12 +209,13 @@ class INFO_MT_mesh_add(bpy.types.Menu): layout.operator("mesh.primitive_torus_add", text="Torus", icon='MESH_TORUS') -class INFO_MT_curve_add(bpy.types.Menu): +class INFO_MT_curve_add(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") @@ -219,7 +224,7 @@ class INFO_MT_curve_add(bpy.types.Menu): layout.operator("curve.primitive_nurbs_path_add", icon='CURVE_PATH', text="Path") -class INFO_MT_edit_curve_add(bpy.types.Menu): +class INFO_MT_edit_curve_add(Menu): bl_idname = "INFO_MT_edit_curve_add" bl_label = "Add" @@ -235,12 +240,13 @@ class INFO_MT_edit_curve_add(bpy.types.Menu): INFO_MT_curve_add.draw(self, context) -class INFO_MT_surface_add(bpy.types.Menu): +class INFO_MT_surface_add(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") @@ -250,17 +256,18 @@ class INFO_MT_surface_add(bpy.types.Menu): layout.operator("surface.primitive_nurbs_surface_torus_add", icon='SURFACE_NTORUS', text="NURBS Torus") -class INFO_MT_armature_add(bpy.types.Menu): +class INFO_MT_armature_add(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): +class INFO_MT_add(Menu): bl_label = "Add" def draw(self, context): @@ -285,6 +292,9 @@ class INFO_MT_add(bpy.types.Menu): layout.operator("object.add", text="Empty", icon='OUTLINER_OB_EMPTY').type = 'EMPTY' layout.separator() + layout.operator("object.speaker_add", text="Speaker", icon='OUTLINER_OB_SPEAKER') + 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') @@ -300,7 +310,7 @@ class INFO_MT_add(bpy.types.Menu): layout.operator_menu_enum("object.group_instance_add", "group", text="Group Instance", icon='OUTLINER_OB_EMPTY') -class INFO_MT_game(bpy.types.Menu): +class INFO_MT_game(Menu): bl_label = "Game" def draw(self, context): @@ -321,7 +331,7 @@ class INFO_MT_game(bpy.types.Menu): layout.prop(gs, "use_auto_start") -class INFO_MT_render(bpy.types.Menu): +class INFO_MT_render(Menu): bl_label = "Render" def draw(self, context): @@ -341,7 +351,7 @@ class INFO_MT_render(bpy.types.Menu): layout.operator("render.play_rendered_anim") -class INFO_MT_help(bpy.types.Menu): +class INFO_MT_help(Menu): bl_label = "Help" def draw(self, context): @@ -350,7 +360,7 @@ class INFO_MT_help(bpy.types.Menu): 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-257/' + layout.operator("wm.url_open", text="Release Log", icon='URL').url = 'http://www.blender.org/development/release-logs/blender-259/' layout.separator() @@ -377,7 +387,7 @@ class INFO_MT_help(bpy.types.Menu): # Help operators -class HELP_OT_operator_cheat_sheet(bpy.types.Operator): +class HELP_OT_operator_cheat_sheet(Operator): bl_idname = "help.operator_cheat_sheet" bl_label = "Operator Cheat Sheet" diff --git a/release/scripts/startup/bl_ui/space_logic.py b/release/scripts/startup/bl_ui/space_logic.py index 7f7aba71a46..869a91124d3 100644 --- a/release/scripts/startup/bl_ui/space_logic.py +++ b/release/scripts/startup/bl_ui/space_logic.py @@ -18,9 +18,10 @@ # <pep8 compliant> import bpy +from bpy.types import Header, Menu, Panel -class LOGIC_PT_properties(bpy.types.Panel): +class LOGIC_PT_properties(Panel): bl_space_type = 'LOGIC_EDITOR' bl_region_type = 'UI' bl_label = "Properties" @@ -49,7 +50,7 @@ class LOGIC_PT_properties(bpy.types.Panel): row.operator("object.game_property_remove", text="", icon='X', emboss=False).index = i -class LOGIC_MT_logicbricks_add(bpy.types.Menu): +class LOGIC_MT_logicbricks_add(Menu): bl_label = "Add" def draw(self, context): @@ -60,30 +61,24 @@ class LOGIC_MT_logicbricks_add(bpy.types.Menu): layout.operator_menu_enum("logic.actuator_add", "type", text="Actuator") -class LOGIC_HT_header(bpy.types.Header): +class LOGIC_HT_header(Header): bl_space_type = 'LOGIC_EDITOR' def draw(self, context): - layout = self.layout + layout = self.layout.row(align=True) - row = layout.row(align=True) - row.template_header() + layout.template_header() if context.area.show_menus: - sub = row.row(align=True) - sub.menu("LOGIC_MT_view") - #sub.menu("LOGIC_MT_select") - #sub.menu("LOGIC_MT_add") + layout.menu("LOGIC_MT_view") -class LOGIC_MT_view(bpy.types.Menu): +class LOGIC_MT_view(Menu): bl_label = "View" def draw(self, context): layout = self.layout - layout.column() - layout.operator("logic.properties", icon='MENU_PANEL') if __name__ == "__main__": # only for live edit. diff --git a/release/scripts/startup/bl_ui/space_nla.py b/release/scripts/startup/bl_ui/space_nla.py index 717adb3baa8..ffead81c507 100644 --- a/release/scripts/startup/bl_ui/space_nla.py +++ b/release/scripts/startup/bl_ui/space_nla.py @@ -19,9 +19,10 @@ # <pep8 compliant> import bpy +from bpy.types import Header, Menu -class NLA_HT_header(bpy.types.Header): +class NLA_HT_header(Header): bl_space_type = 'NLA_EDITOR' def draw(self, context): @@ -35,20 +36,18 @@ class NLA_HT_header(bpy.types.Header): row.template_header() if context.area.show_menus: - sub = row.row(align=True) - - sub.menu("NLA_MT_view") - sub.menu("NLA_MT_select") - sub.menu("NLA_MT_marker") - sub.menu("NLA_MT_edit") - sub.menu("NLA_MT_add") + row.menu("NLA_MT_view") + row.menu("NLA_MT_select") + row.menu("NLA_MT_marker") + row.menu("NLA_MT_edit") + row.menu("NLA_MT_add") dopesheet_filter(layout, context) layout.prop(st, "auto_snap", text="") -class NLA_MT_view(bpy.types.Menu): +class NLA_MT_view(Menu): bl_label = "View" def draw(self, context): @@ -56,8 +55,6 @@ class NLA_MT_view(bpy.types.Menu): st = context.space_data - layout.column() - layout.operator("nla.properties", icon='MENU_PANEL') layout.separator() @@ -74,17 +71,20 @@ class NLA_MT_view(bpy.types.Menu): layout.operator("anim.previewrange_clear") layout.separator() + layout.operator("nla.view_all") + layout.operator("nla.view_selected") + + layout.separator() layout.operator("screen.area_dupli") layout.operator("screen.screen_full_area") -class NLA_MT_select(bpy.types.Menu): +class NLA_MT_select(Menu): bl_label = "Select" def draw(self, context): layout = self.layout - layout.column() # This is a bit misleading as the operator's default text is "Select All" while it actually *toggles* All/None layout.operator("nla.select_all_toggle") layout.operator("nla.select_all_toggle", text="Invert Selection").invert = True @@ -98,7 +98,7 @@ class NLA_MT_select(bpy.types.Menu): layout.operator("nla.select_leftright", text="After Current Frame").mode = 'RIGHT' -class NLA_MT_marker(bpy.types.Menu): +class NLA_MT_marker(Menu): bl_label = "Marker" def draw(self, context): @@ -106,7 +106,6 @@ class NLA_MT_marker(bpy.types.Menu): #layout.operator_context = 'EXEC_REGION_WIN' - layout.column() layout.operator("marker.add", "Add Marker") layout.operator("marker.duplicate", text="Duplicate Marker") layout.operator("marker.delete", text="Delete Marker") @@ -117,7 +116,7 @@ class NLA_MT_marker(bpy.types.Menu): layout.operator("marker.move", text="Grab/Move Marker") -class NLA_MT_edit(bpy.types.Menu): +class NLA_MT_edit(Menu): bl_label = "Edit" def draw(self, context): @@ -125,7 +124,6 @@ class NLA_MT_edit(bpy.types.Menu): scene = context.scene - layout.column() layout.menu("NLA_MT_edit_transform", text="Transform") layout.operator_menu_enum("nla.snap", "type", text="Snap") @@ -160,15 +158,15 @@ class NLA_MT_edit(bpy.types.Menu): layout.operator("nla.tweakmode_enter", text="Start Tweaking Strip Actions") -class NLA_MT_add(bpy.types.Menu): +class NLA_MT_add(Menu): bl_label = "Add" def draw(self, context): layout = self.layout - layout.column() layout.operator("nla.actionclip_add") layout.operator("nla.transition_add") + layout.operator("nla.soundclip_add") layout.separator() layout.operator("nla.meta_add") @@ -179,13 +177,12 @@ class NLA_MT_add(bpy.types.Menu): layout.operator("nla.tracks_add", text="Add Tracks Above Selected").above_selected = True -class NLA_MT_edit_transform(bpy.types.Menu): +class NLA_MT_edit_transform(Menu): bl_label = "Transform" def draw(self, context): layout = self.layout - layout.column() layout.operator("transform.translate", text="Grab/Move") layout.operator("transform.transform", text="Extend").mode = 'TIME_EXTEND' layout.operator("transform.transform", text="Scale").mode = 'TIME_SCALE' diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py index fed1cc49c4c..708017ba749 100644 --- a/release/scripts/startup/bl_ui/space_node.py +++ b/release/scripts/startup/bl_ui/space_node.py @@ -18,42 +18,39 @@ # <pep8 compliant> import bpy +from bpy.types import Header, Menu, Panel -class NODE_HT_header(bpy.types.Header): +class NODE_HT_header(Header): bl_space_type = 'NODE_EDITOR' def draw(self, context): layout = self.layout snode = context.space_data + snode_id = snode.id + id_from = snode.id_from row = layout.row(align=True) row.template_header() if context.area.show_menus: - sub = row.row(align=True) - sub.menu("NODE_MT_view") - sub.menu("NODE_MT_select") - sub.menu("NODE_MT_add") - sub.menu("NODE_MT_node") + row.menu("NODE_MT_view") + row.menu("NODE_MT_select") + row.menu("NODE_MT_add") + row.menu("NODE_MT_node") - row = layout.row() - row.prop(snode, "tree_type", text="", expand=True) + layout.prop(snode, "tree_type", text="", expand=True) if snode.tree_type == 'MATERIAL': - ob = snode.id_from - snode_id = snode.id - if ob: - layout.template_ID(ob, "active_material", new="material.new") + if id_from: + layout.template_ID(id_from, "active_material", new="material.new") if snode_id: layout.prop(snode_id, "use_nodes") elif snode.tree_type == 'TEXTURE': - row.prop(snode, "texture_type", text="", expand=True) + layout.prop(snode, "texture_type", text="", expand=True) - snode_id = snode.id - id_from = snode.id_from if id_from: if snode.texture_type == 'BRUSH': layout.template_ID(id_from, "texture", new="texture.new") @@ -63,10 +60,8 @@ class NODE_HT_header(bpy.types.Header): layout.prop(snode_id, "use_nodes") elif snode.tree_type == 'COMPOSITING': - scene = snode.id - - layout.prop(scene, "use_nodes") - layout.prop(scene.render, "use_free_unused_nodes", text="Free Unused") + layout.prop(snode_id, "use_nodes") + layout.prop(snode_id.render, "use_free_unused_nodes", text="Free Unused") layout.prop(snode, "show_backdrop") if snode.show_backdrop: row = layout.row(align=True) @@ -78,7 +73,7 @@ class NODE_HT_header(bpy.types.Header): layout.template_running_jobs() -class NODE_MT_view(bpy.types.Menu): +class NODE_MT_view(Menu): bl_label = "View" def draw(self, context): @@ -107,7 +102,7 @@ class NODE_MT_view(bpy.types.Menu): layout.operator("screen.screen_full_area") -class NODE_MT_select(bpy.types.Menu): +class NODE_MT_select(Menu): bl_label = "Select" def draw(self, context): @@ -124,7 +119,7 @@ class NODE_MT_select(bpy.types.Menu): layout.operator("node.select_same_type_prev") -class NODE_MT_node(bpy.types.Menu): +class NODE_MT_node(Menu): bl_label = "Node" def draw(self, context): @@ -138,6 +133,7 @@ class NODE_MT_node(bpy.types.Menu): layout.operator("node.duplicate_move") layout.operator("node.delete") + layout.operator("node.delete_reconnect") layout.separator() layout.operator("node.link_make") @@ -164,7 +160,7 @@ class NODE_MT_node(bpy.types.Menu): # Node Backdrop options -class NODE_PT_properties(bpy.types.Panel): +class NODE_PT_properties(Panel): bl_space_type = 'NODE_EDITOR' bl_region_type = 'UI' bl_label = "Backdrop" diff --git a/release/scripts/startup/bl_ui/space_outliner.py b/release/scripts/startup/bl_ui/space_outliner.py index 1f196cbd191..b1e6eaf3245 100644 --- a/release/scripts/startup/bl_ui/space_outliner.py +++ b/release/scripts/startup/bl_ui/space_outliner.py @@ -18,9 +18,10 @@ # <pep8 compliant> import bpy +from bpy.types import Header, Menu -class OUTLINER_HT_header(bpy.types.Header): +class OUTLINER_HT_header(Header): bl_space_type = 'OUTLINER' def draw(self, context): @@ -63,7 +64,7 @@ class OUTLINER_HT_header(bpy.types.Header): row.label(text="No Keying Set active") -class OUTLINER_MT_view(bpy.types.Menu): +class OUTLINER_MT_view(Menu): bl_label = "View" def draw(self, context): @@ -71,14 +72,13 @@ class OUTLINER_MT_view(bpy.types.Menu): space = context.space_data - col = layout.column() if space.display_mode not in {'DATABLOCKS', 'USER_PREFERENCES', 'KEYMAPS'}: - col.prop(space, "show_restrict_columns") - col.separator() - col.operator("outliner.show_active") + layout.prop(space, "show_restrict_columns") + layout.separator() + layout.operator("outliner.show_active") - col.operator("outliner.show_one_level") - col.operator("outliner.show_hierarchy") + layout.operator("outliner.show_one_level") + layout.operator("outliner.show_hierarchy") layout.separator() @@ -86,7 +86,7 @@ class OUTLINER_MT_view(bpy.types.Menu): layout.operator("screen.screen_full_area") -class OUTLINER_MT_search(bpy.types.Menu): +class OUTLINER_MT_search(Menu): bl_label = "Search" def draw(self, context): @@ -94,27 +94,23 @@ class OUTLINER_MT_search(bpy.types.Menu): space = context.space_data - col = layout.column() + layout.prop(space, "use_filter_case_sensitive") + layout.prop(space, "use_filter_complete") - col.prop(space, "use_filter_case_sensitive") - col.prop(space, "use_filter_complete") - -class OUTLINER_MT_edit_datablocks(bpy.types.Menu): +class OUTLINER_MT_edit_datablocks(Menu): bl_label = "Edit" def draw(self, context): layout = self.layout - col = layout.column() - - col.operator("outliner.keyingset_add_selected") - col.operator("outliner.keyingset_remove_selected") + layout.operator("outliner.keyingset_add_selected") + layout.operator("outliner.keyingset_remove_selected") - col.separator() + layout.separator() - col.operator("outliner.drivers_add_selected") - col.operator("outliner.drivers_delete_selected") + layout.operator("outliner.drivers_add_selected") + layout.operator("outliner.drivers_delete_selected") if __name__ == "__main__": # only for live edit. bpy.utils.register_module(__name__) diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index 858c619d3c1..36f606da635 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Header, Menu, Panel def act_strip(context): @@ -27,7 +28,7 @@ def act_strip(context): return None -class SEQUENCER_HT_header(bpy.types.Header): +class SEQUENCER_HT_header(Header): bl_space_type = 'SEQUENCE_EDITOR' def draw(self, context): @@ -39,28 +40,28 @@ class SEQUENCER_HT_header(bpy.types.Header): row.template_header() if context.area.show_menus: - sub = row.row(align=True) - sub.menu("SEQUENCER_MT_view") + row.menu("SEQUENCER_MT_view") - if (st.view_type == 'SEQUENCER') or (st.view_type == 'SEQUENCER_PREVIEW'): - sub.menu("SEQUENCER_MT_select") - sub.menu("SEQUENCER_MT_marker") - sub.menu("SEQUENCER_MT_add") - sub.menu("SEQUENCER_MT_strip") + if st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}: + row.menu("SEQUENCER_MT_select") + row.menu("SEQUENCER_MT_marker") + row.menu("SEQUENCER_MT_add") + row.menu("SEQUENCER_MT_strip") layout.prop(st, "view_type", expand=True, text="") - if (st.view_type == 'PREVIEW') or (st.view_type == 'SEQUENCER_PREVIEW'): + if st.view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'}: layout.prop(st, "display_mode", expand=True, text="") - if (st.view_type == 'SEQUENCER'): + if st.view_type == 'SEQUENCER': row = layout.row(align=True) row.operator("sequencer.copy", text="", icon='COPYDOWN') row.operator("sequencer.paste", text="", icon='PASTEDOWN') layout.separator() layout.operator("sequencer.refresh_all") - elif (st.view_type == 'SEQUENCER_PREVIEW'): + layout.template_running_jobs() + elif st.view_type == 'SEQUENCER_PREVIEW': layout.separator() layout.operator("sequencer.refresh_all") layout.prop(st, "display_channel", text="Channel") @@ -76,7 +77,7 @@ class SEQUENCER_HT_header(bpy.types.Header): row.prop(ed, "overlay_lock", text="", icon='LOCKED') -class SEQUENCER_MT_view_toggle(bpy.types.Menu): +class SEQUENCER_MT_view_toggle(Menu): bl_label = "View Type" def draw(self, context): @@ -87,7 +88,7 @@ class SEQUENCER_MT_view_toggle(bpy.types.Menu): layout.operator("sequencer.view_toggle").type = 'SEQUENCER_PREVIEW' -class SEQUENCER_MT_view(bpy.types.Menu): +class SEQUENCER_MT_view(Menu): bl_label = "View" def draw(self, context): @@ -95,15 +96,13 @@ class SEQUENCER_MT_view(bpy.types.Menu): st = context.space_data - layout.column() - layout.operator("sequencer.properties", icon='MENU_PANEL') layout.separator() - if (st.view_type == 'SEQUENCER') or (st.view_type == 'SEQUENCER_PREVIEW'): + if st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}: layout.operator("sequencer.view_all", text='View all Sequences') - if (st.view_type == 'PREVIEW') or (st.view_type == 'SEQUENCER_PREVIEW'): + if st.view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'}: layout.operator_context = 'INVOKE_REGION_PREVIEW' layout.operator("sequencer.view_all_preview", text='Fit preview in window') layout.operator("sequencer.view_zoom_ratio", text='Show preview 1:1').ratio = 1.0 @@ -114,7 +113,11 @@ class SEQUENCER_MT_view(bpy.types.Menu): layout.operator("sequencer.view_selected") - layout.prop(st, "show_frames") + if st.show_frames: + layout.operator("anim.time_toggle", text="Show Seconds") + else: + layout.operator("anim.time_toggle", text="Show Frames") + layout.prop(st, "show_frame_indicator") if st.display_mode == 'IMAGE': layout.prop(st, "show_safe_margin") @@ -129,13 +132,12 @@ class SEQUENCER_MT_view(bpy.types.Menu): layout.operator("screen.screen_full_area") -class SEQUENCER_MT_select(bpy.types.Menu): +class SEQUENCER_MT_select(Menu): bl_label = "Select" def draw(self, context): layout = self.layout - layout.column() layout.operator("sequencer.select_active_side", text="Strips to the Left").side = 'LEFT' layout.operator("sequencer.select_active_side", text="Strips to the Right").side = 'RIGHT' layout.separator() @@ -148,7 +150,7 @@ class SEQUENCER_MT_select(bpy.types.Menu): layout.operator("sequencer.select_inverse") -class SEQUENCER_MT_marker(bpy.types.Menu): +class SEQUENCER_MT_marker(Menu): bl_label = "Marker" def draw(self, context): @@ -156,7 +158,6 @@ class SEQUENCER_MT_marker(bpy.types.Menu): #layout.operator_context = 'EXEC_REGION_WIN' - layout.column() layout.operator("marker.add", "Add Marker") layout.operator("marker.duplicate", text="Duplicate Marker") layout.operator("marker.delete", text="Delete Marker") @@ -169,14 +170,26 @@ class SEQUENCER_MT_marker(bpy.types.Menu): #layout.operator("sequencer.sound_strip_add", text="Transform Markers") # toggle, will be rna - (sseq->flag & SEQ_MARKER_TRANS) -class SEQUENCER_MT_add(bpy.types.Menu): +class SEQUENCER_MT_change(Menu): + bl_label = "Change" + + def draw(self, context): + layout = self.layout + + layout.operator_context = 'INVOKE_REGION_WIN' + + layout.operator_menu_enum("sequencer.change_effect_input", "swap") + layout.operator_menu_enum("sequencer.change_effect_type", "type") + layout.operator("sequencer.change_path", text="Path/Files") + + +class SEQUENCER_MT_add(Menu): bl_label = "Add" def draw(self, context): layout = self.layout layout.operator_context = 'INVOKE_REGION_WIN' - layout.column() if len(bpy.data.scenes) > 10: layout.operator_context = 'INVOKE_DEFAULT' layout.operator("sequencer.scene_strip_add", text="Scene...") @@ -190,14 +203,13 @@ class SEQUENCER_MT_add(bpy.types.Menu): layout.menu("SEQUENCER_MT_add_effect") -class SEQUENCER_MT_add_effect(bpy.types.Menu): +class SEQUENCER_MT_add_effect(Menu): bl_label = "Effect Strip..." def draw(self, context): layout = self.layout layout.operator_context = 'INVOKE_REGION_WIN' - layout.column() layout.operator("sequencer.effect_strip_add", text="Add").type = 'ADD' layout.operator("sequencer.effect_strip_add", text="Subtract").type = 'SUBTRACT' layout.operator("sequencer.effect_strip_add", text="Alpha Over").type = 'ALPHA_OVER' @@ -216,7 +228,7 @@ class SEQUENCER_MT_add_effect(bpy.types.Menu): layout.operator("sequencer.effect_strip_add", text="Adjustment Layer").type = 'ADJUSTMENT' -class SEQUENCER_MT_strip(bpy.types.Menu): +class SEQUENCER_MT_strip(Menu): bl_label = "Strip" def draw(self, context): @@ -224,7 +236,6 @@ class SEQUENCER_MT_strip(bpy.types.Menu): layout.operator_context = 'INVOKE_REGION_WIN' - layout.column() layout.operator("transform.transform", text="Grab/Move").mode = 'TRANSLATION' layout.operator("transform.transform", text="Grab/Extend from frame").mode = 'TIME_EXTEND' # uiItemO(layout, NULL, 0, "sequencer.strip_snap"); // TODO - add this operator @@ -233,7 +244,9 @@ class SEQUENCER_MT_strip(bpy.types.Menu): layout.operator("sequencer.cut", text="Cut (hard) at frame").type = 'HARD' layout.operator("sequencer.cut", text="Cut (soft) at frame").type = 'SOFT' layout.operator("sequencer.images_separate") + layout.operator("sequencer.offset_clear") layout.operator("sequencer.deinterlace_selected_movies") + layout.operator("sequencer.rebuild_proxy") layout.separator() layout.operator("sequencer.duplicate") @@ -292,6 +305,7 @@ class SEQUENCER_MT_strip(bpy.types.Menu): layout.separator() layout.operator("sequencer.swap_data") + layout.menu("SEQUENCER_MT_change") class SequencerButtonsPanel(): @@ -300,7 +314,7 @@ class SequencerButtonsPanel(): @staticmethod def has_sequencer(context): - return (context.space_data.view_type == 'SEQUENCER') or (context.space_data.view_type == 'SEQUENCER_PREVIEW') + return (context.space_data.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}) @classmethod def poll(cls, context): @@ -313,14 +327,14 @@ class SequencerButtonsPanel_Output(): @staticmethod def has_preview(context): - return (context.space_data.view_type == 'PREVIEW') or (context.space_data.view_type == 'SEQUENCER_PREVIEW') + return (context.space_data.view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'}) @classmethod def poll(cls, context): return cls.has_preview(context) -class SEQUENCER_PT_edit(SequencerButtonsPanel, bpy.types.Panel): +class SEQUENCER_PT_edit(SequencerButtonsPanel, Panel): bl_label = "Edit Strip" def draw(self, context): @@ -374,9 +388,11 @@ class SEQUENCER_PT_edit(SequencerButtonsPanel, bpy.types.Panel): if elem and elem.orig_width > 0 and elem.orig_height > 0: col.label(text="Orig Dim: %dx%d" % (elem.orig_width, elem.orig_height)) + else: + col.label(text="Orig Dim: None") -class SEQUENCER_PT_effect(SequencerButtonsPanel, bpy.types.Panel): +class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel): bl_label = "Effect Strip" @classmethod @@ -514,7 +530,7 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, bpy.types.Panel): col.prop(strip, "rotation_start", text="Rotation") -class SEQUENCER_PT_input(SequencerButtonsPanel, bpy.types.Panel): +class SEQUENCER_PT_input(SequencerButtonsPanel, Panel): bl_label = "Strip Input" @classmethod @@ -558,6 +574,9 @@ class SEQUENCER_PT_input(SequencerButtonsPanel, bpy.types.Panel): col = split.column() col.prop(elem, "filename", text="") # strip.elements[0] could be a fallback + # also accessible from the menu + layout.operator("sequencer.change_path") + elif seq_type == 'MOVIE': split = layout.split(percentage=0.2) col = split.column() @@ -565,6 +584,7 @@ class SEQUENCER_PT_input(SequencerButtonsPanel, bpy.types.Panel): col = split.column() col.prop(strip, "filepath", text="") col.prop(strip, "mpeg_preseek", text="MPEG Preseek") + col.prop(strip, "streamindex", text="Stream Index") # TODO, sound??? # end drawing filename @@ -595,7 +615,7 @@ class SEQUENCER_PT_input(SequencerButtonsPanel, bpy.types.Panel): col.prop(strip, "frame_offset_end", text="End") -class SEQUENCER_PT_sound(SequencerButtonsPanel, bpy.types.Panel): +class SEQUENCER_PT_sound(SequencerButtonsPanel, Panel): bl_label = "Sound" @classmethod @@ -627,8 +647,10 @@ class SEQUENCER_PT_sound(SequencerButtonsPanel, bpy.types.Panel): row.prop(strip.sound, "use_memory_cache") + layout.prop(strip, "waveform") layout.prop(strip, "volume") - layout.prop(strip, "attenuation") + layout.prop(strip, "pitch") + layout.prop(strip, "pan") col = layout.column(align=True) col.label(text="Trim Duration:") @@ -636,7 +658,7 @@ class SEQUENCER_PT_sound(SequencerButtonsPanel, bpy.types.Panel): col.prop(strip, "animation_offset_end", text="End") -class SEQUENCER_PT_scene(SequencerButtonsPanel, bpy.types.Panel): +class SEQUENCER_PT_scene(SequencerButtonsPanel, Panel): bl_label = "Scene" @classmethod @@ -657,14 +679,20 @@ class SEQUENCER_PT_scene(SequencerButtonsPanel, bpy.types.Panel): layout.template_ID(strip, "scene") + scene = strip.scene + if scene: + layout.prop(scene.render, "use_sequencer") + layout.label(text="Camera Override") layout.template_ID(strip, "scene_camera") - sce = strip.scene - layout.label(text="Original frame range: %d-%d (%d)" % (sce.frame_start, sce.frame_end, sce.frame_end - sce.frame_start + 1)) + if scene: + sta = scene.frame_start + end = scene.frame_end + layout.label(text="Original frame range: %d-%d (%d)" % (sta, end, end - sta + 1)) -class SEQUENCER_PT_filter(SequencerButtonsPanel, bpy.types.Panel): +class SEQUENCER_PT_filter(SequencerButtonsPanel, Panel): bl_label = "Filter" @classmethod @@ -726,8 +754,8 @@ class SEQUENCER_PT_filter(SequencerButtonsPanel, bpy.types.Panel): col.prop(strip.color_balance, "invert_gain", text="Inverse") -class SEQUENCER_PT_proxy(SequencerButtonsPanel, bpy.types.Panel): - bl_label = "Proxy" +class SEQUENCER_PT_proxy(SequencerButtonsPanel, Panel): + bl_label = "Proxy / Timecode" @classmethod def poll(cls, context): @@ -753,14 +781,30 @@ class SEQUENCER_PT_proxy(SequencerButtonsPanel, bpy.types.Panel): flow = layout.column_flow() flow.prop(strip, "use_proxy_custom_directory") flow.prop(strip, "use_proxy_custom_file") - if strip.proxy: # TODO - need to add this somehow + if strip.proxy: if strip.use_proxy_custom_directory and not strip.use_proxy_custom_file: flow.prop(strip.proxy, "directory") if strip.use_proxy_custom_file: flow.prop(strip.proxy, "filepath") + row = layout.row() + row.prop(strip.proxy, "build_25") + row.prop(strip.proxy, "build_50") + row.prop(strip.proxy, "build_75") + row.prop(strip.proxy, "build_100") + + col = layout.column() + col.label(text="Build JPEG quality") + col.prop(strip.proxy, "quality") + + if strip.type == "MOVIE": + col = layout.column() + col.label(text="Use timecode index:") + + col.prop(strip.proxy, "timecode") + -class SEQUENCER_PT_preview(SequencerButtonsPanel_Output, bpy.types.Panel): +class SEQUENCER_PT_preview(SequencerButtonsPanel_Output, Panel): bl_label = "Scene Preview/Render" bl_space_type = 'SEQUENCE_EDITOR' bl_region_type = 'UI' @@ -785,7 +829,7 @@ class SEQUENCER_PT_preview(SequencerButtonsPanel_Output, bpy.types.Panel): ''' -class SEQUENCER_PT_view(SequencerButtonsPanel_Output, bpy.types.Panel): +class SEQUENCER_PT_view(SequencerButtonsPanel_Output, Panel): bl_label = "View Settings" def draw(self, context): diff --git a/release/scripts/startup/bl_ui/space_text.py b/release/scripts/startup/bl_ui/space_text.py index 0fc8d937f66..12e07c19ca1 100644 --- a/release/scripts/startup/bl_ui/space_text.py +++ b/release/scripts/startup/bl_ui/space_text.py @@ -16,11 +16,12 @@ # # ##### END GPL LICENSE BLOCK ##### -# <pep8 compliant> +# <pep8-80 compliant> import bpy +from bpy.types import Header, Menu, Panel -class TEXT_HT_header(bpy.types.Header): +class TEXT_HT_header(Header): bl_space_type = 'TEXT_EDITOR' def draw(self, context): @@ -33,19 +34,21 @@ class TEXT_HT_header(bpy.types.Header): row.template_header() if context.area.show_menus: - sub = row.row(align=True) - sub.menu("TEXT_MT_view") - sub.menu("TEXT_MT_text") + row.menu("TEXT_MT_view") + row.menu("TEXT_MT_text") + if text: - sub.menu("TEXT_MT_edit") - sub.menu("TEXT_MT_format") + row.menu("TEXT_MT_edit") + row.menu("TEXT_MT_format") + + row.menu("TEXT_MT_templates") if text and text.is_modified: - row = layout.row() - row.alert = True - row.operator("text.resolve_conflict", text="", icon='HELP') + sub = row.row() + sub.alert = True + sub.operator("text.resolve_conflict", text="", icon='HELP') - layout.template_ID(st, "text", new="text.new", unlink="text.unlink") + row.template_ID(st, "text", new="text.new", unlink="text.unlink") row = layout.row(align=True) row.prop(st, "show_line_numbers", text="") @@ -63,14 +66,16 @@ class TEXT_HT_header(bpy.types.Header): row = layout.row() if text.filepath: if text.is_dirty: - row.label(text="File: *%s (unsaved)" % text.filepath) + row.label(text="File: *%r (unsaved)" % text.filepath) else: - row.label(text="File: %s" % text.filepath) + row.label(text="File: %r" % text.filepath) else: - row.label(text="Text: External" if text.library else "Text: Internal") + row.label(text="Text: External" + if text.library + else "Text: Internal") -class TEXT_PT_properties(bpy.types.Panel): +class TEXT_PT_properties(Panel): bl_space_type = 'TEXT_EDITOR' bl_region_type = 'UI' bl_label = "Properties" @@ -101,7 +106,7 @@ class TEXT_PT_properties(bpy.types.Panel): col.prop(st, "margin_column") -class TEXT_PT_find(bpy.types.Panel): +class TEXT_PT_find(Panel): bl_space_type = 'TEXT_EDITOR' bl_region_type = 'UI' bl_label = "Find" @@ -135,7 +140,7 @@ class TEXT_PT_find(bpy.types.Panel): row.prop(st, "use_find_all", text="All") -class TEXT_MT_view(bpy.types.Menu): +class TEXT_MT_view(Menu): bl_label = "View" def draw(self, context): @@ -150,11 +155,15 @@ class TEXT_MT_view(bpy.types.Menu): layout.separator() - layout.operator("text.move", text="Top of File").type = 'FILE_TOP' - layout.operator("text.move", text="Bottom of File").type = 'FILE_BOTTOM' + layout.operator("text.move", + text="Top of File", + ).type = 'FILE_TOP' + layout.operator("text.move", + text="Bottom of File", + ).type = 'FILE_BOTTOM' -class TEXT_MT_text(bpy.types.Menu): +class TEXT_MT_text(Menu): bl_label = "Text" def draw(self, context): @@ -163,8 +172,9 @@ class TEXT_MT_text(bpy.types.Menu): st = context.space_data text = st.text - layout.column() + layout.operator_context = 'EXEC_AREA' layout.operator("text.new") + layout.operator_context = 'INVOKE_AREA' layout.operator("text.open") if text: @@ -180,27 +190,18 @@ class TEXT_MT_text(bpy.types.Menu): layout.column() layout.operator("text.run_script") - #ifdef WITH_PYTHON - # XXX if(BPY_is_pyconstraint(text)) - # XXX uiMenuItemO(head, 0, "text.refresh_pyconstraints"); - #endif - - layout.separator() - - layout.menu("TEXT_MT_templates") - -class TEXT_MT_templates(bpy.types.Menu): - ''' - Creates the menu items by scanning scripts/templates - ''' - bl_label = "Script Templates" +class TEXT_MT_templates(Menu): + bl_label = "Templates" def draw(self, context): - self.path_menu(bpy.utils.script_paths("templates"), "text.open", {"internal": True}) + self.path_menu(bpy.utils.script_paths("templates"), + "text.open", + {"internal": True}, + ) -class TEXT_MT_edit_select(bpy.types.Menu): +class TEXT_MT_edit_select(Menu): bl_label = "Select" def draw(self, context): @@ -210,7 +211,7 @@ class TEXT_MT_edit_select(bpy.types.Menu): layout.operator("text.select_line") -class TEXT_MT_edit_markers(bpy.types.Menu): +class TEXT_MT_edit_markers(Menu): bl_label = "Markers" def draw(self, context): @@ -221,7 +222,7 @@ class TEXT_MT_edit_markers(bpy.types.Menu): layout.operator("text.previous_marker") -class TEXT_MT_format(bpy.types.Menu): +class TEXT_MT_format(Menu): bl_label = "Format" def draw(self, context): @@ -240,17 +241,21 @@ class TEXT_MT_format(bpy.types.Menu): layout.operator_menu_enum("text.convert_whitespace", "type") -class TEXT_MT_edit_to3d(bpy.types.Menu): +class TEXT_MT_edit_to3d(Menu): bl_label = "Text To 3D Object" def draw(self, context): layout = self.layout - layout.operator("text.to_3d_object", text="One Object").split_lines = False - layout.operator("text.to_3d_object", text="One Object Per Line").split_lines = True + layout.operator("text.to_3d_object", + text="One Object", + ).split_lines = False + layout.operator("text.to_3d_object", + text="One Object Per Line", + ).split_lines = True -class TEXT_MT_edit(bpy.types.Menu): +class TEXT_MT_edit(Menu): bl_label = "Edit" @classmethod @@ -284,7 +289,7 @@ class TEXT_MT_edit(bpy.types.Menu): layout.menu("TEXT_MT_edit_to3d") -class TEXT_MT_toolbox(bpy.types.Menu): +class TEXT_MT_toolbox(Menu): bl_label = "" def draw(self, context): diff --git a/release/scripts/startup/bl_ui/space_time.py b/release/scripts/startup/bl_ui/space_time.py index 7e62465d1ee..db009fe43c2 100644 --- a/release/scripts/startup/bl_ui/space_time.py +++ b/release/scripts/startup/bl_ui/space_time.py @@ -18,9 +18,10 @@ # <pep8 compliant> import bpy +from bpy.types import Header, Menu -class TIME_HT_header(bpy.types.Header): +class TIME_HT_header(Header): bl_space_type = 'TIMELINE' def draw(self, context): @@ -34,10 +35,9 @@ class TIME_HT_header(bpy.types.Header): row.template_header() if context.area.show_menus: - sub = row.row(align=True) - sub.menu("TIME_MT_view") - sub.menu("TIME_MT_frame") - sub.menu("TIME_MT_playback") + row.menu("TIME_MT_view") + row.menu("TIME_MT_frame") + row.menu("TIME_MT_playback") layout.prop(scene, "use_preview_range", text="", toggle=True) @@ -91,7 +91,7 @@ class TIME_HT_header(bpy.types.Header): row.operator("anim.keyframe_delete", text="", icon='KEY_DEHLT') -class TIME_MT_view(bpy.types.Menu): +class TIME_MT_view(Menu): bl_label = "View" def draw(self, context): @@ -116,7 +116,7 @@ class TIME_MT_view(bpy.types.Menu): layout.operator("marker.camera_bind") -class TIME_MT_cache(bpy.types.Menu): +class TIME_MT_cache(Menu): bl_label = "Cache" def draw(self, context): @@ -136,7 +136,7 @@ class TIME_MT_cache(bpy.types.Menu): col.prop(st, "cache_smoke") -class TIME_MT_frame(bpy.types.Menu): +class TIME_MT_frame(Menu): bl_label = "Frame" def draw(self, context): @@ -162,7 +162,7 @@ class TIME_MT_frame(bpy.types.Menu): sub.menu("TIME_MT_autokey") -class TIME_MT_playback(bpy.types.Menu): +class TIME_MT_playback(Menu): bl_label = "Playback" def draw(self, context): @@ -187,7 +187,7 @@ class TIME_MT_playback(bpy.types.Menu): layout.prop(scene, "use_audio_scrub") -class TIME_MT_autokey(bpy.types.Menu): +class TIME_MT_autokey(Menu): bl_label = "Auto-Keyframing Mode" def draw(self, context): diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index f018785a925..13edc3471d2 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Header, Menu, Operator, Panel import os import addon_utils @@ -75,7 +76,7 @@ def opengl_lamp_buttons(column, lamp): col.prop(lamp, "direction", text="") -class USERPREF_HT_header(bpy.types.Header): +class USERPREF_HT_header(Header): bl_space_type = 'USER_PREFERENCES' def draw(self, context): @@ -94,12 +95,12 @@ class USERPREF_HT_header(bpy.types.Header): layout.operator("wm.keyconfig_import") elif userpref.active_section == 'ADDONS': layout.operator("wm.addon_install") - layout.menu("USERPREF_MT_addons_dev_guides", text=" Addons Developer Guides", icon='INFO') + layout.menu("USERPREF_MT_addons_dev_guides") elif userpref.active_section == 'THEMES': layout.operator("ui.reset_default_theme") -class USERPREF_PT_tabs(bpy.types.Panel): +class USERPREF_PT_tabs(Panel): bl_label = "" bl_space_type = 'USER_PREFERENCES' bl_region_type = 'WINDOW' @@ -113,26 +114,26 @@ class USERPREF_PT_tabs(bpy.types.Panel): layout.prop(userpref, "active_section", expand=True) -class USERPREF_MT_interaction_presets(bpy.types.Menu): +class USERPREF_MT_interaction_presets(Menu): bl_label = "Presets" preset_subdir = "interaction" preset_operator = "script.execute_preset" - draw = bpy.types.Menu.draw_preset + draw = Menu.draw_preset -class USERPREF_MT_appconfigs(bpy.types.Menu): +class USERPREF_MT_appconfigs(Menu): bl_label = "AppPresets" preset_subdir = "keyconfig" preset_operator = "wm.appconfig_activate" def draw(self, context): - props = self.layout.operator("wm.appconfig_default", text="Blender (default)") + self.layout.operator("wm.appconfig_default", text="Blender (default)") # now draw the presets - bpy.types.Menu.draw_preset(self, context) + Menu.draw_preset(self, context) -class USERPREF_MT_splash(bpy.types.Menu): +class USERPREF_MT_splash(Menu): bl_label = "Splash" def draw(self, context): @@ -149,7 +150,7 @@ class USERPREF_MT_splash(bpy.types.Menu): row.menu("USERPREF_MT_appconfigs", text="Preset") -class USERPREF_PT_interface(bpy.types.Panel): +class USERPREF_PT_interface(Panel): bl_space_type = 'USER_PREFERENCES' bl_label = "Interface" bl_region_type = 'WINDOW' @@ -246,7 +247,7 @@ class USERPREF_PT_interface(bpy.types.Panel): col.prop(view, "show_splash") -class USERPREF_PT_edit(bpy.types.Panel): +class USERPREF_PT_edit(Panel): bl_space_type = 'USER_PREFERENCES' bl_label = "Edit" bl_region_type = 'WINDOW' @@ -359,7 +360,7 @@ class USERPREF_PT_edit(bpy.types.Panel): col.prop(edit, "use_duplicate_particle", text="Particle") -class USERPREF_PT_system(bpy.types.Panel): +class USERPREF_PT_system(Panel): bl_space_type = 'USER_PREFERENCES' bl_label = "System" bl_region_type = 'WINDOW' @@ -438,6 +439,8 @@ class USERPREF_PT_system(bpy.types.Panel): col.label(text="OpenGL:") col.prop(system, "gl_clip_alpha", slider=True) col.prop(system, "use_mipmaps") + col.label(text="Anisotropic Filtering") + col.prop(system, "anisotropic_filter", text="") col.prop(system, "use_vertex_buffer_objects") #Anti-aliasing is disabled as it breaks broder/lasso select #col.prop(system, "use_antialiasing") @@ -494,7 +497,7 @@ class USERPREF_PT_system(bpy.types.Panel): sub.template_color_ramp(system, "weight_color_range", expand=True) -class USERPREF_PT_theme(bpy.types.Panel): +class USERPREF_PT_theme(Panel): bl_space_type = 'USER_PREFERENCES' bl_label = "Themes" bl_region_type = 'WINDOW' @@ -677,7 +680,7 @@ class USERPREF_PT_theme(bpy.types.Panel): self._theme_generic(split, getattr(theme, theme.theme_area.lower())) -class USERPREF_PT_file(bpy.types.Panel): +class USERPREF_PT_file(Panel): bl_space_type = 'USER_PREFERENCES' bl_label = "Files" bl_region_type = 'WINDOW' @@ -753,7 +756,32 @@ class USERPREF_PT_file(bpy.types.Panel): from bl_ui.space_userpref_keymap import InputKeyMapPanel -class USERPREF_PT_input(bpy.types.Panel, InputKeyMapPanel): +class USERPREF_MT_ndof_settings(Menu): + # accessed from the window keybindings in C (only) + bl_label = "3D Mouse Settings" + + def draw(self, context): + layout = self.layout + input_prefs = context.user_preferences.inputs + + layout.separator() + layout.prop(input_prefs, "ndof_sensitivity") + + if context.space_data.type == 'VIEW_3D': + layout.separator() + layout.prop(input_prefs, "ndof_show_guide") + + layout.separator() + layout.label(text="orbit options") + layout.prop(input_prefs, "ndof_orbit_invert_axes") + + layout.separator() + layout.label(text="fly options") + layout.prop(input_prefs, "ndof_fly_helicopter", icon='NDOF_FLY') + layout.prop(input_prefs, "ndof_lock_horizon", icon='NDOF_DOM') + + +class USERPREF_PT_input(Panel, InputKeyMapPanel): bl_space_type = 'USER_PREFERENCES' bl_label = "Input" @@ -815,12 +843,9 @@ class USERPREF_PT_input(bpy.types.Panel, InputKeyMapPanel): #sub.prop(view, "wheel_scroll_lines", text="Scroll Lines") col.separator() - ''' not implemented yet sub = col.column() sub.label(text="NDOF Device:") - sub.prop(inputs, "ndof_pan_speed", text="Pan Speed") - sub.prop(inputs, "ndof_rotate_speed", text="Orbit Speed") - ''' + sub.prop(inputs, "ndof_sensitivity", text="NDOF Sensitivity") row.separator() @@ -846,21 +871,18 @@ class USERPREF_PT_input(bpy.types.Panel, InputKeyMapPanel): #print("runtime", time.time() - start) -class USERPREF_MT_addons_dev_guides(bpy.types.Menu): - bl_label = "Addons develoment guides" +class USERPREF_MT_addons_dev_guides(Menu): + bl_label = "Development Guides" # menu to open webpages with addons development guides def draw(self, context): layout = self.layout - layout.operator('wm.url_open', text='API Concepts' - ).url = 'http://wiki.blender.org/index.php/Dev:2.5/Py/API/Intro' - layout.operator('wm.url_open', text='Addons guidelines', - ).url = 'http://wiki.blender.org/index.php/Dev:2.5/Py/Scripts/Guidelines/Addons' - layout.operator('wm.url_open', text='How to share your addon', - ).url = 'http://wiki.blender.org/index.php/Dev:Py/Sharing' + layout.operator('wm.url_open', text='API Concepts', icon='URL').url = 'http://wiki.blender.org/index.php/Dev:2.5/Py/API/Intro' + layout.operator('wm.url_open', text='Addon Guidelines', icon='URL').url = 'http://wiki.blender.org/index.php/Dev:2.5/Py/Scripts/Guidelines/Addons' + layout.operator('wm.url_open', text='How to share your addon', icon='URL').url = 'http://wiki.blender.org/index.php/Dev:Py/Sharing' -class USERPREF_PT_addons(bpy.types.Panel): +class USERPREF_PT_addons(Panel): bl_space_type = 'USER_PREFERENCES' bl_label = "Addons" bl_region_type = 'WINDOW' @@ -877,6 +899,29 @@ class USERPREF_PT_addons(bpy.types.Panel): def module_get(mod_name): return USERPREF_PT_addons._addons_fake_modules[mod_name] + @staticmethod + def is_user_addon(mod, user_addon_paths): + if not user_addon_paths: + user_script_path = bpy.utils.user_script_path() + if user_script_path is not None: + user_addon_paths.append(os.path.join(user_script_path, "addons")) + user_addon_paths.append(os.path.join(bpy.utils.resource_path('USER'), "scripts", "addons")) + + for path in user_addon_paths: + if bpy.path.is_subdir(mod.__file__, path): + return True + return False + + @staticmethod + def draw_error(layout, message): + lines = message.split("\n") + box = layout.box() + rowsub = box.row() + rowsub.label(lines[0]) + rowsub.label(icon='ERROR') + for l in lines[1:]: + box.label(l) + def draw(self, context): layout = self.layout @@ -897,10 +942,27 @@ class USERPREF_PT_addons(bpy.types.Panel): col = split.column() + # set in addon_utils.modules(...) + if addon_utils.error_duplicates: + self.draw_error(col, + "Multiple addons using the same name found!\n" + "likely a problem with the script search path.\n" + "(see console for details)", + ) + + if addon_utils.error_encoding: + self.draw_error(col, + "One or more addons do not have UTF-8 encoding\n" + "(see console for details)", + ) + filter = context.window_manager.addon_filter search = context.window_manager.addon_search.lower() support = context.window_manager.addon_support + # initialized on demand + user_addon_paths = [] + for mod, info in addons: module_name = mod.__name__ @@ -970,18 +1032,21 @@ class USERPREF_PT_addons(bpy.types.Panel): split = colsub.row().split(percentage=0.15) split.label(text="Warning:") split.label(text=' ' + info["warning"], icon='ERROR') - if info["wiki_url"] or info["tracker_url"]: + + user_addon = USERPREF_PT_addons.is_user_addon(mod, user_addon_paths) + tot_row = bool(info["wiki_url"]) + bool(info["tracker_url"]) + bool(user_addon) + + if tot_row: split = colsub.row().split(percentage=0.15) split.label(text="Internet:") if info["wiki_url"]: split.operator("wm.url_open", text="Link to the Wiki", icon='HELP').url = info["wiki_url"] if info["tracker_url"]: split.operator("wm.url_open", text="Report a Bug", icon='URL').url = info["tracker_url"] + if user_addon: + split.operator("wm.addon_remove", text="Remove", icon='CANCEL').module = mod.__name__ - if info["wiki_url"] and info["tracker_url"]: - split.separator() - else: - split.separator() + for i in range(4 - tot_row): split.separator() # Append missing scripts @@ -1007,54 +1072,84 @@ class USERPREF_PT_addons(bpy.types.Panel): row.operator("wm.addon_disable", icon='CHECKBOX_HLT', text="", emboss=False).module = module_name -class WM_OT_addon_enable(bpy.types.Operator): +class WM_OT_addon_enable(Operator): "Enable an addon" bl_idname = "wm.addon_enable" bl_label = "Enable Add-On" - module = StringProperty(name="Module", description="Module name of the addon to enable") + module = StringProperty( + name="Module", + description="Module name of the addon to enable", + ) def execute(self, context): mod = addon_utils.enable(self.module) if mod: - # check if add-on is written for current blender version, or raise a warning info = addon_utils.module_bl_info(mod) - if info.get("blender", (0, 0, 0)) > bpy.app.version: - self.report("WARNING','This script was written for a newer version of Blender and might not function (correctly).\nThe script is enabled though.") + info_ver = info.get("blender", (0, 0, 0)) + + if info_ver > bpy.app.version: + self.report({'WARNING'}, ("This script was written Blender " + "version %d.%d.%d and might not " + "function (correctly).\n" + "The script is enabled though.") % + info_ver) return {'FINISHED'} else: return {'CANCELLED'} -class WM_OT_addon_disable(bpy.types.Operator): +class WM_OT_addon_disable(Operator): "Disable an addon" bl_idname = "wm.addon_disable" bl_label = "Disable Add-On" - module = StringProperty(name="Module", description="Module name of the addon to disable") + module = StringProperty( + name="Module", + description="Module name of the addon to disable", + ) def execute(self, context): addon_utils.disable(self.module) return {'FINISHED'} -class WM_OT_addon_install(bpy.types.Operator): +class WM_OT_addon_install(Operator): "Install an addon" bl_idname = "wm.addon_install" bl_label = "Install Add-On..." - overwrite = BoolProperty(name="Overwrite", description="Remove existing addons with the same ID", default=True) + overwrite = BoolProperty( + name="Overwrite", + description="Remove existing addons with the same ID", + default=True, + ) target = EnumProperty( name="Target Path", items=(('DEFAULT', "Default", ""), - ('PREFS', "User Prefs", ""))) - - filepath = StringProperty(name="File Path", description="File path to write file to") - filter_folder = BoolProperty(name="Filter folders", description="", default=True, options={'HIDDEN'}) - filter_python = BoolProperty(name="Filter python", description="", default=True, options={'HIDDEN'}) - filter_glob = StringProperty(default="*.py;*.zip", options={'HIDDEN'}) + ('PREFS', "User Prefs", "")), + ) + + filepath = StringProperty( + name="File Path", + description="File path to write file to", + ) + filter_folder = BoolProperty( + name="Filter folders", + default=True, + options={'HIDDEN'}, + ) + filter_python = BoolProperty( + name="Filter python", + default=True, + options={'HIDDEN'}, + ) + filter_glob = StringProperty( + default="*.py;*.zip", + options={'HIDDEN'}, + ) @staticmethod def _module_remove(path_addons, module): @@ -1105,7 +1200,6 @@ class WM_OT_addon_install(bpy.types.Operator): del pyfile_dir # done checking for exceptional case - addon_files_old = set(os.listdir(path_addons)) addons_old = {mod.__name__ for mod in addon_utils.modules(USERPREF_PT_addons._addons_fake_modules)} #check to see if the file is in compressed format (.zip) @@ -1118,7 +1212,7 @@ class WM_OT_addon_install(bpy.types.Operator): if self.overwrite: for f in file_to_extract.namelist(): - __class__._module_remove(path_addons, f) + WM_OT_addon_install._module_remove(path_addons, f) else: for f in file_to_extract.namelist(): path_dest = os.path.join(path_addons, os.path.basename(f)) @@ -1142,7 +1236,7 @@ class WM_OT_addon_install(bpy.types.Operator): path_dest = os.path.join(path_addons, os.path.basename(pyfile)) if self.overwrite: - __class__._module_remove(path_addons, os.path.basename(pyfile)) + WM_OT_addon_install._module_remove(path_addons, os.path.basename(pyfile)) elif os.path.exists(path_dest): self.report({'WARNING'}, "File already installed to %r\n" % path_dest) return {'CANCELLED'} @@ -1187,12 +1281,66 @@ class WM_OT_addon_install(bpy.types.Operator): return {'RUNNING_MODAL'} -class WM_OT_addon_expand(bpy.types.Operator): +class WM_OT_addon_remove(Operator): + "Disable an addon" + bl_idname = "wm.addon_remove" + bl_label = "Remove Add-On" + + module = StringProperty( + name="Module", + description="Module name of the addon to remove", + ) + + @staticmethod + def path_from_addon(module): + for mod in addon_utils.modules(USERPREF_PT_addons._addons_fake_modules): + if mod.__name__ == module: + filepath = mod.__file__ + if os.path.exists(filepath): + if os.path.splitext(os.path.basename(filepath))[0] == "__init__": + return os.path.dirname(filepath), True + else: + return filepath, False + return None, False + + def execute(self, context): + path, isdir = WM_OT_addon_remove.path_from_addon(self.module) + if path is None: + self.report('WARNING', "Addon path %r could not be found" % path) + return {'CANCELLED'} + + # incase its enabled + addon_utils.disable(self.module) + + import shutil + if isdir: + shutil.rmtree(path) + else: + os.remove(path) + + context.area.tag_redraw() + return {'FINISHED'} + + # lame confirmation check + def draw(self, context): + self.layout.label(text="Remove Addon: %r?" % self.module) + path, isdir = WM_OT_addon_remove.path_from_addon(self.module) + self.layout.label(text="Path: %r" % path) + + def invoke(self, context, event): + wm = context.window_manager + return wm.invoke_props_dialog(self, width=600) + + +class WM_OT_addon_expand(Operator): "Display more information on this add-on" bl_idname = "wm.addon_expand" bl_label = "" - module = StringProperty(name="Module", description="Module name of the addon to expand") + module = StringProperty( + name="Module", + description="Module name of the addon to expand", + ) def execute(self, context): module_name = self.module diff --git a/release/scripts/startup/bl_ui/space_userpref_keymap.py b/release/scripts/startup/bl_ui/space_userpref_keymap.py index e99cefb91b8..9ed1591cbf3 100644 --- a/release/scripts/startup/bl_ui/space_userpref_keymap.py +++ b/release/scripts/startup/bl_ui/space_userpref_keymap.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Menu, Operator, OperatorProperties import os @@ -124,7 +125,7 @@ def _merge_keymaps(kc1, kc2): return merged_keymaps -class USERPREF_MT_keyconfigs(bpy.types.Menu): +class USERPREF_MT_keyconfigs(Menu): bl_label = "KeyPresets" preset_subdir = "keyconfig" preset_operator = "wm.keyconfig_activate" @@ -135,7 +136,7 @@ class USERPREF_MT_keyconfigs(bpy.types.Menu): props.value = "context.window_manager.keyconfigs.default" # now draw the presets - bpy.types.Menu.draw_preset(self, context) + Menu.draw_preset(self, context) class InputKeyMapPanel: @@ -188,10 +189,10 @@ class InputKeyMapPanel: if km.is_modal: row.label(text="", icon='LINKED') - if km.is_user_defined: - op = row.operator("wm.keymap_restore", text="Restore") + if km.is_user_modified: + row.operator("wm.keymap_restore", text="Restore") else: - op = row.operator("wm.keymap_edit", text="Edit") + row.label() if km.show_expanded_children: if children: @@ -212,8 +213,7 @@ class InputKeyMapPanel: # "Add New" at end of keymap item list col = self.indented_layout(col, level + 1) subcol = col.split(percentage=0.2).column() - subcol.enabled = km.is_user_defined - op = subcol.operator("wm.keyitem_add", text="Add New", icon='ZOOMIN') + subcol.operator("wm.keyitem_add", text="Add New", icon='ZOOMIN') col.separator() @@ -233,8 +233,8 @@ class InputKeyMapPanel: flow = box.column_flow(columns=2) for pname, value in properties.bl_rna.properties.items(): if pname != "rna_type" and not properties.is_property_hidden(pname): - if isinstance(value, bpy.types.OperatorProperties): - __class__.draw_kmi_properties(box, value, title=pname) + if isinstance(value, OperatorProperties): + InputKeyMapPanel.draw_kmi_properties(box, value, title=pname) else: flow.prop(properties, pname) @@ -243,7 +243,7 @@ class InputKeyMapPanel: col = self.indented_layout(layout, level) - if km.is_user_defined: + if kmi.show_expanded: col = col.column(align=True) box = col.box() else: @@ -256,7 +256,6 @@ class InputKeyMapPanel: row.prop(kmi, "show_expanded", text="", emboss=False) row = split.row() - row.enabled = km.is_user_defined row.prop(kmi, "active", text="", emboss=False) if km.is_modal: @@ -265,12 +264,13 @@ class InputKeyMapPanel: row.label(text=kmi.name) row = split.row() - row.enabled = km.is_user_defined row.prop(kmi, "map_type", text="") if map_type == 'KEYBOARD': row.prop(kmi, "type", text="", full_event=True) elif map_type == 'MOUSE': row.prop(kmi, "type", text="", full_event=True) + elif map_type == 'NDOF': + row.prop(kmi, "type", text="", full_event=True) elif map_type == 'TWEAK': subrow = row.row() subrow.prop(kmi, "type", text="") @@ -280,18 +280,17 @@ class InputKeyMapPanel: else: row.label() - if not kmi.is_user_defined: + if (not kmi.is_user_defined) and kmi.is_user_modified: op = row.operator("wm.keyitem_restore", text="", icon='BACK') op.item_id = kmi.id - op = row.operator("wm.keyitem_remove", text="", icon='X') - op.item_id = kmi.id + else: + op = row.operator("wm.keyitem_remove", text="", icon='X') + op.item_id = kmi.id # Expanded, additional event settings if kmi.show_expanded: box = col.box() - box.enabled = km.is_user_defined - if map_type not in {'TEXTINPUT', 'TIMER'}: split = box.split(percentage=0.4) sub = split.row() @@ -306,7 +305,7 @@ class InputKeyMapPanel: sub = split.column() subrow = sub.row(align=True) - if map_type == 'KEYBOARD': + if map_type in {'KEYBOARD', 'NDOF'}: subrow.prop(kmi, "type", text="", event=True) subrow.prop(kmi, "value", text="") elif map_type == 'MOUSE': @@ -325,7 +324,7 @@ class InputKeyMapPanel: # Operator properties props = kmi.properties if props is not None: - __class__.draw_kmi_properties(box, props) + InputKeyMapPanel.draw_kmi_properties(box, props) # Modal key maps attached to this operator if not km.is_modal: @@ -350,10 +349,10 @@ class InputKeyMapPanel: row.label() row.label() - if km.is_user_defined: - op = row.operator("wm.keymap_restore", text="Restore") + if km.is_user_modified: + row.operator("wm.keymap_restore", text="Restore") else: - op = row.operator("wm.keymap_edit", text="Edit") + row.label() for kmi in filtered_items: self.draw_kmi(display_keymaps, kc, km, kmi, col, 1) @@ -361,8 +360,7 @@ class InputKeyMapPanel: # "Add New" at end of keymap item list col = self.indented_layout(layout, 1) subcol = col.split(percentage=0.2).column() - subcol.enabled = km.is_user_defined - op = subcol.operator("wm.keyitem_add", text="Add New", icon='ZOOMIN') + subcol.operator("wm.keyitem_add", text="Add New", icon='ZOOMIN') def draw_hierarchy(self, display_keymaps, layout): for entry in KM_HIERARCHY: @@ -370,8 +368,7 @@ class InputKeyMapPanel: def draw_keymaps(self, context, layout): wm = context.window_manager - kc = wm.keyconfigs.active - defkc = wm.keyconfigs.default + kc = wm.keyconfigs.user col = layout.column() sub = col.column() @@ -396,7 +393,7 @@ class InputKeyMapPanel: col.separator() - display_keymaps = _merge_keymaps(kc, defkc) + display_keymaps = _merge_keymaps(kc, kc) if context.space_data.filter_text != "": filter_text = context.space_data.filter_text.lower() self.draw_filtered(display_keymaps, filter_text, col) @@ -414,7 +411,7 @@ def export_properties(prefix, properties, lines=None): for pname in properties.bl_rna.properties.keys(): if pname != "rna_type" and not properties.is_property_hidden(pname): value = getattr(properties, pname) - if isinstance(value, bpy.types.OperatorProperties): + if isinstance(value, OperatorProperties): export_properties(prefix + "." + pname, value, lines) elif properties.is_property_set(pname): value = _string_value(value) @@ -423,7 +420,7 @@ def export_properties(prefix, properties, lines=None): return lines -class WM_OT_keyconfig_test(bpy.types.Operator): +class WM_OT_keyconfig_test(Operator): "Test keyconfig for conflicts" bl_idname = "wm.keyconfig_test" bl_label = "Test Key Configuration for Conflicts" @@ -531,37 +528,58 @@ def _string_value(value): return result -class WM_OT_keyconfig_import(bpy.types.Operator): +class WM_OT_keyconfig_import(Operator): "Import key configuration from a python script" bl_idname = "wm.keyconfig_import" bl_label = "Import Key Configuration..." - filepath = StringProperty(name="File Path", description="Filepath to write file to", default="keymap.py") - filter_folder = BoolProperty(name="Filter folders", description="", default=True, options={'HIDDEN'}) - filter_text = BoolProperty(name="Filter text", description="", default=True, options={'HIDDEN'}) - filter_python = BoolProperty(name="Filter python", description="", default=True, options={'HIDDEN'}) - - keep_original = BoolProperty(name="Keep original", description="Keep original file after copying to configuration folder", default=True) + filepath = StringProperty( + name="File Path", + description="Filepath to write file to", + default="keymap.py", + ) + filter_folder = BoolProperty( + name="Filter folders", + default=True, + options={'HIDDEN'}, + ) + filter_text = BoolProperty( + name="Filter text", + default=True, + options={'HIDDEN'}, + ) + filter_python = BoolProperty( + name="Filter python", + default=True, + options={'HIDDEN'}, + ) + keep_original = BoolProperty( + name="Keep original", + description="Keep original file after copying to configuration folder", + default=True, + ) def execute(self, context): from os.path import basename import shutil - if not self.filepath: - raise Exception("Filepath not set") - f = open(self.filepath, "r") - if not f: - raise Exception("Could not open file") + if not self.filepath: + self.report({'ERROR'}, "Filepath not set") + return {'CANCELLED'} config_name = basename(self.filepath) path = bpy.utils.user_resource('SCRIPTS', os.path.join("presets", "keyconfig"), create=True) path = os.path.join(path, config_name) - if self.keep_original: - shutil.copy(self.filepath, path) - else: - shutil.move(self.filepath, path) + try: + if self.keep_original: + shutil.copy(self.filepath, path) + else: + shutil.move(self.filepath, path) + except Exception as e: + self.report({'ERROR'}, "Installing keymap failed: %s" % e) + return {'CANCELLED'} # sneaky way to check we're actually running the code. bpy.utils.keyconfig_set(path) @@ -576,20 +594,39 @@ class WM_OT_keyconfig_import(bpy.types.Operator): # This operator is also used by interaction presets saving - AddPresetBase -class WM_OT_keyconfig_export(bpy.types.Operator): +class WM_OT_keyconfig_export(Operator): "Export key configuration to a python script" bl_idname = "wm.keyconfig_export" bl_label = "Export Key Configuration..." - filepath = StringProperty(name="File Path", description="Filepath to write file to", default="keymap.py") - filter_folder = BoolProperty(name="Filter folders", description="", default=True, options={'HIDDEN'}) - filter_text = BoolProperty(name="Filter text", description="", default=True, options={'HIDDEN'}) - filter_python = BoolProperty(name="Filter python", description="", default=True, options={'HIDDEN'}) + filepath = StringProperty( + name="File Path", + description="Filepath to write file to", + default="keymap.py", + ) + filter_folder = BoolProperty( + name="Filter folders", + default=True, + options={'HIDDEN'}, + ) + filter_text = BoolProperty( + name="Filter text", + default=True, + options={'HIDDEN'}, + ) + filter_python = BoolProperty( + name="Filter python", + default=True, + options={'HIDDEN'}, + ) def execute(self, context): if not self.filepath: raise Exception("Filepath not set") + if not self.filepath.endswith('.py'): + self.filepath += '.py' + f = open(self.filepath, "w") if not f: raise Exception("Could not open file") @@ -604,7 +641,7 @@ class WM_OT_keyconfig_export(bpy.types.Operator): # Generate a list of keymaps to export: # - # First add all user_defined keymaps (found in inputs.edited_keymaps list), + # First add all user_modified keymaps (found in keyconfigs.user.keymaps list), # then add all remaining keymaps from the currently active custom keyconfig. # # This will create a final list of keymaps that can be used as a 'diff' against @@ -614,7 +651,9 @@ class WM_OT_keyconfig_export(bpy.types.Operator): class FakeKeyConfig(): keymaps = [] edited_kc = FakeKeyConfig() - edited_kc.keymaps.extend(context.user_preferences.inputs.edited_keymaps) + for km in wm.keyconfigs.user.keymaps: + if km.is_user_modified: + edited_kc.keymaps.append(km) # merge edited keymaps with non-default keyconfig, if it exists if kc != wm.keyconfigs.default: export_keymaps = _merge_keymaps(edited_kc, kc) @@ -664,29 +703,21 @@ class WM_OT_keyconfig_export(bpy.types.Operator): return {'RUNNING_MODAL'} -class WM_OT_keymap_edit(bpy.types.Operator): - "Edit stored key map" - bl_idname = "wm.keymap_edit" - bl_label = "Edit Key Map" - - def execute(self, context): - km = context.keymap - km.copy_to_user() - return {'FINISHED'} - - -class WM_OT_keymap_restore(bpy.types.Operator): +class WM_OT_keymap_restore(Operator): "Restore key map(s)" bl_idname = "wm.keymap_restore" bl_label = "Restore Key Map(s)" - all = BoolProperty(name="All Keymaps", description="Restore all keymaps to default") + all = BoolProperty( + name="All Keymaps", + description="Restore all keymaps to default", + ) def execute(self, context): wm = context.window_manager if self.all: - for km in wm.keyconfigs.default.keymaps: + for km in wm.keyconfigs.user.keymaps: km.restore_to_default() else: km = context.keymap @@ -695,37 +726,38 @@ class WM_OT_keymap_restore(bpy.types.Operator): return {'FINISHED'} -class WM_OT_keyitem_restore(bpy.types.Operator): +class WM_OT_keyitem_restore(Operator): "Restore key map item" bl_idname = "wm.keyitem_restore" bl_label = "Restore Key Map Item" - item_id = IntProperty(name="Item Identifier", description="Identifier of the item to remove") + item_id = IntProperty( + name="Item Identifier", + description="Identifier of the item to remove", + ) @classmethod def poll(cls, context): keymap = getattr(context, "keymap", None) - return keymap and keymap.is_user_defined + return keymap def execute(self, context): km = context.keymap kmi = km.keymap_items.from_id(self.item_id) - if not kmi.is_user_defined: + if (not kmi.is_user_defined) and kmi.is_user_modified: km.restore_item_to_default(kmi) return {'FINISHED'} -class WM_OT_keyitem_add(bpy.types.Operator): +class WM_OT_keyitem_add(Operator): "Add key map item" bl_idname = "wm.keyitem_add" bl_label = "Add Key Map Item" def execute(self, context): - wm = context.window_manager km = context.keymap - kc = wm.keyconfigs.default if km.is_modal: km.keymap_items.new_modal("", 'A', 'PRESS') # kmi @@ -741,16 +773,19 @@ class WM_OT_keyitem_add(bpy.types.Operator): return {'FINISHED'} -class WM_OT_keyitem_remove(bpy.types.Operator): +class WM_OT_keyitem_remove(Operator): "Remove key map item" bl_idname = "wm.keyitem_remove" bl_label = "Remove Key Map Item" - item_id = IntProperty(name="Item Identifier", description="Identifier of the item to remove") + item_id = IntProperty( + name="Item Identifier", + description="Identifier of the item to remove", + ) @classmethod def poll(cls, context): - return hasattr(context, "keymap") and context.keymap.is_user_defined + return hasattr(context, "keymap") def execute(self, context): km = context.keymap @@ -759,7 +794,7 @@ class WM_OT_keyitem_remove(bpy.types.Operator): return {'FINISHED'} -class WM_OT_keyconfig_remove(bpy.types.Operator): +class WM_OT_keyconfig_remove(Operator): "Remove key config" bl_idname = "wm.keyconfig_remove" bl_label = "Remove Key Config" diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index 02004283264..9f96df1eb66 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -18,9 +18,10 @@ # <pep8 compliant> import bpy +from bpy.types import Header, Menu, Operator, Panel -class VIEW3D_HT_header(bpy.types.Header): +class VIEW3D_HT_header(Header): bl_space_type = 'VIEW_3D' def draw(self, context): @@ -54,21 +55,13 @@ class VIEW3D_HT_header(bpy.types.Header): sub.menu("VIEW3D_MT_object") row = layout.row() + # Contains buttons like Mode, Pivot, Manipulator, Layer, Mesh Select Mode... row.template_header_3D() - # do in C for now since these buttons cant be both toggle AND exclusive. - ''' - if obj and obj.mode == 'EDIT' and obj.type == 'MESH': - row_sub = row.row(align=True) - row_sub.prop(toolsettings, "mesh_select_mode", text="", index=0, icon='VERTEXSEL') - row_sub.prop(toolsettings, "mesh_select_mode", text="", index=1, icon='EDGESEL') - row_sub.prop(toolsettings, "mesh_select_mode", text="", index=2, icon='FACESEL') - ''' - if obj: # Particle edit if obj.mode == 'PARTICLE_EDIT': - row.prop(toolsettings.particle_edit, "select_mode", text="", expand=True, toggle=True) + row.prop(toolsettings.particle_edit, "select_mode", text="", expand=True) # Occlude geometry if view.viewport_shade in {'SOLID', 'SHADED', 'TEXTURED'} and (obj.mode == 'PARTICLE_EDIT' or (obj.mode == 'EDIT' and obj.type == 'MESH')): @@ -87,16 +80,21 @@ class VIEW3D_HT_header(bpy.types.Header): row.prop(toolsettings, "proportional_edit_falloff", text="", icon_only=True) # Snap + snap_element = toolsettings.snap_element row = layout.row(align=True) row.prop(toolsettings, "use_snap", text="") row.prop(toolsettings, "snap_element", text="", icon_only=True) - if toolsettings.snap_element != 'INCREMENT': + if snap_element != 'INCREMENT': row.prop(toolsettings, "snap_target", text="") - if obj and obj.mode == 'OBJECT': - row.prop(toolsettings, "use_snap_align_rotation", text="") - if toolsettings.snap_element == 'VOLUME': + if obj: + if obj.mode == 'OBJECT': + row.prop(toolsettings, "use_snap_align_rotation", text="") + elif obj.mode == 'EDIT': + row.prop(toolsettings, "use_snap_self", text="") + + if snap_element == 'VOLUME': row.prop(toolsettings, "use_snap_peel_object", text="") - elif toolsettings.snap_element == 'FACE': + elif snap_element == 'FACE': row.prop(toolsettings, "use_snap_project", text="") # OpenGL render @@ -131,7 +129,7 @@ class ShowHideMenu(): layout.operator("%s.hide" % self._operator_name, text="Hide Unselected").unselected = True -class VIEW3D_MT_transform(bpy.types.Menu): +class VIEW3D_MT_transform(Menu): bl_label = "Transform" # TODO: get rid of the custom text strings? @@ -182,8 +180,12 @@ class VIEW3D_MT_transform(bpy.types.Menu): layout.operator("object.randomize_transform") layout.operator("object.align") + layout.separator() + + layout.operator("object.anim_transforms_to_deltas") -class VIEW3D_MT_mirror(bpy.types.Menu): + +class VIEW3D_MT_mirror(Menu): bl_label = "Mirror" def draw(self, context): @@ -221,7 +223,7 @@ class VIEW3D_MT_mirror(bpy.types.Menu): layout.operator("object.vertex_group_mirror") -class VIEW3D_MT_snap(bpy.types.Menu): +class VIEW3D_MT_snap(Menu): bl_label = "Snap" def draw(self, context): @@ -238,7 +240,7 @@ class VIEW3D_MT_snap(bpy.types.Menu): layout.operator("view3d.snap_cursor_to_active", text="Cursor to Active") -class VIEW3D_MT_uv_map(bpy.types.Menu): +class VIEW3D_MT_uv_map(Menu): bl_label = "UV Mapping" def draw(self, context): @@ -271,7 +273,7 @@ class VIEW3D_MT_uv_map(bpy.types.Menu): # ********** View menus ********** -class VIEW3D_MT_view(bpy.types.Menu): +class VIEW3D_MT_view(Menu): bl_label = "View" def draw(self, context): @@ -329,7 +331,7 @@ class VIEW3D_MT_view(bpy.types.Menu): layout.operator("screen.screen_full_area") -class VIEW3D_MT_view_navigation(bpy.types.Menu): +class VIEW3D_MT_view_navigation(Menu): bl_label = "Navigation" def draw(self, context): @@ -352,7 +354,7 @@ class VIEW3D_MT_view_navigation(bpy.types.Menu): layout.operator("view3d.fly") -class VIEW3D_MT_view_align(bpy.types.Menu): +class VIEW3D_MT_view_align(Menu): bl_label = "Align View" def draw(self, context): @@ -368,7 +370,7 @@ class VIEW3D_MT_view_align(bpy.types.Menu): layout.operator("view3d.view_center_cursor") -class VIEW3D_MT_view_align_selected(bpy.types.Menu): +class VIEW3D_MT_view_align_selected(Menu): bl_label = "Align View to Selected" def draw(self, context): @@ -394,7 +396,7 @@ class VIEW3D_MT_view_align_selected(bpy.types.Menu): props.type = 'LEFT' -class VIEW3D_MT_view_cameras(bpy.types.Menu): +class VIEW3D_MT_view_cameras(Menu): bl_label = "Cameras" def draw(self, context): @@ -406,7 +408,7 @@ class VIEW3D_MT_view_cameras(bpy.types.Menu): # ********** Select menus, suffix from context.mode ********** -class VIEW3D_MT_select_object(bpy.types.Menu): +class VIEW3D_MT_select_object(Menu): bl_label = "Select" def draw(self, context): @@ -432,7 +434,7 @@ class VIEW3D_MT_select_object(bpy.types.Menu): layout.operator("object.select_pattern", text="Select Pattern...") -class VIEW3D_MT_select_pose(bpy.types.Menu): +class VIEW3D_MT_select_pose(Menu): bl_label = "Select" def draw(self, context): @@ -469,7 +471,7 @@ class VIEW3D_MT_select_pose(bpy.types.Menu): layout.operator("object.select_pattern", text="Select Pattern...") -class VIEW3D_MT_select_particle(bpy.types.Menu): +class VIEW3D_MT_select_particle(Menu): bl_label = "Select" def draw(self, context): @@ -494,7 +496,7 @@ class VIEW3D_MT_select_particle(bpy.types.Menu): layout.operator("particle.select_tips", text="Tips") -class VIEW3D_MT_select_edit_mesh(bpy.types.Menu): +class VIEW3D_MT_select_edit_mesh(Menu): bl_label = "Select" def draw(self, context): @@ -546,7 +548,7 @@ class VIEW3D_MT_select_edit_mesh(bpy.types.Menu): layout.operator("mesh.region_to_loop") -class VIEW3D_MT_select_edit_curve(bpy.types.Menu): +class VIEW3D_MT_select_edit_curve(Menu): bl_label = "Select" def draw(self, context): @@ -575,7 +577,7 @@ class VIEW3D_MT_select_edit_curve(bpy.types.Menu): layout.operator("curve.select_less") -class VIEW3D_MT_select_edit_surface(bpy.types.Menu): +class VIEW3D_MT_select_edit_surface(Menu): bl_label = "Select" def draw(self, context): @@ -601,7 +603,7 @@ class VIEW3D_MT_select_edit_surface(bpy.types.Menu): layout.operator("curve.select_less") -class VIEW3D_MT_select_edit_metaball(bpy.types.Menu): +class VIEW3D_MT_select_edit_metaball(Menu): bl_label = "Select" def draw(self, context): @@ -619,7 +621,7 @@ class VIEW3D_MT_select_edit_metaball(bpy.types.Menu): layout.operator("mball.select_random_metaelems") -class VIEW3D_MT_select_edit_lattice(bpy.types.Menu): +class VIEW3D_MT_select_edit_lattice(Menu): bl_label = "Select" def draw(self, context): @@ -632,7 +634,7 @@ class VIEW3D_MT_select_edit_lattice(bpy.types.Menu): layout.operator("lattice.select_all", text="Select/Deselect All") -class VIEW3D_MT_select_edit_armature(bpy.types.Menu): +class VIEW3D_MT_select_edit_armature(Menu): bl_label = "Select" def draw(self, context): @@ -663,7 +665,7 @@ class VIEW3D_MT_select_edit_armature(bpy.types.Menu): layout.operator("object.select_pattern", text="Select Pattern...") -class VIEW3D_MT_select_face(bpy.types.Menu): # XXX no matching enum +class VIEW3D_MT_select_face(Menu): # XXX no matching enum bl_label = "Select" def draw(self, context): @@ -676,7 +678,7 @@ class VIEW3D_MT_select_face(bpy.types.Menu): # XXX no matching enum # ********** Object menu ********** -class VIEW3D_MT_object(bpy.types.Menu): +class VIEW3D_MT_object(Menu): bl_context = "objectmode" bl_label = "Object" @@ -734,7 +736,7 @@ class VIEW3D_MT_object(bpy.types.Menu): layout.operator_menu_enum("object.convert", "target") -class VIEW3D_MT_object_animation(bpy.types.Menu): +class VIEW3D_MT_object_animation(Menu): bl_label = "Animation" def draw(self, context): @@ -745,7 +747,7 @@ class VIEW3D_MT_object_animation(bpy.types.Menu): layout.operator("anim.keying_set_active_set", text="Change Keying Set...") -class VIEW3D_MT_object_clear(bpy.types.Menu): +class VIEW3D_MT_object_clear(Menu): bl_label = "Clear" def draw(self, context): @@ -757,7 +759,7 @@ class VIEW3D_MT_object_clear(bpy.types.Menu): layout.operator("object.origin_clear", text="Origin") -class VIEW3D_MT_object_specials(bpy.types.Menu): +class VIEW3D_MT_object_specials(Menu): bl_label = "Specials" @classmethod @@ -772,10 +774,16 @@ class VIEW3D_MT_object_specials(bpy.types.Menu): if obj.type == 'CAMERA': layout.operator_context = 'INVOKE_REGION_WIN' - props = layout.operator("wm.context_modal_mouse", text="Camera Lens Angle") - props.data_path_iter = "selected_editable_objects" - props.data_path_item = "data.lens" - props.input_scale = 0.1 + if obj.data.type == 'PERSP': + props = layout.operator("wm.context_modal_mouse", text="Camera Lens Angle") + props.data_path_iter = "selected_editable_objects" + props.data_path_item = "data.lens" + props.input_scale = 0.1 + else: + props = layout.operator("wm.context_modal_mouse", text="Camera Lens Scale") + props.data_path_iter = "selected_editable_objects" + props.data_path_item = "data.ortho_scale" + props.input_scale = 0.01 if not obj.data.dof_object: #layout.label(text="Test Has DOF obj"); @@ -846,7 +854,7 @@ class VIEW3D_MT_object_specials(bpy.types.Menu): props = layout.operator("object.hide_render_clear_all") -class VIEW3D_MT_object_apply(bpy.types.Menu): +class VIEW3D_MT_object_apply(Menu): bl_label = "Apply" def draw(self, context): @@ -865,7 +873,7 @@ class VIEW3D_MT_object_apply(bpy.types.Menu): layout.operator("object.duplicates_make_real") -class VIEW3D_MT_object_parent(bpy.types.Menu): +class VIEW3D_MT_object_parent(Menu): bl_label = "Parent" def draw(self, context): @@ -875,7 +883,7 @@ class VIEW3D_MT_object_parent(bpy.types.Menu): layout.operator("object.parent_clear", text="Clear") -class VIEW3D_MT_object_track(bpy.types.Menu): +class VIEW3D_MT_object_track(Menu): bl_label = "Track" def draw(self, context): @@ -885,7 +893,7 @@ class VIEW3D_MT_object_track(bpy.types.Menu): layout.operator("object.track_clear", text="Clear") -class VIEW3D_MT_object_group(bpy.types.Menu): +class VIEW3D_MT_object_group(Menu): bl_label = "Group" def draw(self, context): @@ -900,7 +908,7 @@ class VIEW3D_MT_object_group(bpy.types.Menu): layout.operator("group.objects_remove_active") -class VIEW3D_MT_object_constraints(bpy.types.Menu): +class VIEW3D_MT_object_constraints(Menu): bl_label = "Constraints" def draw(self, context): @@ -911,7 +919,7 @@ class VIEW3D_MT_object_constraints(bpy.types.Menu): layout.operator("object.constraints_clear") -class VIEW3D_MT_object_showhide(bpy.types.Menu): +class VIEW3D_MT_object_showhide(Menu): bl_label = "Show/Hide" def draw(self, context): @@ -922,7 +930,7 @@ class VIEW3D_MT_object_showhide(bpy.types.Menu): layout.operator("object.hide_view_set", text="Hide Unselected").unselected = True -class VIEW3D_MT_make_single_user(bpy.types.Menu): +class VIEW3D_MT_make_single_user(Menu): bl_label = "Make Single User" def draw(self, context): @@ -944,7 +952,7 @@ class VIEW3D_MT_make_single_user(bpy.types.Menu): props.animation = True -class VIEW3D_MT_make_links(bpy.types.Menu): +class VIEW3D_MT_make_links(Menu): bl_label = "Make Links" def draw(self, context): @@ -961,7 +969,7 @@ class VIEW3D_MT_make_links(bpy.types.Menu): layout.operator_enum("object.make_links_data", "type") # inline -class VIEW3D_MT_object_game(bpy.types.Menu): +class VIEW3D_MT_object_game(Menu): bl_label = "Game" def draw(self, context): @@ -983,7 +991,7 @@ class VIEW3D_MT_object_game(bpy.types.Menu): # ********** Vertex paint menu ********** -class VIEW3D_MT_paint_vertex(bpy.types.Menu): +class VIEW3D_MT_paint_vertex(Menu): bl_label = "Paint" def draw(self, context): @@ -998,7 +1006,7 @@ class VIEW3D_MT_paint_vertex(bpy.types.Menu): layout.operator("paint.vertex_color_dirt") -class VIEW3D_MT_hook(bpy.types.Menu): +class VIEW3D_MT_hook(Menu): bl_label = "Hooks" def draw(self, context): @@ -1017,7 +1025,7 @@ class VIEW3D_MT_hook(bpy.types.Menu): layout.operator_menu_enum("object.hook_recenter", "modifier") -class VIEW3D_MT_vertex_group(bpy.types.Menu): +class VIEW3D_MT_vertex_group(Menu): bl_label = "Vertex Groups" def draw(self, context): @@ -1042,7 +1050,7 @@ class VIEW3D_MT_vertex_group(bpy.types.Menu): # ********** Weight paint menu ********** -class VIEW3D_MT_paint_weight(bpy.types.Menu): +class VIEW3D_MT_paint_weight(Menu): bl_label = "Weights" def draw(self, context): @@ -1072,7 +1080,7 @@ class VIEW3D_MT_paint_weight(bpy.types.Menu): # ********** Sculpt menu ********** -class VIEW3D_MT_sculpt(bpy.types.Menu): +class VIEW3D_MT_sculpt(Menu): bl_label = "Sculpt" def draw(self, context): @@ -1098,17 +1106,18 @@ class VIEW3D_MT_sculpt(bpy.types.Menu): layout.operator_menu_enum("brush.curve_preset", "shape") layout.separator() - sculpt_tool = brush.sculpt_tool + if brush is not None: # unlikely but can happen + sculpt_tool = brush.sculpt_tool - if sculpt_tool != 'GRAB': - layout.prop_menu_enum(brush, "stroke_method") + if sculpt_tool != 'GRAB': + layout.prop_menu_enum(brush, "stroke_method") - if sculpt_tool in {'DRAW', 'PINCH', 'INFLATE', 'LAYER', 'CLAY'}: - layout.prop_menu_enum(brush, "direction") + if sculpt_tool in {'DRAW', 'PINCH', 'INFLATE', 'LAYER', 'CLAY'}: + layout.prop_menu_enum(brush, "direction") - if sculpt_tool == 'LAYER': - layout.prop(brush, "use_persistent") - layout.operator("sculpt.set_persistent_base") + if sculpt_tool == 'LAYER': + layout.prop(brush, "use_persistent") + layout.operator("sculpt.set_persistent_base") layout.separator() layout.prop(sculpt, "use_threaded", text="Threaded Sculpt") @@ -1121,7 +1130,7 @@ class VIEW3D_MT_sculpt(bpy.types.Menu): # ********** Particle menu ********** -class VIEW3D_MT_particle(bpy.types.Menu): +class VIEW3D_MT_particle(Menu): bl_label = "Particle" def draw(self, context): @@ -1153,7 +1162,7 @@ class VIEW3D_MT_particle(bpy.types.Menu): layout.menu("VIEW3D_MT_particle_showhide") -class VIEW3D_MT_particle_specials(bpy.types.Menu): +class VIEW3D_MT_particle_specials(Menu): bl_label = "Specials" def draw(self, context): @@ -1171,13 +1180,13 @@ class VIEW3D_MT_particle_specials(bpy.types.Menu): layout.operator("particle.remove_doubles") -class VIEW3D_MT_particle_showhide(ShowHideMenu, bpy.types.Menu): +class VIEW3D_MT_particle_showhide(ShowHideMenu, Menu): _operator_name = "particle" # ********** Pose Menu ********** -class VIEW3D_MT_pose(bpy.types.Menu): +class VIEW3D_MT_pose(Menu): bl_label = "Pose" def draw(self, context): @@ -1243,10 +1252,10 @@ class VIEW3D_MT_pose(bpy.types.Menu): layout.separator() layout.menu("VIEW3D_MT_pose_showhide") - layout.operator_menu_enum("pose.flags_set", 'mode', text="Bone Settings") + layout.menu("VIEW3D_MT_bone_options_toggle", text="Bone Settings") -class VIEW3D_MT_pose_transform(bpy.types.Menu): +class VIEW3D_MT_pose_transform(Menu): bl_label = "Clear Transform" def draw(self, context): @@ -1254,14 +1263,18 @@ class VIEW3D_MT_pose_transform(bpy.types.Menu): layout.operator("pose.transforms_clear", text="All") + layout.separator() + layout.operator("pose.loc_clear", text="Location") layout.operator("pose.rot_clear", text="Rotation") layout.operator("pose.scale_clear", text="Scale") - layout.label(text="Origin") + layout.separator() + + layout.operator("pose.user_transforms_clear", text="Reset unkeyed") -class VIEW3D_MT_pose_slide(bpy.types.Menu): +class VIEW3D_MT_pose_slide(Menu): bl_label = "In-Betweens" def draw(self, context): @@ -1272,7 +1285,7 @@ class VIEW3D_MT_pose_slide(bpy.types.Menu): layout.operator("pose.breakdown") -class VIEW3D_MT_pose_propagate(bpy.types.Menu): +class VIEW3D_MT_pose_propagate(Menu): bl_label = "Propagate" def draw(self, context): @@ -1290,7 +1303,7 @@ class VIEW3D_MT_pose_propagate(bpy.types.Menu): layout.operator("pose.propagate", text="On Selected Markers").mode = 'SELECTED_MARKERS' -class VIEW3D_MT_pose_library(bpy.types.Menu): +class VIEW3D_MT_pose_library(Menu): bl_label = "Pose Library" def draw(self, context): @@ -1305,7 +1318,7 @@ class VIEW3D_MT_pose_library(bpy.types.Menu): layout.operator("poselib.pose_remove", text="Remove Pose...") -class VIEW3D_MT_pose_motion(bpy.types.Menu): +class VIEW3D_MT_pose_motion(Menu): bl_label = "Motion Paths" def draw(self, context): @@ -1315,7 +1328,7 @@ class VIEW3D_MT_pose_motion(bpy.types.Menu): layout.operator("pose.paths_clear", text="Clear") -class VIEW3D_MT_pose_group(bpy.types.Menu): +class VIEW3D_MT_pose_group(Menu): bl_label = "Bone Groups" def draw(self, context): @@ -1329,7 +1342,7 @@ class VIEW3D_MT_pose_group(bpy.types.Menu): layout.operator("pose.group_unassign") -class VIEW3D_MT_pose_ik(bpy.types.Menu): +class VIEW3D_MT_pose_ik(Menu): bl_label = "Inverse Kinematics" def draw(self, context): @@ -1339,7 +1352,7 @@ class VIEW3D_MT_pose_ik(bpy.types.Menu): layout.operator("pose.ik_clear") -class VIEW3D_MT_pose_constraints(bpy.types.Menu): +class VIEW3D_MT_pose_constraints(Menu): bl_label = "Constraints" def draw(self, context): @@ -1350,11 +1363,11 @@ class VIEW3D_MT_pose_constraints(bpy.types.Menu): layout.operator("pose.constraints_clear") -class VIEW3D_MT_pose_showhide(ShowHideMenu, bpy.types.Menu): +class VIEW3D_MT_pose_showhide(ShowHideMenu, Menu): _operator_name = "pose" -class VIEW3D_MT_pose_apply(bpy.types.Menu): +class VIEW3D_MT_pose_apply(Menu): bl_label = "Apply" def draw(self, context): @@ -1364,10 +1377,53 @@ class VIEW3D_MT_pose_apply(bpy.types.Menu): layout.operator("pose.visual_transform_apply") +class BoneOptions: + def draw(self, context): + layout = self.layout + + options = [ + "show_wire", + "use_deform", + "use_envelope_multiply", + "use_inherit_rotation", + "use_inherit_scale", + ] + + if context.mode == 'EDIT_ARMATURE': + bone_props = bpy.types.EditBone.bl_rna.properties + data_path_iter = "selected_bones" + opt_suffix = "" + options.append("lock") + else: # posemode + bone_props = bpy.types.Bone.bl_rna.properties + data_path_iter = "selected_pose_bones" + opt_suffix = "bone." + + for opt in options: + props = layout.operator("wm.context_collection_boolean_set", text=bone_props[opt].name) + props.data_path_iter = data_path_iter + props.data_path_item = opt_suffix + opt + props.type = self.type + + +class VIEW3D_MT_bone_options_toggle(Menu, BoneOptions): + bl_label = "Toggle Bone Options" + type = 'TOGGLE' + + +class VIEW3D_MT_bone_options_enable(Menu, BoneOptions): + bl_label = "Enable Bone Options" + type = 'ENABLE' + + +class VIEW3D_MT_bone_options_disable(Menu, BoneOptions): + bl_label = "Disable Bone Options" + type = 'DISABLE' + # ********** Edit Menus, suffix from ob.type ********** -class VIEW3D_MT_edit_mesh(bpy.types.Menu): +class VIEW3D_MT_edit_mesh(Menu): bl_label = "Mesh" def draw(self, context): @@ -1414,7 +1470,7 @@ class VIEW3D_MT_edit_mesh(bpy.types.Menu): layout.menu("VIEW3D_MT_edit_mesh_showhide") -class VIEW3D_MT_edit_mesh_specials(bpy.types.Menu): +class VIEW3D_MT_edit_mesh_specials(Menu): bl_label = "Specials" def draw(self, context): @@ -1439,7 +1495,7 @@ class VIEW3D_MT_edit_mesh_specials(bpy.types.Menu): layout.operator("mesh.select_vertex_path") -class VIEW3D_MT_edit_mesh_select_mode(bpy.types.Menu): +class VIEW3D_MT_edit_mesh_select_mode(Menu): bl_label = "Mesh Select Mode" def draw(self, context): @@ -1460,7 +1516,7 @@ class VIEW3D_MT_edit_mesh_select_mode(bpy.types.Menu): prop.data_path = "tool_settings.mesh_select_mode" -class VIEW3D_MT_edit_mesh_extrude(bpy.types.Menu): +class VIEW3D_MT_edit_mesh_extrude(Menu): bl_label = "Extrude" _extrude_funcs = { \ @@ -1494,7 +1550,7 @@ class VIEW3D_MT_edit_mesh_extrude(bpy.types.Menu): self._extrude_funcs[menu_id](layout) -class VIEW3D_OT_edit_mesh_extrude_individual_move(bpy.types.Operator): +class VIEW3D_OT_edit_mesh_extrude_individual_move(Operator): "Extrude individual elements and move" bl_label = "Extrude Individual and Move" bl_idname = "view3d.edit_mesh_extrude_individual_move" @@ -1523,7 +1579,7 @@ class VIEW3D_OT_edit_mesh_extrude_individual_move(bpy.types.Operator): return self.execute(context) -class VIEW3D_OT_edit_mesh_extrude_move(bpy.types.Operator): +class VIEW3D_OT_edit_mesh_extrude_move(Operator): "Extrude and move along normals" bl_label = "Extrude and Move on Normals" bl_idname = "view3d.edit_mesh_extrude_move_normal" @@ -1549,7 +1605,7 @@ class VIEW3D_OT_edit_mesh_extrude_move(bpy.types.Operator): return self.execute(context) -class VIEW3D_MT_edit_mesh_vertices(bpy.types.Menu): +class VIEW3D_MT_edit_mesh_vertices(Menu): bl_label = "Vertices" def draw(self, context): @@ -1581,7 +1637,7 @@ class VIEW3D_MT_edit_mesh_vertices(bpy.types.Menu): layout.menu("VIEW3D_MT_hook") -class VIEW3D_MT_edit_mesh_edges(bpy.types.Menu): +class VIEW3D_MT_edit_mesh_edges(Menu): bl_label = "Edges" def draw(self, context): @@ -1621,7 +1677,7 @@ class VIEW3D_MT_edit_mesh_edges(bpy.types.Menu): layout.operator("mesh.region_to_loop") -class VIEW3D_MT_edit_mesh_faces(bpy.types.Menu): +class VIEW3D_MT_edit_mesh_faces(Menu): bl_label = "Faces" bl_idname = "VIEW3D_MT_edit_mesh_faces" @@ -1669,7 +1725,7 @@ class VIEW3D_MT_edit_mesh_faces(bpy.types.Menu): layout.operator_menu_enum("mesh.colors_mirror", "axis") -class VIEW3D_MT_edit_mesh_normals(bpy.types.Menu): +class VIEW3D_MT_edit_mesh_normals(Menu): bl_label = "Normals" def draw(self, context): @@ -1683,7 +1739,7 @@ class VIEW3D_MT_edit_mesh_normals(bpy.types.Menu): layout.operator("mesh.flip_normals") -class VIEW3D_MT_edit_mesh_showhide(ShowHideMenu, bpy.types.Menu): +class VIEW3D_MT_edit_mesh_showhide(ShowHideMenu, Menu): _operator_name = "mesh" # Edit Curve @@ -1723,13 +1779,13 @@ def draw_curve(self, context): layout.menu("VIEW3D_MT_edit_curve_showhide") -class VIEW3D_MT_edit_curve(bpy.types.Menu): +class VIEW3D_MT_edit_curve(Menu): bl_label = "Curve" draw = draw_curve -class VIEW3D_MT_edit_curve_ctrlpoints(bpy.types.Menu): +class VIEW3D_MT_edit_curve_ctrlpoints(Menu): bl_label = "Control Points" def draw(self, context): @@ -1751,7 +1807,7 @@ class VIEW3D_MT_edit_curve_ctrlpoints(bpy.types.Menu): layout.menu("VIEW3D_MT_hook") -class VIEW3D_MT_edit_curve_segments(bpy.types.Menu): +class VIEW3D_MT_edit_curve_segments(Menu): bl_label = "Segments" def draw(self, context): @@ -1761,7 +1817,7 @@ class VIEW3D_MT_edit_curve_segments(bpy.types.Menu): layout.operator("curve.switch_direction") -class VIEW3D_MT_edit_curve_specials(bpy.types.Menu): +class VIEW3D_MT_edit_curve_specials(Menu): bl_label = "Specials" def draw(self, context): @@ -1775,17 +1831,17 @@ class VIEW3D_MT_edit_curve_specials(bpy.types.Menu): layout.operator("curve.smooth_radius") -class VIEW3D_MT_edit_curve_showhide(ShowHideMenu, bpy.types.Menu): +class VIEW3D_MT_edit_curve_showhide(ShowHideMenu, Menu): _operator_name = "curve" -class VIEW3D_MT_edit_surface(bpy.types.Menu): +class VIEW3D_MT_edit_surface(Menu): bl_label = "Surface" draw = draw_curve -class VIEW3D_MT_edit_font(bpy.types.Menu): +class VIEW3D_MT_edit_font(Menu): bl_label = "Text" def draw(self, context): @@ -1805,7 +1861,7 @@ class VIEW3D_MT_edit_font(bpy.types.Menu): layout.operator("font.style_toggle", text="Toggle Small Caps").style = 'SMALL_CAPS' -class VIEW3D_MT_edit_text_chars(bpy.types.Menu): +class VIEW3D_MT_edit_text_chars(Menu): bl_label = "Special Characters" def draw(self, context): @@ -1839,7 +1895,7 @@ class VIEW3D_MT_edit_text_chars(bpy.types.Menu): layout.operator("font.text_insert", text="Spanish Exclamation Mark|Alt !").text = b'\xC2\xA1'.decode() -class VIEW3D_MT_edit_meta(bpy.types.Menu): +class VIEW3D_MT_edit_meta(Menu): bl_label = "Metaball" def draw(self, context): @@ -1872,7 +1928,7 @@ class VIEW3D_MT_edit_meta(bpy.types.Menu): layout.menu("VIEW3D_MT_edit_meta_showhide") -class VIEW3D_MT_edit_meta_showhide(bpy.types.Menu): +class VIEW3D_MT_edit_meta_showhide(Menu): bl_label = "Show/Hide" def draw(self, context): @@ -1883,7 +1939,7 @@ class VIEW3D_MT_edit_meta_showhide(bpy.types.Menu): layout.operator("mball.hide_metaelems", text="Hide Unselected").unselected = True -class VIEW3D_MT_edit_lattice(bpy.types.Menu): +class VIEW3D_MT_edit_lattice(Menu): bl_label = "Lattice" def draw(self, context): @@ -1905,7 +1961,7 @@ class VIEW3D_MT_edit_lattice(bpy.types.Menu): layout.prop_menu_enum(settings, "proportional_edit_falloff") -class VIEW3D_MT_edit_armature(bpy.types.Menu): +class VIEW3D_MT_edit_armature(Menu): bl_label = "Armature" def draw(self, context): @@ -1957,10 +2013,10 @@ class VIEW3D_MT_edit_armature(bpy.types.Menu): layout.separator() - layout.operator_menu_enum("armature.flags_set", "mode", text="Bone Settings") + layout.menu("VIEW3D_MT_bone_options_toggle", text="Bone Settings") -class VIEW3D_MT_armature_specials(bpy.types.Menu): +class VIEW3D_MT_armature_specials(Menu): bl_label = "Specials" def draw(self, context): @@ -1980,7 +2036,7 @@ class VIEW3D_MT_armature_specials(bpy.types.Menu): layout.operator("armature.flip_names", text="Flip Names") -class VIEW3D_MT_edit_armature_parent(bpy.types.Menu): +class VIEW3D_MT_edit_armature_parent(Menu): bl_label = "Parent" def draw(self, context): @@ -1990,7 +2046,7 @@ class VIEW3D_MT_edit_armature_parent(bpy.types.Menu): layout.operator("armature.parent_clear", text="Clear") -class VIEW3D_MT_edit_armature_roll(bpy.types.Menu): +class VIEW3D_MT_edit_armature_roll(Menu): bl_label = "Bone Roll" def draw(self, context): @@ -2005,7 +2061,7 @@ class VIEW3D_MT_edit_armature_roll(bpy.types.Menu): # ********** Panel ********** -class VIEW3D_PT_view3d_properties(bpy.types.Panel): +class VIEW3D_PT_view3d_properties(Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_label = "View" @@ -2025,9 +2081,11 @@ class VIEW3D_PT_view3d_properties(bpy.types.Panel): col.prop(view, "lens") col.label(text="Lock to Object:") col.prop(view, "lock_object", text="") - if view.lock_object and view.lock_object.type == 'ARMATURE': - col.prop_search(view, "lock_bone", view.lock_object.data, "bones", text="") - elif not view.lock_object: + lock_object = view.lock_object + if lock_object: + if lock_object.type == 'ARMATURE': + col.prop_search(view, "lock_bone", lock_object.data, "edit_bones" if lock_object.mode == 'EDIT' else "bones", text="") + else: col.prop(view, "lock_cursor", text="Lock to Cursor") col = layout.column() @@ -2046,7 +2104,7 @@ class VIEW3D_PT_view3d_properties(bpy.types.Panel): layout.column().prop(view, "cursor_location") -class VIEW3D_PT_view3d_name(bpy.types.Panel): +class VIEW3D_PT_view3d_name(Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_label = "Item" @@ -2071,7 +2129,7 @@ class VIEW3D_PT_view3d_name(bpy.types.Panel): row.prop(bone, "name", text="") -class VIEW3D_PT_view3d_display(bpy.types.Panel): +class VIEW3D_PT_view3d_display(Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_label = "Display" @@ -2143,7 +2201,7 @@ class VIEW3D_PT_view3d_display(bpy.types.Panel): row.prop(region, "use_box_clip") -class VIEW3D_PT_view3d_meshdisplay(bpy.types.Panel): +class VIEW3D_PT_view3d_meshdisplay(Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_label = "Mesh Display" @@ -2180,7 +2238,7 @@ class VIEW3D_PT_view3d_meshdisplay(bpy.types.Panel): col.prop(mesh, "show_extra_face_area") -class VIEW3D_PT_view3d_curvedisplay(bpy.types.Panel): +class VIEW3D_PT_view3d_curvedisplay(Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_label = "Curve Display" @@ -2202,7 +2260,7 @@ class VIEW3D_PT_view3d_curvedisplay(bpy.types.Panel): col.prop(context.scene.tool_settings, "normal_size", text="Normal Size") -class VIEW3D_PT_background_image(bpy.types.Panel): +class VIEW3D_PT_background_image(Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_label = "Background Images" @@ -2255,7 +2313,7 @@ class VIEW3D_PT_background_image(bpy.types.Panel): row.prop(bg, "offset_y", text="Y") -class VIEW3D_PT_transform_orientations(bpy.types.Panel): +class VIEW3D_PT_transform_orientations(Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_label = "Transform Orientations" @@ -2283,7 +2341,7 @@ class VIEW3D_PT_transform_orientations(bpy.types.Panel): col.operator("transform.delete_orientation", text="Delete") -class VIEW3D_PT_etch_a_ton(bpy.types.Panel): +class VIEW3D_PT_etch_a_ton(Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_label = "Skeleton Sketching" @@ -2328,7 +2386,7 @@ class VIEW3D_PT_etch_a_ton(bpy.types.Panel): col.operator("sketch.convert", text="Convert") -class VIEW3D_PT_context_properties(bpy.types.Panel): +class VIEW3D_PT_context_properties(Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_label = "Properties" @@ -2358,7 +2416,7 @@ class VIEW3D_PT_context_properties(bpy.types.Panel): def draw(self, context): import rna_prop_ui - member = __class__._active_context_member(context) + member = VIEW3D_PT_context_properties._active_context_member(context) if member: # Draw with no edit button diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index 503a1d806ac..aa26cb43eed 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -18,6 +18,7 @@ # <pep8 compliant> import bpy +from bpy.types import Menu, Panel class View3DPanel(): @@ -53,15 +54,18 @@ def draw_gpencil_tools(context, layout): row = col.row() row.operator("gpencil.draw", text="Draw").mode = 'DRAW' row.operator("gpencil.draw", text="Line").mode = 'DRAW_STRAIGHT' + + row = col.row() + row.operator("gpencil.draw", text="Poly").mode = 'DRAW_POLY' row.operator("gpencil.draw", text="Erase").mode = 'ERASER' row = col.row() row.prop(context.tool_settings, "use_grease_pencil_sessions") -# ********** default tools for objectmode **************** +# ********** default tools for objectmode **************** -class VIEW3D_PT_tools_objectmode(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_objectmode(View3DPanel, Panel): bl_context = "objectmode" bl_label = "Object Tools" @@ -88,8 +92,9 @@ class VIEW3D_PT_tools_objectmode(View3DPanel, bpy.types.Panel): col = layout.column(align=True) col.label(text="Shading:") - col.operator("object.shade_smooth", text="Smooth") - col.operator("object.shade_flat", text="Flat") + row = col.row(align=True) + row.operator("object.shade_smooth", text="Smooth") + row.operator("object.shade_flat", text="Flat") draw_keyframing_tools(context, layout) @@ -105,7 +110,7 @@ class VIEW3D_PT_tools_objectmode(View3DPanel, bpy.types.Panel): # ********** default tools for editmode_mesh **************** -class VIEW3D_PT_tools_meshedit(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_meshedit(View3DPanel, Panel): bl_context = "mesh_edit" bl_label = "Mesh Tools" @@ -117,7 +122,8 @@ class VIEW3D_PT_tools_meshedit(View3DPanel, bpy.types.Panel): col.operator("transform.translate") col.operator("transform.rotate") col.operator("transform.resize", text="Scale") - col.operator("transform.shrink_fatten", text="Along Normal") + col.operator("transform.shrink_fatten", text="Shrink/Fatten") + col.operator("transform.push_pull", text="Push/Pull") col = layout.column(align=True) col.label(text="Deform:") @@ -154,15 +160,16 @@ class VIEW3D_PT_tools_meshedit(View3DPanel, bpy.types.Panel): col = layout.column(align=True) col.label(text="Shading:") - col.operator("mesh.faces_shade_smooth", text="Smooth") - col.operator("mesh.faces_shade_flat", text="Flat") + row = col.row(align=True) + row.operator("mesh.faces_shade_smooth", text="Smooth") + row.operator("mesh.faces_shade_flat", text="Flat") draw_repeat_tools(context, layout) draw_gpencil_tools(context, layout) -class VIEW3D_PT_tools_meshedit_options(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_meshedit_options(View3DPanel, Panel): bl_context = "mesh_edit" bl_label = "Mesh Options" @@ -188,7 +195,7 @@ class VIEW3D_PT_tools_meshedit_options(View3DPanel, bpy.types.Panel): # ********** default tools for editmode_curve **************** -class VIEW3D_PT_tools_curveedit(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_curveedit(View3DPanel, Panel): bl_context = "curve_edit" bl_label = "Curve Tools" @@ -234,7 +241,7 @@ class VIEW3D_PT_tools_curveedit(View3DPanel, bpy.types.Panel): # ********** default tools for editmode_surface **************** -class VIEW3D_PT_tools_surfaceedit(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_surfaceedit(View3DPanel, Panel): bl_context = "surface_edit" bl_label = "Surface Tools" @@ -266,7 +273,7 @@ class VIEW3D_PT_tools_surfaceedit(View3DPanel, bpy.types.Panel): # ********** default tools for editmode_text **************** -class VIEW3D_PT_tools_textedit(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_textedit(View3DPanel, Panel): bl_context = "text_edit" bl_label = "Text Tools" @@ -296,7 +303,7 @@ class VIEW3D_PT_tools_textedit(View3DPanel, bpy.types.Panel): # ********** default tools for editmode_armature **************** -class VIEW3D_PT_tools_armatureedit(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_armatureedit(View3DPanel, Panel): bl_context = "armature_edit" bl_label = "Armature Tools" @@ -325,7 +332,7 @@ class VIEW3D_PT_tools_armatureedit(View3DPanel, bpy.types.Panel): draw_gpencil_tools(context, layout) -class VIEW3D_PT_tools_armatureedit_options(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_armatureedit_options(View3DPanel, Panel): bl_context = "armature_edit" bl_label = "Armature Options" @@ -337,7 +344,7 @@ class VIEW3D_PT_tools_armatureedit_options(View3DPanel, bpy.types.Panel): # ********** default tools for editmode_mball **************** -class VIEW3D_PT_tools_mballedit(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_mballedit(View3DPanel, Panel): bl_context = "mball_edit" bl_label = "Meta Tools" @@ -357,7 +364,7 @@ class VIEW3D_PT_tools_mballedit(View3DPanel, bpy.types.Panel): # ********** default tools for editmode_lattice **************** -class VIEW3D_PT_tools_latticeedit(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_latticeedit(View3DPanel, Panel): bl_context = "lattice_edit" bl_label = "Lattice Tools" @@ -381,7 +388,7 @@ class VIEW3D_PT_tools_latticeedit(View3DPanel, bpy.types.Panel): # ********** default tools for posemode **************** -class VIEW3D_PT_tools_posemode(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_posemode(View3DPanel, Panel): bl_context = "posemode" bl_label = "Pose Tools" @@ -422,7 +429,7 @@ class VIEW3D_PT_tools_posemode(View3DPanel, bpy.types.Panel): draw_gpencil_tools(context, layout) -class VIEW3D_PT_tools_posemode_options(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_posemode_options(View3DPanel, Panel): bl_context = "posemode" bl_label = "Pose Options" @@ -456,7 +463,7 @@ class PaintPanel(): return None -class VIEW3D_PT_tools_brush(PaintPanel, bpy.types.Panel): +class VIEW3D_PT_tools_brush(PaintPanel, Panel): bl_label = "Brush" @classmethod @@ -466,7 +473,7 @@ class VIEW3D_PT_tools_brush(PaintPanel, bpy.types.Panel): def draw(self, context): layout = self.layout - settings = __class__.paint_settings(context) + settings = self.paint_settings(context) brush = settings.brush if not context.particle_edit_object: @@ -674,7 +681,7 @@ class VIEW3D_PT_tools_brush(PaintPanel, bpy.types.Panel): #row.prop(brush, "use_pressure_jitter", toggle=True, text="") -class VIEW3D_PT_tools_brush_texture(PaintPanel, bpy.types.Panel): +class VIEW3D_PT_tools_brush_texture(PaintPanel, Panel): bl_label = "Texture" bl_options = {'DEFAULT_CLOSED'} @@ -687,7 +694,7 @@ class VIEW3D_PT_tools_brush_texture(PaintPanel, bpy.types.Panel): def draw(self, context): layout = self.layout - settings = __class__.paint_settings(context) + settings = self.paint_settings(context) brush = settings.brush tex_slot = brush.texture_slot @@ -772,7 +779,7 @@ class VIEW3D_PT_tools_brush_texture(PaintPanel, bpy.types.Panel): col.active = tex_slot.map_mode in {'FIXED', 'TILED'} and brush.use_texture_overlay -class VIEW3D_PT_tools_brush_tool(PaintPanel, bpy.types.Panel): +class VIEW3D_PT_tools_brush_tool(PaintPanel, Panel): bl_label = "Tool" bl_options = {'DEFAULT_CLOSED'} @@ -786,7 +793,7 @@ class VIEW3D_PT_tools_brush_tool(PaintPanel, bpy.types.Panel): def draw(self, context): layout = self.layout - settings = __class__.paint_settings(context) + settings = self.paint_settings(context) brush = settings.brush col = layout.column(align=True) @@ -806,7 +813,7 @@ class VIEW3D_PT_tools_brush_tool(PaintPanel, bpy.types.Panel): row.prop(brush, "use_paint_image", text="", icon='TPAINT_HLT') -class VIEW3D_PT_tools_brush_stroke(PaintPanel, bpy.types.Panel): +class VIEW3D_PT_tools_brush_stroke(PaintPanel, Panel): bl_label = "Stroke" bl_options = {'DEFAULT_CLOSED'} @@ -821,7 +828,7 @@ class VIEW3D_PT_tools_brush_stroke(PaintPanel, bpy.types.Panel): def draw(self, context): layout = self.layout - settings = __class__.paint_settings(context) + settings = self.paint_settings(context) brush = settings.brush image_paint = context.image_paint_object @@ -904,7 +911,7 @@ class VIEW3D_PT_tools_brush_stroke(PaintPanel, bpy.types.Panel): # row.prop(brush, "use_pressure_spacing", toggle=True, text="") -class VIEW3D_PT_tools_brush_curve(PaintPanel, bpy.types.Panel): +class VIEW3D_PT_tools_brush_curve(PaintPanel, Panel): bl_label = "Curve" bl_options = {'DEFAULT_CLOSED'} @@ -931,7 +938,7 @@ class VIEW3D_PT_tools_brush_curve(PaintPanel, bpy.types.Panel): row.operator("brush.curve_preset", icon="NOCURVE", text="").shape = 'MAX' -class VIEW3D_PT_sculpt_options(PaintPanel, bpy.types.Panel): +class VIEW3D_PT_sculpt_options(PaintPanel, Panel): bl_label = "Options" bl_options = {'DEFAULT_CLOSED'} @@ -944,7 +951,6 @@ class VIEW3D_PT_sculpt_options(PaintPanel, bpy.types.Panel): tool_settings = context.tool_settings sculpt = tool_settings.sculpt - settings = __class__.paint_settings(context) layout.label(text="Lock:") row = layout.row(align=True) @@ -962,7 +968,7 @@ class VIEW3D_PT_sculpt_options(PaintPanel, bpy.types.Panel): layout.prop(tool_settings, "sculpt_paint_use_unified_strength", text="Strength") -class VIEW3D_PT_sculpt_symmetry(PaintPanel, bpy.types.Panel): +class VIEW3D_PT_sculpt_symmetry(PaintPanel, Panel): bl_label = "Symmetry" bl_options = {'DEFAULT_CLOSED'} @@ -974,7 +980,6 @@ class VIEW3D_PT_sculpt_symmetry(PaintPanel, bpy.types.Panel): layout = self.layout sculpt = context.tool_settings.sculpt - settings = __class__.paint_settings(context) split = layout.split() @@ -991,20 +996,28 @@ class VIEW3D_PT_sculpt_symmetry(PaintPanel, bpy.types.Panel): layout.prop(sculpt, "use_symmetry_feather", text="Feather") -class VIEW3D_PT_tools_brush_appearance(PaintPanel, bpy.types.Panel): +class VIEW3D_PT_tools_brush_appearance(PaintPanel, Panel): bl_label = "Appearance" bl_options = {'DEFAULT_CLOSED'} @classmethod def poll(cls, context): - return (context.sculpt_object and context.tool_settings.sculpt) or (context.vertex_paint_object and context.tool_settings.vertex_paint) or (context.weight_paint_object and context.tool_settings.weight_paint) or (context.image_paint_object and context.tool_settings.image_paint) + ts = context.tool_settings + return ((context.sculpt_object and ts.sculpt) or + (context.vertex_paint_object and ts.vertex_paint) or + (context.weight_paint_object and ts.weight_paint) or + (context.image_paint_object and ts.image_paint)) def draw(self, context): layout = self.layout - settings = __class__.paint_settings(context) + settings = self.paint_settings(context) brush = settings.brush + if brush is None: # unlikely but can happen + layout.label(text="Brush Unset") + return + col = layout.column() if context.sculpt_object and context.tool_settings.sculpt: @@ -1029,7 +1042,7 @@ class VIEW3D_PT_tools_brush_appearance(PaintPanel, bpy.types.Panel): # ********** default tools for weightpaint **************** -class VIEW3D_PT_tools_weightpaint(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_weightpaint(View3DPanel, Panel): bl_context = "weightpaint" bl_label = "Weight Tools" @@ -1039,7 +1052,7 @@ class VIEW3D_PT_tools_weightpaint(View3DPanel, bpy.types.Panel): ob = context.active_object col = layout.column() - col.active = ob.vertex_groups.active != None + col.active = ob.vertex_groups.active is not None col.operator("object.vertex_group_normalize_all", text="Normalize All") col.operator("object.vertex_group_normalize", text="Normalize") col.operator("object.vertex_group_invert", text="Invert") @@ -1047,7 +1060,7 @@ class VIEW3D_PT_tools_weightpaint(View3DPanel, bpy.types.Panel): col.operator("object.vertex_group_levels", text="Levels") -class VIEW3D_PT_tools_weightpaint_options(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_weightpaint_options(View3DPanel, Panel): bl_context = "weightpaint" bl_label = "Options" @@ -1084,7 +1097,7 @@ class VIEW3D_PT_tools_weightpaint_options(View3DPanel, bpy.types.Panel): # ********** default tools for vertexpaint **************** -class VIEW3D_PT_tools_vertexpaint(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_vertexpaint(View3DPanel, Panel): bl_context = "vertexpaint" bl_label = "Options" @@ -1113,7 +1126,7 @@ class VIEW3D_PT_tools_vertexpaint(View3DPanel, bpy.types.Panel): # ********** default tools for texturepaint **************** -class VIEW3D_PT_tools_projectpaint(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_projectpaint(View3DPanel, Panel): bl_context = "imagepaint" bl_label = "Project Paint" @@ -1205,7 +1218,7 @@ class VIEW3D_PT_imagepaint_options(PaintPanel): col.prop(tool_settings, "sculpt_paint_use_unified_strength", text="Strength") -class VIEW3D_MT_tools_projectpaint_clone(bpy.types.Menu): +class VIEW3D_MT_tools_projectpaint_clone(Menu): bl_label = "Clone Layer" def draw(self, context): @@ -1216,7 +1229,7 @@ class VIEW3D_MT_tools_projectpaint_clone(bpy.types.Menu): prop.value = i -class VIEW3D_MT_tools_projectpaint_stencil(bpy.types.Menu): +class VIEW3D_MT_tools_projectpaint_stencil(Menu): bl_label = "Mask Layer" def draw(self, context): @@ -1227,7 +1240,7 @@ class VIEW3D_MT_tools_projectpaint_stencil(bpy.types.Menu): prop.value = i -class VIEW3D_PT_tools_particlemode(View3DPanel, bpy.types.Panel): +class VIEW3D_PT_tools_particlemode(View3DPanel, Panel): '''default tools for particle mode''' bl_context = "particlemode" bl_label = "Options" |