95 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from lnx.logicnode.lnx_nodes import *
 | |
| 
 | |
| 
 | |
| class JSEventTargetNode(LnxLogicTreeNode):
 | |
|     """JS Event Target"""
 | |
|     bl_idname = 'LNJSEventTargetNode'
 | |
|     bl_label = 'JS Event Target'
 | |
|     bl_description = 'Event Target is an interface implemented by objects that can receive events and may have listeners for them.'
 | |
|     lnx_category = 'HTML'
 | |
|     lnx_version = 1
 | |
| 
 | |
|     @staticmethod
 | |
|     def get_enum_id_value(obj, prop_name, value):
 | |
|         return obj.bl_rna.properties[prop_name].enum_items[value].identifier
 | |
| 
 | |
|     @staticmethod
 | |
|     def get_count_in(type_name):
 | |
|         return {
 | |
|             'addEventListener': 0,
 | |
|             'removeEventListener': 1,
 | |
|             'dispatchEvent': 2,
 | |
|         }.get(type_name, 0)
 | |
| 
 | |
|     def get_enum(self):
 | |
|         return self.get('property0', 0)
 | |
| 
 | |
|     def set_enum(self, value):
 | |
|         # Checking the selection of each type
 | |
|         select_current = self.get_enum_id_value(self, 'property0', value)
 | |
|         select_prev = self.property0
 | |
| 
 | |
|         #Check if type changed
 | |
|         if select_prev != select_current:
 | |
| 
 | |
|             for i in self.inputs:
 | |
|                 self.inputs.remove(i)
 | |
| 
 | |
|             # Arguements for type Client
 | |
|             index = self.get_count_in(select_current)
 | |
|      
 | |
|             match index:
 | |
|                 case 2: 
 | |
|                     self.add_input('LnxNodeSocketAction', 'In')
 | |
|                     self.add_input('LnxDynamicSocket', 'JS Object')
 | |
|                     self.add_input('LnxDynamicSocket', 'Event')
 | |
|                 case _:
 | |
|                     self.add_input('LnxNodeSocketAction', 'In')
 | |
|                     self.add_input('LnxDynamicSocket', 'JS Object')
 | |
|                     self.add_input('LnxStringSocket', 'Type')
 | |
|                     self.add_input('LnxDynamicSocket', 'Listener')
 | |
|                     self.add_input('LnxDynamicSocket', 'Options')
 | |
|                     self.add_input('LnxBoolSocket', 'unTrusted')
 | |
| 
 | |
|         self['property0'] = value
 | |
| 
 | |
|     property0: HaxeEnumProperty(
 | |
|         'property0',
 | |
|         items = [('addEventListener', 'addEventListener', 'Add an event listener to the object'),
 | |
|                 ('removeEventListener', 'removeEventListener', 'Remove an event listener to the object'),
 | |
|                 ('dispatchEvent', 'dispatchEvent', 'Dispatch an event to the object listener')],
 | |
|         name='', 
 | |
|         default='addEventListener',
 | |
|         set=set_enum, 
 | |
|         get=get_enum)   
 | |
| 
 | |
|     property1: HaxeEnumProperty(
 | |
|         'property1',
 | |
|         items = [('inline', 'Inline Function', 'Inline function to evaluate on event'),
 | |
|                 ('callable', 'Callable Function', 'Callable function to trigger on event'),
 | |
|                 ('event', 'Event Listener', 'Bind event to existing event listener'),
 | |
|                 ('output', 'Bind output', 'Trigger node output on JS event')],
 | |
|         name='', 
 | |
|         default='inline')
 | |
| 
 | |
|     def lnx_init(self, context):
 | |
|         self.add_input('LnxNodeSocketAction', 'In')
 | |
|         self.add_input('LnxDynamicSocket', 'JS Object')
 | |
|         self.add_input('LnxStringSocket', 'Type')
 | |
|         self.add_input('LnxDynamicSocket', 'Listener')
 | |
|         self.add_input('LnxDynamicSocket', 'Options')
 | |
|         self.add_input('LnxBoolSocket', 'WantsUnTrusted')
 | |
| 
 | |
|         self.add_output('LnxNodeSocketAction', 'Out')
 | |
| 
 | |
| 
 | |
|     def draw_buttons(self, context, layout):
 | |
|         layout.prop(self, 'property0')
 | |
|         if str(self.property0) == 'addEventListener':
 | |
|             layout.prop(self, 'property1')
 | |
| 
 | |
| 
 | |
| def register():
 | |
|     add_category('HTML', icon='SEQ_STRIP_META')
 | |
|     JSEventTargetNode.on_register()
 |