Fix issues unregistering overridden panels

Previously overridden scene panels were removed but original panels were not restored.
Also added condition check for Blender version to generate list of panels to override, so we won't miss any errors using `try - except`.
This commit is contained in:
Andrej730
2023-12-11 16:25:37 +05:00
parent fa480d99a2
commit 2520a93055
2 changed files with 31 additions and 44 deletions
+5 -19
View File
@@ -181,6 +181,7 @@ addon_keymaps = []
icons = None icons = None
is_registering = False is_registering = False
last_commit_hash = "8888888" last_commit_hash = "8888888"
overridden_scene_panels = dict()
def on_register(scene): def on_register(scene):
@@ -285,22 +286,7 @@ def unregister():
km.keymap_items.remove(kmi) km.keymap_items.remove(kmi)
addon_keymaps.clear() addon_keymaps.clear()
for panel in [ for original_panel, override_panel in tuple(overridden_scene_panels.items()):
"SCENE_PT_scene", bpy.utils.unregister_class(override_panel)
"SCENE_PT_unit", bpy.utils.register_class(original_panel)
"SCENE_PT_physics", del overridden_scene_panels[original_panel]
"SCENE_PT_rigid_body_world",
"SCENE_PT_audio",
"SCENE_PT_keying_sets",
"SCENE_PT_simulation",
"SCENE_PT_custom_props", # 4.0
# after SCENE_PT_keying_sets
"SCENE_PT_keying_set_paths" "SCENE_PT_keyframing_settings",
]:
try:
bpy.utils.unregister_class(getattr(handler, f"Override_{panel}"))
except:
# NOTE: breaks Blender UI on unregister
# since default Blender panels are unregistered on load_post
# unregistering our override panels removes them from Blender completely
pass
+26 -25
View File
@@ -21,6 +21,7 @@ import bpy
import json import json
import addon_utils import addon_utils
import ifcopenshell.api.owner.settings import ifcopenshell.api.owner.settings
import blenderbim.bim
import blenderbim.tool as tool import blenderbim.tool as tool
import blenderbim.core.owner as core_owner import blenderbim.core.owner as core_owner
from bpy.app.handlers import persistent from bpy.app.handlers import persistent
@@ -259,9 +260,7 @@ def poll_check_blender_tab(cls, context):
def get_override_scene_panel(panel_name): def get_override_scene_panel(panel_name):
original_panel = getattr(bpy.types, panel_name, None) original_panel = getattr(bpy.types, panel_name)
if original_panel is None:
return
override_panel = type(f"Override_{panel_name}", (original_panel,), {}) override_panel = type(f"Override_{panel_name}", (original_panel,), {})
override_panel.bl_idname = f"{panel_name}_override" override_panel.bl_idname = f"{panel_name}_override"
@@ -287,6 +286,22 @@ def get_override_scene_panel(panel_name):
return override_panel return override_panel
OVERRIDE_SCENE_PANELS = (
"SCENE_PT_scene",
"SCENE_PT_unit",
"SCENE_PT_physics",
"SCENE_PT_rigid_body_world",
"SCENE_PT_audio",
"SCENE_PT_keying_sets",
"SCENE_PT_custom_props",
# after SCENE_PT_keying_sets
"SCENE_PT_keying_set_paths",
"SCENE_PT_keyframing_settings",
)
if bpy.app.version >= (4, 0):
OVERRIDE_SCENE_PANELS += ("SCENE_PT_simulation",)
@persistent @persistent
def load_post(scene): def load_post(scene):
global global_subscription_owner global global_subscription_owner
@@ -325,28 +340,14 @@ def load_post(scene):
# To improve usability for new users, we hijack the scene properties # To improve usability for new users, we hijack the scene properties
# tab. We override default scene properties panels with our own poll # tab. We override default scene properties panels with our own poll
# to hide them unless the user has chosen to view Blender properties. # to hide them unless the user has chosen to view Blender properties.
for panel in [ for panel in OVERRIDE_SCENE_PANELS:
"SCENE_PT_scene", override_panel = get_override_scene_panel(panel)
"SCENE_PT_unit", if override_panel is None:
"SCENE_PT_physics", continue
"SCENE_PT_rigid_body_world", original_panel = getattr(bpy.types, panel)
"SCENE_PT_audio", bpy.utils.register_class(override_panel)
"SCENE_PT_keying_sets", bpy.utils.unregister_class(original_panel)
"SCENE_PT_simulation", # 4.0+ blenderbim.bim.overridden_scene_panels[original_panel] = override_panel
"SCENE_PT_custom_props",
# after SCENE_PT_keying_sets
"SCENE_PT_keying_set_paths",
"SCENE_PT_keyframing_settings",
]:
try:
override_panel = get_override_scene_panel(panel)
if override_panel is None:
continue
original_panel = getattr(bpy.types, panel)
bpy.utils.register_class(override_panel)
bpy.utils.unregister_class(original_panel)
except Exception: # some panels belong to different Blender versions
pass
# https://blender.stackexchange.com/questions/140644/how-can-make-the-state-of-a-boolean-property-relative-to-the-3d-view-area # https://blender.stackexchange.com/questions/140644/how-can-make-the-state-of-a-boolean-property-relative-to-the-3d-view-area
for screen in bpy.data.screens: for screen in bpy.data.screens:
if len(screen.BIMAreaProperties) == 20: if len(screen.BIMAreaProperties) == 20: