From 228e9d0571c25642b176af1fe886031d1878fca7 Mon Sep 17 00:00:00 2001 From: tim Date: Sun, 12 Jan 2025 10:47:34 -0500 Subject: [PATCH] Refactor detect_icon_color_mode to accept attribute path suffix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Removed bpy.context.preferences.themes[0] from the input and hardcoded it in the function. • color_path now only requires the attribute path suffix (e.g., "user_interface.wcol_regular.text"). • Updated error handling to default to "dm" instead of "lm". --- src/bonsai/bonsai/bim/module/cad/workspace.py | 2 +- .../bonsai/bim/module/model/workspace.py | 2 +- src/bonsai/bonsai/tool/blender.py | 34 ++++++++++--------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/cad/workspace.py b/src/bonsai/bonsai/bim/module/cad/workspace.py index a99de2287b..7042c74ff3 100644 --- a/src/bonsai/bonsai/bim/module/cad/workspace.py +++ b/src/bonsai/bonsai/bim/module/cad/workspace.py @@ -29,7 +29,7 @@ from typing import Union def load_custom_icons(): global custom_icon_previews, display_mode if display_mode is None: - display_mode = tool.Blender.detect_icon_color_mode("ToolText") + display_mode = tool.Blender.detect_icon_color_mode("user_interface.wcol_tool.text") icons_dir = os.path.join(os.path.dirname(__file__), "..", "..", "data", "icons") custom_icon_previews = bpy.utils.previews.new() diff --git a/src/bonsai/bonsai/bim/module/model/workspace.py b/src/bonsai/bonsai/bim/module/model/workspace.py index 9f75c2f2c9..4ece2f4b97 100644 --- a/src/bonsai/bonsai/bim/module/model/workspace.py +++ b/src/bonsai/bonsai/bim/module/model/workspace.py @@ -35,7 +35,7 @@ from typing import Optional, Union def load_custom_icons(): global custom_icon_previews, display_mode if display_mode is None: - display_mode = tool.Blender.detect_icon_color_mode("ToolText") + display_mode = tool.Blender.detect_icon_color_mode("user_interface.wcol_tool.text") icons_dir = os.path.join(os.path.dirname(__file__), "..", "..", "data", "icons") custom_icon_previews = bpy.utils.previews.new() diff --git a/src/bonsai/bonsai/tool/blender.py b/src/bonsai/bonsai/tool/blender.py index c0c2b34dc1..470874a2cb 100644 --- a/src/bonsai/bonsai/tool/blender.py +++ b/src/bonsai/bonsai/tool/blender.py @@ -1421,27 +1421,29 @@ class Blender(bonsai.core.tool.Blender): return Vector(args) @classmethod - def detect_icon_color_mode(cls, key="RegularText", threshold=1.671): + def detect_icon_color_mode(cls, color_path="user_interface.wcol_regular.text", threshold=1.671): """ - Uses the color of text to determine if custom icons should be dark mode (dm) or light mode (mode). + Uses the text color of a given Blender UI property to determine if custom icons should be dark mode (dm) or light mode (lm). + + Common Blender UI text color paths: + - "user_interface.wcol_regular.text" (Regular Text) + - "user_interface.wcol_tool.text" (Tool Text) + - "user_interface.wcol_menu_back.text" (Menu Background Text) + - "user_interface.wcol_menu.text" (Menu Text) + - "user_interface.wcol_menu.text_sel" (Menu Text Selected) Args: - key (str): The key representing the UI element (e.g., "RegularText"). + color_path (str, optional): The attribute path relative to bpy.context.preferences.themes[0]. threshold (float, optional): The RGB sum threshold for determining dark mode. Default is 1.671. Returns: str: 'dm' (dark mode) if the RGB sum is > threshold, otherwise 'lm' (light mode). """ - theme = bpy.context.preferences.themes[0] - ui_colors = { - "RegularText": theme.user_interface.wcol_regular.text[:3], # User Interface - Regular - Text - "ToolText": theme.user_interface.wcol_tool.text[:3], # User Interface - Tool - Text - "MenuBackgroundText": theme.user_interface.wcol_menu_back.text[ - :3 - ], # User Interface - Menu Background - Text - "MenuText": theme.user_interface.wcol_menu.text[:3], # User Interface - Menu - Text - "MenuTextSelected": theme.user_interface.wcol_menu.text_sel[:3], # User Interface - Menu - Selected - } - color = ui_colors.get(key, (0.0, 0.0, 0.0)) - rgb_sum = sum(color[:3]) - return "dm" if rgb_sum > threshold else "lm" + full_path = f"bpy.context.preferences.themes[0].{color_path}" + + try: + color = eval(full_path)[:3] # Dynamically evaluate and extract RGB values + rgb_sum = sum(color) + return "dm" if rgb_sum > threshold else "lm" + except Exception: + return "dm" # Default to dark mode if an error occurs