Skip to content

Commit b8b8c94

Browse files
committed
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. This change is breaking compatibility, because it changes the names of the getter, setter and changer blocks in order to unify them.
1 parent bcc9717 commit b8b8c94

File tree

4 files changed

+65
-32
lines changed

4 files changed

+65
-32
lines changed

addons/block_code/code_generation/block_definition.gd

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ extends Resource
44
const Types = preload("res://addons/block_code/types/types.gd")
55

66
const FORMAT_STRING_PATTERN = "\\[(?<out_parameter>[^\\]]+)\\]|\\{const (?<const_parameter>[^}]+)\\}|\\{(?!const )(?<in_parameter>[^}]+)\\}|(?<label>[^\\{\\[]+)"
7+
const PROPERTY_SETTER_NAME_PATTERN = "(?<class_name>[^\\s]*)_property_set_(?<property_name>[^\\s]+)"
8+
const PROPERTY_SETTER_NAME_FORMAT = &"%s_property_set_%s"
9+
const PROPERTY_CHANGER_NAME_PATTERN = "(?<class_name>[^\\s]*)_property_change_(?<property_name>[^\\s]+)"
10+
const PROPERTY_CHANGER_NAME_FORMAT = &"%s_property_change_%s"
11+
const PROPERTY_GETTER_NAME_PATTERN = "(?<class_name>[^\\s]*)_property_get_(?<property_name>[^\\s]+)"
12+
const PROPERTY_GETTER_NAME_FORMAT = &"%s_property_get_%s"
713

814
@export var name: StringName
915

@@ -73,6 +79,10 @@ var property_name: String
7379

7480
static var _display_template_regex := RegEx.create_from_string(FORMAT_STRING_PATTERN)
7581

82+
static var property_setter_regex := RegEx.create_from_string(PROPERTY_SETTER_NAME_PATTERN)
83+
static var property_changer_regex := RegEx.create_from_string(PROPERTY_CHANGER_NAME_PATTERN)
84+
static var property_getter_regex := RegEx.create_from_string(PROPERTY_GETTER_NAME_PATTERN)
85+
7686

7787
func _init(
7888
p_name: StringName = &"",
@@ -203,7 +213,7 @@ static func has_category(block_definition, category: String) -> bool:
203213
static func new_property_setter(_class_name: String, property: Dictionary, category: String, default_value: Variant) -> Resource:
204214
var type_string: String = Types.VARIANT_TYPE_TO_STRING[property.type]
205215
var block_definition: Resource = new(
206-
&"%s_set_%s" % [_class_name, property.name],
216+
PROPERTY_SETTER_NAME_FORMAT % [_class_name, property.name],
207217
_class_name,
208218
"Set the %s property" % property.name,
209219
category,
@@ -220,7 +230,7 @@ static func new_property_setter(_class_name: String, property: Dictionary, categ
220230
static func new_property_changer(_class_name: String, property: Dictionary, category: String, default_value: Variant) -> Resource:
221231
var type_string: String = Types.VARIANT_TYPE_TO_STRING[property.type]
222232
var block_definition: Resource = new(
223-
&"%s_change_%s" % [_class_name, property.name],
233+
PROPERTY_CHANGER_NAME_FORMAT % [_class_name, property.name],
224234
_class_name,
225235
"Change the %s property" % property.name,
226236
category,
@@ -236,7 +246,7 @@ static func new_property_changer(_class_name: String, property: Dictionary, cate
236246

237247
static func new_property_getter(_class_name: String, property: Dictionary, category: String) -> Resource:
238248
var block_definition: Resource = new(
239-
&"%s_get_%s" % [_class_name, property.name],
249+
PROPERTY_GETTER_NAME_FORMAT % [_class_name, property.name],
240250
_class_name,
241251
"The %s property" % property.name,
242252
category,

addons/block_code/code_generation/blocks_catalog.gd

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ static func _get_custom_parent_class_name(_custom_class_name: String) -> String:
202202
return "Node"
203203

204204

205-
static func _get_parents(_class_name: String) -> Array[String]:
205+
static func get_parents(_class_name: String) -> Array[String]:
206206
if ClassDB.class_exists(_class_name):
207207
return _get_builtin_parents(_class_name)
208208
var parents: Array[String] = []
@@ -217,7 +217,7 @@ static func get_inherited_blocks(_class_name: String) -> Array[BlockDefinition]:
217217
setup()
218218

219219
var definitions: Array[BlockDefinition] = []
220-
for _parent_class_name in _get_parents(_class_name):
220+
for _parent_class_name in get_parents(_class_name):
221221
definitions.append_array(_get_blocks_by_class(_parent_class_name))
222222
definitions.append_array(_get_blocks_by_class(""))
223223
return definitions
@@ -279,16 +279,23 @@ static func get_variable_setter_block_definition(variable: VariableDefinition) -
279279
return block_def
280280

281281

282-
static func get_property_getter_block_definition(variable: VariableDefinition) -> BlockDefinition:
283-
var block_def := get_variable_getter_block_definition(variable)
284-
block_def.description = "The %s property" % variable.var_name
285-
return block_def
282+
static func get_property_getter_block_definition(_class_name: String, property: Dictionary) -> BlockDefinition:
283+
var name = BlockDefinition.PROPERTY_GETTER_NAME_FORMAT % [_class_name, property.name]
284+
if name in _catalog:
285+
return _catalog[name]
286+
var block_definition := BlockDefinition.new_property_getter(_class_name, property, "Variables")
287+
_catalog[block_definition.name] = block_definition
288+
return block_definition
286289

287290

288-
static func get_property_setter_block_definition(variable: VariableDefinition) -> BlockDefinition:
289-
var block_def := get_variable_setter_block_definition(variable)
290-
block_def.description = "Set the %s property" % variable.var_name
291-
return block_def
291+
static func get_property_setter_block_definition(_class_name: String, property: Dictionary) -> BlockDefinition:
292+
var name = BlockDefinition.PROPERTY_SETTER_NAME_FORMAT % [_class_name, property.name]
293+
if name in _catalog:
294+
return _catalog[name]
295+
var default_value: Variant = _FALLBACK_SET_FOR_TYPE[property.type]
296+
var block_definition := BlockDefinition.new_property_setter(_class_name, property, "Variables", default_value)
297+
_catalog[block_definition.name] = block_definition
298+
return block_definition
292299

293300

294301
static func get_resource_block_definition(file_path: String) -> BlockDefinition:

addons/block_code/serialization/block_script_serialization.gd

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -149,30 +149,32 @@ func _get_parameter_block_definition(block_name: String, parameter_name: String)
149149
func _get_obj_property_block_definition(block_name: String) -> BlockDefinition:
150150
var block_definition: BlockDefinition
151151
var variable: VariableDefinition
152+
var _class_name: String
152153
var property_name: String
153154
var is_getter = true
154155

155-
if block_name.begins_with("get_var_"):
156-
property_name = block_name.get_slice("get_var_", 1)
157-
elif block_name.begins_with("set_var_"):
158-
property_name = block_name.get_slice("set_var_", 1)
159-
is_getter = false
156+
var setter_match: RegExMatch = BlockDefinition.property_setter_regex.search(block_name)
157+
var getter_match: RegExMatch = BlockDefinition.property_getter_regex.search(block_name)
158+
if setter_match:
159+
_class_name = setter_match.get_string("class_name")
160+
property_name = setter_match.get_string("property_name")
161+
elif getter_match:
162+
_class_name = getter_match.get_string("class_name")
163+
property_name = getter_match.get_string("property_name")
160164
else:
161165
return null
162166

163167
# Getter block needs the property's variant type information by visiting the
164168
# block_code_node's parent node because the type is not saved as a key of
165169
# the resource in the scene file
166170
var property_info := _get_parent_node_property_info(property_name)
167-
if not property_info.has("type"):
171+
if property_info.is_empty():
168172
return null
169173

170174
if is_getter:
171-
variable = VariableDefinition.new(property_name, property_info["type"])
172-
block_definition = BlocksCatalog.get_property_getter_block_definition(variable)
175+
block_definition = BlocksCatalog.get_property_getter_block_definition(_class_name, property_info)
173176
else:
174-
variable = VariableDefinition.new(property_name, property_info["type"])
175-
block_definition = BlocksCatalog.get_property_setter_block_definition(variable)
177+
block_definition = BlocksCatalog.get_property_setter_block_definition(_class_name, property_info)
176178

177179
return block_definition
178180

addons/block_code/ui/block_canvas/block_canvas.gd

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -133,21 +133,35 @@ func _drop_node(at_position: Vector2, data: Variant) -> void:
133133
reconnect_block.emit(block)
134134

135135

136+
## Return the parent class name where the property is defined.
137+
## For example, if the first argument is "Sprite2D" and the second is:
138+
## - "visible": return "CanvasItem".
139+
## - "position": return "Node2D".
140+
## - "flip_h": return "Sprite2D".
141+
static func _get_classname_for_property(_class_name: StringName, property_name: StringName) -> StringName:
142+
var return_classname := &""
143+
for parent_class_name in BlocksCatalog.get_parents(_class_name):
144+
var property_list := ClassDB.class_get_property_list(parent_class_name, false)
145+
var has_property = property_list.any(func(dict): return dict.name == property_name)
146+
if has_property:
147+
return_classname = parent_class_name
148+
continue
149+
else:
150+
break
151+
return return_classname
152+
153+
136154
func _drop_obj_property(at_position: Vector2, data: Variant) -> void:
137-
var property_name = data["property"]
138-
var property_value = data["value"]
139-
var is_getter = !_modifier_ctrl
155+
var _class_name = _get_classname_for_property(data.object.get_class(), data["property"])
156+
var property := {"name": data["property"], "type": typeof(data["value"])}
157+
var is_getter = not _modifier_ctrl
140158

141-
# Prepare a Variable block to set / get the property's value according to
142-
# the modifier KEY_CTRL pressing.
143-
var variable := VariableDefinition.new(property_name, typeof(property_value))
144159
var block_definition: BlockDefinition
145160

146161
if is_getter:
147-
block_definition = BlocksCatalog.get_property_getter_block_definition(variable)
162+
block_definition = BlocksCatalog.get_property_getter_block_definition(_class_name, property)
148163
else:
149-
block_definition = BlocksCatalog.get_property_setter_block_definition(variable)
150-
block_definition.defaults = {"value": property_value}
164+
block_definition = BlocksCatalog.get_property_setter_block_definition(_class_name, property)
151165

152166
var block = _context.block_script.instantiate_block(block_definition)
153167
add_block(block, at_position)

0 commit comments

Comments
 (0)