diff options
| author | dam <dam@gudinoff> | 2022-01-10 17:56:30 +0000 |
|---|---|---|
| committer | dam <dam@gudinoff> | 2022-01-10 17:56:30 +0000 |
| commit | 81b602620412fbad0429e841051c30c537a1b461 (patch) | |
| tree | 780bf47204aa13e41bd5c22e527f7c69f05e5bcc /touch_vertical_container | |
| parent | 5ba40857cdc770841d216a27e2a9e8bb3ebf3186 (diff) | |
| download | surgery-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.gd | 78 | ||||
| -rw-r--r-- | touch_vertical_container/touch_vertical_container.tscn | 18 |
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 |
