diff --git a/release/ui/buttons_data_armature.py b/release/ui/buttons_data_armature.py index 46a077ebfdb..fd317baf861 100644 --- a/release/ui/buttons_data_armature.py +++ b/release/ui/buttons_data_armature.py @@ -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" diff --git a/release/ui/buttons_data_camera.py b/release/ui/buttons_data_camera.py index 7f3682b1c94..362e4f96aa2 100644 --- a/release/ui/buttons_data_camera.py +++ b/release/ui/buttons_data_camera.py @@ -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) diff --git a/release/ui/buttons_data_curve.py b/release/ui/buttons_data_curve.py index 9baee5516be..b8b7d6a324f 100644 --- a/release/ui/buttons_data_curve.py +++ b/release/ui/buttons_data_curve.py @@ -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) diff --git a/release/ui/buttons_data_lamp.py b/release/ui/buttons_data_lamp.py index 532098cf786..f626eb45ed6 100644 --- a/release/ui/buttons_data_lamp.py +++ b/release/ui/buttons_data_lamp.py @@ -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() diff --git a/release/ui/buttons_data_lattice.py b/release/ui/buttons_data_lattice.py index 6172c255d15..8f83cbb45f9 100644 --- a/release/ui/buttons_data_lattice.py +++ b/release/ui/buttons_data_lattice.py @@ -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) diff --git a/release/ui/buttons_data_mesh.py b/release/ui/buttons_data_mesh.py index fceb235343a..c3742b38cc1 100644 --- a/release/ui/buttons_data_mesh.py +++ b/release/ui/buttons_data_mesh.py @@ -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) diff --git a/release/ui/buttons_data_text.py b/release/ui/buttons_data_text.py index 9683dbee22b..20503d8d2fd 100644 --- a/release/ui/buttons_data_text.py +++ b/release/ui/buttons_data_text.py @@ -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() diff --git a/release/ui/buttons_material.py b/release/ui/buttons_material.py index 7cffb5b18cf..b9816e36dd7 100644 --- a/release/ui/buttons_material.py +++ b/release/ui/buttons_material.py @@ -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" diff --git a/release/ui/buttons_particle.py b/release/ui/buttons_particle.py index 505114e3ac5..571cafb709d 100644 --- a/release/ui/buttons_particle.py +++ b/release/ui/buttons_particle.py @@ -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) \ No newline at end of file +bpy.types.register(PARTICLE_PT_vertexgroups) diff --git a/release/ui/buttons_texture.py b/release/ui/buttons_texture.py index 7d0ef9371d7..e47c775d7fd 100644 --- a/release/ui/buttons_texture.py +++ b/release/ui/buttons_texture.py @@ -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" diff --git a/release/ui/buttons_world.py b/release/ui/buttons_world.py index 79826e04dfc..8298c0c9b13 100644 --- a/release/ui/buttons_world.py +++ b/release/ui/buttons_world.py @@ -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" diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index c459d766937..ef2f60c1803 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -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 } } diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c index 17b8a5a39bb..d3653efd9f2 100644 --- a/source/blender/editors/space_buttons/buttons_context.c +++ b/source/blender/editors/space_buttons/buttons_context.c @@ -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; alen; 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; alen; 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->typeid, &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; aptr[path->len-1]; -static int set_pointer_type(ButsContextPath *path, bContextDataResult *result, StructRNA *type) -{ - PointerRNA *ptr; - int a; - - for(a=0; alen; 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; alen; 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; amainb= 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->typeid, &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; alen; 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; diff --git a/source/blender/editors/space_buttons/buttons_header.c b/source/blender/editors/space_buttons/buttons_header.c index 444db92265d..73f161e1130 100644 --- a/source/blender/editors/space_buttons/buttons_header.c +++ b/source/blender/editors/space_buttons/buttons_header.c @@ -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<mainb), 0.0, (float)BCONTEXT_SCENE, 0, 0, "Scene"); + if(sbuts->pathflag & (1<mainb), 0.0, (float)BCONTEXT_WORLD, 0, 0, "World"); + if(sbuts->pathflag & (1<mainb), 0.0, (float)BCONTEXT_SEQUENCER, 0, 0, "Sequencer"); + if(sbuts->pathflag & (1<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<mainb), 0.0, (float)BCONTEXT_CONSTRAINT, 0, 0, "Modifier"); + if(sbuts->pathflag & (1<dataicon, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_DATA, 0, 0, "Object Data"); + if(sbuts->pathflag & (1<mainb), 0.0, (float)BCONTEXT_MODIFIER, 0, 0, "Modifier"); + if(sbuts->pathflag & (1<mainb), 0.0, (float)BCONTEXT_BONE, 0, 0, "Bone"); + if(sbuts->pathflag & (1<mainb), 0.0, (float)BCONTEXT_MATERIAL, 0, 0, "Material"); + if(sbuts->pathflag & (1<mainb), 0.0, (float)BCONTEXT_TEXTURE, 0, 0, "Texture"); + if(sbuts->pathflag & (1<mainb), 0.0, (float)BCONTEXT_PARTICLE, 0, 0, "Particles"); + if(sbuts->pathflag & (1<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); diff --git a/source/blender/editors/space_buttons/buttons_intern.h b/source/blender/editors/space_buttons/buttons_intern.h index 04c7241c465..196647a3750 100644 --- a/source/blender/editors/space_buttons/buttons_intern.h +++ b/source/blender/editors/space_buttons/buttons_intern.h @@ -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 */ diff --git a/source/blender/editors/space_buttons/buttons_ops.c b/source/blender/editors/space_buttons/buttons_ops.c new file mode 100644 index 00000000000..63469a8294d --- /dev/null +++ b/source/blender/editors/space_buttons/buttons_ops.c @@ -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 +#include + +#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; +} + diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c index a6487fd5f63..291519e9632 100644 --- a/source/blender/editors/space_buttons/space_buttons.c +++ b/source/blender/editors/space_buttons/space_buttons.c @@ -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); } diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c index 9a61d3a7081..adf4772efde 100644 --- a/source/blender/editors/space_image/image_header.c +++ b/source/blender/editors/space_image/image_header.c @@ -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); diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index a7cd505f86e..c47bc704864 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -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