Show.gd 1.9 KB

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