Skip to content

Commit c7b6517

Browse files
authored
Merge pull request #233 from endlessm/parameter-input-drag-event
ParameterInput: Detect click & drag gestures
2 parents 73d7d00 + 6daa3ca commit c7b6517

File tree

5 files changed

+50
-0
lines changed

5 files changed

+50
-0
lines changed

addons/block_code/ui/blocks/block/block.gd

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,18 @@ func _update_template_editor():
7878
template_editor.parameter_defaults = _get_parameter_defaults()
7979
if not template_editor.modified.is_connected(_on_template_editor_modified):
8080
template_editor.modified.connect(_on_template_editor_modified)
81+
if not template_editor.drag_started.is_connected(_on_template_editor_drag_started):
82+
template_editor.drag_started.connect(_on_template_editor_drag_started)
8183

8284

8385
func _on_template_editor_modified():
8486
modified.emit()
8587

8688

89+
func _on_template_editor_drag_started():
90+
_drag_started()
91+
92+
8793
func _get_format_string() -> String:
8894
if not definition:
8995
return ""

addons/block_code/ui/blocks/utilities/parameter_input/parameter_input.gd

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
@tool
22
extends MarginContainer
33

4+
signal drag_started
5+
6+
const Constants = preload("res://addons/block_code/ui/constants.gd")
47
const OptionData = preload("res://addons/block_code/code_generation/option_data.gd")
58
const Types = preload("res://addons/block_code/types/types.gd")
69

@@ -16,6 +19,9 @@ signal modified
1619

1720
var default_value: Variant
1821

22+
var _drag_start: Vector2 = Vector2.INF
23+
var _is_dragging: bool = false
24+
1925
@onready var _panel := %Panel
2026
@onready var snap_point := %SnapPoint
2127
@onready var _input_switcher := %InputSwitcher
@@ -283,3 +289,32 @@ func _on_option_input_item_selected(index):
283289

284290
func _on_snap_point_snapped_block_changed(block):
285291
_update_visible_input()
292+
293+
294+
func _input(event: InputEvent) -> void:
295+
if snap_point.has_snapped_block():
296+
return
297+
298+
if event is InputEventMouseButton:
299+
var button_event: InputEventMouseButton = event as InputEventMouseButton
300+
301+
if button_event.button_index != MOUSE_BUTTON_LEFT:
302+
return
303+
304+
if button_event.double_click:
305+
# Double click event (with the mouse released) has both pressed=true
306+
# and double_click=true, so ignore it as a special case.
307+
pass
308+
elif button_event.pressed and get_global_rect().has_point(button_event.global_position):
309+
# Keep track of where the mouse click originated, but allow this
310+
# event to propagate to other nodes.
311+
_drag_start = event.global_position
312+
else:
313+
_drag_start = Vector2.INF
314+
elif _drag_start != Vector2.INF and event is InputEventMouseMotion:
315+
var motion_event: InputEventMouseMotion = event as InputEventMouseMotion
316+
317+
if not get_global_rect().has_point(event.global_position) and _drag_start.distance_to(event.global_position) > Constants.MINIMUM_DRAG_THRESHOLD:
318+
get_viewport().set_input_as_handled()
319+
drag_started.emit()
320+
_drag_start = Vector2.INF

addons/block_code/ui/blocks/utilities/parameter_input/parameter_input.tscn

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ custom_minimum_size = Vector2(40, 0)
8787
layout_mode = 2
8888
tooltip_text = "Parameter"
8989
theme_override_styles/normal = SubResource("StyleBoxEmpty_fjquj")
90+
action_mode = 1
9091
fit_to_longest_item = false
9192

9293
[node name="Vector2Input" type="MarginContainer" parent="InputSwitcher"]
@@ -171,6 +172,7 @@ theme_override_colors/font_focus_color = Color(0, 0, 0, 1)
171172
theme_override_colors/font_color = Color(0, 0, 0, 1)
172173
theme_override_styles/focus = SubResource("StyleBoxEmpty_e7f0k")
173174
theme_override_styles/normal = SubResource("StyleBoxEmpty_fjquj")
175+
action_mode = 1
174176
selected = 0
175177
item_count = 2
176178
popup/item_0/text = "False"

addons/block_code/ui/blocks/utilities/template_editor/template_editor.gd

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
class_name TemplateEditor
33
extends Container
44

5+
signal drag_started
56
signal modified
67

78
const BlockDefinition = preload("res://addons/block_code/code_generation/block_definition.gd")
@@ -113,6 +114,7 @@ func _append_input_parameter(parameter: Dictionary, id: int):
113114
parameter_input.name = "ParameterInput%d" % id
114115
parameter_input.placeholder = parameter["name"]
115116
parameter_input.variant_type = parameter["type"]
117+
parameter_input.drag_started.connect(_on_parameter_input_drag_started)
116118

117119
if default_value is OptionData:
118120
var option_data := default_value as OptionData
@@ -136,3 +138,7 @@ func _append_output_parameter(parameter: Dictionary, id: int):
136138
parameter_output.block = parent_block
137139
parameter_output.parameter_name = parameter["name"]
138140
_container.add_child(parameter_output)
141+
142+
143+
func _on_parameter_input_drag_started():
144+
drag_started.emit()

addons/block_code/ui/constants.gd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const KNOB_Z = 5.0
99
const CONTROL_MARGIN = 20.0
1010
const OUTLINE_WIDTH = 3.0
1111
const MINIMUM_SNAP_DISTANCE = 80.0
12+
const MINIMUM_DRAG_THRESHOLD = 25
1213

1314
const FOCUS_BORDER_COLOR = Color(225, 242, 0)
1415

0 commit comments

Comments
 (0)