338 lines
13 KiB
GDScript
338 lines
13 KiB
GDScript
extends Control
|
|
|
|
const base_path: = "user://language_resources/"
|
|
const save_file_path: = "user://prof_tool_save.tres"
|
|
var save_file: ProfToolSave
|
|
|
|
@onready var language_select_button: = %LanguageSelectButton
|
|
@onready var new_language_container: = %NewLanguageContainer
|
|
@onready var line_edit: = %LineEdit
|
|
@onready var file_dialog: = $FileDialog
|
|
@onready var file_dialog_export: = $FileDialogExport
|
|
@onready var add_word_list_button: = $VBoxContainer/AddWordListButton
|
|
@onready var error_label: = %ErrorLabel
|
|
|
|
|
|
func _ready() -> void:
|
|
MusicManager.stop()
|
|
_update_add_word_list_button()
|
|
if not ResourceLoader.exists(save_file_path):
|
|
save_file = ProfToolSave.new()
|
|
save_file.resource_path = save_file_path
|
|
ResourceSaver.save(save_file, save_file_path)
|
|
save_file = load(save_file_path)
|
|
_display_available_languages()
|
|
|
|
|
|
func _display_available_languages() -> void:
|
|
for item in range(1, language_select_button.item_count):
|
|
language_select_button.remove_item(item)
|
|
var available_languages: = _get_available_languages()
|
|
var ind: = 1
|
|
for available_language in available_languages:
|
|
language_select_button.add_item(available_language)
|
|
if available_language == save_file.selected_language:
|
|
Database.language = save_file.selected_language
|
|
language_select_button.select(ind)
|
|
ind += 1
|
|
|
|
|
|
func _update_add_word_list_button() -> void:
|
|
if FileAccess.file_exists(Database.get_additional_word_list_path()):
|
|
add_word_list_button.text = "Change Word List"
|
|
else:
|
|
add_word_list_button.text = "Add Word List"
|
|
|
|
|
|
func _on_gp_list_button_pressed() -> void:
|
|
get_tree().change_scene_to_file("res://sources/language_tool/gp_list.tscn")
|
|
|
|
|
|
func _on_word_list_button_pressed() -> void:
|
|
get_tree().change_scene_to_file("res://sources/language_tool/word_list.tscn")
|
|
|
|
|
|
func _on_syllable_list_button_pressed() -> void:
|
|
get_tree().change_scene_to_file("res://sources/language_tool/syllable_list.tscn")
|
|
|
|
|
|
func _on_sentence_list_button_pressed() -> void:
|
|
get_tree().change_scene_to_file("res://sources/language_tool/sentence_list.tscn")
|
|
|
|
|
|
func _on_lesson_list_button_pressed() -> void:
|
|
get_tree().change_scene_to_file("res://sources/language_tool/lessons_list.tscn")
|
|
|
|
|
|
func _on_tracing_builder_button_pressed() -> void:
|
|
get_tree().change_scene_to_file("res://sources/language_tool/tracing_builder.tscn")
|
|
|
|
|
|
func _on_data_loader_button_pressed() -> void:
|
|
get_tree().change_scene_to_file("res://sources/language_tool/gp_image_and_sound_descriptions.tscn")
|
|
|
|
|
|
func _on_data_loader_button_2_pressed() -> void:
|
|
get_tree().change_scene_to_file("res://sources/language_tool/gp_video_descriptions.tscn")
|
|
|
|
|
|
func _on_game_sounds_button_pressed():
|
|
get_tree().change_scene_to_file("res://sources/language_tool/in_game_sounds.tscn")
|
|
|
|
|
|
func _on_pseudowords_button_pressed() -> void:
|
|
get_tree().change_scene_to_file("res://sources/language_tool/fish_word_list.tscn")
|
|
|
|
|
|
func _on_speeches_button_pressed() -> void:
|
|
get_tree().change_scene_to_file("res://sources/language_tool/kalulu_speeches.tscn")
|
|
|
|
|
|
func _on_exercises_button_pressed() -> void:
|
|
get_tree().change_scene_to_file("res://sources/language_tool/lesson_exercises.tscn")
|
|
|
|
|
|
func _on_export_filename_selected(filename: String) -> void:
|
|
var version_file: = FileAccess.open(base_path.path_join(Database.language).path_join("version.txt"), FileAccess.WRITE)
|
|
version_file.store_line(Time.get_datetime_string_from_system(true, false))
|
|
version_file.close()
|
|
|
|
var summary_file: = FileAccess.open(base_path.path_join(Database.language).path_join("summary.txt"), FileAccess.WRITE)
|
|
var sentences_by_lesson: = Database.get_sentences_by_lessons()
|
|
for i in Database.get_lessons_count():
|
|
|
|
var lesson: int = i +1
|
|
|
|
summary_file.store_line("Lesson %s --------------------" % lesson)
|
|
summary_file.store_line("\t \t Words ---")
|
|
var words: = ""
|
|
for e in Database.get_words_for_lesson(lesson, true):
|
|
words += e.Word + ", "
|
|
summary_file.store_line(words.trim_suffix(", "))
|
|
summary_file.store_line("\n")
|
|
summary_file.store_line("\t \t Syllables ---")
|
|
var syllables: = ""
|
|
for e in Database.get_syllables_for_lesson(lesson, true):
|
|
syllables += e.Grapheme + ", "
|
|
summary_file.store_line(syllables.trim_suffix(", "))
|
|
summary_file.store_line("\n")
|
|
summary_file.store_line("\t \t Sentences ---")
|
|
for e in Database.get_sentences(lesson, true, sentences_by_lesson):
|
|
summary_file.store_line(e.Sentence)
|
|
summary_file.store_line("\n\n")
|
|
summary_file.close()
|
|
|
|
_create_GP_csv()
|
|
_create_words_csv()
|
|
_create_syllable_csv()
|
|
_create_sentence_csv()
|
|
|
|
var folder_zipper: = FolderZipper.new()
|
|
folder_zipper.compress(base_path.path_join(Database.language), filename)
|
|
|
|
|
|
func _get_available_languages() -> Array[String]:
|
|
var available_languages: Array[String] = []
|
|
var dir = DirAccess.open(base_path)
|
|
if dir:
|
|
dir.list_dir_begin()
|
|
var file_name = dir.get_next()
|
|
while file_name != "":
|
|
if dir.current_is_dir():
|
|
if FileAccess.file_exists(base_path.path_join(file_name).path_join("language.db")):
|
|
available_languages.append(file_name)
|
|
file_name = dir.get_next()
|
|
return available_languages
|
|
|
|
|
|
func _on_language_select_button_item_selected(index: int) -> void:
|
|
if index == 0:
|
|
new_language_container.show()
|
|
line_edit.grab_focus()
|
|
return
|
|
|
|
save_file.selected_language = language_select_button.get_item_text(index)
|
|
ResourceSaver.save(save_file, save_file_path)
|
|
Database.language = save_file.selected_language
|
|
|
|
|
|
func _on_line_edit_text_submitted(new_text: String) -> void:
|
|
DirAccess.make_dir_recursive_absolute(base_path.path_join(new_text))
|
|
var file: = FileAccess.open("res://model_database.db", FileAccess.READ)
|
|
var dest: = FileAccess.open(base_path.path_join(new_text).path_join("language.db"), FileAccess.WRITE)
|
|
dest.store_buffer(file.get_buffer(file.get_length()))
|
|
file.close()
|
|
dest.close()
|
|
save_file.selected_language = new_text
|
|
ResourceSaver.save(save_file, save_file_path)
|
|
get_tree().reload_current_scene()
|
|
|
|
|
|
|
|
func _word_list_file_selected(file_path: String) -> void:
|
|
if FileAccess.file_exists(file_path):
|
|
DirAccess.copy_absolute(file_path, Database.get_additional_word_list_path())
|
|
var msg: = Database.load_additional_word_list()
|
|
error_label.text = msg
|
|
# Check that the words we have in database have the correct gpmatch, if not update them
|
|
var query: = "SELECT Words.ID as WordId, Word, group_concat(Grapheme, ' ') as Graphemes, group_concat(Phoneme, ' ') as Phonemes, group_concat(GPs.ID, ' ') as GPIDs, Words.Exception
|
|
FROM Words
|
|
INNER JOIN ( SELECT * FROM GPsInWords ORDER BY GPsInWords.Position ) GPsInWords ON Words.ID = GPsInWords.WordID
|
|
INNER JOIN GPs ON GPs.ID = GPsInWords.GPID
|
|
GROUP BY Words.ID"
|
|
Database.db.query(query)
|
|
var result: = Database.db.query_result
|
|
var word_list_element = load("res://sources/language_tool/word_list_element.tscn").instantiate()
|
|
for e in result:
|
|
var is_same: = true
|
|
var master_gpmatch = Database.additional_word_list[e.Word].GPMATCH
|
|
var master_gplist: PackedStringArray = master_gpmatch.trim_prefix("(").trim_suffix(")").split(".")
|
|
var graphemes: PackedStringArray = e.Graphemes.split(" ")
|
|
var phonemes: PackedStringArray = e.Phonemes.split(" ")
|
|
if master_gplist.size() != graphemes.size():
|
|
is_same = false
|
|
else:
|
|
for i in master_gplist.size():
|
|
is_same = is_same and (graphemes[i] + "-" + phonemes[i] == master_gplist[i])
|
|
if not is_same:
|
|
Database.db.delete_rows("Words", "ID=%s" % e.WordId)
|
|
word_list_element._add_from_additional_word_list(e.Word)
|
|
|
|
|
|
func _on_add_word_list_button_pressed() -> void:
|
|
file_dialog.filters = []
|
|
file_dialog.add_filter("*.csv", "csv")
|
|
|
|
for connection in file_dialog.file_selected.get_connections():
|
|
connection["signal"].disconnect(connection["callable"])
|
|
|
|
file_dialog.file_selected.connect(_word_list_file_selected)
|
|
|
|
file_dialog.show()
|
|
_update_add_word_list_button()
|
|
|
|
|
|
|
|
|
|
func _on_import_language_button_pressed() -> void:
|
|
file_dialog.filters = []
|
|
file_dialog.add_filter("*.zip", "zip")
|
|
|
|
for connection in file_dialog.file_selected.get_connections():
|
|
connection["signal"].disconnect(connection["callable"])
|
|
|
|
file_dialog.file_selected.connect(_language_data_selected)
|
|
|
|
file_dialog.show()
|
|
|
|
|
|
func _on_export_button_pressed() -> void:
|
|
file_dialog_export.filters = []
|
|
file_dialog_export.add_filter("*.zip", "zip")
|
|
|
|
for connection in file_dialog_export.file_selected.get_connections():
|
|
connection["signal"].disconnect(connection["callable"])
|
|
|
|
file_dialog_export.file_selected.connect(_on_export_filename_selected)
|
|
|
|
file_dialog_export.show()
|
|
|
|
|
|
func _language_data_selected(file_path: String) -> void:
|
|
if FileAccess.file_exists(file_path):
|
|
var folder_unzipper: = FolderUnzipper.new()
|
|
folder_unzipper.extract(file_path, base_path, false)
|
|
get_tree().reload_current_scene()
|
|
|
|
|
|
func _create_GP_csv() -> void:
|
|
var gp_list_file: = FileAccess.open(base_path.path_join(Database.language).path_join("gp_list.csv"), FileAccess.WRITE)
|
|
gp_list_file.store_csv_line(["Grapheme", "Phoneme", "Type", "Exception"])
|
|
var query: = "Select * FROM GPs ORDER BY GPs.Grapheme"
|
|
Database.db.query(query)
|
|
var result: = Database.db.query_result
|
|
var types_text: = ["Silent", "Vowel", "Consonant"]
|
|
for e in result:
|
|
gp_list_file.store_csv_line([e.Grapheme, e.Phoneme, types_text[e.Type], e.Exception])
|
|
|
|
|
|
func _create_words_csv() -> void:
|
|
var gp_list_file: = FileAccess.open(base_path.path_join(Database.language).path_join("words_list.csv"), FileAccess.WRITE)
|
|
gp_list_file.store_csv_line(["ORTHO", "GPMATCH", "LESSON"])
|
|
var query: = "SELECT Words.ID as WordId, Word, group_concat(Grapheme, ' ') as Graphemes, group_concat(Phoneme, ' ') as Phonemes, group_concat(GPs.ID, ' ') as GPIDs, Words.Exception
|
|
FROM Words
|
|
INNER JOIN ( SELECT * FROM GPsInWords ORDER BY GPsInWords.Position ) GPsInWords ON Words.ID = GPsInWords.WordID
|
|
INNER JOIN GPs ON GPs.ID = GPsInWords.GPID
|
|
GROUP BY Words.ID"
|
|
Database.db.query(query)
|
|
var result: = Database.db.query_result
|
|
for e in result:
|
|
var gpmatch: = "("
|
|
var graphemes: PackedStringArray = e.Graphemes.split(" ")
|
|
var phonemes: PackedStringArray = e.Phonemes.split(" ")
|
|
for i in graphemes.size() - 1:
|
|
gpmatch += graphemes[i] + "-" + phonemes[i] + "."
|
|
var i: = graphemes.size() - 1
|
|
gpmatch += graphemes[i] + "-" + phonemes[i] + ")"
|
|
var lesson: = -1
|
|
for gp_id in e.GPIDs.split(' '):
|
|
var gp_id_lesson: = Database.get_min_lesson_for_gp_id(int(gp_id))
|
|
if gp_id_lesson < 0:
|
|
lesson = -1
|
|
break
|
|
lesson = max(lesson, gp_id_lesson)
|
|
gp_list_file.store_csv_line([e.Word, gpmatch, lesson])
|
|
|
|
|
|
func _create_syllable_csv() -> void:
|
|
var gp_list_file: = FileAccess.open(base_path.path_join(Database.language).path_join("syllables_list.csv"), FileAccess.WRITE)
|
|
gp_list_file.store_csv_line(["ORTHO", "GPMATCH", "LESSON"])
|
|
var query: = "SELECT Syllables.ID as SyllableId, Syllable, group_concat(Grapheme, ' ') as Graphemes, group_concat(Phoneme, ' ') as Phonemes, group_concat(GPs.ID, ' ') as GPIDs, Syllables.Exception
|
|
FROM Syllables
|
|
INNER JOIN ( SELECT * FROM GPsInSyllables ORDER BY GPsInSyllables.Position ) GPsInSyllables ON Syllables.ID = GPsInSyllables.SyllableID
|
|
INNER JOIN GPs ON GPs.ID = GPsInSyllables.GPID
|
|
GROUP BY Syllables.ID"
|
|
Database.db.query(query)
|
|
var result: = Database.db.query_result
|
|
for e in result:
|
|
var gpmatch: = "("
|
|
var graphemes: PackedStringArray = e.Graphemes.split(" ")
|
|
var phonemes: PackedStringArray = e.Phonemes.split(" ")
|
|
for i in graphemes.size() - 1:
|
|
gpmatch += graphemes[i] + "-" + phonemes[i] + "."
|
|
var i: = graphemes.size() - 1
|
|
gpmatch += graphemes[i] + "-" + phonemes[i] + ")"
|
|
var lesson: = -1
|
|
for gp_id in e.GPIDs.split(' '):
|
|
var gp_id_lesson: = Database.get_min_lesson_for_gp_id(int(gp_id))
|
|
if gp_id_lesson < 0:
|
|
lesson = -1
|
|
break
|
|
lesson = max(lesson, gp_id_lesson)
|
|
gp_list_file.store_csv_line([e.Syllable, gpmatch, lesson])
|
|
|
|
|
|
func _create_sentence_csv() -> void:
|
|
var gp_list_file: = FileAccess.open(base_path.path_join(Database.language).path_join("sentences_list.csv"), FileAccess.WRITE)
|
|
gp_list_file.store_csv_line(["Sentence", "Lesson"])
|
|
var query: = "SELECT Sentences.ID as SentenceId, Sentence, group_concat(Word, ' ') as Words, group_concat(Word, ' ') as Words, group_concat(Words.ID, ' ') as WordIDs, Sentences.Exception
|
|
FROM Sentences
|
|
INNER JOIN ( SELECT * FROM WordsInSentences ORDER BY WordsInSentences.Position ) WordsInSentences ON Sentences.ID = WordsInSentences.SentenceID
|
|
INNER JOIN Words ON Words.ID = WordsInSentences.WordID
|
|
GROUP BY Sentences.ID"
|
|
Database.db.query(query)
|
|
var result: = Database.db.query_result
|
|
for e in result:
|
|
var lesson: = -1
|
|
for word_id in e.WordIDs.split(' '):
|
|
var i: = Database.get_min_lesson_for_word_id(int(word_id))
|
|
if i < 0:
|
|
lesson = -1
|
|
break
|
|
lesson = max(lesson, i)
|
|
gp_list_file.store_csv_line([e.Sentence, lesson])
|
|
|
|
|
|
func _on_open_folder_button_pressed() -> void:
|
|
OS.shell_show_in_file_manager(ProjectSettings.globalize_path(base_path))
|