@@ -8,6 +8,8 @@ signal block_modified
88@export var picker_path : NodePath
99@export var block_canvas_path : NodePath
1010
11+ const Constants = preload ("res://addons/block_code/ui/constants.gd" )
12+
1113var drag_offset : Vector2
1214var dragging : Block = null
1315
@@ -39,38 +41,41 @@ func _process(_delta):
3941 var closest_snap_point : SnapPoint = null
4042 var closest_dist : float = INF
4143 var snap_points : Array [Node ] = get_tree ().get_nodes_in_group ("snap_point" )
42- for n in snap_points :
43- if n is SnapPoint :
44- var snap_point : SnapPoint = n as SnapPoint
45- if snap_point .block == null :
46- push_error ("Warning: a snap point does not reference it's parent block." )
47- continue
48- if snap_point .block .on_canvas :
49- if Types .can_cast (dragging .block_type , snap_point .block_type ):
50- var snap_global_pos : Vector2 = snap_point .get_global_rect ().position
51- var temp_dist : float = dragging_global_pos .distance_to (snap_global_pos )
52- if temp_dist < closest_dist :
53- # Check if any parent node is this node
54- var is_child : bool = false
55- var parent = snap_point
56- while parent is SnapPoint :
57- if parent .block == dragging :
58- is_child = true
59-
60- parent = parent .block .get_parent ()
61-
62- if not is_child :
63- closest_dist = temp_dist
64- closest_snap_point = snap_point
65-
66- if closest_dist > 80.0 :
67- closest_snap_point = null
44+ for snap_point in snap_points :
45+ if not snap_point is SnapPoint :
46+ push_error ('Warning: node %s in group "snap_point" is not of class SnapPoint.' % snap_point )
47+ continue
48+ if snap_point .block == null :
49+ push_error ("Warning: snap point %s does not reference it's parent block." % snap_point )
50+ continue
51+ if not snap_point .block .on_canvas :
52+ # We only snap to blocks on the canvas:
53+ continue
54+ if dragging .block_type != snap_point .block_type :
55+ # We only snap to the same block type:
56+ continue
57+ if dragging .block_type == Types .BlockType .VALUE and not Types .can_cast (dragging .variant_type , snap_point .variant_type ):
58+ # We only snap Value blocks to snaps that can cast to same variant:
59+ continue
60+ var snap_global_pos : Vector2 = snap_point .get_global_rect ().position
61+ var temp_dist : float = dragging_global_pos .distance_to (snap_global_pos )
62+ if temp_dist <= Constants .MINIMUM_SNAP_DISTANCE and temp_dist < closest_dist :
63+ # Check if any parent node is this node
64+ var is_child : bool = false
65+ var parent = snap_point
66+ while parent is SnapPoint :
67+ if parent .block == dragging :
68+ is_child = true
69+
70+ parent = parent .block .get_parent ()
71+
72+ if not is_child :
73+ closest_dist = temp_dist
74+ closest_snap_point = snap_point
6875
6976 if closest_snap_point != previewing_snap_point :
7077 _update_preview (closest_snap_point )
7178
72- # TODO: make sure dragging.block_type is the same as snap_point type
73-
7479
7580func _update_preview (snap_point : SnapPoint ):
7681 previewing_snap_point = snap_point
0 commit comments