immersive-home/lib/globals/event_system.gd

56 lines
1.3 KiB
GDScript3
Raw Normal View History

2023-11-22 02:44:07 +02:00
extends Node
const FN_PREFIX = "_on_"
const SIGNAL_PREFIX = "on_"
# Interaction Events
signal on_click(event: EventRay)
signal on_press_down(event: EventRay)
signal on_press_move(event: EventRay)
signal on_press_up(event: EventRay)
signal on_grab_down(event: EventRay)
signal on_grab_move(event: EventRay)
signal on_grab_up(event: EventRay)
signal on_ray_enter(event: EventRay)
signal on_ray_leave(event: EventRay)
signal on_key_down(event: EventKey)
signal on_key_up(event: EventKey)
func emit(type: String, event: Event):
if event is EventBubble:
_bubble_call(type, event.target, event)
else:
_root_call(type, event)
func _bubble_call(type: String, target: Variant, event: EventBubble):
if target == null:
return
if target.has_method(FN_PREFIX + type):
var updated_event = target.call(FN_PREFIX + type, event)
if updated_event is EventBubble:
updated_event.merge(event)
event = updated_event
if event.bubbling == false:
return
for child in target.get_children():
if child is Function && child.has_method(FN_PREFIX + type):
child.call(FN_PREFIX + type, event)
var parent = target.get_parent()
if parent != null && parent is Node:
_bubble_call(type, parent, event)
else:
# in case the top has been reached
_root_call(type, event)
func _root_call(type: String, event: Event):
get(SIGNAL_PREFIX + type).emit(event)