From d3a1599ffd96cf2ab7e2bee7981f2faafa10c3ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Wed, 4 Jun 2025 22:36:18 -0300 Subject: [PATCH 01/11] Move property setter, changer and getter to BlockDefinition Create three constructor functions and use them from the catalog. --- .../code_generation/block_definition.gd | 43 +++++++++++++++++ .../code_generation/blocks_catalog.gd | 46 ++----------------- 2 files changed, 48 insertions(+), 41 deletions(-) diff --git a/addons/block_code/code_generation/block_definition.gd b/addons/block_code/code_generation/block_definition.gd index 5781733f..e4721a65 100644 --- a/addons/block_code/code_generation/block_definition.gd +++ b/addons/block_code/code_generation/block_definition.gd @@ -194,3 +194,46 @@ static func _parse_parameter_format(parameter_format: String) -> Dictionary: static func has_category(block_definition, category: String) -> bool: return block_definition.category == category + + +static func new_property_setter(_class_name: String, property: Dictionary, category: String, default_value: Variant) -> Resource: + var type_string: String = Types.VARIANT_TYPE_TO_STRING[property.type] + return new( + &"%s_set_%s" % [_class_name, property.name], + _class_name, + "Set the %s property" % property.name, + category, + Types.BlockType.STATEMENT, + TYPE_NIL, + "set %s to {value: %s}" % [property.name.capitalize().to_lower(), type_string], + "%s = {value}" % property.name, + {"value": default_value}, + ) + + +static func new_property_changer(_class_name: String, property: Dictionary, category: String, default_value: Variant) -> Resource: + var type_string: String = Types.VARIANT_TYPE_TO_STRING[property.type] + return new( + &"%s_change_%s" % [_class_name, property.name], + _class_name, + "Change the %s property" % property.name, + category, + Types.BlockType.STATEMENT, + TYPE_NIL, + "change %s by {value: %s}" % [property.name.capitalize().to_lower(), type_string], + "%s += {value}" % property.name, + {"value": default_value}, + ) + + +static func new_property_getter(_class_name: String, property: Dictionary, category: String) -> Resource: + return new( + &"%s_get_%s" % [_class_name, property.name], + _class_name, + "The %s property" % property.name, + category, + Types.BlockType.VALUE, + property.type, + "%s" % property.name.capitalize().to_lower(), + "%s" % property.name, + ) diff --git a/addons/block_code/code_generation/blocks_catalog.gd b/addons/block_code/code_generation/blocks_catalog.gd index 2009112f..e61553e1 100644 --- a/addons/block_code/code_generation/blocks_catalog.gd +++ b/addons/block_code/code_generation/blocks_catalog.gd @@ -132,54 +132,18 @@ static func _add_property_definitions(_class_name: String, property_list: Array[ # Setter var block_definition: BlockDefinition if block_settings.get("has_setter", true): - block_definition = ( - BlockDefinition - . new( - &"%s_set_%s" % [_class_name, property.name], - _class_name, - "Set the %s property" % property.name, - block_settings.category, - Types.BlockType.STATEMENT, - TYPE_NIL, - "set %s to {value: %s}" % [property.name.capitalize().to_lower(), type_string], - "%s = {value}" % property.name, - {"value": block_settings.get("default_set", _FALLBACK_SET_FOR_TYPE[property.type])}, - ) - ) + var default_value: Variant = block_settings.get("default_set", _FALLBACK_SET_FOR_TYPE[property.type]) + block_definition = BlockDefinition.new_property_setter(_class_name, property, block_settings.category, default_value) _catalog[block_definition.name] = block_definition # Changer if block_settings.get("has_change", true): - block_definition = ( - BlockDefinition - . new( - &"%s_change_%s" % [_class_name, property.name], - _class_name, - "Change the %s property" % property.name, - block_settings.category, - Types.BlockType.STATEMENT, - TYPE_NIL, - "change %s by {value: %s}" % [property.name.capitalize().to_lower(), type_string], - "%s += {value}" % property.name, - {"value": block_settings.get("default_change", _FALLBACK_CHANGE_FOR_TYPE[property.type])}, - ) - ) + var default_value: Variant = block_settings.get("default_change", _FALLBACK_CHANGE_FOR_TYPE[property.type]) + block_definition = BlockDefinition.new_property_changer(_class_name, property, block_settings.category, default_value) _catalog[block_definition.name] = block_definition # Getter - block_definition = ( - BlockDefinition - . new( - &"%s_get_%s" % [_class_name, property.name], - _class_name, - "The %s property" % property.name, - block_settings.category, - Types.BlockType.VALUE, - property.type, - "%s" % property.name.capitalize().to_lower(), - "%s" % property.name, - ) - ) + block_definition = BlockDefinition.new_property_getter(_class_name, property, block_settings.category) _catalog[block_definition.name] = block_definition From 7ecd7cb5dfb6257c5f8c27804863c96b057de3aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Wed, 4 Jun 2025 23:43:18 -0300 Subject: [PATCH 02/11] Translate properties Display localized properties whenever possible. Just like the Inspector does when "Localized" is set from the dropdown menu. For this the property name must be stored in the block definition. Once translated, it is added to the display template. --- .../code_generation/block_definition.gd | 25 ++++++++++++++----- addons/block_code/ui/blocks/block/block.gd | 7 ++++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/addons/block_code/code_generation/block_definition.gd b/addons/block_code/code_generation/block_definition.gd index e4721a65..0358d7bc 100644 --- a/addons/block_code/code_generation/block_definition.gd +++ b/addons/block_code/code_generation/block_definition.gd @@ -32,6 +32,9 @@ const FORMAT_STRING_PATTERN = "\\[(?[^\\]]+)\\]|\\{const (? Resource: var type_string: String = Types.VARIANT_TYPE_TO_STRING[property.type] - return new( + var block_definition: Resource = new( &"%s_change_%s" % [_class_name, property.name], _class_name, "Change the %s property" % property.name, category, Types.BlockType.STATEMENT, TYPE_NIL, - "change %s by {value: %s}" % [property.name.capitalize().to_lower(), type_string], + "change %%s by {value: %s}" % type_string, "%s += {value}" % property.name, {"value": default_value}, ) + block_definition.property_name = property.name + return block_definition static func new_property_getter(_class_name: String, property: Dictionary, category: String) -> Resource: - return new( + var block_definition: Resource = new( &"%s_get_%s" % [_class_name, property.name], _class_name, "The %s property" % property.name, category, Types.BlockType.VALUE, property.type, - "%s" % property.name.capitalize().to_lower(), + "%s", "%s" % property.name, ) + block_definition.property_name = property.name + return block_definition diff --git a/addons/block_code/ui/blocks/block/block.gd b/addons/block_code/ui/blocks/block/block.gd index 64be644f..9972cdfb 100644 --- a/addons/block_code/ui/blocks/block/block.gd +++ b/addons/block_code/ui/blocks/block/block.gd @@ -129,6 +129,13 @@ func _get_format_string() -> String: if not definition: return "" + if definition.property_name: + var domain: TranslationDomain = TranslationServer.get_or_add_domain("godot.properties") + var translated_property: String = domain.translate(definition.property_name.capitalize()) + # TODO: Ideally we should be also passing the context. See: + # https://github.com/godotengine/godot/blob/978b38797ba8e8757592f21101e32e364d60662d/editor/editor_property_name_processor.cpp#L90 + return tr(definition.display_template) % translated_property.to_lower() + return tr(definition.display_template) From 362c5b832349e642dfd1a91daff621c278effb7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Thu, 5 Jun 2025 12:16:59 -0300 Subject: [PATCH 03/11] Unify property getters and setters done through drag and drop So they use the localized property name. And also, reuse the setter or getter if it's already in the catalog. --- .../code_generation/block_definition.gd | 16 ++++-- .../code_generation/blocks_catalog.gd | 27 ++++++---- .../block_script_serialization.gd | 53 +++++++++++-------- .../ui/block_canvas/block_canvas.gd | 24 +++++---- tests/test_block_canvas.gd | 10 ++++ tests/test_block_canvas.gd.uid | 1 + 6 files changed, 86 insertions(+), 45 deletions(-) create mode 100644 tests/test_block_canvas.gd create mode 100644 tests/test_block_canvas.gd.uid diff --git a/addons/block_code/code_generation/block_definition.gd b/addons/block_code/code_generation/block_definition.gd index 0358d7bc..a35b3b1e 100644 --- a/addons/block_code/code_generation/block_definition.gd +++ b/addons/block_code/code_generation/block_definition.gd @@ -4,6 +4,12 @@ extends Resource const Types = preload("res://addons/block_code/types/types.gd") const FORMAT_STRING_PATTERN = "\\[(?[^\\]]+)\\]|\\{const (?[^}]+)\\}|\\{(?!const )(?[^}]+)\\}|(?