Skip to content

Commit c937831

Browse files
authored
Merge pull request #54 from endlessm/T35510-on-body-entered
Add ‘On body entered’ entry block for Area2D and RigidBody2D
2 parents 29563a5 + e94214d commit c937831

File tree

5 files changed

+46
-14
lines changed

5 files changed

+46
-14
lines changed

addons/block_code/ui/block_canvas/node_block_canvas/node_block_canvas.gd

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ func generate_script_from_current_window(script_inherits: String = ""):
2424

2525
script += "var VAR_DICT := {}\n\n"
2626

27+
var init_func = InstructionTree.TreeNode.new("func _init():")
28+
2729
for entry_block in entry_blocks:
2830
script += entry_block.get_entry_statement() + "\n"
2931

@@ -39,4 +41,10 @@ func generate_script_from_current_window(script_inherits: String = ""):
3941

4042
script += "\n"
4143

44+
if entry_block.signal_name:
45+
init_func.add_child(InstructionTree.TreeNode.new("{0}.connect(_on_{0})".format([entry_block.signal_name])))
46+
47+
if init_func.children:
48+
script += InstructionTree.new().generate_text(init_func)
49+
4250
return script

addons/block_code/ui/blocks/entry_block/entry_block.gd

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
class_name EntryBlock
33
extends StatementBlock
44

5+
## if non-empty, this block defines a callback that will be connected to the signal with this name
6+
@export var signal_name: String
7+
58

69
func _ready():
710
block_type = Types.BlockType.ENTRY
@@ -22,8 +25,10 @@ func get_entry_statement() -> String:
2225
for pair in param_name_input_pairs:
2326
formatted_statement = formatted_statement.replace("{%s}" % pair[0], pair[1].get_string())
2427

25-
# One line, should not have \n
26-
if formatted_statement.find("\n") != -1:
27-
push_error("Entry block has multiline statement.")
28-
2928
return formatted_statement
29+
30+
31+
func get_serialized_props() -> Array:
32+
var props := super()
33+
props.append_array(serialize_props(["signal_name"]))
34+
return props

addons/block_code/ui/blocks/parameter_block/parameter_block.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func _on_drag_drop_area_mouse_down():
3535

3636
func get_serialized_props() -> Array:
3737
var props := super()
38-
props.append_array(serialize_props(["block_format", "statement"]))
38+
props.append_array(serialize_props(["block_format", "statement", "variant_type"]))
3939

4040
var _param_input_strings: Dictionary = {}
4141
for pair in param_name_input_pairs:

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,11 @@ func get_string() -> String:
5555
var snapped_block: ParameterBlock = get_snapped_block() as ParameterBlock
5656
if snapped_block:
5757
var generated_string = snapped_block.get_parameter_string()
58-
return Types.cast(generated_string, snapped_block.variant_type, variant_type)
58+
if Types.can_cast(snapped_block.variant_type, variant_type):
59+
return Types.cast(generated_string, snapped_block.variant_type, variant_type)
60+
else:
61+
push_warning("No cast from %s to %s; using '%s' verbatim" % [snapped_block, variant_type, generated_string])
62+
return generated_string
5963

6064
var text: String = get_plain_text()
6165

addons/block_code/ui/picker/categories/category_factory.gd

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,6 @@ static func get_general_categories() -> Array[BlockCategory]:
8383
b.statement = "print({text})"
8484
test_list.append(b)
8585

86-
b = BLOCKS["entry_block"].instantiate()
87-
b.block_format = "On body enter [body: NODE_PATH]"
88-
b.statement = "func _on_body_enter(body):"
89-
test_list.append(b)
90-
9186
var test_category: BlockCategory = BlockCategory.new("Test", test_list, Color("9989df"))
9287

9388
# Signal
@@ -318,7 +313,10 @@ static func category_from_property_list(property_list: Array, selected_props: Ar
318313
if selected_property == prop.name:
319314
found_prop = prop
320315
break
321-
block_list.append_array(property_to_blocklist(found_prop))
316+
if found_prop:
317+
block_list.append_array(property_to_blocklist(found_prop))
318+
else:
319+
push_warning("No property matching %s found in %s" % [selected_property, property_list])
322320

323321
return BlockCategory.new(p_name, block_list, p_color)
324322

@@ -354,16 +352,33 @@ static func get_built_in_categories(_class_name: String) -> Array[BlockCategory]
354352
props = ["modulate"]
355353

356354
"RigidBody2D":
357-
# On body entered
355+
for verb in ["entered", "exited"]:
356+
var b = BLOCKS["entry_block"].instantiate()
357+
b.block_format = "On [body: NODE_PATH] %s" % [verb]
358+
# HACK: Blocks refer to nodes by path but the callback receives the node itself;
359+
# convert to path
360+
b.statement = "func _on_body_%s(_body: Node):\n\tvar body: NodePath = _body.get_path()" % [verb]
361+
b.signal_name = "body_%s" % [verb]
362+
block_list.append(b)
358363

359364
props = ["mass", "linear_velocity", "angular_velocity"]
360365

366+
"Area2D":
367+
for verb in ["entered", "exited"]:
368+
var b = BLOCKS["entry_block"].instantiate()
369+
b.block_format = "On [body: NODE_PATH] %s" % [verb]
370+
# HACK: Blocks refer to nodes by path but the callback receives the node itself;
371+
# convert to path
372+
b.statement = "func _on_body_%s(_body: Node2D):\n\tvar body: NodePath = _body.get_path()" % [verb]
373+
b.signal_name = "body_%s" % [verb]
374+
block_list.append(b)
375+
361376
var prop_list = ClassDB.class_get_property_list(_class_name, true)
362377

363378
var class_cat: BlockCategory = category_from_property_list(prop_list, props, _class_name, Color.SLATE_GRAY)
364379
block_list.append_array(class_cat.block_list)
365380
class_cat.block_list = block_list
366-
if props.size() > 0:
381+
if block_list:
367382
cats.append(class_cat)
368383

369384
return cats

0 commit comments

Comments
 (0)