Clean and hard-typing

This commit is contained in:
Adrien Ufferte
2025-04-29 13:48:27 +02:00
parent c1b1a8d981
commit 0cfe83778c
58 changed files with 433 additions and 428 deletions
+16 -16
View File
@@ -1,27 +1,27 @@
extends Control
var element_scene: = preload("res://sources/language_tool/gp_list_element.tscn")
var element_scene: PackedScene = preload("res://sources/language_tool/gp_list_element.tscn")
@onready var elements_container: VBoxContainer = %ElementsContainer
@onready var error_label: Label = %ErrorLabel
var undo_redo: = UndoRedo.new()
var undo_redo: UndoRedo = UndoRedo.new()
func _ready() -> void:
var query: = "Select * FROM GPs ORDER BY GPs.Grapheme"
var query: String = "Select * FROM GPs ORDER BY GPs.Grapheme"
Database.db.query(query)
var result: = Database.db.query_result
for e in result:
var element: GPListElement = element_scene.instantiate()
element.grapheme = e.Grapheme
element.phoneme = e.Phoneme
element.type = e.Type
element.exception = e.Exception
element.undo_redo = undo_redo
element.id = e.ID
elements_container.add_child(element)
element.delete_pressed.connect(_on_element_delete_pressed.bind(element))
var result: Array[Dictionary] = Database.db.query_result
for element_dico: Dictionary in result:
var new_element: GPListElement = element_scene.instantiate()
new_element.grapheme = element_dico.Grapheme
new_element.phoneme = element_dico.Phoneme
new_element.type = element_dico.Type
new_element.exception = element_dico.Exception
new_element.undo_redo = undo_redo
new_element.id = element_dico.ID
elements_container.add_child(new_element)
new_element.delete_pressed.connect(_on_element_delete_pressed.bind(new_element))
for pseudo_button: Label in [%Grapheme, %Phoneme, %Type]:
pseudo_button.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
@@ -53,9 +53,9 @@ func _on_plus_button_pressed() -> void:
func _on_save_button_pressed() -> void:
for element: GPListElement in elements_container.get_children():
element.insert_in_database()
var query: = "Select * FROM GPs"
var query: String = "Select * FROM GPs"
Database.db.query(query)
var result: = Database.db.query_result
var result: Array[Dictionary] = Database.db.query_result
for e in result:
var found: = false
for element: GPListElement in elements_container.get_children():
+1 -1
View File
@@ -14,7 +14,7 @@ func _on_item_selected(index: int) -> void:
if index == 0:
new_selected.emit()
return
var id: = get_item_id(index)
var id: int = get_item_id(index)
gp_selected.emit(id)
+7 -7
View File
@@ -22,13 +22,13 @@ enum Type {
var grapheme: = "":
var grapheme: String = "":
set = set_grapheme
var phoneme: = "":
var phoneme: String = "":
set = set_phoneme
var type: = Type.Silent:
var type: GPListElement.Type = Type.Silent:
set = set_type
var exception: = 0:
var exception: bool = false:
set = set_exception
var id: int = -1
var undo_redo: UndoRedo:
@@ -107,9 +107,9 @@ func insert_in_database() -> void:
if id >= 0:
Database.db.query_with_bindings("SELECT * FROM GPs WHERE ID=?", [id])
if not Database.db.query_result.is_empty():
var e = Database.db.query_result[0]
if grapheme != e.Grapheme or phoneme != e.Phoneme or type != e.Type or exception != e.Exception:
Logger.trace("GPListElement: UPDATING %s" % e.Grapheme)
var element: Dictionary = Database.db.query_result[0]
if grapheme != element.Grapheme or phoneme != element.Phoneme or type != element.Type or exception != element.Exception:
Logger.trace("GPListElement: UPDATING %s" % element.Grapheme)
Database.db.update_rows("GPs", "ID=%s" % id, {Grapheme=grapheme, Phoneme=phoneme, Type=type, Exception=exception})
return
@@ -1,4 +1,5 @@
extends MarginContainer
class_name LessonContainer
var gp_label_scene: = preload("res://sources/language_tool/lesson_gp_label.tscn")
+5 -4
View File
@@ -1,13 +1,14 @@
extends Label
class_name LessonGPLabel
signal gp_dropped(before: bool, data: Dictionary)
var gp_id: = -1
var grapheme: = "":
var gp_id: int = -1
var grapheme: String = "":
set = set_grapheme
var phoneme: = "":
var phoneme: String = "":
set = set_phoneme
var is_being_dragged: = false
var is_being_dragged: bool = false
func set_grapheme(p_grapheme: String) -> void:
+22 -22
View File
@@ -1,12 +1,12 @@
extends Control
@onready var lessons_container: = $%LessonsContainer
@onready var unused_gp_container: = $%UnusedGPContainer
@onready var lessons_container: MarginContainer = $%LessonsContainer
@onready var unused_gp_container: GridContainer = $%UnusedGPContainer
var lesson_container_scene: = preload("res://sources/language_tool/lesson_container.tscn")
var gp_label_scene: = preload("res://sources/language_tool/lesson_gp_label.tscn")
var lesson_container_scene: PackedScene = preload("res://sources/language_tool/lesson_container.tscn")
var gp_label_scene: PackedScene = preload("res://sources/language_tool/lesson_gp_label.tscn")
var lessons: = {}
var lessons: Dictionary = {}
func _ready() -> void:
@@ -14,35 +14,35 @@ func _ready() -> void:
INNER JOIN GPsInLessons ON GPsInLessons.LessonID = Lessons.ID
INNER JOIN GPs ON GPsInLessons.GPID = GPs.ID
ORDER BY LessonNb")
for e in Database.db.query_result:
if lessons.has(e.LessonNb):
lessons[e.LessonNb].add_gp({grapheme = e.Grapheme, phoneme = e.Phoneme, gp_id = e.GPID})
for element: Dictionary in Database.db.query_result:
if lessons.has(element.LessonNb):
(lessons[element.LessonNb] as LessonContainer).add_gp({grapheme = element.Grapheme, phoneme = element.Phoneme, gp_id = element.GPID})
else:
var lesson_container: = lesson_container_scene.instantiate()
var lesson_container: LessonContainer = lesson_container_scene.instantiate()
lessons_container.add_child(lesson_container)
lesson_container.add_gp({grapheme = e.Grapheme, phoneme = e.Phoneme, gp_id = e.GPID})
lesson_container.number = e.LessonNb
lesson_container.add_gp({grapheme = element.Grapheme, phoneme = element.Phoneme, gp_id = element.GPID})
lesson_container.number = element.LessonNb
lesson_container.lesson_dropped.connect(_on_lesson_dropped)
lessons[e.LessonNb] = lesson_container
lessons[element.LessonNb] = lesson_container
Database.db.query("SELECT Grapheme, Phoneme, GPs.ID as GPID FROM GPs
WHERE NOT EXISTS(SELECT 1 FROM GPsInLessons WHERE GPs.ID=GPsInLessons.GPID)")
for e in Database.db.query_result:
var gp_label: = gp_label_scene.instantiate()
for element: Dictionary in Database.db.query_result:
var gp_label: LessonGPLabel = gp_label_scene.instantiate()
unused_gp_container.add_child(gp_label)
gp_label.grapheme = e.Grapheme
gp_label.phoneme = e.Phoneme
gp_label.gp_id = e.GPID
gp_label.grapheme = element.Grapheme
gp_label.phoneme = element.Phoneme
gp_label.gp_id = element.GPID
gp_label.gp_dropped.connect(_on_gp_dropped)
unused_gp_container.set_drag_forwarding(Callable(), _can_drop_in_gp_container, _drop_data_in_gp_container)
func _on_plus_button_pressed() -> void:
var lesson_container: = lesson_container_scene.instantiate()
var lesson_container: LessonContainer = lesson_container_scene.instantiate()
lessons_container.add_child(lesson_container)
lesson_container.lesson_dropped.connect(_on_lesson_dropped)
var max_nb: = -1
var max_nb: int = -1
for e in lessons.values():
max_nb = max(max_nb, e.number)
lesson_container.number = max_nb + 1
@@ -56,7 +56,7 @@ func _can_drop_in_gp_container(_at_position: Vector2, data: Variant) -> bool:
func _drop_data_in_gp_container(_at_position: Vector2, data: Variant) -> void:
if not data.has("gp_id"):
return
var new_gp_label: = gp_label_scene.instantiate()
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
@@ -84,8 +84,8 @@ func _on_lesson_dropped(before: bool, number: int, dropped_number: int) -> void:
func _on_save_button_pressed() -> void:
Database.db.query("DELETE FROM GPsInLessons")
var children: = lessons_container.get_children()
for index in children.size():
var children: Array[Node] = lessons_container.get_children()
for index: int in children.size():
var child: = children[index]
Database.db.query_with_bindings("SELECT * FROM Lessons WHERE LessonNb = ?", [index + 1])
var lesson_id: = -1
+5 -5
View File
@@ -43,11 +43,11 @@ func _on_button_pressed() -> void:
file_dialog.ok_button_text = "Add new elements"
for connection in file_dialog.file_selected.get_connections():
connection["signal"].disconnect(connection["callable"])
for connection: Dictionary in file_dialog.file_selected.get_connections():
(connection["signal"] as Signal).disconnect(connection["callable"] as Callable)
for connection in file_dialog.custom_action.get_connections():
connection["signal"].disconnect(connection["callable"])
for connection: Dictionary in file_dialog.custom_action.get_connections():
(connection["signal"] as Signal).disconnect(connection["callable"] as Callable)
file_dialog.file_selected.connect(_on_filename_selected)
file_dialog.custom_action.connect(_on_match_to_file_selected)
@@ -59,7 +59,7 @@ func _on_filename_selected(path: String) -> void:
import_path_selected.emit(path, false)
func _on_match_to_file_selected(custom_action: String) -> void:
func _on_match_to_file_selected(_custom_action: String) -> void:
import_path_selected.emit(file_dialog.current_path, true)
file_dialog.hide()
+5 -5
View File
@@ -418,7 +418,7 @@ func _create_words_csv() -> void:
if gp_id_lesson < 0:
lesson = -1
break
lesson = max(lesson, gp_id_lesson)
lesson = maxi(lesson, gp_id_lesson)
gp_list_file.store_csv_line([element.Word, gpmatch, lesson, element.Reading, element.Writing])
@@ -447,7 +447,7 @@ func _create_syllable_csv() -> void:
if gp_id_lesson < 0:
lesson = -1
break
lesson = max(lesson, gp_id_lesson)
lesson = maxi(lesson, gp_id_lesson)
gp_list_file.store_csv_line([element.Syllable, gpmatch, lesson, element.Reading, element.Writing])
@@ -465,11 +465,11 @@ func _create_sentence_csv() -> void:
var lesson: int = -1
@warning_ignore("unsafe_method_access")
for word_id: String in element.WordIDs.split(' '):
var i: int = Database.get_min_lesson_for_word_id(int(word_id))
if i < 0:
var ind: int = Database.get_min_lesson_for_word_id(int(word_id))
if ind < 0:
lesson = -1
break
lesson = max(lesson, i)
lesson = maxi(lesson, ind)
gp_list_file.store_csv_line([element.Sentence, lesson])
+16 -16
View File
@@ -11,8 +11,8 @@ signal changed()
@onready var segments_container: VBoxContainer = %SegmentsContainer
@onready var lines: Node2D = %Lines
const segment_build_class: = preload("res://sources/language_tool/segment_build.tscn")
const point_button_class: = preload("res://sources/language_tool/segment_point_button.tscn")
const segment_build_class: PackedScene = preload("res://sources/language_tool/segment_build.tscn")
const point_button_class: PackedScene = preload("res://sources/language_tool/segment_point_button.tscn")
var gradient: Gradient
@@ -22,9 +22,9 @@ var buttons: Array[SegmentPointButton]
func reset() -> void:
var to_free: = lines.get_children()
var to_free: Array[Node] = lines.get_children()
to_free.append_array(segments_container.get_children())
for node in to_free:
for node: Node in to_free:
node.queue_free()
current_segment = null
@@ -49,7 +49,7 @@ func _process(_delta: float) -> void:
current_button = null
if is_instance_valid(current_button):
var ind: = current_segment.remove_point(current_button.global_position - lines.global_position)
var ind: int = current_segment.remove_point(current_button.global_position - lines.global_position)
current_button.global_position = get_global_mouse_position()
current_segment.add_point_at(current_button.global_position - lines.global_position, ind)
@@ -58,14 +58,14 @@ func draw_segment(segment: SegmentBuild) -> void:
if not is_instance_valid(segment):
return
var ind_seg: = segments_container.get_children().find(segment)
var ind_seg: int = segments_container.get_children().find(segment)
var line: Line2D = lines.get_child(ind_seg)
line.points = Bezier.bezier_sampling(segment.points, max(points_per_lines, segment.points.size()))
line.points = Bezier.bezier_sampling(segment.points, maxi(points_per_lines, segment.points.size()))
func draw_all_segments() -> void:
for segment in segments_container.get_children():
for segment: SegmentBuild in segments_container.get_children():
draw_segment(segment)
@@ -121,7 +121,7 @@ func _on_place_point_button_pressed() -> void:
func _on_add_segment_button_pressed() -> void:
var segment_build: = segment_build_class.instantiate()
var segment_build: SegmentBuild = segment_build_class.instantiate()
segments_container.add_child(segment_build)
segment_build.modify.connect(_on_segment_modify.bind(segment_build))
@@ -129,16 +129,16 @@ func _on_add_segment_button_pressed() -> void:
current_segment = segment_build
var line: = Line2D.new()
var line: Line2D = Line2D.new()
line.width = 25
line.begin_cap_mode = Line2D.LINE_CAP_ROUND
line.end_cap_mode = Line2D.LINE_CAP_ROUND
line.joint_mode = Line2D.LINE_JOINT_ROUND
lines.add_child(line)
var i: = segments_container.get_child_count()
var r: = float(i % points_per_gradient) / float(points_per_gradient)
var color: = gradient.sample(r)
var i: int = segments_container.get_child_count()
var r: float = float(i % points_per_gradient) / float(points_per_gradient)
var color: Color = gradient.sample(r)
segment_build.set_color(color)
line.default_color = color
@@ -157,15 +157,15 @@ func _on_segment_modify(segment: SegmentBuild) -> void:
func _on_segment_delete(segment: SegmentBuild) -> void:
if segment == current_segment:
var possible_segments: = segments_container.get_children()
var possible_segments: Array[Node] = segments_container.get_children()
if not possible_segments.is_empty():
current_segment = possible_segments[0]
current_segment = possible_segments[0] as SegmentBuild
else:
current_segment = null
match_segment_with_buttons()
var ind_seg: = segments_container.get_children().find(segment)
var ind_seg: int = segments_container.get_children().find(segment)
lines.get_child(ind_seg).queue_free()
changed.emit()
@@ -13,13 +13,13 @@ func _ready() -> void:
func update_lesson() -> void:
var m: = -1
var m: int = -1
for gp_id in gp_ids:
var i: = Database.get_min_lesson_for_word_id(gp_id)
var i: int = Database.get_min_lesson_for_word_id(gp_id)
if i < 0:
m = -1
break
m = max(m, i)
m = maxi(m, i)
lesson = m
+39 -38
View File
@@ -6,8 +6,8 @@ signal new_GP_asked(i: int)
signal validated()
signal GPs_updated()
const gp_list_button_scene: = preload("res://sources/language_tool/gp_list_button.tscn")
const plus_button_scene: = preload("res://sources/language_tool/plus_button.tscn")
const gp_list_button_scene: PackedScene = preload("res://sources/language_tool/gp_list_button.tscn")
const plus_button_scene: PackedScene = preload("res://sources/language_tool/plus_button.tscn")
@export var table: String = "Words"
@export var table_graph_column: String = "Word"
@@ -32,24 +32,24 @@ const plus_button_scene: = preload("res://sources/language_tool/plus_button.tscn
@onready var add_gp_button: MarginContainer = %AddGPButton
@onready var remove_gp_button: MarginContainer = %RemoveGPButton2
var word: = "":
var word: String = "":
set = set_word
var lesson: = 0:
var lesson: int = 0:
set = set_lesson
var undo_redo: UndoRedo:
get:
if not undo_redo:
undo_redo = UndoRedo.new()
return undo_redo
var id: = -1
var id: int = -1
var gp_ids: Array[int] = []:
set = set_gp_ids
var unvalidated_gp_ids: Array[int] = []
var exception: = 0:
var exception: int = 0:
set = set_exception
var reading: = 0:
var reading: int = 0:
set = set_reading
var writing: = 0:
var writing: int = 0:
set = set_writing
var sub_elements_list: Dictionary
@@ -92,11 +92,11 @@ func set_gp_ids(p_gp_ids: Array[int]) -> void:
func set_graphemes_edit(p_gp_ids: Array[int]) -> void:
if graphemes_edit_container:
for child in graphemes_edit_container.get_children():
for child: Node in graphemes_edit_container.get_children():
graphemes_edit_container.remove_child(child)
child.queue_free()
for ind_gp_id in p_gp_ids.size():
var gp_id: = p_gp_ids[ind_gp_id]
for ind_gp_id: int in p_gp_ids.size():
var gp_id: int = p_gp_ids[ind_gp_id]
add_gp_list_button(gp_id, ind_gp_id)
@@ -117,27 +117,27 @@ func add_gp_list_button(gp_id: int, ind_gp_id: int) -> void:
func _on_gp_list_button_selected(gp_id: int, element: Node) -> void:
@warning_ignore("integer_division")
var ind_gp_id: = element.get_index() / 2
var ind_gp_id: int = element.get_index() / 2
unvalidated_gp_ids[ind_gp_id] = gp_id
word_edit.text = get_graphemes(unvalidated_gp_ids)
func _on_gp_list_button_new_selected(element: Node) -> void:
@warning_ignore("integer_division")
var ind_gp_id: = element.get_index() / 2
var ind_gp_id: int = element.get_index() / 2
new_GP_asked.emit(ind_gp_id)
func get_graphemes(p_gp_ids: Array[int]) -> String:
var res: = ""
for gp_id in p_gp_ids:
var res: String = ""
for gp_id: int in p_gp_ids:
res += sub_elements_list[gp_id].grapheme
return res
func get_gps(p_gp_ids: Array[int]) -> String:
var res: = ""
for gp_id in p_gp_ids:
var res: String = ""
for gp_id: int in p_gp_ids:
res += sub_elements_list[gp_id].grapheme
res += "-"
res += sub_elements_list[gp_id].phoneme
@@ -195,13 +195,13 @@ func _on_validate_button_pressed() -> void:
func update_lesson() -> void:
var m: = -1
for gp_id in gp_ids:
var i: = Database.get_min_lesson_for_gp_id(gp_id)
var m: int = -1
for gp_id: int in gp_ids:
var i: int = Database.get_min_lesson_for_gp_id(gp_id)
if i < 0:
m = -1
break
m = max(m, i)
m = maxi(m, i)
lesson = m
@@ -226,7 +226,7 @@ func insert_in_database() -> void:
id = Database.db.query_result[0].ID
if id >= 0:
var query: = "SELECT %s, group_concat(%s, ' ') as %ss, group_concat(%s, ' ') as %ss, group_concat(%s.ID, ' ') as %sIDs, group_concat(%s.ID, ' ') as %sIDs, %s.Exception, %s.Reading, %s.Writing
var query: String = "SELECT %s, group_concat(%s, ' ') as %ss, group_concat(%s, ' ') as %ss, group_concat(%s.ID, ' ') as %sIDs, group_concat(%s.ID, ' ') as %sIDs, %s.Exception, %s.Reading, %s.Writing
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
@@ -242,15 +242,15 @@ func insert_in_database() -> void:
Database.db.query_with_bindings(query, [id])
Logger.trace("WordListElement: Sending query to insert in database: %s" % query)
if not Database.db.query_result.is_empty():
var e = Database.db.query_result[0]
if word != e[table_graph_column] or exception != e.Exception or reading != e.Reading or writing != e.Writing:
var element: Dictionary = Database.db.query_result[0]
if word != element[table_graph_column] or exception != element.Exception or reading != element.Reading or writing != element.Writing:
Database.db.update_rows(table, "ID=%s" % id, {table_graph_column: word, "Exception": exception, "Reading": reading, "Writing": writing})
if " ".join(gp_ids) != e[sub_table + "IDs"]:
var gps_in_words_ids: Array = Array(e[relational_table + "IDs"].split(" "))
if " ".join(gp_ids) != element[sub_table + "IDs"]:
var gps_in_words_ids: Array[String] = Array((element[relational_table + "IDs"] as String).split(" "))
while gps_in_words_ids.size() > gp_ids.size():
Database.db.delete_rows(relational_table, "ID=%s" % int(gps_in_words_ids.pop_back()))
Database.db.delete_rows(relational_table, "ID=%s" % int(gps_in_words_ids.pop_back() as String))
for index: int in gps_in_words_ids.size():
var gps_in_words_id: = int(gps_in_words_ids[index])
var gps_in_words_id: int = int(gps_in_words_ids[index])
Database.db.update_rows(relational_table, "ID=%s" % gps_in_words_id, {
table_graph_column + "ID": id,
sub_table_id: gp_ids[index],
@@ -266,9 +266,9 @@ func insert_in_database() -> void:
else:
Database.db.query_with_bindings("SELECT * FROM %s WHERE %s=?" % [table, table_graph_column], [word])
if not Database.db.query_result.is_empty():
var e = Database.db.query_result[0]
id = e.ID
if word != e[table_graph_column] or exception != e.Exception or reading != e.Reading or writing != e.writing:
var element: Dictionary = Database.db.query_result[0]
id = element.ID
if word != element[table_graph_column] or exception != element.Exception or reading != element.Reading or writing != element.writing:
Database.db.update_rows(table, "ID=%s" % id, {table_graph_column: word, "Exception": exception, "Reading": reading, "Writing": writing})
for index: int in range(gp_ids.size()):
Database.db.insert_row(relational_table, {
@@ -290,7 +290,7 @@ func insert_in_database() -> void:
func _already_in_database(text: String) -> int:
var query: = "SELECT %s.ID, %s, group_concat(%s, ' ') as %ss, group_concat(%s, ' ') as %ss, group_concat(%s.ID, ' ') as %sIDs
var query: String = "SELECT %s.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
@@ -305,15 +305,15 @@ func _already_in_database(text: String) -> int:
table]
Database.db.query_with_bindings(query, [text])
if not Database.db.query_result.is_empty():
var e = Database.db.query_result[0]
id = e.ID
var element: Dictionary = Database.db.query_result[0]
id = element.ID
return id
return -1
func _add_from_additional_word_list(new_text: String) -> int:
if new_text in Database.additional_word_list:
var is_word: = table == "Words"
var is_word: bool = table == "Words"
var res: Array = Database._import_word_from_csv(new_text, Database.additional_word_list[new_text].GPMATCH as String, is_word)
GPs_updated.emit()
id = res[0]
@@ -355,14 +355,15 @@ func _process(_delta: float) -> void:
remove_gp_button.visible = graphemes_edit_container.get_child_count() > 0
func new_gp_asked_added(ind: int, id: int) -> void:
unvalidated_gp_ids[ind] = id
func new_gp_asked_added(ind: int, gp_id: int) -> void:
unvalidated_gp_ids[ind] = gp_id
set_graphemes_edit(unvalidated_gp_ids)
word_edit.text = get_graphemes(unvalidated_gp_ids)
func _on_add_gp_button_pressed(element: Node) -> void:
var ind_gp_id: = element.get_index() / 2
@warning_ignore("integer_division")
var ind_gp_id: int = element.get_index() / 2
var gp_id: int = sub_elements_list.keys()[0]
unvalidated_gp_ids.insert(ind_gp_id + 1, gp_id)
add_gp_list_button(gp_id, ind_gp_id + 1)