pep8 checker, mostly pedantic style changes but also found an error in mesh_utils...
[blender.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 from types import ModuleType
26
27 _uilayout_rna = _bpy.types.UILayout.bl_rna
28
29 _uilayout_tags = ["ui"] + \
30     _uilayout_rna.properties.keys() + \
31     _uilayout_rna.functions.keys()
32
33 # these need to be imported directly
34 # >>> from bpyml_ui.locals import *
35 locals = bpyml.tag_module("%s.locals" % __name__, _uilayout_tags)
36
37
38 def _parse_rna(prop, value):
39     if prop.type == 'FLOAT':
40         value = float(value)
41     elif prop.type == 'INT':
42         value = int(value)
43     elif prop.type == 'BOOLEAN':
44         if value in (True, False):
45             pass
46         else:
47             if value not in ("True", "False"):
48                 raise Exception("invalid bool value: %s" % value)
49             value = bool(value == "True")
50     elif prop.type in ('STRING', 'ENUM'):
51         pass
52     elif prop.type == 'POINTER':
53         value = eval("_bpy." + value)
54     else:
55         raise Exception("type not supported %s.%s" % (prop.identifier, prop.type))
56     return value
57
58
59 def _parse_rna_args(base, py_node):
60     rna_params = base.bl_rna.functions[py_node[TAG]].parameters
61     args = {}
62     for key, value in py_node[ARGS].items():
63         args[key] = _parse_rna(rna_params[key], value)
64     return args
65
66
67 def _call_recursive(context, base, py_node):
68     # prop = base.bl_rna.properties.get(py_node[TAG])
69     if py_node[TAG] in base.bl_rna.properties:
70         value = py_node[ARGS].get("expr")
71         if value:
72             value = eval(value, {"context": _bpy.context})
73             setattr(base, py_node[TAG], value)
74         else:
75             value = py_node[ARGS]['value']  # have to have this
76             setattr(base, py_node[TAG], value)
77     else:
78         args = _parse_rna_args(base, py_node)
79         func_new = getattr(base, py_node[TAG])
80         base_new = func_new(**args)  # call blender func
81         if base_new is not None:
82             for py_node_child in py_node[CHILDREN]:
83                 _call_recursive(context, base_new, py_node_child)
84
85
86 class BPyML_BaseUI():
87     '''
88     This is a mix-in class that defines a draw function
89     which checks for draw_data
90     '''
91
92     def draw(self, context):
93         layout = self.layout
94         for py_node in self.draw_data[CHILDREN]:
95             _call_recursive(context, layout, py_node)
96
97     def draw_header(self, context):
98         layout = self.layout
99         for py_node in self.draw_header_data[CHILDREN]:
100             _call_recursive(context, layout, py_node)