Move icon code into module

This, combined with lazy loading, has the advantage of using icons in property definitions before the actual registration code runs
This commit is contained in:
Moritz Brückner 2021-01-15 19:26:31 +01:00
parent fa7f58e4dd
commit ee1b55184c
4 changed files with 43 additions and 13 deletions

View file

@ -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):

View file

@ -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)

View file

@ -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':

34
blender/arm/ui_icons.py Normal file
View file

@ -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