cleanup for python scripts - unused vars and imports
[blender-staging.git] / release / scripts / modules / bpyml_ui.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20
21
22 import bpy as _bpy
23 import bpyml
24 from bpyml import TAG, ARGS, CHILDREN
25
26 _uilayout_rna = _bpy.types.UILayout.bl_rna
27
28 _uilayout_tags = ["ui"] + \
29     _uilayout_rna.properties.keys() + \
30     _uilayout_rna.functions.keys()
31
32 # these need to be imported directly
33 # >>> from bpyml_ui.locals import *
34 locals = bpyml.tag_module("%s.locals" % __name__, _uilayout_tags)
35
36
37 def _parse_rna(prop, value):
38     if prop.type == 'FLOAT':
39         value = float(value)
40     elif prop.type == 'INT':
41         value = int(value)
42     elif prop.type == 'BOOLEAN':
43         if value in (True, False):
44             pass
45         else:
46             if value not in ("True", "False"):
47                 raise Exception("invalid bool value: %s" % value)
48             value = bool(value == "True")
49     elif prop.type in ('STRING', 'ENUM'):
50         pass
51     elif prop.type == 'POINTER':
52         value = eval("_bpy." + value)
53     else:
54         raise Exception("type not supported %s.%s" % (prop.identifier, prop.type))
55     return value
56
57
58 def _parse_rna_args(base, py_node):
59     rna_params = base.bl_rna.functions[py_node[TAG]].parameters
60     args = {}
61     for key, value in py_node[ARGS].items():
62         args[key] = _parse_rna(rna_params[key], value)
63     return args
64
65
66 def _call_recursive(context, base, py_node):
67     # prop = base.bl_rna.properties.get(py_node[TAG])
68     if py_node[TAG] in base.bl_rna.properties:
69         value = py_node[ARGS].get("expr")
70         if value:
71             value = eval(value, {"context": _bpy.context})
72             setattr(base, py_node[TAG], value)
73         else:
74             value = py_node[ARGS]['value']  # have to have this
75             setattr(base, py_node[TAG], value)
76     else:
77         args = _parse_rna_args(base, py_node)
78         func_new = getattr(base, py_node[TAG])
79         base_new = func_new(**args)  # call blender func
80         if base_new is not None:
81             for py_node_child in py_node[CHILDREN]:
82                 _call_recursive(context, base_new, py_node_child)
83
84
85 class BPyML_BaseUI():
86     '''
87     This is a mix-in class that defines a draw function
88     which checks for draw_data
89     '''
90
91     def draw(self, context):
92         layout = self.layout
93         for py_node in self.draw_data[CHILDREN]:
94             _call_recursive(context, layout, py_node)
95
96     def draw_header(self, context):
97         layout = self.layout
98         for py_node in self.draw_header_data[CHILDREN]:
99             _call_recursive(context, layout, py_node)