diff --git a/blender/arm/nodes_logic.py b/blender/arm/nodes_logic.py index 4a61c1f7..12f605fb 100755 --- a/blender/arm/nodes_logic.py +++ b/blender/arm/nodes_logic.py @@ -8,6 +8,7 @@ import arm.logicnode.arm_nodes as arm_nodes import arm.logicnode.replacement import arm.logicnode import arm.props_traits +import arm.ui_icons as ui_icons import arm.utils registered_nodes = [] @@ -174,7 +175,7 @@ class ARM_PT_LogicNodePanel(bpy.types.Panel): layout.operator('arm.open_node_documentation', icon='HELP') column = layout.column(align=True) column.operator('arm.open_node_python_source', icon='FILE_SCRIPT') - column.operator('arm.open_node_haxe_source', icon_value=arm.props_traits.icons_dict['haxe'].icon_id) + column.operator('arm.open_node_haxe_source', icon_value=ui_icons.get_id("haxe")) class ArmOpenNodeHaxeSource(bpy.types.Operator): diff --git a/blender/arm/props_traits.py b/blender/arm/props_traits.py index 7dd5c429..2353c1da 100755 --- a/blender/arm/props_traits.py +++ b/blender/arm/props_traits.py @@ -11,6 +11,7 @@ import bpy.utils.previews import arm.make as make from arm.props_traits_props import * import arm.proxy as proxy +import arm.ui_icons as ui_icons import arm.utils import arm.write_data as write_data @@ -94,13 +95,13 @@ class ARM_UL_TraitList(bpy.types.UIList): custom_icon = "NONE" custom_icon_value = 0 if item.type_prop == "Haxe Script": - custom_icon_value = icons_dict["haxe"].icon_id + custom_icon_value = ui_icons.get_id("haxe") elif item.type_prop == "WebAssembly": - custom_icon_value = icons_dict["wasm"].icon_id + custom_icon_value = ui_icons.get_id("wasm") elif item.type_prop == "UI Canvas": custom_icon = "NODE_COMPOSITING" elif item.type_prop == "Bundled Script": - custom_icon_value = icons_dict["bundle"].icon_id + custom_icon_value = ui_icons.get_id("bundle") elif item.type_prop == "Logic Nodes": custom_icon = 'NODETREE' @@ -862,8 +863,8 @@ def draw_traits_panel(layout: bpy.types.UILayout, obj: Union[bpy.types.Object, b row = layout.row() row.template_list("ARM_UL_PropList", "The_List", item, "arm_traitpropslist", item, "arm_traitpropslist_index", rows=propsrows) + def register(): - global icons_dict bpy.utils.register_class(ArmTraitListItem) bpy.utils.register_class(ARM_UL_TraitList) bpy.utils.register_class(ArmTraitListNewItem) @@ -891,14 +892,8 @@ def register(): bpy.types.Scene.arm_traitlist = CollectionProperty(type=ArmTraitListItem) bpy.types.Scene.arm_traitlist_index = IntProperty(name="Index for arm_traitlist", default=0) - icons_dict = bpy.utils.previews.new() - icons_dir = os.path.join(os.path.dirname(__file__), "custom_icons") - icons_dict.load("haxe", os.path.join(icons_dir, "haxe.png"), 'IMAGE') - icons_dict.load("wasm", os.path.join(icons_dir, "wasm.png"), 'IMAGE') - icons_dict.load("bundle", os.path.join(icons_dir, "bundle.png"), 'IMAGE') def unregister(): - global icons_dict bpy.utils.unregister_class(ARM_OT_CopyTraitsFromActive) bpy.utils.unregister_class(ArmTraitListItem) bpy.utils.unregister_class(ARM_UL_TraitList) @@ -920,4 +915,3 @@ def unregister(): bpy.utils.unregister_class(ArmRefreshCanvasListButton) bpy.utils.unregister_class(ARM_PT_TraitPanel) bpy.utils.unregister_class(ARM_PT_SceneTraitPanel) - bpy.utils.previews.remove(icons_dict) diff --git a/blender/arm/props_ui.py b/blender/arm/props_ui.py index 4de624e3..304f635f 100644 --- a/blender/arm/props_ui.py +++ b/blender/arm/props_ui.py @@ -15,6 +15,7 @@ import arm.props_properties import arm.props_traits import arm.nodes_logic import arm.proxy +import arm.ui_icons as ui_icons import arm.utils from arm.lightmapper.utility import icon @@ -2574,7 +2575,7 @@ def draw_custom_node_menu(self, context): layout = self.layout layout.separator() layout.operator("arm.open_node_documentation", text="Show documentation for this node", icon='HELP') - layout.operator("arm.open_node_haxe_source", text="Open .hx source in the browser", icon_value=arm.props_traits.icons_dict['haxe'].icon_id) + layout.operator("arm.open_node_haxe_source", text="Open .hx source in the browser", icon_value=ui_icons.get_id("haxe")) layout.operator("arm.open_node_python_source", text="Open .py source in the browser", icon='FILE_SCRIPT') elif context.space_data.tree_type == 'ShaderNodeTree': diff --git a/blender/arm/ui_icons.py b/blender/arm/ui_icons.py new file mode 100644 index 00000000..f9364dd7 --- /dev/null +++ b/blender/arm/ui_icons.py @@ -0,0 +1,34 @@ +""" +Blender user interface icon handling. +""" +import os.path +from typing import Optional + +import bpy.utils.previews + +_icons_dict: Optional[bpy.utils.previews.ImagePreviewCollection] = None +"""Dictionary of all loaded icons, or `None` if not loaded""" + +_icons_dir = os.path.join(os.path.dirname(__file__), "custom_icons") +"""Directory of the icon files""" + + +def _load_icons() -> None: + """(Re)loads all icons""" + global _icons_dict + + if _icons_dict is not None: + bpy.utils.previews.remove(_icons_dict) + + _icons_dict = bpy.utils.previews.new() + _icons_dict.load("armory", os.path.join(_icons_dir, "armory.png"), 'IMAGE') + _icons_dict.load("bundle", os.path.join(_icons_dir, "bundle.png"), 'IMAGE') + _icons_dict.load("haxe", os.path.join(_icons_dir, "haxe.png"), 'IMAGE') + _icons_dict.load("wasm", os.path.join(_icons_dir, "wasm.png"), 'IMAGE') + + +def get_id(identifier: str) -> int: + """Returns the icon ID from the given identifier""" + if _icons_dict is None: + _load_icons() + return _icons_dict[identifier].icon_id