283 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			283 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								"""Custom bpy property creators for logic nodes. Please be aware that
							 | 
						||
| 
								 | 
							
								the code in this file is usually run once at registration and not for
							 | 
						||
| 
								 | 
							
								each individual node instance when it is created.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The functions for creating typed properties wrap the private __haxe_prop
							 | 
						||
| 
								 | 
							
								function to allow for IDE autocompletion.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Some default parameters in the signature of functions in this module are
							 | 
						||
| 
								 | 
							
								mutable (common Python pitfall, be aware of this!), but because they
							 | 
						||
| 
								 | 
							
								don't get accessed later it doesn't matter here and we keep it this way
							 | 
						||
| 
								 | 
							
								for parity with the Blender API.
							 | 
						||
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								from typing import Any, Callable, Sequence, Union
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import sys
							 | 
						||
| 
								 | 
							
								import bpy
							 | 
						||
| 
								 | 
							
								from bpy.props import *
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								__all__ = [
							 | 
						||
| 
								 | 
							
								    'HaxeBoolProperty',
							 | 
						||
| 
								 | 
							
								    'HaxeBoolVectorProperty',
							 | 
						||
| 
								 | 
							
								    'HaxeCollectionProperty',
							 | 
						||
| 
								 | 
							
								    'HaxeEnumProperty',
							 | 
						||
| 
								 | 
							
								    'HaxeFloatProperty',
							 | 
						||
| 
								 | 
							
								    'HaxeFloatVectorProperty',
							 | 
						||
| 
								 | 
							
								    'HaxeIntProperty',
							 | 
						||
| 
								 | 
							
								    'HaxeIntVectorProperty',
							 | 
						||
| 
								 | 
							
								    'HaxePointerProperty',
							 | 
						||
| 
								 | 
							
								    'HaxeStringProperty',
							 | 
						||
| 
								 | 
							
								    'RemoveHaxeProperty'
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def __haxe_prop(prop_type: Callable, prop_name: str, *args, **kwargs) -> Any:
							 | 
						||
| 
								 | 
							
								    """Declares a logic node property as a property that will be
							 | 
						||
| 
								 | 
							
								    used ingame for a logic node."""
							 | 
						||
| 
								 | 
							
								    update_callback: Callable = kwargs.get('update', None)
							 | 
						||
| 
								 | 
							
								    if update_callback is None:
							 | 
						||
| 
								 | 
							
								        def wrapper(self: bpy.types.Node, context: bpy.types.Context):
							 | 
						||
| 
								 | 
							
								            self.on_prop_update(context, prop_name)
							 | 
						||
| 
								 | 
							
								        kwargs['update'] = wrapper
							 | 
						||
| 
								 | 
							
								    else:
							 | 
						||
| 
								 | 
							
								        def wrapper(self: bpy.types.Node, context: bpy.types.Context):
							 | 
						||
| 
								 | 
							
								            update_callback(self, context)
							 | 
						||
| 
								 | 
							
								            self.on_prop_update(context, prop_name)
							 | 
						||
| 
								 | 
							
								        kwargs['update'] = wrapper
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Tags are not allowed on classes other than bpy.types.ID or
							 | 
						||
| 
								 | 
							
								    # bpy.types.Bone, remove them here to prevent registration errors
							 | 
						||
| 
								 | 
							
								    if 'tags' in kwargs:
							 | 
						||
| 
								 | 
							
								        del kwargs['tags']
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return prop_type(*args, **kwargs)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def HaxeBoolProperty(
							 | 
						||
| 
								 | 
							
								        prop_name: str,
							 | 
						||
| 
								 | 
							
								        *,  # force passing further arguments as keywords, see PEP 3102
							 | 
						||
| 
								 | 
							
								        name: str = "",
							 | 
						||
| 
								 | 
							
								        description: str = "",
							 | 
						||
| 
								 | 
							
								        default=False,
							 | 
						||
| 
								 | 
							
								        options: set = {'ANIMATABLE'},
							 | 
						||
| 
								 | 
							
								        override: set = set(),
							 | 
						||
| 
								 | 
							
								        tags: set = set(),
							 | 
						||
| 
								 | 
							
								        subtype: str = 'NONE',
							 | 
						||
| 
								 | 
							
								        update=None,
							 | 
						||
| 
								 | 
							
								        get=None,
							 | 
						||
| 
								 | 
							
								        set=None
							 | 
						||
| 
								 | 
							
								) -> 'bpy.types.BoolProperty':
							 | 
						||
| 
								 | 
							
								    """Declares a new BoolProperty that has a Haxe counterpart with the
							 | 
						||
| 
								 | 
							
								    given prop_name (Python and Haxe names must be identical for now).
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    return __haxe_prop(BoolProperty, **locals())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def HaxeBoolVectorProperty(
							 | 
						||
| 
								 | 
							
								        prop_name: str,
							 | 
						||
| 
								 | 
							
								        *,
							 | 
						||
| 
								 | 
							
								        name: str = "",
							 | 
						||
| 
								 | 
							
								        description: str = "",
							 | 
						||
| 
								 | 
							
								        default: list = (False, False, False),
							 | 
						||
| 
								 | 
							
								        options: set = {'ANIMATABLE'},
							 | 
						||
| 
								 | 
							
								        override: set = set(),
							 | 
						||
| 
								 | 
							
								        tags: set = set(),
							 | 
						||
| 
								 | 
							
								        subtype: str = 'NONE',
							 | 
						||
| 
								 | 
							
								        size: int = 3,
							 | 
						||
| 
								 | 
							
								        update=None,
							 | 
						||
| 
								 | 
							
								        get=None,
							 | 
						||
| 
								 | 
							
								        set=None
							 | 
						||
| 
								 | 
							
								) -> list['bpy.types.BoolProperty']:
							 | 
						||
| 
								 | 
							
								    """Declares a new BoolVectorProperty that has a Haxe counterpart
							 | 
						||
| 
								 | 
							
								    with the given prop_name (Python and Haxe names must be identical
							 | 
						||
| 
								 | 
							
								    for now).
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    return __haxe_prop(BoolVectorProperty, **locals())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def HaxeCollectionProperty(
							 | 
						||
| 
								 | 
							
								        prop_name: str,
							 | 
						||
| 
								 | 
							
								        *,
							 | 
						||
| 
								 | 
							
								        type=None,
							 | 
						||
| 
								 | 
							
								        name: str = "",
							 | 
						||
| 
								 | 
							
								        description: str = "",
							 | 
						||
| 
								 | 
							
								        options: set = {'ANIMATABLE'},
							 | 
						||
| 
								 | 
							
								        override: set = set(),
							 | 
						||
| 
								 | 
							
								        tags: set = set()
							 | 
						||
| 
								 | 
							
								) -> 'bpy.types.CollectionProperty':
							 | 
						||
| 
								 | 
							
								    """Declares a new CollectionProperty that has a Haxe counterpart
							 | 
						||
| 
								 | 
							
								    with the given prop_name (Python and Haxe names must be identical
							 | 
						||
| 
								 | 
							
								    for now).
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    return __haxe_prop(CollectionProperty, **locals())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def HaxeEnumProperty(
							 | 
						||
| 
								 | 
							
								        prop_name: str,
							 | 
						||
| 
								 | 
							
								        *,
							 | 
						||
| 
								 | 
							
								        items: Sequence,
							 | 
						||
| 
								 | 
							
								        name: str = "",
							 | 
						||
| 
								 | 
							
								        description: str = "",
							 | 
						||
| 
								 | 
							
								        default: Union[str, set[str]] = None,
							 | 
						||
| 
								 | 
							
								        options: set = {'ANIMATABLE'},
							 | 
						||
| 
								 | 
							
								        override: set = set(),
							 | 
						||
| 
								 | 
							
								        tags: set = set(),
							 | 
						||
| 
								 | 
							
								        update=None,
							 | 
						||
| 
								 | 
							
								        get=None,
							 | 
						||
| 
								 | 
							
								        set=None
							 | 
						||
| 
								 | 
							
								) -> 'bpy.types.EnumProperty':
							 | 
						||
| 
								 | 
							
								    """Declares a new EnumProperty that has a Haxe counterpart with the
							 | 
						||
| 
								 | 
							
								    given prop_name (Python and Haxe names must be identical for now).
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    return __haxe_prop(EnumProperty, **locals())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def HaxeFloatProperty(
							 | 
						||
| 
								 | 
							
								        prop_name: str,
							 | 
						||
| 
								 | 
							
								        *,
							 | 
						||
| 
								 | 
							
								        name: str = "",
							 | 
						||
| 
								 | 
							
								        description: str = "",
							 | 
						||
| 
								 | 
							
								        default=0.0,
							 | 
						||
| 
								 | 
							
								        min: float = -3.402823e+38,
							 | 
						||
| 
								 | 
							
								        max: float = 3.402823e+38,
							 | 
						||
| 
								 | 
							
								        soft_min: float = -3.402823e+38,
							 | 
						||
| 
								 | 
							
								        soft_max: float = 3.402823e+38,
							 | 
						||
| 
								 | 
							
								        step: int = 3,
							 | 
						||
| 
								 | 
							
								        precision: int = 2,
							 | 
						||
| 
								 | 
							
								        options: set = {'ANIMATABLE'},
							 | 
						||
| 
								 | 
							
								        override: set = set(),
							 | 
						||
| 
								 | 
							
								        tags: set = set(),
							 | 
						||
| 
								 | 
							
								        subtype: str = 'NONE',
							 | 
						||
| 
								 | 
							
								        unit: str = 'NONE',
							 | 
						||
| 
								 | 
							
								        update=None,
							 | 
						||
| 
								 | 
							
								        get=None,
							 | 
						||
| 
								 | 
							
								        set=None
							 | 
						||
| 
								 | 
							
								) -> 'bpy.types.FloatProperty':
							 | 
						||
| 
								 | 
							
								    """Declares a new FloatProperty that has a Haxe counterpart with the
							 | 
						||
| 
								 | 
							
								    given prop_name (Python and Haxe names must be identical for now).
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    return __haxe_prop(FloatProperty, **locals())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def HaxeFloatVectorProperty(
							 | 
						||
| 
								 | 
							
								        prop_name: str,
							 | 
						||
| 
								 | 
							
								        *,
							 | 
						||
| 
								 | 
							
								        name: str = "",
							 | 
						||
| 
								 | 
							
								        description: str = "",
							 | 
						||
| 
								 | 
							
								        default: list = (0.0, 0.0, 0.0),
							 | 
						||
| 
								 | 
							
								        min: float = sys.float_info.min,
							 | 
						||
| 
								 | 
							
								        max: float = sys.float_info.max,
							 | 
						||
| 
								 | 
							
								        soft_min: float = sys.float_info.min,
							 | 
						||
| 
								 | 
							
								        soft_max: float = sys.float_info.max,
							 | 
						||
| 
								 | 
							
								        step: int = 3,
							 | 
						||
| 
								 | 
							
								        precision: int = 2,
							 | 
						||
| 
								 | 
							
								        options: set = {'ANIMATABLE'},
							 | 
						||
| 
								 | 
							
								        override: set = set(),
							 | 
						||
| 
								 | 
							
								        tags: set = set(),
							 | 
						||
| 
								 | 
							
								        subtype: str = 'NONE',
							 | 
						||
| 
								 | 
							
								        unit: str = 'NONE',
							 | 
						||
| 
								 | 
							
								        size: int = 3,
							 | 
						||
| 
								 | 
							
								        update=None,
							 | 
						||
| 
								 | 
							
								        get=None,
							 | 
						||
| 
								 | 
							
								        set=None
							 | 
						||
| 
								 | 
							
								) -> list['bpy.types.FloatProperty']:
							 | 
						||
| 
								 | 
							
								    """Declares a new FloatVectorProperty that has a Haxe counterpart
							 | 
						||
| 
								 | 
							
								    with the given prop_name (Python and Haxe names must be identical
							 | 
						||
| 
								 | 
							
								    for now).
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    return __haxe_prop(FloatVectorProperty, **locals())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def HaxeIntProperty(
							 | 
						||
| 
								 | 
							
								        prop_name: str,
							 | 
						||
| 
								 | 
							
								        *,
							 | 
						||
| 
								 | 
							
								        name: str = "",
							 | 
						||
| 
								 | 
							
								        description: str = "",
							 | 
						||
| 
								 | 
							
								        default=0,
							 | 
						||
| 
								 | 
							
								        min: int = -2**31,
							 | 
						||
| 
								 | 
							
								        max: int = 2**31 - 1,
							 | 
						||
| 
								 | 
							
								        soft_min: int = -2**31,
							 | 
						||
| 
								 | 
							
								        soft_max: int = 2**31 - 1,
							 | 
						||
| 
								 | 
							
								        step: int = 1,
							 | 
						||
| 
								 | 
							
								        options: set = {'ANIMATABLE'},
							 | 
						||
| 
								 | 
							
								        override: set = set(),
							 | 
						||
| 
								 | 
							
								        tags: set = set(),
							 | 
						||
| 
								 | 
							
								        subtype: str = 'NONE',
							 | 
						||
| 
								 | 
							
								        update=None,
							 | 
						||
| 
								 | 
							
								        get=None,
							 | 
						||
| 
								 | 
							
								        set=None
							 | 
						||
| 
								 | 
							
								) -> 'bpy.types.IntProperty':
							 | 
						||
| 
								 | 
							
								    """Declares a new IntProperty that has a Haxe counterpart with the
							 | 
						||
| 
								 | 
							
								    given prop_name (Python and Haxe names must be identical for now).
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    return __haxe_prop(IntProperty, **locals())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def HaxeIntVectorProperty(
							 | 
						||
| 
								 | 
							
								        prop_name: str,
							 | 
						||
| 
								 | 
							
								        *,
							 | 
						||
| 
								 | 
							
								        name: str = "",
							 | 
						||
| 
								 | 
							
								        description: str = "",
							 | 
						||
| 
								 | 
							
								        default: list = (0, 0, 0),
							 | 
						||
| 
								 | 
							
								        min: int = -2**31,
							 | 
						||
| 
								 | 
							
								        max: int = 2**31 - 1,
							 | 
						||
| 
								 | 
							
								        soft_min: int = -2**31,
							 | 
						||
| 
								 | 
							
								        soft_max: int = 2**31 - 1,
							 | 
						||
| 
								 | 
							
								        step: int = 1,
							 | 
						||
| 
								 | 
							
								        options: set = {'ANIMATABLE'},
							 | 
						||
| 
								 | 
							
								        override: set = set(),
							 | 
						||
| 
								 | 
							
								        tags: set = set(),
							 | 
						||
| 
								 | 
							
								        subtype: str = 'NONE',
							 | 
						||
| 
								 | 
							
								        size: int = 3,
							 | 
						||
| 
								 | 
							
								        update=None,
							 | 
						||
| 
								 | 
							
								        get=None,
							 | 
						||
| 
								 | 
							
								        set=None
							 | 
						||
| 
								 | 
							
								) -> list['bpy.types.IntProperty']:
							 | 
						||
| 
								 | 
							
								    """Declares a new IntVectorProperty that has a Haxe counterpart with
							 | 
						||
| 
								 | 
							
								    the given prop_name (Python and Haxe names must be identical for now).
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    return __haxe_prop(IntVectorProperty, **locals())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def HaxePointerProperty(
							 | 
						||
| 
								 | 
							
								        prop_name: str,
							 | 
						||
| 
								 | 
							
								        *,
							 | 
						||
| 
								 | 
							
								        type=None,
							 | 
						||
| 
								 | 
							
								        name: str = "",
							 | 
						||
| 
								 | 
							
								        description: str = "",
							 | 
						||
| 
								 | 
							
								        options: set = {'ANIMATABLE'},
							 | 
						||
| 
								 | 
							
								        override: set = set(),
							 | 
						||
| 
								 | 
							
								        tags: set = set(),
							 | 
						||
| 
								 | 
							
								        poll=None,
							 | 
						||
| 
								 | 
							
								        update=None
							 | 
						||
| 
								 | 
							
								) -> 'bpy.types.PointerProperty':
							 | 
						||
| 
								 | 
							
								    """Declares a new PointerProperty that has a Haxe counterpart with
							 | 
						||
| 
								 | 
							
								    the given prop_name (Python and Haxe names must be identical for now).
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    return __haxe_prop(PointerProperty, **locals())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def RemoveHaxeProperty(cls, attr: str):
							 | 
						||
| 
								 | 
							
								    RemoveProperty(cls, attr)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def HaxeStringProperty(
							 | 
						||
| 
								 | 
							
								        prop_name: str,
							 | 
						||
| 
								 | 
							
								        *,
							 | 
						||
| 
								 | 
							
								        name: str = "",
							 | 
						||
| 
								 | 
							
								        description: str = "",
							 | 
						||
| 
								 | 
							
								        default: str = "",
							 | 
						||
| 
								 | 
							
								        maxlen: int = 0,
							 | 
						||
| 
								 | 
							
								        options: set = {'ANIMATABLE'},
							 | 
						||
| 
								 | 
							
								        override: set = set(),
							 | 
						||
| 
								 | 
							
								        tags: set = set(),
							 | 
						||
| 
								 | 
							
								        subtype: str = 'NONE',
							 | 
						||
| 
								 | 
							
								        update=None,
							 | 
						||
| 
								 | 
							
								        get=None,
							 | 
						||
| 
								 | 
							
								        set=None
							 | 
						||
| 
								 | 
							
								) -> 'bpy.types.StringProperty':
							 | 
						||
| 
								 | 
							
								    """Declares a new StringProperty that has a Haxe counterpart with
							 | 
						||
| 
								 | 
							
								    the given prop_name (Python and Haxe names must be identical for now).
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    return __haxe_prop(StringProperty, **locals())
							 |