forked from LeenkxTeam/LNXSDK
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())
|