forked from bartvdbraak/blender
63810ffcef
Should also fix the broken py ops tips...
102 lines
3.2 KiB
Python
102 lines
3.2 KiB
Python
# ##### 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
#
|
|
# ##### END GPL LICENSE BLOCK #####
|
|
|
|
# <pep8 compliant>
|
|
|
|
|
|
import bpy as _bpy
|
|
import bpyml
|
|
from bpyml import TAG, ARGS, CHILDREN
|
|
|
|
_uilayout_rna = _bpy.types.UILayout.bl_rna
|
|
|
|
_uilayout_tags = (
|
|
["ui"] +
|
|
_uilayout_rna.properties.keys() +
|
|
_uilayout_rna.functions.keys()
|
|
)
|
|
|
|
# these need to be imported directly
|
|
# >>> from bpyml_ui.locals import *
|
|
locals = bpyml.tag_module("%s.locals" % __name__, _uilayout_tags)
|
|
|
|
|
|
def _parse_rna(prop, value):
|
|
if prop.type == 'FLOAT':
|
|
value = float(value)
|
|
elif prop.type == 'INT':
|
|
value = int(value)
|
|
elif prop.type == 'BOOLEAN':
|
|
if value in {True, False}:
|
|
pass
|
|
else:
|
|
if value not in {"True", "False"}:
|
|
raise Exception("invalid bool value: %s" % value)
|
|
value = bool(value == "True")
|
|
elif prop.type in {'STRING', 'ENUM'}:
|
|
pass
|
|
elif prop.type == 'POINTER':
|
|
value = eval("_bpy." + value)
|
|
else:
|
|
raise Exception("type not supported %s.%s" % (prop.identifier, prop.type))
|
|
return value
|
|
|
|
|
|
def _parse_rna_args(base, py_node):
|
|
rna_params = base.bl_rna.functions[py_node[TAG]].parameters
|
|
args = {}
|
|
for key, value in py_node[ARGS].items():
|
|
args[key] = _parse_rna(rna_params[key], value)
|
|
return args
|
|
|
|
|
|
def _call_recursive(context, base, py_node):
|
|
# prop = base.bl_rna.properties.get(py_node[TAG])
|
|
if py_node[TAG] in base.bl_rna.properties:
|
|
value = py_node[ARGS].get("expr")
|
|
if value:
|
|
value = eval(value, {"context": _bpy.context})
|
|
setattr(base, py_node[TAG], value)
|
|
else:
|
|
value = py_node[ARGS]["value"] # have to have this
|
|
setattr(base, py_node[TAG], value)
|
|
else:
|
|
args = _parse_rna_args(base, py_node)
|
|
func_new = getattr(base, py_node[TAG])
|
|
base_new = func_new(**args) # call blender func
|
|
if base_new is not None:
|
|
for py_node_child in py_node[CHILDREN]:
|
|
_call_recursive(context, base_new, py_node_child)
|
|
|
|
|
|
class BPyML_BaseUI():
|
|
"""
|
|
This is a mix-in class that defines a draw function
|
|
which checks for draw_data
|
|
"""
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
for py_node in self.draw_data[CHILDREN]:
|
|
_call_recursive(context, layout, py_node)
|
|
|
|
def draw_header(self, context):
|
|
layout = self.layout
|
|
for py_node in self.draw_header_data[CHILDREN]:
|
|
_call_recursive(context, layout, py_node)
|