Skip to content

Commit 7c520fb

Browse files
authored
Merge pull request #73 from endlessm/T35519-snap-point-enhancements
Re-order blocks when a block is placed in an occupied snap point
2 parents bde4e1b + ebcd851 commit 7c520fb

File tree

4 files changed

+85
-23
lines changed

4 files changed

+85
-23
lines changed

addons/block_code/drag_manager/drag_manager.gd

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ signal block_modified
99
@export var block_canvas_path: NodePath
1010

1111
const Constants = preload("res://addons/block_code/ui/constants.gd")
12+
const BLOCK_AUTO_PLACE_MARGIN: Vector2 = Vector2(16, 8)
1213

1314
var drag_offset: Vector2
1415
var dragging: Block = null
@@ -33,10 +34,6 @@ func _process(_delta):
3334

3435
var dragging_global_pos: Vector2 = dragging.get_global_rect().position
3536

36-
# TODO: check if dropped snap point is occupied
37-
# if so, replace with this node and attach the previous one
38-
# to this node's bottom snap
39-
4037
# Find closest snap point not child of current node
4138
var closest_snap_point: SnapPoint = null
4239
var closest_dist: float = INF
@@ -92,6 +89,7 @@ func _update_preview(snap_point: SnapPoint):
9289
preview_block.color = Color(1, 1, 1, 0.5)
9390
preview_block.custom_minimum_size = dragging.get_global_rect().size
9491
preview_block.size_flags_horizontal = Control.SIZE_SHRINK_BEGIN
92+
preview_block.size_flags_vertical = Control.SIZE_SHRINK_BEGIN
9593

9694
previewing_snap_point.add_child(preview_block)
9795

@@ -105,7 +103,9 @@ func drag_block(block: Block, copied_from: Block = null):
105103
new_pos += block.get_global_rect().position
106104

107105
var parent = block.get_parent()
108-
if parent:
106+
if parent is SnapPoint:
107+
parent.remove_snapped_block(block)
108+
elif parent:
109109
parent.remove_child(block)
110110

111111
block.position = new_pos
@@ -142,7 +142,13 @@ func drag_ended():
142142
# Can snap block
143143
preview_block.free()
144144
preview_block = null
145-
previewing_snap_point.add_child(dragging)
145+
var orphaned_block = previewing_snap_point.set_snapped_block(dragging)
146+
if orphaned_block:
147+
# Place the orphan block somewhere outside the snap point
148+
orphaned_block.position = (
149+
(previewing_snap_point.block.global_position - block_canvas_rect.position) + (previewing_snap_point.block.get_size() * Vector2.RIGHT) + BLOCK_AUTO_PLACE_MARGIN
150+
)
151+
_block_canvas.add_block(orphaned_block)
146152
else:
147153
# Block goes on screen somewhere
148154
dragging.position = (get_global_mouse_position() - block_canvas_rect.position - drag_offset)

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

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -100,18 +100,7 @@ func _ready():
100100
snap_point.block_type = block_type
101101
snap_point.variant_type = variant_type
102102

103-
match variant_type:
104-
TYPE_COLOR:
105-
switch_input(_color_input)
106-
TYPE_VECTOR2:
107-
switch_input(_vector2_input)
108-
TYPE_BOOL:
109-
switch_input(_bool_input)
110-
_:
111-
switch_input(_text_input)
112-
113-
if option:
114-
switch_input(_option_input)
103+
_update_visible_input()
115104

116105

117106
func get_snapped_block() -> Block:
@@ -148,11 +137,29 @@ func _on_line_edit_text_changed(new_text):
148137
modified.emit()
149138

150139

151-
func switch_input(node: Node):
140+
func _update_visible_input():
141+
if snap_point.has_snapped_block():
142+
_switch_input(null)
143+
elif option:
144+
_switch_input(_option_input)
145+
else:
146+
match variant_type:
147+
TYPE_COLOR:
148+
_switch_input(_color_input)
149+
TYPE_VECTOR2:
150+
_switch_input(_vector2_input)
151+
TYPE_BOOL:
152+
_switch_input(_bool_input)
153+
_:
154+
_switch_input(_text_input)
155+
156+
157+
func _switch_input(node: Node):
152158
for c in _input_switcher.get_children():
153159
c.visible = false
154160

155-
node.visible = true
161+
if node:
162+
node.visible = true
156163

157164

158165
func _on_color_input_color_changed(color):
@@ -169,3 +176,7 @@ func _update_panel_bg_color(new_color):
169176

170177
func _on_option_input_item_selected(index):
171178
modified.emit()
179+
180+
181+
func _on_snap_point_snapped_block_changed(block):
182+
_update_visible_input()

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
@@ -156,6 +156,7 @@ size_flags_horizontal = 3
156156

157157
[node name="BoolInput" type="MarginContainer" parent="InputSwitcher"]
158158
unique_name_in_owner = true
159+
visible = false
159160
layout_mode = 2
160161
theme_override_constants/margin_left = 8
161162

@@ -187,3 +188,4 @@ variant_type = 4
187188
[connection signal="text_changed" from="InputSwitcher/Vector2Input/HBoxContainer/XLineEdit" to="." method="_on_line_edit_text_changed"]
188189
[connection signal="text_changed" from="InputSwitcher/Vector2Input/HBoxContainer/YLineEdit" to="." method="_on_line_edit_text_changed"]
189190
[connection signal="item_selected" from="InputSwitcher/BoolInput/BoolInputOption" to="." method="_on_option_input_item_selected"]
191+
[connection signal="snapped_block_changed" from="SnapPoint" to="." method="_on_snap_point_snapped_block_changed"]

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

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ extends MarginContainer
99
## When block_type is [enum Types.BlockType.VALUE], the type of the value that can be used at this snap point.
1010
@export var variant_type: Variant.Type
1111

12+
signal snapped_block_changed(block: Block)
13+
1214
var block: Block
1315

1416

@@ -18,7 +20,48 @@ func _ready():
1820

1921

2022
func get_snapped_block() -> Block:
21-
if get_child_count() == 0:
22-
return null
23+
for node in get_children():
24+
if node is Block:
25+
return node
26+
return null
27+
28+
29+
func has_snapped_block() -> bool:
30+
return get_snapped_block() != null
31+
32+
33+
func set_snapped_block(snapped_block: Block) -> Block:
34+
var orphaned_block: Block = _pop_snapped_block()
35+
36+
if snapped_block:
37+
add_child(snapped_block)
38+
39+
if snapped_block and orphaned_block:
40+
var last_snap = _get_last_snap(snapped_block)
41+
if last_snap:
42+
last_snap.set_snapped_block(orphaned_block)
43+
orphaned_block = null
44+
45+
snapped_block_changed.emit(snapped_block)
46+
47+
return orphaned_block
48+
49+
50+
func remove_snapped_block(snapped_block: Block):
51+
assert(snapped_block == get_snapped_block())
52+
set_snapped_block(null)
53+
54+
55+
func _pop_snapped_block() -> Block:
56+
var snapped_block = get_snapped_block()
57+
if snapped_block:
58+
remove_child(snapped_block)
59+
return snapped_block
60+
2361

24-
return get_child(0) as Block
62+
func _get_last_snap(block: Block) -> SnapPoint:
63+
var last_snap: SnapPoint
64+
while block:
65+
last_snap = block.bottom_snap
66+
block = last_snap.get_snapped_block() if last_snap else null
67+
return last_snap

0 commit comments

Comments
 (0)