Skip to content

Commit 01ab76c

Browse files
committed
Serialization: Reuse serialized resources
Add a resource property to blocks. The resource will be updated before building the tree. This mitigates having a huge diff in scenes with blocks for minimum changes like moving a block in the canvas.
1 parent 5ce3180 commit 01ab76c

File tree

3 files changed

+39
-19
lines changed

3 files changed

+39
-19
lines changed

addons/block_code/ui/block_canvas/block_canvas.gd

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ var zoom: float:
4040
get:
4141
return _window.scale.x
4242

43+
var _undo_redo: EditorUndoRedoManager
44+
4345
signal reconnect_block(block: Block)
4446
signal add_block_code
4547
signal open_scene
@@ -170,24 +172,29 @@ func load_tree(parent: Node, node: SerializedBlockTreeNode):
170172
load_tree(scene.get_node(c[0]), c[1])
171173

172174

173-
func get_canvas_block_trees() -> SerializedBlockTreeNodeArray:
174-
var block_trees := SerializedBlockTreeNodeArray.new()
175+
func rebuild_block_trees(undo_redo):
176+
_undo_redo = undo_redo
177+
_current_bsd.block_trees.array = []
175178
for c in _window.get_children():
176-
block_trees.array.append(build_tree(c))
177-
178-
return block_trees
179+
_current_bsd.block_trees.array.append(build_tree(c))
179180

180181

181182
func build_tree(block: Block) -> SerializedBlockTreeNode:
182-
var n = SerializedBlockTreeNode.new()
183-
n.serialized_block = SerializedBlock.new(block.get_block_class(), block.get_serialized_props())
183+
var path_child_pairs = []
184+
block.update_resources(_undo_redo)
184185

185186
for snap in find_snaps(block):
186-
for c in snap.get_children():
187-
if c is Block: # Make sure to not include preview
188-
n.path_child_pairs.append([block.get_path_to(snap), build_tree(c)])
187+
for child in snap.get_children():
188+
if not child is Block: # Make sure to not include preview
189+
continue
190+
path_child_pairs.append([block.get_path_to(snap), build_tree(child)])
191+
192+
if block.resource.path_child_pairs != path_child_pairs:
193+
_undo_redo.add_undo_property(block.resource, "path_child_pairs", block.resource.path_child_pairs)
194+
block.resource.path_child_pairs = path_child_pairs
195+
_undo_redo.add_do_property(block.resource, "path_child_pairs", block.resource.path_child_pairs)
189196

190-
return n
197+
return block.resource
191198

192199

193200
func find_snaps(node: Node) -> Array:

addons/block_code/ui/blocks/block/block.gd

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ signal modified
2626
## The scope of the block (statement of matching entry block)
2727
@export var scope: String = ""
2828

29+
## The resource containing the block properties and the snapped blocks
30+
@export var resource: SerializedBlockTreeNode
31+
2932

3033
func _ready():
3134
mouse_filter = Control.MOUSE_FILTER_IGNORE
@@ -61,6 +64,19 @@ func get_instruction_node() -> InstructionTree.TreeNode:
6164
return node
6265

6366

67+
func update_resources(undo_redo: EditorUndoRedoManager):
68+
if resource == null:
69+
var serialized_block = SerializedBlock.new(get_block_class(), get_serialized_props())
70+
resource = SerializedBlockTreeNode.new(serialized_block)
71+
return
72+
73+
var serialized_props = get_serialized_props()
74+
if serialized_props != resource.serialized_block.serialized_props:
75+
undo_redo.add_undo_property(resource.serialized_block, "serialized_props", resource.serialized_block.serialized_props)
76+
resource.serialized_block.serialized_props = serialized_props
77+
undo_redo.add_do_property(resource.serialized_block, "serialized_props", resource.serialized_block.serialized_props)
78+
79+
6480
# Override this method to add more serialized properties
6581
func get_serialized_props() -> Array:
6682
return serialize_props(["block_name", "label", "color", "block_type", "position", "scope"])

addons/block_code/ui/main_panel.gd

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -139,17 +139,14 @@ func save_script():
139139
_current_block_code_node.block_script = block_script
140140
undo_redo.add_do_property(_current_block_code_node, "block_script", _current_block_code_node.block_script)
141141

142-
undo_redo.add_undo_property(_current_block_code_node.block_script, "block_trees", _current_block_code_node.block_script.block_trees)
143-
undo_redo.add_undo_property(_current_block_code_node.block_script, "generated_script", _current_block_code_node.block_script.generated_script)
144-
145-
var block_trees := _block_canvas.get_canvas_block_trees()
142+
_block_canvas.rebuild_block_trees(undo_redo)
146143
var generated_script = _block_canvas.generate_script_from_current_window(block_script)
147-
block_script.block_trees = block_trees
148-
block_script.generated_script = generated_script
144+
if generated_script != block_script.generated_script:
145+
undo_redo.add_undo_property(_current_block_code_node.block_script, "generated_script", _current_block_code_node.block_script.generated_script)
146+
block_script.generated_script = generated_script
147+
undo_redo.add_do_property(_current_block_code_node.block_script, "generated_script", _current_block_code_node.block_script.generated_script)
149148
block_script.version = Constants.CURRENT_DATA_VERSION
150149

151-
undo_redo.add_do_property(_current_block_code_node.block_script, "block_trees", block_trees)
152-
undo_redo.add_do_property(_current_block_code_node.block_script, "generated_script", generated_script)
153150
undo_redo.commit_action()
154151

155152

0 commit comments

Comments
 (0)