aboutsummaryrefslogtreecommitdiff
path: root/touch_vertical_container
diff options
context:
space:
mode:
authordam <dam@gudinoff>2022-01-10 17:56:30 +0000
committerdam <dam@gudinoff>2022-01-10 17:56:30 +0000
commit81b602620412fbad0429e841051c30c537a1b461 (patch)
tree780bf47204aa13e41bd5c22e527f7c69f05e5bcc /touch_vertical_container
parent5ba40857cdc770841d216a27e2a9e8bb3ebf3186 (diff)
downloadsurgery-log-81b602620412fbad0429e841051c30c537a1b461.tar.zst
surgery-log-81b602620412fbad0429e841051c30c537a1b461.zip
Split touch logic from stage
Diffstat (limited to 'touch_vertical_container')
-rw-r--r--touch_vertical_container/touch_vertical_container.gd78
-rw-r--r--touch_vertical_container/touch_vertical_container.tscn18
2 files changed, 96 insertions, 0 deletions
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