diff --git a/src/bonsai/bonsai/tool/web.py b/src/bonsai/bonsai/tool/web.py index 66847f0c03..7ab178bde7 100644 --- a/src/bonsai/bonsai/tool/web.py +++ b/src/bonsai/bonsai/tool/web.py @@ -28,7 +28,8 @@ import bonsai.tool as tool import ifcopenshell.api.sequence import ifcopenshell.api.classification import ifcopenshell.api.cost -from typing import Any, Optional, TYPE_CHECKING +from typing import Any, Optional, TYPE_CHECKING, Union +from mathutils import Color import time import socket import sys @@ -790,8 +791,8 @@ class Web(bonsai.core.tool.Web): calculates the mixed colors, and sends the theme data to the Web UI. """ - def get_color(theme, attribute) -> tuple[Any, ...]: - return tuple(getattr(theme, attribute)[:]) + def to_tuple(theme: Union[Color, bpy.types.bpy_prop_array[float]]) -> tuple[float, ...]: + return tuple(theme[:]) def mix_colors(color1, color2): alpha1 = color1[3] * 255 if len(color1) > 3 else 255 @@ -803,33 +804,50 @@ class Web(bonsai.core.tool.Web): blue = (color1[2] * (255 - alpha2) + color2[2] * alpha2) / 255 return red, green, blue, alpha / 255 - prefs = bpy.context.preferences.themes[0].preferences.space - panel = prefs.panelcolors - view_3d = bpy.context.preferences.themes[0].view_3d - top_bar = bpy.context.preferences.themes[0].topbar.space - info = bpy.context.preferences.themes[0].info - outliner = bpy.context.preferences.themes[0].outliner - ui = bpy.context.preferences.themes[0].user_interface + assert (blender_preferences := bpy.context.preferences) + blender_theme = blender_preferences.themes[0] + prefs = blender_theme.preferences.space + + if tool.Blender.BLENDER_5 or TYPE_CHECKING: + theme_ui = blender_theme.user_interface + theme_regions = blender_theme.regions + panel_header, panel_back, panel_sub_back = ( + theme_ui.panel_header, + theme_ui.panel_back, + theme_ui.panel_sub_back, + ) + tab_back, tab_outline = theme_regions.sidebars.tab_back, theme_ui.wcol_tab.outline + else: + # Removed in Blender 5.0. + panel = prefs.panelcolors + tab_back, tab_outline = prefs.tab_back, prefs.tab_outline + panel_header, panel_back, panel_sub_back = panel.header, panel.back, panel.sub_back + + view_3d = blender_theme.view_3d + top_bar = blender_theme.topbar.space + info = blender_theme.info + outliner = blender_theme.outliner + ui = blender_theme.user_interface theme = { - "window_background": get_color(prefs, "back"), - "text": get_color(prefs, "text"), - "tab_background": get_color(prefs, "tab_back"), - "tab_outline": get_color(prefs, "tab_outline"), - "panel_header": get_color(panel, "header"), - "panel_background": mix_colors(get_color(panel, "back"), get_color(panel, "sub_back")), - "top_bar_header": get_color(top_bar, "header"), - "top_bar_header_text": get_color(top_bar, "header_text"), - "active_object": get_color(view_3d, "object_active"), - "selected_object": get_color(view_3d, "object_selected"), - "info_warning": get_color(info, "info_warning_text"), - "odd_row": get_color(outliner.space, "back"), - "even_row": mix_colors(get_color(outliner.space, "back"), get_color(outliner, "row_alternate")), - "active_highlight": get_color(outliner, "active"), - "active_text_highlight": get_color(outliner, "active_object"), - "button_background": get_color(ui.wcol_tool, "inner"), - "button_test": get_color(ui.wcol_tool, "text"), - "button_border": get_color(ui.wcol_tool, "outline"), + "window_background": prefs.back[:], + "text": to_tuple(prefs.text), + "tab_background": to_tuple(tab_back), + "tab_outline": to_tuple(tab_outline), + "panel_header": to_tuple(panel_header), + "panel_background": mix_colors(to_tuple(panel_back), to_tuple(panel_sub_back)), + "top_bar_header": to_tuple(top_bar.header), + "top_bar_header_text": to_tuple(top_bar.header_text), + "active_object": to_tuple(view_3d.object_active), + "selected_object": to_tuple(view_3d.object_selected), + "info_warning": to_tuple(info.info_warning_text), + "odd_row": to_tuple(outliner.space.back), + "even_row": mix_colors(to_tuple(outliner.space.back), to_tuple(outliner.row_alternate)), + "active_highlight": to_tuple(outliner.active), + "active_text_highlight": to_tuple(outliner.active_object), + "button_background": to_tuple(ui.wcol_tool.inner), + "button_test": to_tuple(ui.wcol_tool.text), + "button_border": to_tuple(ui.wcol_tool.outline), } cls.send_webui_data(theme, "theme", "theme_data", use_web_data=False)