From eb8b6062b45dc8a509f86bb9782e1884ffcdff63 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 3 Apr 2024 16:16:50 +0500 Subject: [PATCH] move override panel methods to tool.Blender to keep them close, so it will be easier to keep them in sync --- src/blenderbim/blenderbim/bim/__init__.py | 17 +++------ src/blenderbim/blenderbim/bim/handler.py | 28 +-------------- src/blenderbim/blenderbim/tool/blender.py | 43 +++++++++++++++++++++++ 3 files changed, 49 insertions(+), 39 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/__init__.py b/src/blenderbim/blenderbim/bim/__init__.py index a9606d8ed4..ec0fb4b38f 100644 --- a/src/blenderbim/blenderbim/bim/__init__.py +++ b/src/blenderbim/blenderbim/bim/__init__.py @@ -296,17 +296,10 @@ def unregister(): km.keymap_items.remove(kmi) addon_keymaps.clear() - for panel, poll in tuple(original_scene_panels_polls.items()): - if poll is None: - del panel.poll - else: - panel.poll = poll - # panel might be already unregisterd during blender exit - # or if it's addon was disabled - if panel.is_registered: - # reregister to activate new poll - bpy.utils.unregister_class(panel) - bpy.utils.register_class(panel) - del original_scene_panels_polls[panel] + import blenderbim.tool as tool + + # use tuple() as method will be removing keys from dict + for panel in tuple(original_scene_panels_polls.keys()): + tool.Blender.remove_scene_panel_override(panel) bpy.app.translations.unregister("blenderbim") diff --git a/src/blenderbim/blenderbim/bim/handler.py b/src/blenderbim/blenderbim/bim/handler.py index 32782b9537..4e9228186a 100644 --- a/src/blenderbim/blenderbim/bim/handler.py +++ b/src/blenderbim/blenderbim/bim/handler.py @@ -255,32 +255,6 @@ def viewport_shading_changed_callback(area): bpy.context.scene.BIMStylesProperties.active_style_type = "External" -@classmethod -def poll_check_blender_tab(cls, context): - return tool.Blender.is_tab(context, "BLENDER") - - -def override_scene_panel(original_panel: bpy.types.Panel) -> None: - polls = blenderbim.bim.original_scene_panels_polls - - # override poll method - if not hasattr(original_panel, "poll"): - polls[original_panel] = None - original_panel.poll = poll_check_blender_tab - else: - polls[original_panel] = original_panel.poll - - @classmethod - def wrapped_poll(cls, context): - return polls[cls](context) and poll_check_blender_tab.__func__(cls, context) - - original_panel.poll = wrapped_poll - - # reregister to activate new poll - bpy.utils.unregister_class(original_panel) - bpy.utils.register_class(original_panel) - - @persistent def load_post(scene): global global_subscription_owner @@ -322,5 +296,5 @@ def load_post(scene): for panel in tool.Blender.get_scene_panels_list(): if panel in blenderbim.bim.original_scene_panels_polls: continue - override_scene_panel(panel) + tool.Blender.override_scene_panel(panel) tool.Blender.setup_tabs() diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 51399db0a3..0d2b7d8b9e 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -934,3 +934,46 @@ class Blender(blenderbim.core.tool.Blender): assert set(items) == set(final_items), "Sorted list doesn't match original" return final_items + + @classmethod + def override_scene_panel(cls, original_panel: bpy.types.Panel) -> None: + @classmethod + def poll_check_blender_tab(cls, context): + return tool.Blender.is_tab(context, "BLENDER") + + polls = blenderbim.bim.original_scene_panels_polls + + # override poll method + if not hasattr(original_panel, "poll"): + polls[original_panel] = None + original_panel.poll = poll_check_blender_tab + else: + polls[original_panel] = original_panel.poll + + @classmethod + def wrapped_poll(cls, context): + return polls[cls](context) and poll_check_blender_tab.__func__(cls, context) + + original_panel.poll = wrapped_poll + + # reregister to activate new poll + bpy.utils.unregister_class(original_panel) + bpy.utils.register_class(original_panel) + + @classmethod + def remove_scene_panel_override(cls, panel: bpy.types.Panel) -> None: + polls = blenderbim.bim.original_scene_panels_polls + + poll = polls[panel] + if poll is None: + del panel.poll + else: + panel.poll = poll + + # panel might be already unregistered during blender exit + # or if it's addon was disabled + if panel.is_registered: + # reregister to activate new poll + bpy.utils.unregister_class(panel) + bpy.utils.register_class(panel) + del polls[panel]