Ver código fonte

started properly implementing undo redo for deleted nodes

Jonathan Higgins 2 meses atrás
pai
commit
0083617b87
3 arquivos alterados com 37 adições e 33 exclusões
  1. 2 1
      project.godot
  2. 3 3
      scenes/main/scripts/control.gd
  3. 32 29
      scenes/main/scripts/graph_edit.gd

+ 2 - 1
project.godot

@@ -90,7 +90,8 @@ auto_link_nodes={
 }
 redo={
 "deadzone": 0.2,
-"events": []
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":0,"physical_keycode":89,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
 }
 
 [rendering]

+ 3 - 3
scenes/main/scripts/control.gd

@@ -54,7 +54,7 @@ func _ready() -> void:
 	$LoadDialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE
 	$LoadDialog.filters = ["*.thd"]
 	
-	
+	undo_redo.max_steps = 20
 	
 	get_tree().set_auto_accept_quit(false) #disable closing the app with the x and instead handle it internally
 	
@@ -309,8 +309,8 @@ func _input(event):
 		simulate_mouse_click()
 		await get_tree().process_frame
 		undo_redo.undo()
-	#elif event.is_action_pressed("redo"):
-		#undo_redo.redo()
+	elif event.is_action_pressed("redo"):
+		undo_redo.redo()
 	elif event.is_action_pressed("save"):
 		if currentfile == "none":
 			savestate = "saveas"

+ 32 - 29
scenes/main/scripts/graph_edit.gd

@@ -386,8 +386,9 @@ func _unhandled_key_input(event: InputEvent) -> void:
 			pass
 
 func _on_graph_edit_delete_nodes_request(nodes: Array[StringName]) -> void:
-	control_script.undo_redo.create_action("Delete Nodes (Undo only)")
-
+	control_script.undo_redo.create_action("Delete Nodes")
+	
+	#Collect node data for undo
 	for node_name in nodes:
 		var node: GraphNode = get_node_or_null(NodePath(node_name))
 		if node and is_instance_valid(node):
@@ -395,37 +396,39 @@ func _on_graph_edit_delete_nodes_request(nodes: Array[StringName]) -> void:
 			if node.get_meta("command") == "outputfile":
 				continue
 
-			# Store duplicate and state for undo
-			var node_data = node.duplicate()
-			var position = node.position_offset
-
-			# Store all connections for undo
-			var conns := []
-			for con in get_connection_list():
-				if con["to_node"] == node.name or con["from_node"] == node.name:
-					conns.append(con)
+			#register redo
+			control_script.undo_redo.add_do_method(delete_node.bind(node))
+			#register undo
+			control_script.undo_redo.add_undo_method(restore_node.bind(node))
+			control_script.undo_redo.add_undo_reference(node)
+			
+			
+	selected_nodes = {}
 
-			# Delete
-			remove_connections_to_node(node)
-			node.queue_free()
-			control_script.changesmade = true
+	control_script.undo_redo.commit_action()
+	
+	for node_name in nodes:
+		var node: GraphNode = get_node_or_null(NodePath(node_name))
+		if node and is_instance_valid(node):
+			# Skip output nodes
+			if node.get_meta("command") == "outputfile":
+				continue
+			delete_node(node)
+			
 
-			# Register undo restore
-			control_script.undo_redo.add_undo_method(Callable(self, "add_child").bind(node_data, true))
-			control_script.undo_redo.add_undo_method(Callable(node_data, "set_position_offset").bind(position))
-			for con in conns:
-				control_script.undo_redo.add_undo_method(Callable(self, "connect_node").bind(
-					con["from_node"], con["from_port"],
-					con["to_node"], con["to_port"]
-				))
-			control_script.undo_redo.add_undo_method(Callable(self, "set_node_selected").bind(node_data, true))
-			control_script.undo_redo.add_undo_method(Callable(self, "_track_changes"))
-			control_script.undo_redo.add_undo_method(Callable(self, "_register_inputs_in_node").bind(node_data))
-			control_script.undo_redo.add_undo_method(Callable(self, "_register_node_movement"))
+func delete_node(node_to_delete: GraphNode) -> void:
+	remove_connections_to_node(node_to_delete)
+	remove_child(node_to_delete)
+	control_script.changesmade = true
 
-	selected_nodes = {}
+func restore_node(node_to_restore: GraphNode) -> void:
+	add_child(node_to_restore)
+	set_node_selected(node_to_restore, true)
+	_track_changes()
+	_register_inputs_in_node(node_to_restore)
+	_register_node_movement()
+	
 
-	control_script.undo_redo.commit_action()
 
 func set_node_selected(node: Node, selected: bool) -> void:
 	selected_nodes[node] = selected