Amaranth Addon
[blender-addons-contrib.git] / amaranth / node_editor / switch_material.py
1 #  This program is free software; you can redistribute it and/or
2 #  modify it under the terms of the GNU General Public License
3 #  as published by the Free Software Foundation; either version 2
4 #  of the License, or (at your option) any later version.
5 #
6 #  This program is distributed in the hope that it will be useful,
7 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
8 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9 #  GNU General Public License for more details.
10 #
11 #  You should have received a copy of the GNU General Public License
12 #  along with this program; if not, write to the Free Software Foundation,
13 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
14 """
15 Material Selector
16
17 Quickly switch materials in the active mesh without going to the Properties editor
18
19 Based on 'Afeitadora's work on Elysiun
20 http://www.elysiun.com/forum/showthread.php?290097-Dynamic-Object-Dropdown-List&p=2361851#post2361851
21
22 """
23
24 import bpy
25
26 def ui_node_editor_material_select(self, context):
27
28     act_ob = context.active_object
29
30     if act_ob and context.active_object.type in {'MESH', 'CURVE', 'SURFACE', 'META'} and \
31         context.space_data.tree_type == 'ShaderNodeTree' and \
32         context.space_data.shader_type == 'OBJECT':
33
34         if act_ob.active_material:
35             mat_name = act_ob.active_material.name
36         else:
37             mat_name = "No Material"
38
39         self.layout.operator_menu_enum("material.menu_select",
40                                        "material_select",
41                                         text=mat_name,
42                                        icon="MATERIAL")
43
44 class AMNodeEditorMaterialSelect(bpy.types.Operator):
45     bl_idname = "material.menu_select"
46     bl_label = "Select Material"
47     bl_description = "Switch to another material in this mesh"
48
49     def avail_materials(self,context):
50         items = [(str(i),x.name,x.name, "MATERIAL", i) for i,x in enumerate(bpy.context.active_object.material_slots)]
51         return items
52     material_select = bpy.props.EnumProperty(items = avail_materials, name = "Available Materials")
53
54     @classmethod
55     def poll(cls, context):
56         return context.active_object
57     
58     def execute(self,context):
59         bpy.context.active_object.active_material_index = int(self.material_select)
60         return {'FINISHED'}
61
62 def register():
63     bpy.utils.register_class(AMNodeEditorMaterialSelect)
64     bpy.types.NODE_HT_header.append(ui_node_editor_material_select)
65
66 def unregister():
67     bpy.utils.unregister_class(AMNodeEditorMaterialSelect)
68     bpy.types.NODE_HT_header.remove(ui_node_editor_material_select)