extends TouchVerticalContainer class_name Stage signal save # (database_entry: Dictionary) signal discard # () const OPTION_SETS_FILE_PATH: String = "user://option_sets.json" const OPTION_SETS_NOT_AVAILABLE: String = "--" const OPTION_SETS_TREE_STRUCTURE := { "place": null, "anesthesia": null, "first_assistant": null, "type": { "sub_type": { "sub_sub_type": null, "pathology": null, "intervention": null, } } } var option_sets := { "thing": {}, "place": { "P0": null, "P1": null, "P2": null, "xpto_01": null, "xpto_02": null, "xpto_03": null, "xpto_04": null, "xpto_05": null, "xpto_06": null, "xpto_07": null, "xpto_08": null, "xpto_09": null, "xpto_10": null, "xpto_11": null, "xpto_12": null, "xpto_13": null, "xpto_14": null, "xpto_15": null, "xpto_16": null, "xpto_17": null, "xpto_18": null, "xpto_19": null, "xpto_20": null, "xpto_21": null, "xpto_22": null, "xpto_23": null, "xpto_24": null, "xpto_25": null, "xpto_26": null, "xpto_27": null, "xpto_28": null, "xpto_29": null, }, "first_assistant": { "FA0": null, "FA1": null, "FA2": null, }, # "anesthesia": { # "AN0": null, # "AN1": null, # "AN2": null, # }, "type": { "A": { "sub_type": { "aA": { "sub_sub_type": { "aaA": null, "aaB": null, "aaC": null, }, "pathology": { "aaP0": null, "aaP1": null, "aaP2": null, }, "intervention": { "aaI0": null, "aaI1": null, "aaI2": null, }, }, "aB": { "sub_sub_type": { "abA": null, "abB": null, "abC": null, }, "pathology": { "abP0": null, "abP1": null, "abP2": null, }, "intervention": { "abI0": null, "abI1": null, "abI2": null, }, }, }, }, "B": { "sub_type": { "bA": null, "bB": null, }, }, "C": null, }, } onready var process_id := get_node("controls/process_id") as LineEdit onready var surgery_id := get_node("controls/surgery_id") as LineEdit onready var date := get_node("controls/date_picker") as DatePicker onready var place := get_node("controls/place") as LineEdit onready var anesthesia := get_node("controls/anesthesia") as LineEdit onready var first_assistant := get_node("controls/first_assistant") as LineEdit onready var type := get_node("controls/type") as LineEdit onready var sub_type := get_node("controls/sub_type") as LineEdit onready var sub_sub_type := get_node("controls/sub_sub_type") as LineEdit onready var pathology := get_node("controls/pathology") as LineEdit onready var intervention := get_node("controls/intervention") as LineEdit onready var is_urgency := get_node("controls/is_urgency") as Button onready var notes := get_node("controls/notes") as LineEdit onready var save_button := get_node("controls/save") as Button onready var discard_button := get_node("controls/discard") as Button onready var option_sets_map := { "place": place, "anesthesia": anesthesia, "first_assistant": first_assistant, "type": type, "sub_type": sub_type, "sub_sub_type": sub_sub_type, "pathology": pathology, "intervention": intervention } func _init(): exclude_controls = ["date_picker", "save", "discard"] load_option_sets() func _ready(): save_button.connect("pressed", self, "save_action") discard_button.connect("pressed", self, "discard_action") for it in get_node("controls").get_children(): it = it as Control if it is LineEdit: it.connect("focus_entered", it, "set_cursor_position", [99999999]) # @DAM Use MAX_INT it.connect("focus_exited", it, "deselect") # Map option sets buttons. # @DAM TEST defining he option_sets_map onready # var option_sets_map := { # "place": place, # "anesthesia": anesthesia, # "first_assistant": first_assistant, # "type": type, # "sub_type": sub_type, # "sub_sub_type": sub_sub_type, # "pathology": pathology, # "intervention": intervention # } for key in option_sets_map: var button := option_sets_map[key].get_node("auto") as Button button.connect("pressed", self, "auto_populate", [key]) func is_sub_dictionary(dictionary: Dictionary, key: String) -> bool: return dictionary.has(key) && dictionary[key] is Dictionary func get_option_sets(field: String): var options: Array match field: "sub_type": if option_sets["type"].get(type.text) != null: options = option_sets["type"][type.text][field].keys() "sub_sub_type", "pathology", "intervention": if option_sets["type"].get(type.text) != null && option_sets["type"][type.text]["sub_type"].get(sub_type.text) != null: options = option_sets["type"][type.text]["sub_type"][sub_type.text][field].keys() _: options = option_sets[field].keys() if options.size() == 0: options.append(OPTION_SETS_NOT_AVAILABLE) return options func auto_populate(field: String): var stage_options = get_node("/root/main/popup_list") as Popup stage_options.connect("item_selected", self, "auto_selected", [field], CONNECT_ONESHOT) stage_options.popup_options(get_option_sets(field)) func auto_selected(index: int, field: String): var field_input: LineEdit = self[field] field_input.text = get_option_sets(field)[index] field_input.caret_position = field_input.text.length() func save_action(): self.visible = false var staged_entry = get_stage() gather_new_option_sets(staged_entry) emit_signal("save", staged_entry) func discard_action(): self.visible = false emit_signal("discard") func set_stage(entry: Dictionary): process_id.text = entry.process_id surgery_id.text = entry.surgery_id date.set_date(entry.date_year, entry.date_month, entry.date_day) place.text = entry.place anesthesia.text = entry.anesthesia first_assistant.text = entry.first_assistant type.text = entry.type sub_type.text = entry.sub_type sub_sub_type.text = entry.sub_sub_type pathology.text = entry.pathology intervention.text = entry.intervention is_urgency.pressed = entry.is_urgency notes.text = entry.notes self.scroll_vertical = 0 func get_stage() -> Dictionary: var entry := { "process_id": process_id.text, "surgery_id": surgery_id.text, "date_year": date.get_year(), "date_month": date.get_month(), "date_day": date.get_day(), "place": place.text, "anesthesia": anesthesia.text, "first_assistant": first_assistant.text, "type": type.text, "sub_type": sub_type.text, "sub_sub_type": sub_sub_type.text, "pathology": pathology.text, "intervention": intervention.text, "is_urgency": is_urgency.pressed, "notes": notes.text, } return entry func load_option_sets(file_path: String = OPTION_SETS_FILE_PATH): var file := File.new() file.open(file_path, File.READ_WRITE) var file_content = file.get_as_text() file.close() var parse_result = JSON.parse(file_content) if parse_result.error == OK && typeof(parse_result.result) == TYPE_DICTIONARY: option_sets = parse_result.result else: option_sets = {} push_error("Failed to parse option sets file: '%s'.") # @DAM Only do sanitize_option_sets_dict if file_path is no the default one. sanitize_option_sets_dict(OPTION_SETS_TREE_STRUCTURE, option_sets) # if file_path != OPTION_SETS_FILE_PATH: # sanitize_option_sets() func sanitize_option_sets_dict(blueprint: Dictionary, test: Dictionary): for key in blueprint: if test.get(key) == null: test[key] = {} if blueprint[key] != null: for sub_value in test[key]: if test[key][sub_value] == null: test[key][sub_value] = {} sanitize_option_sets_dict(blueprint[key], test[key][sub_value]) func gather_new_option_sets(entry: Dictionary): pass # @DAM TODO WIP # WIP WIP WIP if entry["type"] != OPTION_SETS_NOT_AVAILABLE: if option_sets["type"].has(entry["type"]) == false: # option_sets["type"][entry["type"]] = {} func sanitize_option_sets(): for key in OPTION_SETS_TREE_STRUCTURE: if option_sets.get(key) == null: option_sets[key] = {} for type_key in option_sets["type"]: var type_value := option_sets["type"][type_key] as Dictionary if type_value.get("sub_type") == null: type_value["sub_type"] = {} else: for sub_type_key in type_value["sub_type"]: var sub_type_value := type_value["sub_type"][sub_type_key] as Dictionary if sub_type_value.get("sub_sub_type") == null: sub_type_value["sub_sub_type"] = {} if sub_type_value.get("pathology") == null: sub_type_value["pathology"] = {} if sub_type_value.get("intervention") == null: sub_type_value["intervention"] = {} func store_option_sets(file_path: String = OPTION_SETS_FILE_PATH): var file := File.new() file.open(file_path, File.WRITE) file.store_string(JSON.print(option_sets, "" if file_path == OPTION_SETS_FILE_PATH else "\t")) file.close() func clear_option_sets(save_changes: bool = false): option_sets = {} if save_changes: store_option_sets() func pointer_input_on_click_handler(pointer: PointerInputSensor.PointerInputData): .pointer_input_on_click_handler(pointer) var target: Control = pointer.target.get_parent() var button: Button if target is Button: button = target elif target.get_node("auto") is Button: button = target.get_node("auto") if button != null && button.get_global_rect().has_point(pointer.current_position): if button is CheckBox || button is CheckButton: button.pressed = !button.pressed button.emit_signal("button_down") button.emit_signal("pressed") button.emit_signal("button_up")