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

119 lines
3.4 KiB
GDScript

class_name GPListElement
extends MarginContainer
signal delete_pressed()
signal validated()
enum Type {
Silent,
Vowel,
Consonant,
}
var grapheme: String = "":
set = set_grapheme
var phoneme: String = "":
set = set_phoneme
var type: GPListElement.Type = Type.Silent:
set = set_type
var exception: bool = false:
set = set_exception
var id: int = -1
var undo_redo: UndoRedo:
get:
if not undo_redo:
undo_redo = UndoRedo.new()
return undo_redo
@onready var exception_checkbox: CheckBox = %ExceptionCheckBox
@onready var exception_edit_checkbox: CheckBox = %ExceptionEditCheckBox
@onready var grapheme_label: Label = $%Grapheme
@onready var phoneme_label: Label = $%Phoneme
@onready var type_label: Label = $%Type
@onready var grapheme_edit: LineEdit = $%GraphemeEdit
@onready var phoneme_edit: LineEdit = $%PhonemeEdit
@onready var type_edit: OptionButton = $%TypeEdit
@onready var tab_container: TabContainer = $%TabContainer
func set_grapheme(p_grapheme: String) -> void:
grapheme = p_grapheme
if grapheme_label:
grapheme_label.text = grapheme
if grapheme_edit:
grapheme_edit.text = grapheme
func set_phoneme(p_phoneme: String) -> void:
phoneme = p_phoneme
if phoneme_label:
phoneme_label.text = phoneme
if phoneme_edit:
phoneme_edit.text = phoneme
func set_type(p_type: Type) -> void:
type = p_type
if type_label:
type_label.text = Type.keys()[type]
if type_edit:
type_edit.selected = type
func set_exception(p_exception: bool) -> void:
exception = p_exception
if exception_checkbox:
exception_checkbox.button_pressed = bool(exception)
if exception_edit_checkbox:
exception_edit_checkbox.button_pressed = bool(exception)
func _ready() -> void:
set_grapheme(grapheme)
set_phoneme(phoneme)
set_type(type)
set_exception(exception)
func _on_edit_button_pressed() -> void:
edit_mode()
func _on_validate_button_pressed() -> void:
undo_redo.create_action("validated")
undo_redo.add_do_property(self, "exception", int(exception_edit_checkbox.button_pressed))
undo_redo.add_do_property(self, "grapheme", grapheme_edit.text)
undo_redo.add_do_property(self, "phoneme", phoneme_edit.text)
undo_redo.add_do_property(self, "type", type_edit.selected)
undo_redo.add_undo_property(self, "exception", int(exception_checkbox.button_pressed))
undo_redo.add_undo_property(self, "grapheme", grapheme)
undo_redo.add_undo_property(self, "phoneme", phoneme)
undo_redo.add_undo_property(self, "type", type)
undo_redo.commit_action()
tab_container.current_tab = 0
validated.emit()
func edit_mode() -> void:
tab_container.current_tab = 1
func _on_minus_button_pressed() -> void:
delete_pressed.emit()
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 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
Database.db.query_with_bindings("SELECT * FROM GPs WHERE Grapheme=? AND Phoneme=? AND Type=?", [grapheme, phoneme, type])
if Database.db.query_result.is_empty():
Database.db.insert_row("GPs", {Grapheme=grapheme, Phoneme=phoneme, Type=type, Exception=exception})
id = Database.db.last_insert_rowid