help loading words and sentences in prof tool by adding a word list

This commit is contained in:
BimDav
2024-02-08 17:47:04 +01:00
parent 15fb6277ad
commit 1211226ccd
8 changed files with 200 additions and 35 deletions
@@ -1,4 +1,4 @@
[gd_scene load_steps=4 format=3 uid="uid://bxkg7t6myxtyi"]
[gd_scene load_steps=4 format=3 uid="uid://dk8seaie6lxn1"]
[ext_resource type="Script" path="res://sources/language_tool/gp_image_and_sound_descriptions.gd" id="1_8rkii"]
[ext_resource type="PackedScene" uid="uid://dbl3r8426473v" path="res://sources/language_tool/plus_button.tscn" id="1_tjhx5"]
@@ -1,4 +1,4 @@
[gd_scene load_steps=4 format=3 uid="uid://d2fegfgf5gefe"]
[gd_scene load_steps=4 format=3 uid="uid://cfpx5q6dd2gq7"]
[ext_resource type="Script" path="res://sources/language_tool/image_and_sound_gp_description.gd" id="1_rm4b8"]
[ext_resource type="PackedScene" uid="uid://dbl3r8426473v" path="res://sources/language_tool/plus_button.tscn" id="1_uutsu"]
+30 -1
View File
@@ -7,9 +7,12 @@ 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 add_word_list_button: = $AddWordListButton
func _ready() -> void:
_update_add_word_list_button()
if not ResourceLoader.exists(save_file_path):
save_file = ProfToolSave.new()
save_file.resource_path = save_file_path
@@ -24,7 +27,13 @@ func _ready() -> void:
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:
@@ -105,3 +114,23 @@ func _on_line_edit_text_submitted(new_text: String) -> void:
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())
Database.load_additional_word_list()
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()
+20
View File
@@ -140,6 +140,25 @@ custom_minimum_size = Vector2(800, 2.08165e-12)
layout_mode = 2
theme_override_font_sizes/font_size = 100
[node name="FileDialog" type="FileDialog" parent="."]
title = "Open a File"
initial_position = 2
size = Vector2i(1500, 1000)
always_on_top = true
popup_window = true
ok_button_text = "Ouvrir"
file_mode = 0
access = 2
[node name="AddWordListButton" type="Button" parent="."]
layout_mode = 0
offset_left = 150.0
offset_top = 301.0
offset_right = 563.0
offset_bottom = 375.0
theme_override_font_sizes/font_size = 60
text = "Change word list"
[connection signal="pressed" from="CenterContainer/VBoxContainer/GPListButton" to="." method="_on_gp_list_button_pressed"]
[connection signal="pressed" from="CenterContainer/VBoxContainer/WordListButton" to="." method="_on_word_list_button_pressed"]
[connection signal="pressed" from="CenterContainer/VBoxContainer/SentenceListButton" to="." method="_on_sentence_list_button_pressed"]
@@ -150,3 +169,4 @@ theme_override_font_sizes/font_size = 100
[connection signal="pressed" from="ExportButton" to="." method="_on_export_button_pressed"]
[connection signal="item_selected" from="LanguageSelectButton" to="." method="_on_language_select_button_item_selected"]
[connection signal="text_submitted" from="NewLanguageContainer/CenterContainer/LineEdit" to="." method="_on_line_edit_text_submitted"]
[connection signal="pressed" from="AddWordListButton" to="." method="_on_add_word_list_button_pressed"]
@@ -1,5 +1,6 @@
extends "res://sources/language_tool/word_list_element.gd"
const word_list_element_scene: = preload("res://sources/language_tool/word_list_element.tscn")
func update_lesson() -> void:
var m: = -1
@@ -7,3 +8,33 @@ func update_lesson() -> void:
var i: = Database.get_min_lesson_for_word_id(gp_id)
m = max(m, i)
lesson = m
func _add_from_additional_word_list(new_text: String) -> int:
var word_list_element: = word_list_element_scene.instantiate()
var all_found: = true
var word_ids: Array[int] = []
for word in new_text.split(" "):
var word_id: int = word_list_element._try_to_complete_from_word(word)
word_ids.append(word_id)
if word_id < 0:
all_found = false
word_list_element.free()
if all_found:
gp_ids = word_ids
unvalidated_gp_ids = gp_ids
graphemes = new_text
Database.db.insert_row("Sentences", {
Sentence = new_text,
})
id = Database.db.last_insert_rowid
for i in word_ids.size():
var word_id: int = word_ids[i]
Database.db.insert_row("WordsInSentences", {
WordID = word_id,
SentenceID = id,
Position = i
})
return id
return -1
@@ -276,3 +276,57 @@ func insert_in_database() -> void:
sub_table_id: gp_ids[i],
"Position": i
})
func _already_in_database(text: String) -> int:
var query: = "SELECT ID, %s, group_concat(%s, ' ') as %ss, group_concat(%s, ' ') as %ss, group_concat(%s.ID, ' ') as %sIDs
FROM %s
INNER JOIN ( SELECT * FROM %s ORDER BY %s.Position ) %s ON %s.ID = %s.%sID
INNER JOIN %s ON %s.ID = %s.%s
WHERE %s.%s = ?
GROUP BY %s.ID" % [table_graph_column, sub_table_graph_column, sub_table_graph_column,
sub_table_phon_column, sub_table_phon_column,
relational_table, relational_table,
table,
relational_table, relational_table, relational_table, table, relational_table, table_graph_column,
sub_table, sub_table, relational_table, sub_table_id,
table, table_graph_column,
table]
Database.db.query_with_bindings(query, [text])
if not Database.db.query_result.is_empty():
var e = Database.db.query_result[0]
graphemes_edit.text = e[sub_table_graph_column + "s"]
id = e.ID
return id
return -1
func _add_from_additional_word_list(new_text: String) -> int:
if new_text in Database.additional_word_list:
var res: = Database._import_word_from_csv(new_text, Database.additional_word_list[new_text].GPMATCH)
id = res[0]
gp_ids = res[1]
unvalidated_gp_ids = gp_ids
graphemes = " ".join(Database.additional_word_list[new_text].GPMATCH.trim_prefix('(').trim_suffix(')').split('.'))
return id
return -1
func _try_to_complete_from_word(new_text: String) -> int:
var id: = _already_in_database(new_text)
if id >= 0:
return id
id = _add_from_additional_word_list(new_text)
if id >= 0:
return id
return -1
func _on_word_edit_text_submitted(new_text: String) -> void:
if _try_to_complete_from_word(new_text) >= 0:
_on_validate_button_pressed()
update_lesson()
graphemes_edit.grab_focus()
@@ -113,6 +113,7 @@ texture = ExtResource("2_i6x6b")
[connection signal="pressed" from="TabContainer/NormalContainer/EditButton" to="." method="_on_edit_button_pressed"]
[connection signal="pressed" from="TabContainer/EditContainer/MinusButton" to="." method="_on_minus_button_pressed"]
[connection signal="text_submitted" from="TabContainer/EditContainer/WordEdit" to="." method="_on_word_edit_text_submitted"]
[connection signal="focus_entered" from="TabContainer/EditContainer/GraphemesEdit" to="." method="_on_graphemes_edit_focus_entered"]
[connection signal="focus_exited" from="TabContainer/EditContainer/GraphemesEdit" to="." method="_on_graphemes_edit_focus_exited"]
[connection signal="gui_input" from="TabContainer/EditContainer/GraphemesEdit" to="." method="_on_graphemes_edit_gui_input"]
+62 -32
View File
@@ -12,6 +12,7 @@ const base_path: = "res://language_resources/"
const look_and_learn_images: = "/look_and_learn/images/"
const look_and_learn_sounds: = "/look_and_learn/sounds/"
const look_and_learn_videos: = "/look_and_learn/video/"
const additional_word_list_path: = "word_list.csv"
const video_extension: = ".ogv"
const image_extension: = ".png"
const sound_extension: = ".mp3"
@@ -30,17 +31,41 @@ var db_path: = base_path + language + "/language.db":
db.foreign_keys = true
db.open_db()
var words_path: = base_path + language + "/words/"
var additional_word_list: Dictionary
@onready var db: = SQLite.new()
func _ready() -> void:
pass
load_additional_word_list()
# db_path = db_path
#_import_words_csv()
#_import_look_and_learn_data()
func get_additional_word_list_path() -> String:
return base_path.path_join(additional_word_list_path)
func load_additional_word_list() -> void:
additional_word_list.clear()
var word_list_path: = get_additional_word_list_path()
if FileAccess.file_exists(word_list_path):
var file: = FileAccess.open(word_list_path, FileAccess.READ)
var title_line: = file.get_csv_line()
if (not "ORTHO" in title_line) or (not "PHON" in title_line) or (not "GPMATCH" in title_line):
push_error("word list should have columns ORTHO, PHON and GPMATCH")
return
var ortho_index: = title_line.find("ORTHO")
while not file.eof_reached():
var line: = file.get_csv_line()
var data: = {}
for i in line.size():
data[title_line[i]] = line[i]
additional_word_list[line[ortho_index]] = data
file.close()
func _exit_tree() -> void:
db.close_db()
@@ -367,36 +392,41 @@ func _import_words_csv() -> void:
file.get_line()
while not file.eof_reached():
var line: = file.get_csv_line()
var word: = line[0]
var gp_list: = line[2].trim_prefix("(").trim_suffix(")").split(".")
var gp_ids: = []
for gp in gp_list:
var split: = gp.split("-")
var grapheme: = split[0]
var phoneme: = split[1]
db.query_with_bindings("SELECT * FROM GPs WHERE Grapheme = ? AND Phoneme = ?", [grapheme, phoneme])
var gp_id: = -1
if db.query_result.is_empty():
db.insert_row("GPs", {
Grapheme = grapheme,
Phoneme = phoneme,
InGame = 0,
})
gp_id = db.last_insert_rowid
else:
gp_id = db.query_result[0].ID
gp_ids.append(gp_id)
db.query_with_bindings("SELECT * FROM Words WHERE Word = ?", [word])
_import_word_from_csv(line[0], line[2])
func _import_word_from_csv(ortho: String, gpmatch: String) -> Array:
var gp_list: = gpmatch.trim_prefix("(").trim_suffix(")").split(".")
var gp_ids: Array[int] = []
for gp in gp_list:
var split: = gp.split("-")
var grapheme: = split[0]
var phoneme: = split[1]
db.query_with_bindings("SELECT * FROM GPs WHERE Grapheme = ? AND Phoneme = ?", [grapheme, phoneme])
var gp_id: = -1
if db.query_result.is_empty():
db.insert_row("Words", {
Word = word,
InGame = 0,
db.insert_row("GPs", {
Grapheme = grapheme,
Phoneme = phoneme,
})
var word_id: = db.last_insert_rowid
for i in gp_ids.size():
var gp_id: int = gp_ids[i]
db.insert_row("GPsInWords", {
WordID = word_id,
GPID = gp_id,
Position = i
})
gp_id = db.last_insert_rowid
else:
gp_id = db.query_result[0].ID
gp_ids.append(gp_id)
db.query_with_bindings("SELECT * FROM Words WHERE Word = ?", [ortho])
var word_id: = -1
if db.query_result.is_empty():
db.insert_row("Words", {
Word = ortho,
})
word_id = db.last_insert_rowid
for i in gp_ids.size():
var gp_id: int = gp_ids[i]
db.insert_row("GPsInWords", {
WordID = word_id,
GPID = gp_id,
Position = i
})
else:
word_id = db.query_result[0].ID
return [word_id, gp_ids]