Commit: d9bc297c23d5841c7c05926352cf00ea1fc20817 Author: Campbell Barton Date: Tue Mar 21 13:22:53 2017 +1100 Branches: app-templates https://developer.blender.org/rBd9bc297c23d5841c7c05926352cf00ea1fc20817
Add filtering for UI elements There is a remaining preset drawing issue that needs resolving. =================================================================== M release/datafiles/app_templates/101/template/__init__.py M release/scripts/modules/bl_app_override.py =================================================================== diff --git a/release/datafiles/app_templates/101/template/__init__.py b/release/datafiles/app_templates/101/template/__init__.py index 7c1a0f5365..5cdde52263 100644 --- a/release/datafiles/app_templates/101/template/__init__.py +++ b/release/datafiles/app_templates/101/template/__init__.py @@ -25,8 +25,12 @@ import bl_app_override class AppStateStore: # Utility class to encapsulate application state, backup and restore. __slots__ = ( + # setup_classes "class_store", + # setup_addons "sys_path", + # setup_ui_filter + "ui_filter_store" ) _template_addons = ( @@ -36,6 +40,7 @@ class AppStateStore: def __init__(self): self.class_store = [] self.sys_path = [] + self.ui_filter_store = [] def setup_classes(self): assert(len(self.class_store) == 0) @@ -69,6 +74,41 @@ class AppStateStore: register(cls) self.class_store.clear() + def setup_ui_filter(self): + import bl_app_override + self.ui_filter_store = bl_app_override.ui_draw_filter_register( + operator_blacklist={ + # "render.render", + "transform.mirror", + "sound.mixdown", + "object.modifier_add", + "object.forcefield_toggle", + }, + property_blacklist={ + ("Object", "location"), + ("Object", "scale"), + ("Object", "rotation_euler"), + ("RenderSettings", "use_placeholder"), + ("RenderSettings", "use_render_cache"), + ("RenderSettings", "pixel_filter_type"), + ("RenderSettings", "filter_size"), + ("RenderSettings", "frame_map_old"), + ("RenderSettings", "frame_map_new"), + ("RenderSettings", "use_border"), + ("RenderSettings", "use_crop_to_border"), + ("RenderSettings", "pixel_aspect_x"), + ("RenderSettings", "pixel_aspect_y"), + }, + ) + + def teardown_ui_filter(self): + import bl_app_override + bl_app_override.ui_draw_filter_unregister( + self.ui_filter_store + ) + self.ui_filter_store = None + + def setup_addons(self): import sys import os @@ -102,8 +142,9 @@ from . import ui def register(): print("Template Register", __file__) - app_state.setup_classes() + # app_state.setup_classes() app_state.setup_addons() + app_state.setup_ui_filter() ui.register() @@ -112,5 +153,6 @@ def unregister(): ui.unregister() - app_state.teardown_classes() + # app_state.teardown_classes() app_state.teardown_addons() + app_state.teardown_ui_filter() diff --git a/release/scripts/modules/bl_app_override.py b/release/scripts/modules/bl_app_override.py index b9c83fefcc..5ea6045e83 100644 --- a/release/scripts/modules/bl_app_override.py +++ b/release/scripts/modules/bl_app_override.py @@ -40,3 +40,124 @@ def class_filter(cls_parent, **kw): if ((white_list is not None and cls.__name__ is white_list) or all((getattr(cls, attr) in expect) for attr, expect in kw_items)): yield cls + + +def ui_draw_filter_register( + *, + classes=None, + property_blacklist=None, + operator_blacklist=None, +): + import bpy + + UILayout = bpy.types.UILayout + + if classes is None: + classes = ( + bpy.types.Panel, + bpy.types.Menu, + bpy.types.Header, + ) + + def filter_operator(op_id): + return op_id not in operator_blacklist + + def filter_prop(data, prop): + return (data.__class__.__name__, prop) not in property_blacklist + + class OperatorProperties_Fake: + pass + + class UILayout_Fake(bpy.types.UILayout): + __slots__ = () + + def __getattribute__(self, attr): + # ensure we always pass down UILayout_Fake instances + if attr in {"row", "split", "column", "box", "column_flow"}: + real_func = UILayout.__getattribute__(self, attr) + + def dummy_func(*args, **kw): + # print("wrapped", attr) + ret = real_func(*args, **kw) + return UILayout_Fake(ret) + return dummy_func + + elif attr in {"operator", "operator_menu_enum", "operator_enum"}: + real_func = UILayout.__getattribute__(self, attr) + + def dummy_func(*args, **kw): + # print("wrapped", attr) + if filter_operator(args[0]): + ret = real_func(*args, **kw) + else: + # UILayout.__getattribute__(self, "label")() + # may need to be set + ret = OperatorProperties_Fake() + return ret + return dummy_func + elif attr in {"prop", "prop_enum"}: + real_func = UILayout.__getattribute__(self, attr) + + def dummy_func(*args, **kw): + # print("wrapped", attr) + if filter_prop(args[0], args[1]): + ret = real_func(*args, **kw) + else: + ret = None + return ret + return dummy_func + else: + return UILayout.__getattribute__(self, attr) + # print(self, attr) + + def operator(*args, **kw): + return super().operator(*args, **kw) + + def draw_override(func_orig, self_real, context): + # simple, no wrapping + # return func_orig(self_wrap, context) + + class Wrapper(self_real.__class__): + __slots__ = () + def __getattribute__(self, attr): + if attr == "layout": + return UILayout_Fake(self_real.layout) + else: + cls = super() + try: + return cls.__getattr__(self, attr) + except AttributeError: + # class variable + return getattr(cls, attr) + + @property + def layout(self): + # print("wrapped") + return self_real.layout + + return func_orig(Wrapper(self_real), context) + + ui_filter_store = [] + + for cls in classes: + for subcls in list(cls.__subclasses__()): + if "draw" in subcls.__dict__: # don't want to get parents draw() + + def replace_draw(): + # function also serves to hold draw_old in a local name-space + draw_orig = subcls.draw + + def draw(self, context): + return draw_override(draw_orig, self, context) + subcls.draw = draw + + ui_filter_store.append((subcls, "draw", subcls.draw)) + + replace_draw() + + return ui_filter_store + + +def ui_draw_filter_unregister(ui_filter_store): + for (obj, attr, value) in ui_filter_store: + setattr(obj, attr, value) _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs