Skip to content

Commit 936de49

Browse files
committed
Re-order blocks when a block is placed in an occupied snap point
https://phabricator.endlessm.com/T35519
1 parent a93162d commit 936de49

File tree

2 files changed

+57
-9
lines changed

2 files changed

+57
-9
lines changed

addons/block_code/drag_manager/drag_manager.gd

Lines changed: 11 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
@@ -105,7 +102,9 @@ func drag_block(block: Block, copied_from: Block = null):
105102
new_pos += block.get_global_rect().position
106103

107104
var parent = block.get_parent()
108-
if parent:
105+
if parent is SnapPoint:
106+
parent.remove_snapped_block(block)
107+
elif parent:
109108
parent.remove_child(block)
110109

111110
block.position = new_pos
@@ -142,7 +141,13 @@ func drag_ended():
142141
# Can snap block
143142
preview_block.free()
144143
preview_block = null
145-
previewing_snap_point.add_child(dragging)
144+
var orphaned_block = previewing_snap_point.set_snapped_block(dragging)
145+
if orphaned_block:
146+
# Place the orphan block somewhere outside the snap point
147+
orphaned_block.position = (
148+
(previewing_snap_point.block.global_position - block_canvas_rect.position) + (previewing_snap_point.block.get_size() * Vector2.RIGHT) + BLOCK_AUTO_PLACE_MARGIN
149+
)
150+
_block_canvas.add_block(orphaned_block)
146151
else:
147152
# Block goes on screen somewhere
148153
dragging.position = (get_global_mouse_position() - block_canvas_rect.position - drag_offset)

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)