forked from bartvdbraak/blender
UI Buttons:
* Context now allows pinning a datablock, independent of selection. * Initial ID browse buttons for most buttons tabs. * Browsing from world to texture now displays world textures again, but is a bit of a hack, not sure there is a right way to do this. * There's a button to switch between active materials and textures now, only temporary though. * There's some code to put context part in own region, disabled still because it doesn't work that well yet.
This commit is contained in:
parent
0a9dea9d7d
commit
eecf7722b6
@ -14,27 +14,40 @@ class DATA_PT_skeleton(DataButtonsPanel):
|
||||
__label__ = "Skeleton"
|
||||
|
||||
def draw(self, context):
|
||||
ob = context.object
|
||||
arm = context.armature
|
||||
space = context.space_data
|
||||
layout = self.layout
|
||||
|
||||
layout.itemR(arm, "rest_position")
|
||||
|
||||
split = layout.split()
|
||||
split = layout.split(percentage=0.65)
|
||||
|
||||
sub = split.column()
|
||||
sub.itemL(text="Deform:")
|
||||
sub.itemR(arm, "deform_vertexgroups", text="Vertes Groups")
|
||||
sub.itemR(arm, "deform_envelope", text="Envelopes")
|
||||
sub.itemR(arm, "deform_quaternion", text="Quaternion")
|
||||
sub.itemR(arm, "deform_bbone_rest", text="B-Bones Rest")
|
||||
#sub.itemR(arm, "x_axis_mirror")
|
||||
#sub.itemR(arm, "auto_ik")
|
||||
|
||||
sub = split.column()
|
||||
sub.itemL(text="Layers:")
|
||||
sub.itemL(text="LAYERS")
|
||||
#sub.itemR(arm, "layer")
|
||||
#sub.itemR(arm, "layer_protection")
|
||||
if ob:
|
||||
split.template_ID(context, ob, "data")
|
||||
split.itemS()
|
||||
elif arm:
|
||||
split.template_ID(context, space, "pin_id")
|
||||
split.itemS()
|
||||
|
||||
if arm:
|
||||
layout.itemS()
|
||||
layout.itemR(arm, "rest_position")
|
||||
|
||||
split = layout.split()
|
||||
|
||||
sub = split.column()
|
||||
sub.itemL(text="Deform:")
|
||||
sub.itemR(arm, "deform_vertexgroups", text="Vertes Groups")
|
||||
sub.itemR(arm, "deform_envelope", text="Envelopes")
|
||||
sub.itemR(arm, "deform_quaternion", text="Quaternion")
|
||||
sub.itemR(arm, "deform_bbone_rest", text="B-Bones Rest")
|
||||
#sub.itemR(arm, "x_axis_mirror")
|
||||
#sub.itemR(arm, "auto_ik")
|
||||
|
||||
sub = split.column()
|
||||
sub.itemL(text="Layers:")
|
||||
sub.itemL(text="LAYERS")
|
||||
#sub.itemR(arm, "layer")
|
||||
#sub.itemR(arm, "layer_protection")
|
||||
|
||||
class DATA_PT_display(DataButtonsPanel):
|
||||
__idname__ = "DATA_PT_display"
|
||||
|
@ -9,45 +9,58 @@ class DataButtonsPanel(bpy.types.Panel):
|
||||
def poll(self, context):
|
||||
return (context.camera != None)
|
||||
|
||||
class DATA_PT_cameralens(DataButtonsPanel):
|
||||
class DATA_PT_camera(DataButtonsPanel):
|
||||
__idname__ = "DATA_PT_camera"
|
||||
__label__ = "Lens"
|
||||
|
||||
def draw(self, context):
|
||||
ob = context.object
|
||||
cam = context.camera
|
||||
space = context.space_data
|
||||
layout = self.layout
|
||||
|
||||
layout.itemR(cam, "type", expand=True)
|
||||
|
||||
row = layout.row(align=True)
|
||||
if cam.type == 'PERSP':
|
||||
row.itemR(cam, "lens_unit", text="")
|
||||
if cam.lens_unit == 'MILLIMETERS':
|
||||
row.itemR(cam, "lens", text="Angle")
|
||||
elif cam.lens_unit == 'DEGREES':
|
||||
row.itemR(cam, "angle")
|
||||
split = layout.split(percentage=0.65)
|
||||
|
||||
elif cam.type == 'ORTHO':
|
||||
row.itemR(cam, "ortho_scale")
|
||||
if ob:
|
||||
split.template_ID(context, ob, "data")
|
||||
split.itemS()
|
||||
elif arm:
|
||||
split.template_ID(context, space, "pin_id")
|
||||
split.itemS()
|
||||
|
||||
if cam:
|
||||
layout.itemS()
|
||||
layout.itemR(cam, "type", expand=True)
|
||||
|
||||
split = layout.split()
|
||||
row = layout.row(align=True)
|
||||
if cam.type == 'PERSP':
|
||||
row.itemR(cam, "lens_unit", text="")
|
||||
if cam.lens_unit == 'MILLIMETERS':
|
||||
row.itemR(cam, "lens", text="Angle")
|
||||
elif cam.lens_unit == 'DEGREES':
|
||||
row.itemR(cam, "angle")
|
||||
|
||||
elif cam.type == 'ORTHO':
|
||||
row.itemR(cam, "ortho_scale")
|
||||
|
||||
split = layout.split()
|
||||
|
||||
sub = split.column(align=True)
|
||||
sub.itemL(text="Shift:")
|
||||
sub.itemR(cam, "shift_x", text="X")
|
||||
sub.itemR(cam, "shift_y", text="Y")
|
||||
|
||||
sub = split.column(align=True)
|
||||
sub.itemL(text="Clipping:")
|
||||
sub.itemR(cam, "clip_start", text="Start")
|
||||
sub.itemR(cam, "clip_end", text="End")
|
||||
|
||||
row = layout.row()
|
||||
row.itemR(cam, "dof_object")
|
||||
row.itemR(cam, "dof_distance")
|
||||
|
||||
sub = split.column(align=True)
|
||||
sub.itemL(text="Shift:")
|
||||
sub.itemR(cam, "shift_x", text="X")
|
||||
sub.itemR(cam, "shift_y", text="Y")
|
||||
|
||||
sub = split.column(align=True)
|
||||
sub.itemL(text="Clipping:")
|
||||
sub.itemR(cam, "clip_start", text="Start")
|
||||
sub.itemR(cam, "clip_end", text="End")
|
||||
|
||||
row = layout.row()
|
||||
row.itemR(cam, "dof_object")
|
||||
row.itemR(cam, "dof_distance")
|
||||
|
||||
class DATA_PT_cameradisplay(DataButtonsPanel):
|
||||
__idname__ = "DATA_PT_cameradisplay"
|
||||
class DATA_PT_camera_display(DataButtonsPanel):
|
||||
__idname__ = "DATA_PT_camera_display"
|
||||
__label__ = "Display"
|
||||
|
||||
def draw(self, context):
|
||||
@ -69,5 +82,5 @@ class DATA_PT_cameradisplay(DataButtonsPanel):
|
||||
colsub.itemR(cam, "passepartout_alpha", text="Alpha", slider=True)
|
||||
col.itemR(cam, "draw_size", text="Size")
|
||||
|
||||
bpy.types.register(DATA_PT_cameralens)
|
||||
bpy.types.register(DATA_PT_cameradisplay)
|
||||
bpy.types.register(DATA_PT_camera)
|
||||
bpy.types.register(DATA_PT_camera_display)
|
||||
|
@ -11,13 +11,26 @@ class DataButtonsPanel(bpy.types.Panel):
|
||||
return (ob and ob.type == 'CURVE' and context.curve)
|
||||
|
||||
class DATA_PT_shape_curve(DataButtonsPanel):
|
||||
__idname__ = "DATA_PT_shape_curve"
|
||||
__label__ = "Shape"
|
||||
__idname__ = "DATA_PT_shape_curve"
|
||||
__label__ = "Shape"
|
||||
|
||||
def draw(self, context):
|
||||
curve = context.curve
|
||||
layout = self.layout
|
||||
def draw(self, context):
|
||||
ob = context.object
|
||||
curve = context.curve
|
||||
space = context.space_data
|
||||
layout = self.layout
|
||||
|
||||
split = layout.split(percentage=0.65)
|
||||
|
||||
if ob:
|
||||
split.template_ID(context, ob, "data")
|
||||
split.itemS()
|
||||
elif curve:
|
||||
split.template_ID(context, space, "pin_id")
|
||||
split.itemS()
|
||||
|
||||
if curve:
|
||||
layout.itemS()
|
||||
layout.itemR(curve, "curve_2d")
|
||||
|
||||
split = layout.split()
|
||||
@ -46,85 +59,85 @@ class DATA_PT_shape_curve(DataButtonsPanel):
|
||||
sub.itemR(curve, "vertex_normal_flip")
|
||||
|
||||
class DATA_PT_geometry(DataButtonsPanel):
|
||||
__idname__ = "DATA_PT_geometry"
|
||||
__label__ = "Geometry"
|
||||
__idname__ = "DATA_PT_geometry"
|
||||
__label__ = "Geometry"
|
||||
|
||||
def draw(self, context):
|
||||
curve = context.curve
|
||||
layout = self.layout
|
||||
def draw(self, context):
|
||||
curve = context.curve
|
||||
layout = self.layout
|
||||
|
||||
split = layout.split()
|
||||
split = layout.split()
|
||||
|
||||
sub = split.column()
|
||||
sub.itemL(text="Modification:")
|
||||
sub.itemR(curve, "width")
|
||||
sub.itemR(curve, "extrude")
|
||||
sub.itemR(curve, "taper_object")
|
||||
|
||||
sub = split.column()
|
||||
sub.itemL(text="Modification:")
|
||||
sub.itemR(curve, "width")
|
||||
sub.itemR(curve, "extrude")
|
||||
sub.itemR(curve, "taper_object")
|
||||
|
||||
sub = split.column()
|
||||
sub.itemL(text="Bevel:")
|
||||
sub.itemR(curve, "bevel_depth", text="Depth")
|
||||
sub.itemR(curve, "bevel_resolution", text="Resolution")
|
||||
sub.itemR(curve, "bevel_object")
|
||||
sub = split.column()
|
||||
sub.itemL(text="Bevel:")
|
||||
sub.itemR(curve, "bevel_depth", text="Depth")
|
||||
sub.itemR(curve, "bevel_resolution", text="Resolution")
|
||||
sub.itemR(curve, "bevel_object")
|
||||
|
||||
class DATA_PT_pathanim(DataButtonsPanel):
|
||||
__idname__ = "DATA_PT_pathanim"
|
||||
__label__ = "Path Animation"
|
||||
__idname__ = "DATA_PT_pathanim"
|
||||
__label__ = "Path Animation"
|
||||
|
||||
def draw_header(self, context):
|
||||
curve = context.curve
|
||||
|
||||
layout = self.layout
|
||||
layout.itemR(curve, "path", text="")
|
||||
|
||||
def draw(self, context):
|
||||
curve = context.curve
|
||||
layout = self.layout
|
||||
layout.active = curve.path
|
||||
|
||||
def draw_header(self, context):
|
||||
curve = context.curve
|
||||
split = layout.split()
|
||||
|
||||
sub = split.column()
|
||||
sub.itemR(curve, "path_length", text="Frames")
|
||||
sub.itemR(curve, "follow")
|
||||
|
||||
layout = self.layout
|
||||
layout.itemR(curve, "path", text="")
|
||||
|
||||
def draw(self, context):
|
||||
curve = context.curve
|
||||
layout = self.layout
|
||||
layout.active = curve.path
|
||||
|
||||
split = layout.split()
|
||||
|
||||
sub = split.column()
|
||||
sub.itemR(curve, "path_length", text="Frames")
|
||||
sub.itemR(curve, "follow")
|
||||
|
||||
sub = split.column()
|
||||
sub.itemR(curve, "stretch")
|
||||
sub.itemR(curve, "offset_path_distance", text="Offset Children")
|
||||
sub = split.column()
|
||||
sub.itemR(curve, "stretch")
|
||||
sub.itemR(curve, "offset_path_distance", text="Offset Children")
|
||||
|
||||
class DATA_PT_current_curve(DataButtonsPanel):
|
||||
__idname__ = "DATA_PT_current_curve"
|
||||
__label__ = "Current Curve"
|
||||
__idname__ = "DATA_PT_current_curve"
|
||||
__label__ = "Current Curve"
|
||||
|
||||
def draw(self, context):
|
||||
currentcurve = context.curve.curves[0] # XXX
|
||||
layout = self.layout
|
||||
def draw(self, context):
|
||||
currentcurve = context.curve.curves[0] # XXX
|
||||
layout = self.layout
|
||||
|
||||
split = layout.split()
|
||||
split = layout.split()
|
||||
|
||||
sub = split.column()
|
||||
sub.itemL(text="Cyclic:")
|
||||
sub.itemR(currentcurve, "cyclic_u", text="U")
|
||||
sub.itemR(currentcurve, "cyclic_v", text="V")
|
||||
sub.itemL(text="Order:")
|
||||
sub.itemR(currentcurve, "order_u", text="U")
|
||||
sub.itemR(currentcurve, "order_v", text="V")
|
||||
sub.itemL(text="Endpoints:")
|
||||
sub.itemR(currentcurve, "endpoint_u", text="U")
|
||||
sub.itemR(currentcurve, "endpoint_v", text="V")
|
||||
|
||||
sub = split.column()
|
||||
sub.itemL(text="Bezier:")
|
||||
sub.itemR(currentcurve, "bezier_u", text="U")
|
||||
sub.itemR(currentcurve, "bezier_v", text="V")
|
||||
sub.itemL(text="Resolution:")
|
||||
sub.itemR(currentcurve, "resolution_u", text="U")
|
||||
sub.itemR(currentcurve, "resolution_v", text="V")
|
||||
sub.itemL(text="Interpolation:")
|
||||
sub.itemR(currentcurve, "tilt_interpolation", text="Tilt")
|
||||
sub.itemR(currentcurve, "radius_interpolation", text="Tilt")
|
||||
sub.itemR(currentcurve, "smooth")
|
||||
|
||||
sub = split.column()
|
||||
sub.itemL(text="Cyclic:")
|
||||
sub.itemR(currentcurve, "cyclic_u", text="U")
|
||||
sub.itemR(currentcurve, "cyclic_v", text="V")
|
||||
sub.itemL(text="Order:")
|
||||
sub.itemR(currentcurve, "order_u", text="U")
|
||||
sub.itemR(currentcurve, "order_v", text="V")
|
||||
sub.itemL(text="Endpoints:")
|
||||
sub.itemR(currentcurve, "endpoint_u", text="U")
|
||||
sub.itemR(currentcurve, "endpoint_v", text="V")
|
||||
|
||||
sub = split.column()
|
||||
sub.itemL(text="Bezier:")
|
||||
sub.itemR(currentcurve, "bezier_u", text="U")
|
||||
sub.itemR(currentcurve, "bezier_v", text="V")
|
||||
sub.itemL(text="Resolution:")
|
||||
sub.itemR(currentcurve, "resolution_u", text="U")
|
||||
sub.itemR(currentcurve, "resolution_v", text="V")
|
||||
sub.itemL(text="Interpolation:")
|
||||
sub.itemR(currentcurve, "tilt_interpolation", text="Tilt")
|
||||
sub.itemR(currentcurve, "radius_interpolation", text="Tilt")
|
||||
sub.itemR(currentcurve, "smooth")
|
||||
|
||||
bpy.types.register(DATA_PT_shape_curve)
|
||||
bpy.types.register(DATA_PT_geometry)
|
||||
bpy.types.register(DATA_PT_pathanim)
|
||||
|
@ -24,9 +24,22 @@ class DATA_PT_lamp(DataButtonsPanel):
|
||||
__label__ = "Lamp"
|
||||
|
||||
def draw(self, context):
|
||||
ob = context.object
|
||||
lamp = context.lamp
|
||||
space = context.space_data
|
||||
layout = self.layout
|
||||
|
||||
split = layout.split(percentage=0.65)
|
||||
|
||||
if ob:
|
||||
split.template_ID(context, ob, "data")
|
||||
split.itemS()
|
||||
elif lamp:
|
||||
split.template_ID(context, space, "pin_id")
|
||||
split.itemS()
|
||||
|
||||
layout.itemS()
|
||||
|
||||
layout.itemR(lamp, "type", expand=True)
|
||||
|
||||
split = layout.split()
|
||||
|
@ -14,23 +14,37 @@ class DATA_PT_lattice(DataButtonsPanel):
|
||||
__label__ = "Lattice"
|
||||
|
||||
def draw(self, context):
|
||||
ob = context.object
|
||||
lat = context.lattice
|
||||
space = context.space_data
|
||||
layout = self.layout
|
||||
|
||||
row = layout.row()
|
||||
row.itemR(lat, "points_u")
|
||||
row.itemR(lat, "interpolation_type_u", expand=True)
|
||||
|
||||
row = layout.row()
|
||||
row.itemR(lat, "points_v")
|
||||
row.itemR(lat, "interpolation_type_v", expand=True)
|
||||
|
||||
row = layout.row()
|
||||
row.itemR(lat, "points_w")
|
||||
row.itemR(lat, "interpolation_type_w", expand=True)
|
||||
|
||||
row = layout.row()
|
||||
row.itemR(lat, "outside")
|
||||
row.itemR(lat, "shape_keys")
|
||||
split = layout.split(percentage=0.65)
|
||||
|
||||
if ob:
|
||||
split.template_ID(context, ob, "data")
|
||||
split.itemS()
|
||||
elif lat:
|
||||
split.template_ID(context, space, "pin_id")
|
||||
split.itemS()
|
||||
|
||||
if lat:
|
||||
layout.itemS()
|
||||
|
||||
row = layout.row()
|
||||
row.itemR(lat, "points_u")
|
||||
row.itemR(lat, "interpolation_type_u", expand=True)
|
||||
|
||||
row = layout.row()
|
||||
row.itemR(lat, "points_v")
|
||||
row.itemR(lat, "interpolation_type_v", expand=True)
|
||||
|
||||
row = layout.row()
|
||||
row.itemR(lat, "points_w")
|
||||
row.itemR(lat, "interpolation_type_w", expand=True)
|
||||
|
||||
row = layout.row()
|
||||
row.itemR(lat, "outside")
|
||||
row.itemR(lat, "shape_keys")
|
||||
|
||||
bpy.types.register(DATA_PT_lattice)
|
||||
|
@ -9,13 +9,27 @@ class DataButtonsPanel(bpy.types.Panel):
|
||||
def poll(self, context):
|
||||
return (context.mesh != None)
|
||||
|
||||
class DATA_PT_surface(DataButtonsPanel):
|
||||
__idname__ = "DATA_PT_surface"
|
||||
__label__ = "Mesh"
|
||||
class DATA_PT_mesh(DataButtonsPanel):
|
||||
__idname__ = "DATA_PT_mesh"
|
||||
__label__ = "Mesh"
|
||||
|
||||
def draw(self, context):
|
||||
mesh = context.mesh
|
||||
layout = self.layout
|
||||
def draw(self, context):
|
||||
ob = context.object
|
||||
mesh = context.mesh
|
||||
space = context.space_data
|
||||
layout = self.layout
|
||||
|
||||
split = layout.split(percentage=0.65)
|
||||
|
||||
if ob:
|
||||
split.template_ID(context, ob, "data")
|
||||
split.itemS()
|
||||
elif mesh:
|
||||
split.template_ID(context, space, "pin_id")
|
||||
split.itemS()
|
||||
|
||||
if mesh:
|
||||
layout.itemS()
|
||||
|
||||
split = layout.split()
|
||||
|
||||
@ -29,5 +43,5 @@ class DATA_PT_surface(DataButtonsPanel):
|
||||
sub.itemR(mesh, "double_sided")
|
||||
|
||||
layout.itemR(mesh, "texco_mesh")
|
||||
|
||||
bpy.types.register(DATA_PT_surface)
|
||||
|
||||
bpy.types.register(DATA_PT_mesh)
|
||||
|
@ -11,13 +11,26 @@ class DataButtonsPanel(bpy.types.Panel):
|
||||
return (ob and ob.type == 'TEXT')
|
||||
|
||||
class DATA_PT_shape_text(DataButtonsPanel):
|
||||
__idname__ = "DATA_PT_shape_text"
|
||||
__label__ = "Shape"
|
||||
__idname__ = "DATA_PT_shape_text"
|
||||
__label__ = "Shape"
|
||||
|
||||
def draw(self, context):
|
||||
curve = context.curve
|
||||
layout = self.layout
|
||||
def draw(self, context):
|
||||
ob = context.object
|
||||
curve = context.curve
|
||||
space = context.space_data
|
||||
layout = self.layout
|
||||
|
||||
split = layout.split(percentage=0.65)
|
||||
|
||||
if ob:
|
||||
split.template_ID(context, ob, "data")
|
||||
split.itemS()
|
||||
elif curve:
|
||||
split.template_ID(context, space, "pin_id")
|
||||
split.itemS()
|
||||
|
||||
if curve:
|
||||
layout.itemS()
|
||||
layout.itemR(curve, "curve_2d")
|
||||
|
||||
split = layout.split()
|
||||
|
@ -13,6 +13,9 @@ class MATERIAL_PT_preview(MaterialButtonsPanel):
|
||||
__idname__= "MATERIAL_PT_preview"
|
||||
__label__ = "Preview"
|
||||
|
||||
def poll(self, context):
|
||||
return (context.material or context.object)
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
@ -23,18 +26,36 @@ class MATERIAL_PT_material(MaterialButtonsPanel):
|
||||
__idname__= "MATERIAL_PT_material"
|
||||
__label__ = "Material"
|
||||
|
||||
def poll(self, context):
|
||||
return (context.material or context.object)
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
mat = context.material
|
||||
|
||||
layout.itemR(mat, "type", expand=True)
|
||||
ob = context.object
|
||||
slot = context.material_slot
|
||||
space = context.space_data
|
||||
|
||||
row = layout.row()
|
||||
row.column().itemR(mat, "diffuse_color")
|
||||
row.column().itemR(mat, "specular_color")
|
||||
row.column().itemR(mat, "mirror_color")
|
||||
split = layout.split(percentage=0.65)
|
||||
|
||||
if ob and slot:
|
||||
split.template_ID(context, slot, "material", new="MATERIAL_OT_new")
|
||||
split.itemR(ob, "active_material_index", text="Active")
|
||||
elif mat:
|
||||
split.template_ID(context, space, "pin_id")
|
||||
split.itemS()
|
||||
|
||||
if mat:
|
||||
layout.itemS()
|
||||
|
||||
layout.itemR(mat, "alpha", slider=True)
|
||||
layout.itemR(mat, "type", expand=True)
|
||||
|
||||
row = layout.row()
|
||||
row.column().itemR(mat, "diffuse_color")
|
||||
row.column().itemR(mat, "specular_color")
|
||||
row.column().itemR(mat, "mirror_color")
|
||||
|
||||
layout.itemR(mat, "alpha", slider=True)
|
||||
|
||||
class MATERIAL_PT_sss(MaterialButtonsPanel):
|
||||
__idname__= "MATERIAL_PT_sss"
|
||||
|
@ -19,45 +19,85 @@ class ParticleButtonsPanel(bpy.types.Panel):
|
||||
|
||||
class PARTICLE_PT_particles(ParticleButtonsPanel):
|
||||
__idname__= "PARTICLE_PT_particles"
|
||||
__label__ = "ParticleSystem"
|
||||
__label__ = "Particle System"
|
||||
|
||||
def poll(self, context):
|
||||
return (context.particle_system != None)
|
||||
|
||||
return (context.particle_system or context.object)
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
ob = context.object
|
||||
psys = context.particle_system
|
||||
part = psys.settings
|
||||
|
||||
split = layout.split(percentage=0.65)
|
||||
|
||||
if psys:
|
||||
split.template_ID(context, psys, "settings")
|
||||
|
||||
#if ob:
|
||||
# split.itemR(ob, "active_particle_system_index", text="Active")
|
||||
|
||||
if psys:
|
||||
#row = layout.row()
|
||||
#row.itemL(text="Particle system datablock")
|
||||
#row.itemL(text="Viewport")
|
||||
#row.itemL(text="Render")
|
||||
|
||||
part = psys.settings
|
||||
ptype = psys.settings.type
|
||||
|
||||
if ptype not in ('EMITTER', 'REACTOR', 'HAIR'):
|
||||
layout.itemL(text="No settings for fluid particles")
|
||||
return
|
||||
|
||||
row = layout.row()
|
||||
row.enabled = particle_panel_enabled(psys)
|
||||
row.itemR(part, "type")
|
||||
row.itemR(psys, "seed")
|
||||
|
||||
row = layout.row()
|
||||
if part.type=='HAIR':
|
||||
if psys.editable==True:
|
||||
row.itemO("PARTICLE_OT_editable_set", text="Free Edit")
|
||||
else:
|
||||
row.itemO("PARTICLE_OT_editable_set", text="Make Editable")
|
||||
subrow = row.row()
|
||||
subrow.enabled = particle_panel_enabled(psys)
|
||||
subrow.itemR(part, "hair_step")
|
||||
elif part.type=='REACTOR':
|
||||
row.itemR(psys, "reactor_target_object")
|
||||
row.itemR(psys, "reactor_target_particle_system", text="Particle System")
|
||||
|
||||
#row = layout.row()
|
||||
#row.itemL(text="Particle system datablock")
|
||||
#row.itemL(text="Viewport")
|
||||
#row.itemL(text="Render")
|
||||
|
||||
ptype = psys.settings.type
|
||||
|
||||
if ptype not in ('EMITTER', 'REACTOR', 'HAIR'):
|
||||
layout.itemL(text="No settings for fluid particles")
|
||||
return
|
||||
|
||||
row = layout.row()
|
||||
row.enabled = particle_panel_enabled(psys)
|
||||
row.itemR(part, "type", expand=True)
|
||||
|
||||
|
||||
row = layout.row()
|
||||
if part.type=='HAIR':
|
||||
if psys.editable==True:
|
||||
row.itemO("PARTICLE_OT_editable_set", text="Free Edit")
|
||||
else:
|
||||
row.itemO("PARTICLE_OT_editable_set", text="Make Editable")
|
||||
subrow = row.row()
|
||||
subrow.enabled = particle_panel_enabled(psys)
|
||||
subrow.itemR(part, "hair_step")
|
||||
elif part.type=='REACTOR':
|
||||
row.itemR(psys, "reactor_target_object")
|
||||
row.itemR(psys, "reactor_target_particle_system", text="Particle System")
|
||||
if psys:
|
||||
#row = layout.row()
|
||||
#row.itemL(text="Particle system datablock")
|
||||
#row.itemL(text="Viewport")
|
||||
#row.itemL(text="Render")
|
||||
|
||||
part = psys.settings
|
||||
ptype = psys.settings.type
|
||||
|
||||
if ptype not in ('EMITTER', 'REACTOR', 'HAIR'):
|
||||
layout.itemL(text="No settings for fluid particles")
|
||||
return
|
||||
|
||||
row = layout.row()
|
||||
row.enabled = particle_panel_enabled(psys)
|
||||
row.itemR(part, "type", expand=True)
|
||||
|
||||
|
||||
row = layout.row()
|
||||
if part.type=='HAIR':
|
||||
if psys.editable==True:
|
||||
row.itemO("PARTICLE_OT_editable_set", text="Free Edit")
|
||||
else:
|
||||
row.itemO("PARTICLE_OT_editable_set", text="Make Editable")
|
||||
subrow = row.row()
|
||||
subrow.enabled = particle_panel_enabled(psys)
|
||||
subrow.itemR(part, "hair_step")
|
||||
elif part.type=='REACTOR':
|
||||
row.itemR(psys, "reactor_target_object")
|
||||
row.itemR(psys, "reactor_target_particle_system", text="Particle System")
|
||||
|
||||
class PARTICLE_PT_emission(ParticleButtonsPanel):
|
||||
__idname__= "PARTICLE_PT_emission"
|
||||
@ -587,4 +627,4 @@ bpy.types.register(PARTICLE_PT_physics)
|
||||
bpy.types.register(PARTICLE_PT_render)
|
||||
bpy.types.register(PARTICLE_PT_draw)
|
||||
bpy.types.register(PARTICLE_PT_children)
|
||||
bpy.types.register(PARTICLE_PT_vertexgroups)
|
||||
bpy.types.register(PARTICLE_PT_vertexgroups)
|
||||
|
@ -13,6 +13,9 @@ class TEXTURE_PT_preview(TextureButtonsPanel):
|
||||
__idname__= "TEXTURE_PT_preview"
|
||||
__label__ = "Preview"
|
||||
|
||||
def poll(self, context):
|
||||
return (context.texture or context.material)
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
@ -23,11 +26,40 @@ class TEXTURE_PT_texture(TextureButtonsPanel):
|
||||
__idname__= "TEXTURE_PT_texture"
|
||||
__label__ = "Texture"
|
||||
|
||||
def poll(self, context):
|
||||
return (context.texture or context.material or context.world or context.lamp)
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
tex = context.texture
|
||||
ma = context.material
|
||||
la = context.lamp
|
||||
wo = context.world
|
||||
space = context.space_data
|
||||
slot = context.texture_slot
|
||||
|
||||
split = layout.split(percentage=0.65)
|
||||
|
||||
if ma or la or wo:
|
||||
if slot:
|
||||
split.template_ID(context, slot, "texture", new="TEXTURE_OT_new")
|
||||
else:
|
||||
split.itemS()
|
||||
|
||||
if ma:
|
||||
split.itemR(ma, "active_texture_index", text="Active")
|
||||
elif la:
|
||||
split.itemR(la, "active_texture_index", text="Active")
|
||||
elif wo:
|
||||
split.itemR(wo, "active_texture_index", text="Active")
|
||||
elif tex:
|
||||
split.template_ID(context, space, "pin_id")
|
||||
split.itemS()
|
||||
|
||||
layout.itemS()
|
||||
|
||||
layout.itemR(tex, "type")
|
||||
if tex:
|
||||
layout.itemR(tex, "type")
|
||||
|
||||
class TEXTURE_PT_colors(TextureButtonsPanel):
|
||||
__idname__= "TEXTURE_PT_colors"
|
||||
|
@ -12,6 +12,9 @@ class WorldButtonsPanel(bpy.types.Panel):
|
||||
class WORLD_PT_preview(WorldButtonsPanel):
|
||||
__label__ = "Preview"
|
||||
|
||||
def poll(self, context):
|
||||
return (context.scene or context.world)
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
@ -21,21 +24,38 @@ class WORLD_PT_preview(WorldButtonsPanel):
|
||||
class WORLD_PT_world(WorldButtonsPanel):
|
||||
__label__ = "World"
|
||||
|
||||
def poll(self, context):
|
||||
return (context.scene or context.world)
|
||||
|
||||
def draw(self, context):
|
||||
scene = context.scene
|
||||
world = context.world
|
||||
space = context.space_data
|
||||
layout = self.layout
|
||||
|
||||
row = layout.row()
|
||||
row.itemR(world, "blend_sky")
|
||||
row.itemR(world, "paper_sky")
|
||||
row.itemR(world, "real_sky")
|
||||
|
||||
row = layout.row()
|
||||
row.column().itemR(world, "horizon_color")
|
||||
col = row.column()
|
||||
col.itemR(world, "zenith_color")
|
||||
col.active = world.blend_sky
|
||||
row.column().itemR(world, "ambient_color")
|
||||
|
||||
split = layout.split(percentage=0.65)
|
||||
|
||||
if scene:
|
||||
split.template_ID(context, scene, "world", new="WORLD_OT_new")
|
||||
elif world:
|
||||
split.template_ID(context, space, "pin_id")
|
||||
|
||||
split.itemS()
|
||||
|
||||
if world:
|
||||
layout.itemS()
|
||||
|
||||
row = layout.row()
|
||||
row.itemR(world, "blend_sky")
|
||||
row.itemR(world, "paper_sky")
|
||||
row.itemR(world, "real_sky")
|
||||
|
||||
row = layout.row()
|
||||
row.column().itemR(world, "horizon_color")
|
||||
col = row.column()
|
||||
col.itemR(world, "zenith_color")
|
||||
col.active = world.blend_sky
|
||||
row.column().itemR(world, "ambient_color")
|
||||
|
||||
class WORLD_PT_color_correction(WorldButtonsPanel):
|
||||
__label__ = "Color Correction"
|
||||
@ -89,7 +109,7 @@ class WORLD_PT_stars(WorldButtonsPanel):
|
||||
flow.itemR(world.stars, "size")
|
||||
flow.itemR(world.stars, "min_distance", text="Min. Dist")
|
||||
flow.itemR(world.stars, "average_separation", text="Separation")
|
||||
flow.itemR(world.stars, "color_randomization", text="Random:")
|
||||
flow.itemR(world.stars, "color_randomization", text="Random")
|
||||
|
||||
class WORLD_PT_ambient_occlusion(WorldButtonsPanel):
|
||||
__label__ = "Ambient Occlusion"
|
||||
|
@ -5528,6 +5528,16 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
|
||||
ar->regiontype= RGN_TYPE_UI;
|
||||
ar->alignment= RGN_ALIGN_TOP;
|
||||
break;
|
||||
|
||||
#if 0
|
||||
case SPACE_BUTS:
|
||||
/* context UI region */
|
||||
ar= MEM_callocN(sizeof(ARegion), "area region from do_versions");
|
||||
BLI_addtail(lb, ar);
|
||||
ar->regiontype= RGN_TYPE_CHANNELS;
|
||||
ar->alignment= RGN_ALIGN_TOP;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -50,9 +50,12 @@
|
||||
#include "BKE_particle.h"
|
||||
#include "BKE_screen.h"
|
||||
#include "BKE_utildefines.h"
|
||||
#include "BKE_world.h"
|
||||
|
||||
#include "RNA_access.h"
|
||||
|
||||
#include "ED_screen.h"
|
||||
|
||||
#include "UI_interface.h"
|
||||
#include "UI_resources.h"
|
||||
|
||||
@ -61,8 +64,41 @@
|
||||
typedef struct ButsContextPath {
|
||||
PointerRNA ptr[8];
|
||||
int len;
|
||||
int worldtex;
|
||||
} ButsContextPath;
|
||||
|
||||
static int set_pointer_type(ButsContextPath *path, bContextDataResult *result, StructRNA *type)
|
||||
{
|
||||
PointerRNA *ptr;
|
||||
int a;
|
||||
|
||||
for(a=0; a<path->len; a++) {
|
||||
ptr= &path->ptr[a];
|
||||
|
||||
if(RNA_struct_is_a(ptr->type, type)) {
|
||||
CTX_data_pointer_set(result, ptr->id.data, ptr->type, ptr->data);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static PointerRNA *get_pointer_type(ButsContextPath *path, StructRNA *type)
|
||||
{
|
||||
PointerRNA *ptr;
|
||||
int a;
|
||||
|
||||
for(a=0; a<path->len; a++) {
|
||||
ptr= &path->ptr[a];
|
||||
|
||||
if(RNA_struct_is_a(ptr->type, type))
|
||||
return ptr;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/************************* Creating the Path ************************/
|
||||
|
||||
static int buttons_context_path_scene(ButsContextPath *path)
|
||||
@ -99,13 +135,20 @@ static int buttons_context_path_world(ButsContextPath *path)
|
||||
// XXX - place holder, need to get this working
|
||||
static int buttons_context_path_sequencer(ButsContextPath *path)
|
||||
{
|
||||
PointerRNA *ptr= &path->ptr[path->len-1];
|
||||
Scene *scene;
|
||||
|
||||
/* this one just verifies */
|
||||
return RNA_struct_is_a(ptr->type, &RNA_Scene);
|
||||
if(buttons_context_path_scene(path)) {
|
||||
scene= path->ptr[path->len-1].data;
|
||||
|
||||
RNA_pointer_create(&scene->id, &RNA_SequenceEditor, scene->ed, &path->ptr[path->len]);
|
||||
path->len++;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int buttons_context_path_object(ButsContextPath *path)
|
||||
{
|
||||
Scene *scene;
|
||||
@ -136,12 +179,21 @@ static int buttons_context_path_object(ButsContextPath *path)
|
||||
static int buttons_context_path_data(ButsContextPath *path, int type)
|
||||
{
|
||||
Object *ob;
|
||||
PointerRNA *ptr= &path->ptr[path->len-1];
|
||||
|
||||
/* if we already have a data, we're done */
|
||||
if(RNA_struct_is_a(ptr->type, &RNA_Mesh) && (type == -1 || type == OB_MESH)) return 1;
|
||||
else if(RNA_struct_is_a(ptr->type, &RNA_Curve) && (type == -1 || ELEM3(type, OB_CURVE, OB_SURF, OB_FONT))) return 1;
|
||||
else if(RNA_struct_is_a(ptr->type, &RNA_Armature) && (type == -1 || type == OB_ARMATURE)) return 1;
|
||||
else if(RNA_struct_is_a(ptr->type, &RNA_MetaBall) && (type == -1 || type == OB_MBALL)) return 1;
|
||||
else if(RNA_struct_is_a(ptr->type, &RNA_Lattice) && (type == -1 || type == OB_LATTICE)) return 1;
|
||||
else if(RNA_struct_is_a(ptr->type, &RNA_Camera) && (type == -1 || type == OB_CAMERA)) return 1;
|
||||
else if(RNA_struct_is_a(ptr->type, &RNA_Lamp) && (type == -1 || type == OB_LAMP)) return 1;
|
||||
/* try to get an object in the path, no pinning supported here */
|
||||
if(buttons_context_path_object(path)) {
|
||||
else if(buttons_context_path_object(path)) {
|
||||
ob= path->ptr[path->len-1].data;
|
||||
|
||||
if(type == -1 || type == ob->type) {
|
||||
if(ob && (type == -1 || type == ob->type)) {
|
||||
RNA_id_pointer_create(ob->data, &path->ptr[path->len]);
|
||||
path->len++;
|
||||
|
||||
@ -153,10 +205,25 @@ static int buttons_context_path_data(ButsContextPath *path, int type)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int buttons_context_path_modifier(ButsContextPath *path)
|
||||
{
|
||||
Object *ob;
|
||||
|
||||
if(buttons_context_path_object(path)) {
|
||||
ob= path->ptr[path->len-1].data;
|
||||
|
||||
if(ob && ELEM4(ob->type, OB_MESH, OB_CURVE, OB_FONT, OB_SURF))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int buttons_context_path_material(ButsContextPath *path)
|
||||
{
|
||||
Object *ob;
|
||||
PointerRNA *ptr= &path->ptr[path->len-1];
|
||||
Material *ma;
|
||||
|
||||
/* if we already have a (pinned) material, we're done */
|
||||
if(RNA_struct_is_a(ptr->type, &RNA_Material)) {
|
||||
@ -167,7 +234,8 @@ static int buttons_context_path_material(ButsContextPath *path)
|
||||
ob= path->ptr[path->len-1].data;
|
||||
|
||||
if(ob && ob->type && (ob->type<OB_LAMP)) {
|
||||
RNA_pointer_create(&ob->id, &RNA_MaterialSlot, ob->mat+ob->actcol-1, &path->ptr[path->len]);
|
||||
ma= give_current_material(ob, ob->actcol);
|
||||
RNA_id_pointer_create(&ma->id, &path->ptr[path->len]);
|
||||
path->len++;
|
||||
return 1;
|
||||
}
|
||||
@ -222,11 +290,14 @@ static int buttons_context_path_particle(ButsContextPath *path)
|
||||
/* if we have an object, get the active particle system */
|
||||
if(buttons_context_path_object(path)) {
|
||||
ob= path->ptr[path->len-1].data;
|
||||
psys= psys_get_current(ob);
|
||||
|
||||
RNA_pointer_create(&ob->id, &RNA_ParticleSystem, psys, &path->ptr[path->len]);
|
||||
path->len++;
|
||||
return 1;
|
||||
if(ob && ob->type == OB_MESH) {
|
||||
psys= psys_get_current(ob);
|
||||
|
||||
RNA_pointer_create(&ob->id, &RNA_ParticleSystem, psys, &path->ptr[path->len]);
|
||||
path->len++;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* no path to a particle system possible */
|
||||
@ -235,58 +306,70 @@ static int buttons_context_path_particle(ButsContextPath *path)
|
||||
|
||||
static int buttons_context_path_texture(ButsContextPath *path)
|
||||
{
|
||||
Object *ob;
|
||||
Lamp *la;
|
||||
Material *ma;
|
||||
Lamp *la;
|
||||
World *wo;
|
||||
MTex *mtex;
|
||||
Tex *tex;
|
||||
PointerRNA *ptr= &path->ptr[path->len-1];
|
||||
|
||||
/* if we already have a (pinned) texture, we're done */
|
||||
if(RNA_struct_is_a(ptr->type, &RNA_Texture)) {
|
||||
return 1;
|
||||
}
|
||||
/* try to get the active material */
|
||||
else if(buttons_context_path_material(path)) {
|
||||
ptr= &path->ptr[path->len-1];
|
||||
/* try world */
|
||||
else if(path->worldtex && buttons_context_path_world(path)) {
|
||||
wo= path->ptr[path->len-1].data;
|
||||
|
||||
if(RNA_struct_is_a(ptr->type, &RNA_Material)) {
|
||||
ma= ptr->data;
|
||||
}
|
||||
else if(RNA_struct_is_a(ptr->type, &RNA_MaterialSlot)) {
|
||||
ob= ptr->id.data;
|
||||
ma= give_current_material(ob, (Material**)ptr->data - ob->mat);
|
||||
}
|
||||
else
|
||||
ma= NULL;
|
||||
if(wo) {
|
||||
mtex= wo->mtex[(int)wo->texact];
|
||||
tex= (mtex)? mtex->tex: NULL;
|
||||
|
||||
if(ma) {
|
||||
RNA_pointer_create(&ma->id, &RNA_TextureSlot, ma->mtex[(int)ma->texact], &path->ptr[path->len]);
|
||||
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
|
||||
path->len++;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/* try to get the active lamp */
|
||||
/* try material */
|
||||
else if(buttons_context_path_material(path)) {
|
||||
ma= path->ptr[path->len-1].data;
|
||||
|
||||
if(ma) {
|
||||
mtex= ma->mtex[(int)ma->texact];
|
||||
tex= (mtex)? mtex->tex: NULL;
|
||||
|
||||
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
|
||||
path->len++;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/* try lamp */
|
||||
else if(buttons_context_path_data(path, OB_LAMP)) {
|
||||
la= path->ptr[path->len-1].data;
|
||||
|
||||
if(la) {
|
||||
RNA_pointer_create(&la->id, &RNA_TextureSlot, la->mtex[(int)la->texact], &path->ptr[path->len]);
|
||||
mtex= la->mtex[(int)la->texact];
|
||||
tex= (mtex)? mtex->tex: NULL;
|
||||
|
||||
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
|
||||
path->len++;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/* TODO: world, brush */
|
||||
/* TODO: material nodes, brush */
|
||||
|
||||
/* no path to a particle system possible */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int buttons_context_path(const bContext *C, ButsContextPath *path)
|
||||
static int buttons_context_path(const bContext *C, ButsContextPath *path, int mainb, int worldtex)
|
||||
{
|
||||
SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
|
||||
ID *id;
|
||||
int found;
|
||||
|
||||
memset(path, 0, sizeof(*path));
|
||||
path->worldtex= worldtex;
|
||||
|
||||
/* if some ID datablock is pinned, set the root pointer */
|
||||
if(sbuts->pinid) {
|
||||
@ -305,7 +388,7 @@ static int buttons_context_path(const bContext *C, ButsContextPath *path)
|
||||
|
||||
/* now for each buttons context type, we try to construct a path,
|
||||
* tracing back recursively */
|
||||
switch(sbuts->mainb) {
|
||||
switch(mainb) {
|
||||
case BCONTEXT_SCENE:
|
||||
found= buttons_context_path_scene(path);
|
||||
break;
|
||||
@ -318,9 +401,11 @@ static int buttons_context_path(const bContext *C, ButsContextPath *path)
|
||||
case BCONTEXT_OBJECT:
|
||||
case BCONTEXT_PHYSICS:
|
||||
case BCONTEXT_CONSTRAINT:
|
||||
case BCONTEXT_MODIFIER:
|
||||
found= buttons_context_path_object(path);
|
||||
break;
|
||||
case BCONTEXT_MODIFIER:
|
||||
found= buttons_context_path_modifier(path);
|
||||
break;
|
||||
case BCONTEXT_DATA:
|
||||
found= buttons_context_path_data(path, -1);
|
||||
break;
|
||||
@ -346,46 +431,63 @@ static int buttons_context_path(const bContext *C, ButsContextPath *path)
|
||||
|
||||
void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
|
||||
{
|
||||
ButsContextPath *path;
|
||||
PointerRNA *ptr;
|
||||
int a, worldtex, flag= 0;
|
||||
|
||||
if(!sbuts->path)
|
||||
sbuts->path= MEM_callocN(sizeof(ButsContextPath), "ButsContextPath");
|
||||
|
||||
buttons_context_path(C, sbuts->path);
|
||||
}
|
||||
path= sbuts->path;
|
||||
worldtex= (sbuts->flag & SB_WORLD_TEX);
|
||||
|
||||
/* for each context, see if we can compute a valid path to it, if
|
||||
* this is the case, we know we have to display the button */
|
||||
for(a=0; a<BCONTEXT_TOT; a++) {
|
||||
if(buttons_context_path(C, path, a, worldtex)) {
|
||||
flag |= (1<<a);
|
||||
|
||||
/************************* Context Callback ************************/
|
||||
/* setting icon for data context */
|
||||
if(a == BCONTEXT_DATA) {
|
||||
ptr= &path->ptr[path->len-1];
|
||||
|
||||
static int set_pointer_type(ButsContextPath *path, bContextDataResult *result, StructRNA *type)
|
||||
{
|
||||
PointerRNA *ptr;
|
||||
int a;
|
||||
|
||||
for(a=0; a<path->len; a++) {
|
||||
ptr= &path->ptr[a];
|
||||
|
||||
if(RNA_struct_is_a(ptr->type, type)) {
|
||||
CTX_data_pointer_set(result, ptr->id.data, ptr->type, ptr->data);
|
||||
return 1;
|
||||
if(ptr->type)
|
||||
sbuts->dataicon= RNA_struct_ui_icon(ptr->type);
|
||||
else
|
||||
sbuts->dataicon= ICON_EMPTY_DATA;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static PointerRNA *get_pointer_type(ButsContextPath *path, StructRNA *type)
|
||||
{
|
||||
PointerRNA *ptr;
|
||||
int a;
|
||||
|
||||
for(a=0; a<path->len; a++) {
|
||||
ptr= &path->ptr[a];
|
||||
|
||||
if(RNA_struct_is_a(ptr->type, type))
|
||||
return ptr;
|
||||
/* in case something becomes invalid, change */
|
||||
if((flag & (1 << sbuts->mainb)) == 0) {
|
||||
if(flag & BCONTEXT_OBJECT) {
|
||||
sbuts->mainb= BCONTEXT_OBJECT;
|
||||
}
|
||||
else {
|
||||
for(a=0; a<BCONTEXT_TOT; a++) {
|
||||
if(flag & (1 << a)) {
|
||||
sbuts->mainb= a;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
buttons_context_path(C, path, sbuts->mainb, worldtex);
|
||||
|
||||
if(!(flag & (1 << sbuts->mainb))) {
|
||||
if(flag & (1 << BCONTEXT_OBJECT))
|
||||
sbuts->mainb= BCONTEXT_OBJECT;
|
||||
else
|
||||
sbuts->mainb= BCONTEXT_SCENE;
|
||||
}
|
||||
|
||||
sbuts->pathflag= flag;
|
||||
}
|
||||
|
||||
/************************* Context Callback ************************/
|
||||
|
||||
int buttons_context(const bContext *C, const char *member, bContextDataResult *result)
|
||||
{
|
||||
SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
|
||||
@ -433,34 +535,53 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
|
||||
return 1;
|
||||
}
|
||||
else if(CTX_data_equals(member, "material")) {
|
||||
if(!set_pointer_type(path, result, &RNA_Material)) {
|
||||
PointerRNA *ptr= get_pointer_type(path, &RNA_MaterialSlot);
|
||||
|
||||
if(ptr && ptr->data) {
|
||||
Object *ob= ptr->id.data;
|
||||
Material *ma= give_current_material(ob, (Material**)ptr->data - ob->mat);
|
||||
CTX_data_id_pointer_set(result, &ma->id);
|
||||
}
|
||||
}
|
||||
|
||||
set_pointer_type(path, result, &RNA_Material);
|
||||
return 1;
|
||||
}
|
||||
else if(CTX_data_equals(member, "texture")) {
|
||||
if(!set_pointer_type(path, result, &RNA_Texture)) {
|
||||
PointerRNA *ptr= get_pointer_type(path, &RNA_TextureSlot);
|
||||
set_pointer_type(path, result, &RNA_Texture);
|
||||
return 1;
|
||||
}
|
||||
else if(CTX_data_equals(member, "material_slot")) {
|
||||
PointerRNA *ptr= get_pointer_type(path, &RNA_Object);
|
||||
|
||||
if(ptr && ptr->data)
|
||||
CTX_data_id_pointer_set(result, &((MTex*)ptr->data)->tex->id);
|
||||
if(ptr) {
|
||||
Object *ob= ptr->data;
|
||||
|
||||
if(ob && ob->type && (ob->type<OB_LAMP))
|
||||
CTX_data_pointer_set(result, &ob->id, &RNA_MaterialSlot, ob->mat+ob->actcol-1);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
else if(CTX_data_equals(member, "material_slot")) {
|
||||
set_pointer_type(path, result, &RNA_MaterialSlot);
|
||||
return 1;
|
||||
}
|
||||
else if(CTX_data_equals(member, "texture_slot")) {
|
||||
set_pointer_type(path, result, &RNA_TextureSlot);
|
||||
PointerRNA *ptr;
|
||||
|
||||
if((ptr=get_pointer_type(path, &RNA_Material))) {
|
||||
Material *ma= ptr->data;
|
||||
|
||||
if(ma)
|
||||
CTX_data_pointer_set(result, &ma->id, &RNA_TextureSlot, ma->mtex[(int)ma->texact]);
|
||||
}
|
||||
else if((ptr=get_pointer_type(path, &RNA_Lamp))) {
|
||||
Lamp *la= ptr->data;
|
||||
|
||||
if(la)
|
||||
CTX_data_pointer_set(result, &la->id, &RNA_TextureSlot, la->mtex[(int)la->texact]);
|
||||
}
|
||||
else if((ptr=get_pointer_type(path, &RNA_World))) {
|
||||
World *wo= ptr->data;
|
||||
|
||||
if(wo)
|
||||
CTX_data_pointer_set(result, &wo->id, &RNA_TextureSlot, wo->mtex[(int)wo->texact]);
|
||||
}
|
||||
else if((ptr=get_pointer_type(path, &RNA_Brush))) { /* how to get this into context? */
|
||||
Brush *br= ptr->data;
|
||||
|
||||
if(br)
|
||||
CTX_data_pointer_set(result, &br->id, &RNA_TextureSlot, br->mtex[(int)br->texact]);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
else if(CTX_data_equals(member, "bone")) {
|
||||
@ -500,11 +621,38 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
|
||||
|
||||
/************************* Drawing the Path ************************/
|
||||
|
||||
static void buttons_panel_context(const bContext *C, Panel *pa)
|
||||
static void pin_cb(bContext *C, void *arg1, void *arg2)
|
||||
{
|
||||
SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
|
||||
ButsContextPath *path= sbuts->path;
|
||||
PointerRNA *ptr;
|
||||
int a;
|
||||
|
||||
if(sbuts->flag & SB_PIN_CONTEXT) {
|
||||
if(path->len) {
|
||||
for(a=path->len-1; a>=0; a--) {
|
||||
ptr= &path->ptr[a];
|
||||
|
||||
if(ptr->id.data) {
|
||||
sbuts->pinid= ptr->id.data;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
sbuts->pinid= NULL;
|
||||
|
||||
ED_area_tag_redraw(CTX_wm_area(C));
|
||||
}
|
||||
|
||||
void buttons_context_draw(const bContext *C, uiLayout *layout)
|
||||
{
|
||||
SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
|
||||
ButsContextPath *path= sbuts->path;
|
||||
uiLayout *row;
|
||||
uiBlock *block;
|
||||
uiBut *but;
|
||||
PointerRNA *ptr;
|
||||
PropertyRNA *nameprop;
|
||||
char namebuf[128], *name;
|
||||
@ -513,9 +661,14 @@ static void buttons_panel_context(const bContext *C, Panel *pa)
|
||||
if(!path)
|
||||
return;
|
||||
|
||||
row= uiLayoutRow(pa->layout, 0);
|
||||
row= uiLayoutRow(layout, 0);
|
||||
uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_LEFT);
|
||||
|
||||
block= uiLayoutGetBlock(row);
|
||||
uiBlockSetEmboss(block, UI_EMBOSSN);
|
||||
but= uiDefIconButBitC(block, ICONTOG, SB_PIN_CONTEXT, 0, (sbuts->flag & SB_PIN_CONTEXT)? ICON_PINNED: ICON_UNPINNED, 0, 0, UI_UNIT_X, UI_UNIT_Y, &sbuts->flag, 0, 0, 0, 0, "Follow context or keep fixed datablock displayed.");
|
||||
uiButSetFunc(but, pin_cb, NULL, NULL);
|
||||
|
||||
for(a=0; a<path->len; a++) {
|
||||
ptr= &path->ptr[a];
|
||||
|
||||
@ -523,6 +676,12 @@ static void buttons_panel_context(const bContext *C, Panel *pa)
|
||||
icon= RNA_struct_ui_icon(ptr->type);
|
||||
nameprop= RNA_struct_name_property(ptr->type);
|
||||
|
||||
#if 0
|
||||
if(sbuts->mainb != BCONTEXT_SCENE && ptr->type == &RNA_Scene) {
|
||||
uiItemL(row, "", icon); /* save some space */
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if(nameprop) {
|
||||
name= RNA_property_string_get_alloc(ptr, nameprop, namebuf, sizeof(namebuf));
|
||||
|
||||
@ -537,6 +696,11 @@ static void buttons_panel_context(const bContext *C, Panel *pa)
|
||||
}
|
||||
}
|
||||
|
||||
static void buttons_panel_context(const bContext *C, Panel *pa)
|
||||
{
|
||||
buttons_context_draw(C, pa->layout);
|
||||
}
|
||||
|
||||
void buttons_context_register(ARegionType *art)
|
||||
{
|
||||
PanelType *pt;
|
||||
|
@ -114,6 +114,8 @@ static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
|
||||
|
||||
static void do_buttons_buttons(bContext *C, void *arg, int event)
|
||||
{
|
||||
SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
|
||||
|
||||
switch(event) {
|
||||
case B_NEWFRAME:
|
||||
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, NULL);
|
||||
@ -121,18 +123,25 @@ static void do_buttons_buttons(bContext *C, void *arg, int event)
|
||||
case B_CONTEXT_SWITCH:
|
||||
case B_BUTSPREVIEW:
|
||||
ED_area_tag_redraw(CTX_wm_area(C));
|
||||
|
||||
/* silly exception */
|
||||
if(sbuts->mainb == BCONTEXT_WORLD)
|
||||
sbuts->flag |= SB_WORLD_TEX;
|
||||
else if(sbuts->mainb != BCONTEXT_TEXTURE)
|
||||
sbuts->flag &= ~SB_WORLD_TEX;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void buttons_header_buttons(const bContext *C, ARegion *ar)
|
||||
{
|
||||
ScrArea *sa= CTX_wm_area(C);
|
||||
SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
|
||||
Object *ob= CTX_data_active_object(C);
|
||||
uiBlock *block;
|
||||
int xco, yco= 3, dataicon= ICON_OBJECT_DATA;
|
||||
int xco, yco= 3;
|
||||
|
||||
buttons_context_compute(C, sbuts);
|
||||
|
||||
block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS);
|
||||
uiBlockSetHandleFunc(block, do_buttons_buttons, NULL);
|
||||
@ -148,70 +157,38 @@ void buttons_header_buttons(const bContext *C, ARegion *ar)
|
||||
|
||||
xco+=xmax;
|
||||
}
|
||||
// DATA Icons
|
||||
if(ob) {
|
||||
switch(ob->type) {
|
||||
case OB_EMPTY: dataicon= ICON_EMPTY_DATA; break;
|
||||
case OB_MESH: dataicon= ICON_MESH_DATA; break;
|
||||
case OB_CURVE: dataicon= ICON_CURVE_DATA; break;
|
||||
case OB_SURF: dataicon= ICON_SURFACE_DATA; break;
|
||||
case OB_FONT: dataicon= ICON_FONT_DATA; break;
|
||||
case OB_MBALL: dataicon= ICON_META_DATA; break;
|
||||
case OB_LAMP: dataicon= ICON_LAMP_DATA; break;
|
||||
case OB_CAMERA: dataicon= ICON_CAMERA_DATA; break;
|
||||
case OB_LATTICE: dataicon= ICON_LATTICE_DATA; break;
|
||||
case OB_ARMATURE: dataicon= ICON_ARMATURE_DATA; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
uiBlockSetEmboss(block, UI_EMBOSS);
|
||||
|
||||
// if object selection changed, validate button selection
|
||||
if(ob && (ob->type == OB_LAMP) && ELEM3(sbuts->mainb, (float)BCONTEXT_MATERIAL, (float)BCONTEXT_PARTICLE, (float)BCONTEXT_PHYSICS))
|
||||
sbuts->mainb = (float)BCONTEXT_DATA;
|
||||
|
||||
if(ob && (ob->type == OB_EMPTY) && ELEM3(sbuts->mainb, (float)BCONTEXT_MATERIAL, (float)BCONTEXT_TEXTURE, (float)BCONTEXT_PARTICLE))
|
||||
sbuts->mainb = (float)BCONTEXT_DATA;
|
||||
|
||||
if((ob && ELEM(ob->type, OB_CAMERA, OB_ARMATURE)) && ELEM4(sbuts->mainb, (float)BCONTEXT_MATERIAL, (float)BCONTEXT_TEXTURE, (float)BCONTEXT_PARTICLE, (float)BCONTEXT_PHYSICS))
|
||||
sbuts->mainb = (float)BCONTEXT_DATA;
|
||||
|
||||
if((ob && (ob->type != OB_ARMATURE)) && (sbuts->mainb == (float)BCONTEXT_BONE))
|
||||
sbuts->mainb = (float)BCONTEXT_DATA;
|
||||
|
||||
if(!ob && !ELEM3(sbuts->mainb, (float)BCONTEXT_SCENE, (float)BCONTEXT_WORLD, (float)BCONTEXT_SEQUENCER))
|
||||
sbuts->mainb = (float)BCONTEXT_WORLD;
|
||||
|
||||
if((ob && ELEM5(ob->type, OB_EMPTY, OB_MBALL, OB_LAMP, OB_CAMERA, OB_ARMATURE)) && (sbuts->mainb == (float) BCONTEXT_MODIFIER))
|
||||
sbuts->mainb = (float)BCONTEXT_DATA;
|
||||
xco -= XIC;
|
||||
|
||||
// Default panels
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_SCENE, xco, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_SCENE, 0, 0, "Scene");
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_WORLD, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_WORLD, 0, 0, "World");
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_SEQUENCE, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_SEQUENCER, 0, 0, "Sequencer");
|
||||
|
||||
// Specific panels, check on active object seletion
|
||||
if(ob) {
|
||||
if(sbuts->pathflag & (1<<BCONTEXT_SCENE))
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_SCENE, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_SCENE, 0, 0, "Scene");
|
||||
if(sbuts->pathflag & (1<<BCONTEXT_WORLD))
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_WORLD, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_WORLD, 0, 0, "World");
|
||||
if(sbuts->pathflag & (1<<BCONTEXT_SEQUENCER))
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_SEQUENCE, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_SEQUENCER, 0, 0, "Sequencer");
|
||||
if(sbuts->pathflag & (1<<BCONTEXT_OBJECT))
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_OBJECT_DATA, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_OBJECT, 0, 0, "Object");
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_CONSTRAINT, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_CONSTRAINT, 0, 0, "Constraint");
|
||||
|
||||
if(ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_LATTICE))
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_MODIFIER, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_MODIFIER, 0, 0, "Modifier");
|
||||
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, dataicon, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_DATA, 0, 0, "Object Data");
|
||||
if((ob->type == OB_ARMATURE))
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_BONE_DATA, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_BONE, 0, 0, "Bone");
|
||||
if(ELEM5(ob->type, OB_MESH, OB_SURF, OB_MBALL, OB_CURVE, OB_FONT))
|
||||
uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_MATERIAL, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_MATERIAL, 0, 0, "Material");
|
||||
if(ELEM6(ob->type, OB_MESH, OB_SURF, OB_MBALL, OB_CURVE, OB_FONT, OB_LAMP))
|
||||
uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_TEXTURE, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_TEXTURE, 0, 0, "Texture");
|
||||
if(ELEM5(ob->type, OB_MESH, OB_SURF, OB_MBALL, OB_CURVE, OB_FONT))
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_PARTICLES, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_PARTICLE, 0, 0, "Particles");
|
||||
if(ELEM6(ob->type, OB_MESH, OB_SURF, OB_MBALL, OB_CURVE, OB_FONT, OB_EMPTY))
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_PHYSICS, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_PHYSICS, 0, 0, "Physics");
|
||||
}
|
||||
if(sbuts->pathflag & (1<<BCONTEXT_CONSTRAINT))
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_CONSTRAINT, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_CONSTRAINT, 0, 0, "Modifier");
|
||||
if(sbuts->pathflag & (1<<BCONTEXT_DATA))
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, sbuts->dataicon, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_DATA, 0, 0, "Object Data");
|
||||
if(sbuts->pathflag & (1<<BCONTEXT_MODIFIER))
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_MODIFIER, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_MODIFIER, 0, 0, "Modifier");
|
||||
if(sbuts->pathflag & (1<<BCONTEXT_BONE))
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_BONE_DATA, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_BONE, 0, 0, "Bone");
|
||||
if(sbuts->pathflag & (1<<BCONTEXT_MATERIAL))
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_MATERIAL, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_MATERIAL, 0, 0, "Material");
|
||||
if(sbuts->pathflag & (1<<BCONTEXT_TEXTURE))
|
||||
uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_TEXTURE, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_TEXTURE, 0, 0, "Texture");
|
||||
if(sbuts->pathflag & (1<<BCONTEXT_PARTICLE))
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_PARTICLES, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_PARTICLE, 0, 0, "Particles");
|
||||
if(sbuts->pathflag & (1<<BCONTEXT_PHYSICS))
|
||||
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_PHYSICS, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_PHYSICS, 0, 0, "Physics");
|
||||
|
||||
xco+= XIC;
|
||||
|
||||
uiBlockEndAlign(block);
|
||||
@ -220,11 +197,6 @@ void buttons_header_buttons(const bContext *C, ARegion *ar)
|
||||
uiDefButI(block, NUM, B_NEWFRAME, "", (xco+20),yco,60,YIC, &(CTX_data_scene(C)->r.cfra), 1.0, MAXFRAMEF, 0, 0, "Displays Current Frame of animation. Click to change.");
|
||||
xco+= 80;
|
||||
|
||||
// XXX buttons_active_id(&id, &idfrom);
|
||||
// sbuts->lockpoin= id;
|
||||
|
||||
|
||||
|
||||
/* always as last */
|
||||
UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
|
||||
|
||||
|
@ -32,6 +32,9 @@ struct ARegion;
|
||||
struct ARegionType;
|
||||
struct bContext;
|
||||
struct bContextDataResult;
|
||||
struct SpaceButs;
|
||||
struct uiLayout;
|
||||
struct wmOperatorType;
|
||||
|
||||
/* buts->scaflag */
|
||||
#define BUTS_SENS_SEL 1
|
||||
@ -52,9 +55,15 @@ struct bContextDataResult;
|
||||
void buttons_header_buttons(const struct bContext *C, struct ARegion *ar);
|
||||
|
||||
/* buttons_context.c */
|
||||
void buttons_context_compute(const struct bContext *C, SpaceButs *sbuts);
|
||||
void buttons_context_compute(const struct bContext *C, struct SpaceButs *sbuts);
|
||||
int buttons_context(const struct bContext *C, const char *member, struct bContextDataResult *result);
|
||||
void buttons_context_draw(const struct bContext *C, struct uiLayout *layout);
|
||||
void buttons_context_register(struct ARegionType *art);
|
||||
|
||||
/* buttons_ops.c */
|
||||
void MATERIAL_OT_new(struct wmOperatorType *ot);
|
||||
void TEXTURE_OT_new(struct wmOperatorType *ot);
|
||||
void WORLD_OT_new(struct wmOperatorType *ot);
|
||||
|
||||
#endif /* ED_BUTTONS_INTERN_H */
|
||||
|
||||
|
194
source/blender/editors/space_buttons/buttons_ops.c
Normal file
194
source/blender/editors/space_buttons/buttons_ops.c
Normal file
@ -0,0 +1,194 @@
|
||||
/**
|
||||
* $Id:
|
||||
*
|
||||
* ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2009 Blender Foundation.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Contributor(s): Blender Foundation
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_material_types.h"
|
||||
#include "DNA_texture_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
#include "DNA_world_types.h"
|
||||
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_library.h"
|
||||
#include "BKE_material.h"
|
||||
#include "BKE_texture.h"
|
||||
#include "BKE_world.h"
|
||||
|
||||
#include "RNA_access.h"
|
||||
|
||||
#include "WM_api.h"
|
||||
#include "WM_types.h"
|
||||
|
||||
#include "buttons_intern.h" // own include
|
||||
|
||||
/********************** new material operator *********************/
|
||||
|
||||
static int new_material_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
PointerRNA ptr;
|
||||
Material *ma;
|
||||
Object *ob;
|
||||
int index;
|
||||
|
||||
/* add or copy material */
|
||||
ptr= CTX_data_pointer_get(C, "material");
|
||||
ma= (RNA_struct_is_a(ptr.type, &RNA_Material))? ptr.data: NULL;
|
||||
|
||||
if(ma)
|
||||
ma= copy_material(ma);
|
||||
else
|
||||
ma= add_material("Material");
|
||||
|
||||
ma->id.us--; /* compensating for us++ in assign_material */
|
||||
|
||||
/* attempt to assign to material slot */
|
||||
ptr= CTX_data_pointer_get(C, "material_slot");
|
||||
|
||||
if(RNA_struct_is_a(ptr.type, &RNA_MaterialSlot)) {
|
||||
ob= ptr.id.data;
|
||||
index= (Material**)ptr.data - ob->mat;
|
||||
|
||||
assign_material(ob, ma, index+1);
|
||||
|
||||
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
|
||||
}
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
void MATERIAL_OT_new(wmOperatorType *ot)
|
||||
{
|
||||
/* identifiers */
|
||||
ot->name= "New Material";
|
||||
ot->idname= "MATERIAL_OT_new";
|
||||
|
||||
/* api callbacks */
|
||||
ot->exec= new_material_exec;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
}
|
||||
|
||||
/********************** new texture operator *********************/
|
||||
|
||||
static int new_texture_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
PointerRNA ptr;
|
||||
ID *id;
|
||||
Tex *tex;
|
||||
MTex *mtex;
|
||||
|
||||
/* add or copy texture */
|
||||
ptr= CTX_data_pointer_get(C, "texture");
|
||||
tex= (RNA_struct_is_a(ptr.type, &RNA_Texture))? ptr.data: NULL;
|
||||
|
||||
if(tex)
|
||||
tex= copy_texture(tex);
|
||||
else
|
||||
tex= add_texture("Texture");
|
||||
|
||||
id_us_min(&tex->id);
|
||||
|
||||
/* attempt to assign to texture slot */
|
||||
ptr= CTX_data_pointer_get(C, "texture_slot");
|
||||
|
||||
if(RNA_struct_is_a(ptr.type, &RNA_TextureSlot)) {
|
||||
id= ptr.id.data;
|
||||
mtex= ptr.data;
|
||||
|
||||
if(mtex) {
|
||||
if(mtex->tex)
|
||||
id_us_min(&mtex->tex->id);
|
||||
mtex->tex= tex;
|
||||
id_us_plus(&tex->id);
|
||||
}
|
||||
|
||||
/* XXX nodes, notifier .. */
|
||||
}
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
void TEXTURE_OT_new(wmOperatorType *ot)
|
||||
{
|
||||
/* identifiers */
|
||||
ot->name= "New Texture";
|
||||
ot->idname= "TEXTURE_OT_new";
|
||||
|
||||
/* api callbacks */
|
||||
ot->exec= new_texture_exec;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
}
|
||||
|
||||
/********************** new world operator *********************/
|
||||
|
||||
static int new_world_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
PointerRNA ptr;
|
||||
Scene *scene;
|
||||
World *wo;
|
||||
|
||||
/* add or copy world */
|
||||
ptr= CTX_data_pointer_get(C, "world");
|
||||
wo= (RNA_struct_is_a(ptr.type, &RNA_World))? ptr.data: NULL;
|
||||
|
||||
if(wo)
|
||||
wo= copy_world(wo);
|
||||
else
|
||||
wo= add_world("World");
|
||||
|
||||
/* assign to scene */
|
||||
scene= CTX_data_scene(C);
|
||||
|
||||
if(scene->world)
|
||||
id_us_min(&scene->world->id);
|
||||
scene->world= wo;
|
||||
|
||||
// XXX notifier
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
void WORLD_OT_new(wmOperatorType *ot)
|
||||
{
|
||||
/* identifiers */
|
||||
ot->name= "New World";
|
||||
ot->idname= "WORLD_OT_new";
|
||||
|
||||
/* api callbacks */
|
||||
ot->exec= new_world_exec;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
}
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include "DNA_space_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
#include "DNA_screen_types.h"
|
||||
#include "DNA_userdef_types.h"
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
@ -79,6 +80,14 @@ static SpaceLink *buttons_new(const bContext *C)
|
||||
ar->regiontype= RGN_TYPE_HEADER;
|
||||
ar->alignment= RGN_ALIGN_BOTTOM;
|
||||
|
||||
#if 0
|
||||
/* context area */
|
||||
ar= MEM_callocN(sizeof(ARegion), "context area for buts");
|
||||
BLI_addtail(&sbuts->regionbase, ar);
|
||||
ar->regiontype= RGN_TYPE_CHANNELS;
|
||||
ar->alignment= RGN_ALIGN_TOP;
|
||||
#endif
|
||||
|
||||
/* main area */
|
||||
ar= MEM_callocN(sizeof(ARegion), "main area for buts");
|
||||
|
||||
@ -203,7 +212,9 @@ static void buttons_main_area_draw(const bContext *C, ARegion *ar)
|
||||
|
||||
void buttons_operatortypes(void)
|
||||
{
|
||||
|
||||
WM_operatortype_append(MATERIAL_OT_new);
|
||||
WM_operatortype_append(TEXTURE_OT_new);
|
||||
WM_operatortype_append(WORLD_OT_new);
|
||||
}
|
||||
|
||||
void buttons_keymap(struct wmWindowManager *wm)
|
||||
@ -239,6 +250,58 @@ static void buttons_header_area_draw(const bContext *C, ARegion *ar)
|
||||
UI_view2d_view_restore(C);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* add handlers, stuff you only do once or on area/region changes */
|
||||
static void buttons_context_area_init(wmWindowManager *wm, ARegion *ar)
|
||||
{
|
||||
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
|
||||
}
|
||||
|
||||
#define CONTEXTY 30
|
||||
|
||||
static void buttons_context_area_draw(const bContext *C, ARegion *ar)
|
||||
{
|
||||
SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
|
||||
uiStyle *style= U.uistyles.first;
|
||||
uiBlock *block;
|
||||
uiLayout *layout;
|
||||
View2D *v2d= &ar->v2d;
|
||||
float col[3];
|
||||
int x, y, w, h;
|
||||
|
||||
buttons_context_compute(C, sbuts);
|
||||
|
||||
w= v2d->cur.xmax - v2d->cur.xmin;
|
||||
h= v2d->cur.ymax - v2d->cur.ymin;
|
||||
UI_view2d_view_ortho(C, v2d);
|
||||
|
||||
/* create UI */
|
||||
block= uiBeginBlock(C, ar, "buttons_context", UI_EMBOSS);
|
||||
layout= uiBlockLayout(block, UI_LAYOUT_HORIZONTAL, UI_LAYOUT_PANEL,
|
||||
style->panelspace, h - (h-UI_UNIT_Y)/2, w, 20, style);
|
||||
|
||||
buttons_context_draw(C, layout);
|
||||
|
||||
uiBlockLayoutResolve(C, block, &x, &y);
|
||||
uiEndBlock(C, block);
|
||||
|
||||
/* draw */
|
||||
UI_SetTheme(SPACE_BUTS, RGN_TYPE_WINDOW); /* XXX */
|
||||
|
||||
UI_GetThemeColor3fv(TH_BACK, col);
|
||||
glClearColor(col[0], col[1], col[2], 0.0);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
UI_view2d_totRect_set(v2d, x, -y);
|
||||
UI_view2d_view_ortho(C, v2d);
|
||||
|
||||
uiDrawBlock(C, block);
|
||||
|
||||
/* restore view matrix */
|
||||
UI_view2d_view_restore(C);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* reused! */
|
||||
static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
|
||||
{
|
||||
@ -328,17 +391,19 @@ void ED_spacetype_buttons(void)
|
||||
art->init= buttons_header_area_init;
|
||||
art->draw= buttons_header_area_draw;
|
||||
BLI_addhead(&st->regiontypes, art);
|
||||
|
||||
/* regions: channels */
|
||||
|
||||
#if 0
|
||||
/* regions: context */
|
||||
art= MEM_callocN(sizeof(ARegionType), "spacetype buttons region");
|
||||
art->regionid = RGN_TYPE_CHANNELS;
|
||||
art->minsizex= 80;
|
||||
art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
|
||||
|
||||
// art->init= buttons_channel_area_init;
|
||||
// art->draw= buttons_channel_area_draw;
|
||||
art->minsizey= CONTEXTY;
|
||||
art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_FRAMES;
|
||||
art->init= buttons_context_area_init;
|
||||
art->draw= buttons_context_area_draw;;
|
||||
art->listener= buttons_area_listener;
|
||||
|
||||
BLI_addhead(&st->regiontypes, art);
|
||||
#endif
|
||||
|
||||
BKE_spacetype_register(st);
|
||||
}
|
||||
|
@ -140,13 +140,8 @@ static void image_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
|
||||
show_uvedit= ED_space_image_show_uvedit(sima, CTX_data_edit_object(C));
|
||||
|
||||
/* create menu */
|
||||
uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_view_properties_panel"); // View Properties...
|
||||
uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_image_properties_panel"); // Image Properties...|N
|
||||
uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_realtime_properties_panel"); // Real-time properties...
|
||||
if(show_paint) uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_paint_panel"); // Paint Tool...|C
|
||||
uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_curves_panel"); // Curves Tool...
|
||||
if(show_render) uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_compositing_preview_panel"); // Compositing Preview...|Shift P
|
||||
uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_grease_pencil_panel"); // Grease Pencil...
|
||||
uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_properties");
|
||||
//if(show_render) uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_compositing_preview_panel"); // Compositing Preview...|Shift P
|
||||
|
||||
uiItemS(layout);
|
||||
|
||||
|
@ -139,7 +139,8 @@ typedef struct SpaceButs {
|
||||
short oldkeypress; /* for keeping track of the sub tab key cycling */
|
||||
char flag, texact;
|
||||
|
||||
void *path; /* runtime */
|
||||
void *path; /* runtime */
|
||||
int pathflag, dataicon; /* runtime */
|
||||
ID *pinid;
|
||||
} SpaceButs;
|
||||
|
||||
@ -464,7 +465,6 @@ typedef struct SpaceImaSel {
|
||||
#define TAB_SCENE_SEQUENCER 4
|
||||
|
||||
|
||||
/* warning: the values of these defines are used in sbuts->tabs[8] */
|
||||
/* buts->mainb new */
|
||||
#define BCONTEXT_SCENE 0
|
||||
#define BCONTEXT_WORLD 1
|
||||
@ -479,10 +479,12 @@ typedef struct SpaceImaSel {
|
||||
#define BCONTEXT_MODIFIER 10
|
||||
#define BCONTEXT_SEQUENCER 11
|
||||
#define BCONTEXT_CONSTRAINT 12
|
||||
|
||||
#define BCONTEXT_TOT 13
|
||||
|
||||
/* sbuts->flag */
|
||||
#define SB_PRV_OSA 1
|
||||
#define SB_PIN_CONTEXT 2
|
||||
#define SB_WORLD_TEX 4
|
||||
|
||||
/* sbuts->align */
|
||||
#define BUT_FREE 0
|
||||
|
Loading…
Reference in New Issue
Block a user