@@ -16,6 +16,7 @@ enum DragAction { NONE, PLACE, REMOVE }
16
16
class Drag :
17
17
extends Control
18
18
var _block : Block
19
+ var _block_scope : String
19
20
var _block_canvas : BlockCanvas
20
21
var _preview_block : Control
21
22
var action : DragAction :
@@ -38,13 +39,14 @@ class Drag:
38
39
get :
39
40
return target_snap_point .block if target_snap_point else null
40
41
41
- func _init (block : Block , offset : Vector2 , block_canvas : BlockCanvas ):
42
+ func _init (block : Block , block_scope : String , offset : Vector2 , block_canvas : BlockCanvas ):
42
43
assert (block .get_parent () == null )
43
44
44
45
add_child (block )
45
46
block .position = - offset
46
47
47
48
_block = block
49
+ _block_scope = block_scope
48
50
_block_canvas = block_canvas
49
51
50
52
func apply_drag () -> Block :
@@ -108,12 +110,24 @@ class Drag:
108
110
109
111
# Check if any parent node is this node
110
112
var parent = _snap_point
113
+ var top_block
111
114
while parent is SnapPoint :
112
115
if parent .block == _block :
113
116
return false
114
117
118
+ top_block = parent .block
115
119
parent = parent .block .get_parent ()
116
120
121
+ # Check if scope is valid
122
+ if _block_scope != "" :
123
+ if top_block is EntryBlock :
124
+ if _block_scope != top_block .get_entry_statement ():
125
+ return false
126
+ else :
127
+ var tree_scope := DragManager .get_tree_scope (top_block )
128
+ if tree_scope != "" and _block_scope != tree_scope :
129
+ return false
130
+
117
131
return true
118
132
119
133
func sort_snap_points_by_distance (a : SnapPoint , b : SnapPoint ):
@@ -198,7 +212,11 @@ func drag_block(block: Block, copied_from: Block = null):
198
212
199
213
block .disconnect_signals ()
200
214
201
- drag = Drag .new (block , offset , _block_canvas )
215
+ var block_scope := get_tree_scope (block )
216
+ if block_scope != "" :
217
+ _block_canvas .set_scope (block_scope )
218
+
219
+ drag = Drag .new (block , block_scope , offset , _block_canvas )
202
220
add_child (drag )
203
221
204
222
@@ -222,6 +240,8 @@ func drag_ended():
222
240
if block :
223
241
connect_block_canvas_signals (block )
224
242
243
+ _block_canvas .release_scope ()
244
+
225
245
drag .queue_free ()
226
246
drag = null
227
247
@@ -237,7 +257,27 @@ func connect_block_canvas_signals(block: Block):
237
257
var statement_block := block as StatementBlock
238
258
for pair in statement_block .param_name_input_pairs :
239
259
var param_input : ParameterInput = pair [1 ]
240
- var b := param_input .get_snapped_block ()
241
- if b :
242
- if b .drag_started .get_connections ().size () == 0 :
243
- b .drag_started .connect (copy_picked_block_and_drag )
260
+ var copy_block := param_input .get_snapped_block ()
261
+ if copy_block == null :
262
+ continue
263
+ if copy_block .drag_started .get_connections ().size () == 0 :
264
+ copy_block .drag_started .connect (func (b : Block ): drag_copy_parameter (b , block ))
265
+
266
+
267
+ func drag_copy_parameter (block : Block , parent : Block ):
268
+ if parent is EntryBlock :
269
+ block .scope = parent .get_entry_statement ()
270
+ copy_picked_block_and_drag (block )
271
+
272
+
273
+ ## Returns the scope of the first non-empty scope child block
274
+ static func get_tree_scope (node : Node ) -> String :
275
+ if node is Block :
276
+ if node .scope != "" :
277
+ return node .scope
278
+
279
+ for c in node .get_children ():
280
+ var scope := get_tree_scope (c )
281
+ if scope != "" :
282
+ return scope
283
+ return ""
0 commit comments