help loading words and sentences in prof tool by adding a word list
This commit is contained in:
@@ -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"]
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user