Files
Kalulu/sources/language_tool/lesson_container.gd
T
Adrien Ufferte deda564993 Clean & debug
2025-06-24 15:52:19 +02:00

97 lines
3.0 KiB
GDScript

extends MarginContainer
class_name LessonContainer
var gp_label_scene: PackedScene = preload("res://sources/language_tool/lesson_gp_label.tscn")
signal lesson_dropped(before: bool, number: int, dropped_number: int)
var number: int = 0:
set = set_number
@onready var gp_container: HBoxContainer = $%GPContainer
@onready var number_label: Label = $%NumberLabel
func set_number(p_number: int) -> void:
number = p_number
if number_label:
number_label.text = str(number)
func add_gp(new_gp: Dictionary) -> void:
var gp_label: LessonGPLabel = gp_label_scene.instantiate()
gp_label.grapheme = new_gp.grapheme
gp_label.phoneme = new_gp.phoneme
gp_label.gp_id = new_gp.gp_id
gp_container.add_child(gp_label)
gp_label.gp_dropped.connect(_on_gp_dropped.bind(gp_label))
func _on_gp_dropped(before: bool, data: Dictionary, gp_label: Control) -> void:
var new_gp_label: LessonGPLabel = gp_label_scene.instantiate()
new_gp_label.grapheme = data.grapheme
new_gp_label.phoneme = data.phoneme
new_gp_label.gp_id = data.gp_id
new_gp_label.gp_dropped.connect(_on_gp_dropped.bind(new_gp_label))
gp_container.add_child(new_gp_label)
var children: Array[Node] = gp_container.get_children()
for index: int in range(children.size()):
var child: Node = children[index]
if child == gp_label:
if before:
gp_container.move_child(new_gp_label, index)
else:
gp_container.move_child(new_gp_label, index + 1)
func _can_drop_in_gp_container(_at_position: Vector2, data: Variant) -> bool:
@warning_ignore("unsafe_method_access")
return data.has("gp_id")
func _drop_data_in_gp_container(_at_position: Vector2, data: Variant) -> void:
@warning_ignore("unsafe_method_access")
if not data.has("gp_id"):
return
var new_gp_label: LessonGPLabel = gp_label_scene.instantiate()
new_gp_label.grapheme = data.grapheme
new_gp_label.phoneme = data.phoneme
new_gp_label.gp_id = data.gp_id
new_gp_label.gp_dropped.connect(_on_gp_dropped.bind(new_gp_label))
gp_container.add_child(new_gp_label)
gp_container.move_child(new_gp_label, 0)
func _ready() -> void:
gp_container.set_drag_forwarding(Callable(), _can_drop_in_gp_container, _drop_data_in_gp_container)
func _get_drag_data(_at_position: Vector2) -> Variant:
set_drag_preview(self.duplicate() as Control)
return { number = number }
func _can_drop_data(at_position: Vector2, data: Variant) -> bool:
@warning_ignore("unsafe_method_access")
return (data.has("number") and number != data.number) or _can_drop_in_gp_container(at_position, data)
func _drop_data(at_position: Vector2, data: Variant) -> void:
@warning_ignore("unsafe_method_access")
if not (data.has("number") or data.has("gp_id")):
return
@warning_ignore("unsafe_method_access")
if data.has("number"):
var before: bool = at_position.y < size.y
lesson_dropped.emit(before, number, data.number)
else:
_drop_data_in_gp_container(at_position, data)
func get_gp_ids() -> Array[int]:
var res: Array[int] = []
for gp: LessonGPLabel in gp_container.get_children():
res.append(gp.gp_id)
return res