diff options
| -rw-r--r-- | logic/stage.gd | 99 | ||||
| -rw-r--r-- | main.tscn | 48 | ||||
| -rw-r--r-- | project.godot | 8 | ||||
| -rw-r--r-- | readme.md | 5 | ||||
| -rw-r--r-- | touch_item_list/touch_item_list.gd | 96 | ||||
| -rw-r--r-- | touch_item_list/touch_item_list.tscn | 2 | ||||
| -rw-r--r-- | touch_vertical_container/touch_vertical_container.gd | 78 | ||||
| -rw-r--r-- | touch_vertical_container/touch_vertical_container.tscn | 18 |
8 files changed, 183 insertions, 171 deletions
diff --git a/logic/stage.gd b/logic/stage.gd index dc42273..12457c9 100644 --- a/logic/stage.gd +++ b/logic/stage.gd @@ -1,11 +1,10 @@ -extends ScrollContainer +extends TouchVerticalContainer 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 staged_entry := {} var filters := { @@ -44,8 +43,6 @@ var filters := { "xpto_29": null, }, } -var is_pointer_dragging := false -var pointer_drag_velocity := 0.0 onready var process_id := get_node("controls/process_id") as LineEdit onready var surgery_id := get_node("controls/surgery_id") as LineEdit @@ -62,40 +59,16 @@ 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 _init(): + exclude_controls = ["date_picker", "save", "discard"] 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") - var auto_place := place.get_node("auto") as Button auto_place.connect("pressed", self, "auto_populate", ["place"]) @@ -112,14 +85,6 @@ func auto_selected(index: int, field: String): field_input.caret_position = field_input.text.length() - -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()) @@ -167,60 +132,6 @@ func get_stage() -> Dictionary: return staged_entry -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: - - # @DAM Try this approach on the TouchItemList - - var target: Control = pointer.target.get_parent() - var position := target.get_global_mouse_position() - target.rect_global_position - - var button: Button = target.get_node("auto") - if button != null && button.get_rect().has_point(position): - button.grab_focus() -# button.emit_signal("button_down") - button.emit_signal("pressed") -# button.emit_signal("button_up") - else: - target.grab_focus() - return - - - 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) @@ -1,4 +1,4 @@ -[gd_scene load_steps=12 format=2] +[gd_scene load_steps=13 format=2] [ext_resource path="res://main.gd" type="Script" id=1] [ext_resource path="res://date_picker/date_picker.tscn" type="PackedScene" id=2] @@ -11,6 +11,7 @@ [ext_resource path="res://logic/stage.gd" type="Script" id=9] [ext_resource path="res://logic/popup_list.gd" type="Script" id=10] [ext_resource path="res://touch_item_list/touch_item_list.tscn" type="PackedScene" id=11] +[ext_resource path="res://touch_vertical_container/touch_vertical_container.tscn" type="PackedScene" id=12] [node name="main" type="Control"] anchor_right = 1.0 @@ -70,31 +71,22 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="stage" type="ScrollContainer" parent="."] +[node name="stage" parent="." instance=ExtResource( 12 )] visible = false -anchor_right = 1.0 -anchor_bottom = 1.0 margin_top = 60.0 -scroll_horizontal_enabled = false script = ExtResource( 9 ) -__meta__ = { -"_edit_use_anchors_": false -} -[node name="controls" type="VBoxContainer" parent="stage"] -margin_right = 1080.0 +[node name="controls" parent="stage" index="0"] margin_bottom = 1860.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -[node name="process_id" type="LineEdit" parent="stage/controls"] +[node name="process_id" type="LineEdit" parent="stage/controls" index="0"] margin_right = 1080.0 margin_bottom = 49.0 placeholder_text = "Nº Processo" caret_blink = true caret_blink_speed = 0.5 -[node name="surgery_id" type="LineEdit" parent="stage/controls"] +[node name="surgery_id" type="LineEdit" parent="stage/controls" index="1"] margin_top = 53.0 margin_right = 1080.0 margin_bottom = 102.0 @@ -102,7 +94,7 @@ placeholder_text = "Nº Cirurgia" caret_blink = true caret_blink_speed = 0.5 -[node name="date_picker" parent="stage/controls" instance=ExtResource( 2 )] +[node name="date_picker" parent="stage/controls" index="2" instance=ExtResource( 2 )] anchor_right = 0.0 anchor_bottom = 0.0 margin_top = 106.0 @@ -110,7 +102,7 @@ margin_right = 1080.0 margin_bottom = 306.0 rect_min_size = Vector2( 400, 200 ) -[node name="place" type="LineEdit" parent="stage/controls"] +[node name="place" type="LineEdit" parent="stage/controls" index="3"] margin_top = 310.0 margin_right = 1080.0 margin_bottom = 359.0 @@ -124,7 +116,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 text = "X" -[node name="anesthesia" type="LineEdit" parent="stage/controls"] +[node name="anesthesia" type="LineEdit" parent="stage/controls" index="4"] margin_top = 363.0 margin_right = 1080.0 margin_bottom = 412.0 @@ -132,7 +124,7 @@ placeholder_text = "Anestesia" caret_blink = true caret_blink_speed = 0.5 -[node name="first_assistant" type="LineEdit" parent="stage/controls"] +[node name="first_assistant" type="LineEdit" parent="stage/controls" index="5"] margin_top = 416.0 margin_right = 1080.0 margin_bottom = 465.0 @@ -140,7 +132,7 @@ placeholder_text = "1º Ajudante" caret_blink = true caret_blink_speed = 0.5 -[node name="type" type="LineEdit" parent="stage/controls"] +[node name="type" type="LineEdit" parent="stage/controls" index="6"] margin_top = 469.0 margin_right = 1080.0 margin_bottom = 518.0 @@ -148,7 +140,7 @@ placeholder_text = "Tipo" caret_blink = true caret_blink_speed = 0.5 -[node name="sub_type" type="LineEdit" parent="stage/controls"] +[node name="sub_type" type="LineEdit" parent="stage/controls" index="7"] margin_top = 522.0 margin_right = 1080.0 margin_bottom = 571.0 @@ -156,7 +148,7 @@ placeholder_text = "Subtipo" caret_blink = true caret_blink_speed = 0.5 -[node name="sub_sub_type" type="LineEdit" parent="stage/controls"] +[node name="sub_sub_type" type="LineEdit" parent="stage/controls" index="8"] margin_top = 575.0 margin_right = 1080.0 margin_bottom = 624.0 @@ -164,7 +156,7 @@ placeholder_text = "Sub-Subtipo" caret_blink = true caret_blink_speed = 0.5 -[node name="pathology" type="LineEdit" parent="stage/controls"] +[node name="pathology" type="LineEdit" parent="stage/controls" index="9"] margin_top = 628.0 margin_right = 1080.0 margin_bottom = 677.0 @@ -172,7 +164,7 @@ placeholder_text = "Patologia" caret_blink = true caret_blink_speed = 0.5 -[node name="intervention" type="LineEdit" parent="stage/controls"] +[node name="intervention" type="LineEdit" parent="stage/controls" index="10"] margin_top = 681.0 margin_right = 1080.0 margin_bottom = 730.0 @@ -180,13 +172,13 @@ placeholder_text = "Intervenção" caret_blink = true caret_blink_speed = 0.5 -[node name="is_urgency" type="CheckBox" parent="stage/controls"] +[node name="is_urgency" type="CheckBox" parent="stage/controls" index="11"] margin_top = 734.0 margin_right = 1080.0 margin_bottom = 781.0 text = "Urgência" -[node name="notes" type="LineEdit" parent="stage/controls"] +[node name="notes" type="LineEdit" parent="stage/controls" index="12"] margin_top = 785.0 margin_right = 1080.0 margin_bottom = 834.0 @@ -194,7 +186,7 @@ placeholder_text = "Notas" caret_blink = true caret_blink_speed = 0.5 -[node name="discard" type="Button" parent="stage/controls"] +[node name="discard" type="Button" parent="stage/controls" index="13"] margin_top = 838.0 margin_right = 1080.0 margin_bottom = 888.0 @@ -206,7 +198,7 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="save" type="Button" parent="stage/controls"] +[node name="save" type="Button" parent="stage/controls" index="14"] margin_top = 892.0 margin_right = 1080.0 margin_bottom = 942.0 @@ -271,3 +263,5 @@ valign = 2 __meta__ = { "_edit_use_anchors_": false } + +[editable path="stage"] diff --git a/project.godot b/project.godot index d630b8d..9067744 100644 --- a/project.godot +++ b/project.godot @@ -29,7 +29,7 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://pointer_input_sensor.gd" }, { -"base": "ScrollContainer", +"base": "TouchVerticalContainer", "class": "Stage", "language": "GDScript", "path": "res://logic/stage.gd" @@ -39,6 +39,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://touch_item_list/touch_item_list.gd" }, { +"base": "ScrollContainer", +"class": "TouchVerticalContainer", +"language": "GDScript", +"path": "res://touch_vertical_container/touch_vertical_container.gd" +}, { "base": "Control", "class": "ValuePicker", "language": "GDScript", @@ -51,6 +56,7 @@ _global_script_class_icons={ "PointerInputSensor": "", "Stage": "", "TouchItemList": "", +"TouchVerticalContainer": "", "ValuePicker": "" } @@ -17,7 +17,10 @@ Surgery Log - [x] export database to CSV file; - [x] allow to reset database; - [x] split touch logic from database (create TouchItemList); -- [ ] split touch logic from stage (create TouchVerticalContainer); +- [x] split touch logic from stage (create TouchVerticalContainer); +- [ ] on-press: + - highlight item on lists + - mark auto buttons as pressed - [ ] load/store filters CSV file; - [ ] import/export filters to CSV file; - [ ] Implement file access permission check on Android: diff --git a/touch_item_list/touch_item_list.gd b/touch_item_list/touch_item_list.gd index d2d0d37..0534bb2 100644 --- a/touch_item_list/touch_item_list.gd +++ b/touch_item_list/touch_item_list.gd @@ -6,16 +6,16 @@ const POINTER_VELOCITY_DECAYING_FACTOR: float = 2.5 var is_pointer_dragging := false var pointer_drag_velocity := 0.0 -onready var drag_sensor := get_node("drag_sensor") as PointerInputSensor +onready var sensor := get_node("sensor") as PointerInputSensor onready var v_scroll_bar := get_v_scroll() as ScrollBar func _ready(): - 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") - drag_sensor.connect("on_scroll", self, "pointer_input_handler") + sensor.connect("on_press", self, "pointer_input_on_press_handler") + sensor.connect("on_drag", self, "pointer_input_on_drag_handler") + sensor.connect("on_end_drag", self, "pointer_input_on_end_drag_handler") + sensor.connect("on_click", self, "pointer_input_on_click_handler") + sensor.connect("on_scroll", self, "pointer_input_on_scroll_handler") func _process(delta: float): @@ -25,46 +25,48 @@ func _process(delta: float): v_scroll_bar.value -= pointer_drag_velocity * delta -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_SCROLL: - var target := self - target._gui_input(pointer.event) - - PointerInputSensor.PointerInputAction.ON_CLICK: - var target := self - 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 pointer_input_on_press_handler(pointer: PointerInputSensor.PointerInputData): + is_pointer_dragging = true + + +func pointer_input_on_drag_handler(pointer: PointerInputSensor.PointerInputData): + is_pointer_dragging = true + pointer_drag_velocity = pointer.velocity.y + v_scroll_bar.value -= pointer.relative_position.y + + +func pointer_input_on_end_drag_handler(pointer: PointerInputSensor.PointerInputData): + is_pointer_dragging = false + + +func pointer_input_on_click_handler(pointer: PointerInputSensor.PointerInputData): + var target := self + 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 pointer_input_on_scroll_handler(pointer: PointerInputSensor.PointerInputData): + var target := self + target._gui_input(pointer.event) diff --git a/touch_item_list/touch_item_list.tscn b/touch_item_list/touch_item_list.tscn index 6022ed4..6207e7d 100644 --- a/touch_item_list/touch_item_list.tscn +++ b/touch_item_list/touch_item_list.tscn @@ -13,7 +13,7 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="drag_sensor" type="Control" parent="."] +[node name="sensor" type="Control" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 margin_right = -8.0 diff --git a/touch_vertical_container/touch_vertical_container.gd b/touch_vertical_container/touch_vertical_container.gd new file mode 100644 index 0000000..10462fd --- /dev/null +++ b/touch_vertical_container/touch_vertical_container.gd @@ -0,0 +1,78 @@ +extends ScrollContainer +class_name TouchVerticalContainer + +const POINTER_VELOCITY_DECAYING_FACTOR: float = 2.5 + +var is_pointer_dragging := false +var pointer_drag_velocity := 0.0 +var exclude_controls := [] + + +func _ready(): + + for it in get_node("controls").get_children(): + it = it as Control + if exclude_controls.has(it.name): + continue + + var sensor = PointerInputSensor.new() + it.add_child(sensor) + + sensor.name = "sensor" + sensor.anchor_right = 1.0 + sensor.anchor_bottom = 1.0 + + sensor.connect("on_press", self, "pointer_input_on_press_handler") + sensor.connect("on_drag", self, "pointer_input_on_drag_handler") + sensor.connect("on_end_drag", self, "pointer_input_on_end_drag_handler") + sensor.connect("on_click", self, "pointer_input_on_click_handler") + + it.connect("focus_entered", sensor, "set_mouse_filter", [Control.MOUSE_FILTER_IGNORE]) + it.connect("focus_entered", sensor, "mouse_default_cursor_shape", [Control.CURSOR_IBEAM]) + it.connect("focus_exited", sensor, "set_mouse_filter", [Control.MOUSE_FILTER_STOP]) + it.connect("focus_exited", 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) + self.scroll_vertical -= pointer_drag_velocity * delta + + +func pointer_input_on_press_handler(pointer: PointerInputSensor.PointerInputData): + is_pointer_dragging = true + + +func pointer_input_on_drag_handler(pointer: PointerInputSensor.PointerInputData): + is_pointer_dragging = true + pointer_drag_velocity = pointer.velocity.y + self.scroll_vertical -= pointer.relative_position.y + + +func pointer_input_on_end_drag_handler(pointer: PointerInputSensor.PointerInputData): + is_pointer_dragging = false + + +func pointer_input_on_click_handler(pointer: PointerInputSensor.PointerInputData): + var target: Control = pointer.target.get_parent() + var position := target.get_global_mouse_position() + target.grab_focus() + + 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(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") + + diff --git a/touch_vertical_container/touch_vertical_container.tscn b/touch_vertical_container/touch_vertical_container.tscn new file mode 100644 index 0000000..770ac38 --- /dev/null +++ b/touch_vertical_container/touch_vertical_container.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://touch_vertical_container/touch_vertical_container.gd" type="Script" id=1] + +[node name="scroll_container" type="ScrollContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +scroll_horizontal_enabled = false +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="controls" type="VBoxContainer" parent="."] +margin_right = 1080.0 +margin_bottom = 1920.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 |
