extends ScrollContainer class_name Stage signal save # (database_entry: Dictionary) signal discard # () const FILTERS_FILE_PATH: String = "user://filters.csv" const POINTER_VELOCITY_DECAYING_FACTOR: float = 2.5 var is_pointer_dragging := false var pointer_drag_velocity := 0.0 var filters := {} 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 v_scroll_bar := get_v_scrollbar() as VScrollBar 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 match it.name: "date_picker", "save", "discard": pass _: var drag_sensor = PointerInputSensor.new() it.add_child(drag_sensor) drag_sensor.name = "drag_sensor" drag_sensor.anchor_right = 1.0 drag_sensor.anchor_bottom = 1.0 drag_sensor.connect("on_press", self, "pointer_input_handler") drag_sensor.connect("on_drag", self, "pointer_input_handler") drag_sensor.connect("on_end_drag", self, "pointer_input_handler") drag_sensor.connect("on_click", self, "pointer_input_handler") it.connect("focus_entered", drag_sensor, "set_mouse_filter", [Control.MOUSE_FILTER_IGNORE]) it.connect("focus_entered", drag_sensor, "mouse_default_cursor_shape", [Control.CURSOR_IBEAM]) it.connect("focus_exited", drag_sensor, "set_mouse_filter", [Control.MOUSE_FILTER_STOP]) it.connect("focus_exited", drag_sensor, "mouse_default_cursor_shape", [Control.CURSOR_ARROW]) if it is LineEdit: it.connect("focus_exited", it, "deselect") func _process(delta: float): # Apply drag movement inertia. if is_pointer_dragging == false && abs(pointer_drag_velocity) > 0.5: pointer_drag_velocity *= clamp((1.0 - POINTER_VELOCITY_DECAYING_FACTOR * delta), 0.0, 1.0) v_scroll_bar.value -= pointer_drag_velocity * delta func save_action(): self.visible = false emit_signal("save", get_stage()) 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 # @DAM TODO func get_stage() -> Dictionary: # @DAM Simplify all this... avoid creating multiple entries/dictionaries. var entry: Dictionary = { "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 _notification(what: int): if what == MainLoop.NOTIFICATION_WM_GO_BACK_REQUEST: discard_action() func pointer_input_handler(pointer: PointerInputSensor.PointerInputData): match pointer.action: PointerInputSensor.PointerInputAction.ON_PRESS: is_pointer_dragging = true PointerInputSensor.PointerInputAction.ON_DRAG: is_pointer_dragging = true pointer_drag_velocity = pointer.velocity.y v_scroll_bar.value -= pointer.relative_position.y PointerInputSensor.PointerInputAction.ON_END_DRAG: is_pointer_dragging = false PointerInputSensor.PointerInputAction.ON_CLICK: var target: Control = pointer.target.get_parent() var position := target.get_global_mouse_position() - target.rect_global_position var event_touch := InputEventScreenTouch.new() event_touch.index = 0 event_touch.position = position var event_mouse := InputEventMouseButton.new() event_mouse.button_index = BUTTON_LEFT event_mouse.button_mask = BUTTON_MASK_LEFT event_mouse.position = position event_mouse.pressed = true event_touch.pressed = true target._gui_input(event_mouse) target._gui_input(event_touch) target.grab_focus() event_mouse.pressed = false event_touch.pressed = false target._gui_input(event_mouse) target._gui_input(event_touch) func load_filters(file_path: String = FILTERS_FILE_PATH): var file := File.new() file.open(file_path, File.READ_WRITE) var headers: PoolStringArray var is_first_line := true # while file.eof_reached() == false: # @DAM Why this? while file.get_position() < file.get_len(): var csv_entry := file.get_csv_line() if is_first_line: is_first_line = false headers = csv_entry continue # var entry = DatabaseEntry.instance_entry() # for idx in headers.size(): # var field_name := headers[idx] # var field_value := csv_entry[idx] # match field_name: # "date_year", "date_month", "date_day": # entry[field_name] = int(field_value) # "is_urgency": # entry[field_name] = true if field_value.strip_edges().to_lower() == "true" else false # _: # entry[field_name] = field_value # filters.append(entry) func store_filters(file_path: String = FILTERS_FILE_PATH): pass # @DAM TODO func clear_filters(save_changes: bool = false): pass # @DAM TODO if save_changes: store_filters()