Files
Kalulu/sources/language_tool/tracing_builder.gd
T
2025-09-05 15:55:48 +02:00

139 lines
4.3 KiB
GDScript

extends Control
const EXTENSION: String = ".csv"
@export var gradient: Gradient
var letters: Array[String] = []
var current_letter: int = -1
@onready var lower_container: SegmentContainer = %Lower
@onready var upper_container: SegmentContainer = %Upper
@onready var letter_picker: OptionButton = %LetterPicker
@onready var save_ok: TextureRect = %SaveOk
@onready var copy_from: MenuButton = %CopyFrom
func _ready() -> void:
copy_from.get_popup().id_pressed.connect(_on_copy_from_id_pressed)
lower_container.gradient = gradient
upper_container.gradient = gradient
_find_all_letters()
_next_letter()
func _find_all_letters() -> void:
letters = []
var query: String = "Select * FROM GPs"
Database.db.query(query)
var result: Array[Dictionary] = Database.db.query_result
for element: Dictionary in result:
for letter: String in element.Grapheme:
if not letter in letters:
letters.append(letter)
letter_picker.add_item(letter)
copy_from.get_popup().add_item(letter)
func _next_letter() -> void:
current_letter = (current_letter + 1) % letters.size()
await lower_container.reset()
await upper_container.reset()
lower_container.grapheme_label.text = letters[current_letter].to_lower()
upper_container.grapheme_label.text = letters[current_letter].to_upper()
_load_segments(lower_container, lower_path(letters[current_letter]))
_load_segments(upper_container, upper_path(letters[current_letter]))
letter_picker.selected = current_letter
save_ok.visible = true
func _load_segments(segment_container: SegmentContainer, path: String) -> void:
if not FileAccess.file_exists(real_path(path)):
return
var file: FileAccess = FileAccess.open(real_path(path), FileAccess.READ)
var error: Error = FileAccess.get_open_error()
if error != OK:
Logger.error("TracingBuilder: Load segment: Cannot open file %s. Error: %s" % [real_path(path), error_string(error)])
return
if file == null:
Logger.error("TracingBuilder: Load segment: Cannot open file %s. File is null" % real_path(path))
return
while not file.eof_reached():
var line: PackedStringArray = file.get_csv_line()
var points: Array[Vector2] = []
for element: String in line:
if element == "":
break
var point: PackedStringArray = element.split(" ")
points.append(Vector2(float(point[0]), float(point[1])))
if not points.is_empty():
segment_container.load_segment(points)
func _save_segments(segments: Array[SegmentBuild], path: String) -> void:
DirAccess.make_dir_recursive_absolute(Database.BASE_PATH.path_join(Database.language).path_join(Database.TRACING_DATA_FOLDER))
var file: FileAccess = FileAccess.open(real_path(path), FileAccess.WRITE)
var error: Error = FileAccess.get_open_error()
if error != OK:
Logger.error("TracingBuilder: Save segment: Cannot open file %s. Error: %s" % [real_path(path), error_string(error)])
return
if file == null:
Logger.error("TracingBuilder: Save segment: Cannot open file %s. File is null" % real_path(path))
return
for segment: SegmentBuild in segments:
var values: PackedStringArray = []
for point: Vector2 in segment.points:
values.append(str(point.x) + " " + str(point.y))
file.store_csv_line(values)
file.close()
func lower_path(letter: String) -> String:
return letter + "_lower"
func upper_path(letter: String) -> String:
return letter + "_upper"
func real_path(path: String) -> String:
return Database.BASE_PATH.path_join(Database.language).path_join(Database.TRACING_DATA_FOLDER).path_join(path) + EXTENSION
func _on_save_button_pressed() -> void:
_save_segments(lower_container.segments_container.get_children() as Array[SegmentBuild], lower_path(letters[current_letter]))
_save_segments(upper_container.segments_container.get_children() as Array[SegmentBuild], upper_path(letters[current_letter]))
save_ok.visible = true
func _on_back_button_pressed() -> void:
get_tree().change_scene_to_file("res://sources/language_tool/prof_tool_menu.tscn")
func _on_letter_picker_item_selected(index: int) -> void:
current_letter = index - 1
_next_letter()
func _on_copy_from_id_pressed(index: int) -> void:
_load_segments(lower_container, lower_path(letters[index]))
_load_segments(upper_container, upper_path(letters[index]))
func _on_lower_container_changed() -> void:
save_ok.visible = false
func _on_upper_container_changed() -> void:
save_ok.visible = false