API update: percentage to factor
[blender-addons-contrib.git] / amaranth / node_editor / id_panel.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 """
16 Object / Material Indices Panel
17
18 When working with ID Masks in the Nodes Editor, is hard to follow track
19 of which objects/materials have which ID.
20 This adds a panel on the sidebar when an ID Mask node is selected.
21 The active object is highlighted between [square brackets] On the Nodes
22 Editor's sidebar, when an ID Mask node is selected.
23 """
24
25 import bpy
26
27
28 class AMTH_NODE_PT_indices(bpy.types.Panel):
29     bl_space_type = "NODE_EDITOR"
30     bl_region_type = "UI"
31     bl_label = "Object / Material Indices"
32     bl_options = {"DEFAULT_CLOSED"}
33
34     @classmethod
35     def poll(cls, context):
36         node = context.active_node
37         return node and node.type == "ID_MASK"
38
39     def draw(self, context):
40         layout = self.layout
41
42         objects = bpy.data.objects
43         materials = bpy.data.materials
44         node = context.active_node
45
46         show_ob_id = False
47         show_ma_id = False
48         matching_ids = False
49
50         if context.active_object:
51             ob_act = context.active_object
52         else:
53             ob_act = False
54
55         for ob in objects:
56             if ob and ob.pass_index > 0:
57                 show_ob_id = True
58         for ma in materials:
59             if ma and ma.pass_index > 0:
60                 show_ma_id = True
61         row = layout.row(align=True)
62         row.prop(node, "index", text="Mask Index")
63         row.prop(node, "use_matching_indices", text="Only Matching IDs")
64
65         layout.separator()
66
67         if not show_ob_id and not show_ma_id:
68             layout.label(
69                 text="No objects or materials indices so far.", icon="INFO")
70
71         if show_ob_id:
72             split = layout.split()
73             col = split.column()
74             col.label(text="Object Name")
75             split.label(text="ID Number")
76             row = layout.row()
77             for ob in objects:
78                 icon = "OUTLINER_DATA_" + ob.type
79                 if ob.library:
80                     icon = "LIBRARY_DATA_DIRECT"
81                 elif ob.is_library_indirect:
82                     icon = "LIBRARY_DATA_INDIRECT"
83
84                 if ob and node.use_matching_indices \
85                     and ob.pass_index == node.index \
86                     and ob.pass_index != 0:
87                     matching_ids = True
88                     row.label(
89                         text="[{}]".format(ob.name)
90                         if ob_act and ob.name == ob_act.name else ob.name,
91                         icon=icon)
92                     row.label(text="%s" % ob.pass_index)
93                     row = layout.row()
94
95                 elif ob and not node.use_matching_indices \
96                         and ob.pass_index > 0:
97
98                     matching_ids = True
99                     row.label(
100                         text="[{}]".format(ob.name)
101                         if ob_act and ob.name == ob_act.name else ob.name,
102                         icon=icon)
103                     row.label(text="%s" % ob.pass_index)
104                     row = layout.row()
105
106             if node.use_matching_indices and not matching_ids:
107                 row.label(text="No objects with ID %s" %
108                           node.index, icon="INFO")
109
110             layout.separator()
111
112         if show_ma_id:
113             split = layout.split()
114             col = split.column()
115             col.label(text="Material Name")
116             split.label(text="ID Number")
117             row = layout.row()
118
119             for ma in materials:
120                 icon = "BLANK1"
121                 if ma.use_nodes:
122                     icon = "NODETREE"
123                 elif ma.library:
124                     icon = "LIBRARY_DATA_DIRECT"
125                     if ma.is_library_indirect:
126                         icon = "LIBRARY_DATA_INDIRECT"
127
128                 if ma and node.use_matching_indices \
129                     and ma.pass_index == node.index \
130                     and ma.pass_index != 0:
131                     matching_ids = True
132                     row.label(text="%s" % ma.name, icon=icon)
133                     row.label(text="%s" % ma.pass_index)
134                     row = layout.row()
135
136                 elif ma and not node.use_matching_indices \
137                         and ma.pass_index > 0:
138
139                     matching_ids = True
140                     row.label(text="%s" % ma.name, icon=icon)
141                     row.label(text="%s" % ma.pass_index)
142                     row = layout.row()
143
144             if node.use_matching_indices and not matching_ids:
145                 row.label(text="No materials with ID %s" %
146                           node.index, icon="INFO")
147
148
149 def register():
150     bpy.utils.register_class(AMTH_NODE_PT_indices)
151
152
153 def unregister():
154     bpy.utils.unregister_class(AMTH_NODE_PT_indices)