Show.gd 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. class_name Show
  2. extends Node2D
  3. # Manage slide cycling
  4. signal new_focus(pos: Vector2, scale: float)
  5. const VOID_SLIDE_ID := -1
  6. @export var start_slide := 0
  7. var current_id := VOID_SLIDE_ID
  8. var current_slide: Slide
  9. @onready var slides: Array = get_children()
  10. func _ready():
  11. _enforce()
  12. next_slide()
  13. func next_slide():
  14. _disconnect_current_slide()
  15. current_id = _next_id()
  16. current_slide = focus_slide(current_id)
  17. _connect_current_slide()
  18. func focus_slide(id: int) -> Slide:
  19. var slide: Slide = slides[id]
  20. slide.focus()
  21. new_focus.emit(slide.get_center(), slide.get_scale().x)
  22. return slide
  23. func _disconnect_current_slide():
  24. if current_slide != null:
  25. current_slide.finished.disconnect(_on_current_slide_finished)
  26. func _connect_current_slide():
  27. current_slide.finished.connect(_on_current_slide_finished)
  28. func _enforce() -> void:
  29. _enforce_parameters()
  30. _enforce_children()
  31. func _enforce_parameters() -> void:
  32. assert(start_slide >= 0,
  33. "Negative index is not supported for start_slide")
  34. assert(start_slide < slides.size(),
  35. "start_slide index is out of bound (max is %s)" % (slides.size() - 1))
  36. func _enforce_children() -> void:
  37. assert(!slides.is_empty(), "A slideshow must contain slides")
  38. for slide in slides:
  39. assert(slide is Slide, "A slideshow can only contain slides")
  40. func _next_id() -> int:
  41. if current_id == VOID_SLIDE_ID:
  42. return start_slide
  43. var next_id: int = current_id + 1
  44. if next_id >= slides.size():
  45. return 0
  46. return next_id
  47. func _on_current_slide_finished():
  48. next_slide()