Browse Source

added full automatic node generation

Jonathan Higgins 6 months ago
parent
commit
4feee9dc46

+ 5 - 4
scenes/Nodes/node_logic.gd

@@ -16,6 +16,7 @@ func _ready() -> void:
 	btn.tooltip_text = "Open help for " + self.title
 	btn.connect("pressed", Callable(self, "_open_help")) #pass key (process name) when button is pressed
 	titlebar.add_child(btn)
+	
 
 func _get_all_hsliders(node: Node) -> Array:
 	#moves through all children recusively to find nested sliders
@@ -29,8 +30,8 @@ func _get_all_hsliders(node: Node) -> Array:
 
 func _on_slider_value_changed(value: float, changed_slider: HSlider) -> void:
 	#checks if the slider moved has min or max meta data
-	var is_min := changed_slider.has_meta("min")
-	var is_max := changed_slider.has_meta("max")
+	var is_min = changed_slider.get_meta("min")
+	var is_max = changed_slider.get_meta("max")
 	
 	#if not exits function
 	if not is_min and not is_max:
@@ -42,12 +43,12 @@ func _on_slider_value_changed(value: float, changed_slider: HSlider) -> void:
 		if other_slider == changed_slider:
 			continue
 		
-		if is_min and other_slider.has_meta("max"):
+		if is_min and other_slider.get_meta("max"):
 			var max_value: float = other_slider.value
 			if changed_slider.value > max_value - min_gap:
 				changed_slider.value = max_value - min_gap
 		
-		elif is_max and other_slider.has_meta("min"):
+		elif is_max and other_slider.get_meta("min"):
 			var min_value: float = other_slider.value
 			if changed_slider.value < min_value + min_gap:
 				changed_slider.value = min_value + min_gap

+ 1 - 1
scenes/Nodes/valueslider.gd

@@ -55,7 +55,7 @@ func _on_line_edit_focus_exited() -> void:
 
 #check for right click
 func _on_h_slider_gui_input(event: InputEvent) -> void:
-	if $HSplitContainer/HSlider.has_meta("brk"): #check if slider can take a break file
+	if $HSplitContainer/HSlider.get_meta("brk"): #check if slider can take a break file
 		if $HSplitContainer/HSlider.has_meta("brk_data"): #check if it already has break data and set menu correctly (used when loading files)
 			$HSplitContainer/HSlider/PopupMenu.set_item_text(0, "Edit Automation")
 			if $HSplitContainer/HSlider/PopupMenu.get_item_count() <= 1: #if it has automation data but no remove button, add it

+ 1 - 1
scenes/Nodes/valueslider.tscn

@@ -9,7 +9,7 @@ offset_right = 270.0
 offset_bottom = 57.0
 script = ExtResource("1_4kxw6")
 
-[node name="Label" type="Label" parent="."]
+[node name="SliderLabel" type="Label" parent="."]
 layout_mode = 2
 text = "Value Name"
 

+ 103 - 15
scenes/main/scripts/graph_edit.gd

@@ -8,6 +8,8 @@ var selected_nodes = {} #used to track which nodes in the GraphEdit are selected
 var copied_nodes_data = [] #stores node data on ctrl+c
 var copied_connections = [] #stores all connections on ctrl+c
 var node_data = {} #stores json with all nodes in it
+var valueslider = preload("res://scenes/Nodes/valueslider.tscn") #slider scene for use in nodes
+var node_logic = preload("res://scenes/Nodes/node_logic.gd") #load the script logic
 
 # Called when the node enters the scene tree for the first time.
 func _ready() -> void:
@@ -52,40 +54,126 @@ func _make_node(command: String):
 			control_script.undo_redo.add_undo_method(Callable(effect, "queue_free"))
 			control_script.undo_redo.add_undo_method(Callable(self, "_track_changes"))
 			control_script.undo_redo.commit_action()
-		else:
-			var title = node_info.get("title", "")
-			var shortdescription = node_info.get("short_description", "")
+		else: #auto generate node from json
+			#get the title to display at the top of the node
+			var title 
+			if node_info.get("category", "") == "pvoc":
+				title = "%s: %s" % [node_info.get("category", "").to_upper(), node_info.get("title", "")]
+			else:
+				title = "%s: %s" % [node_info.get("subcategory", "").to_pascal_case(), node_info.get("title", "")]
+			var shortdescription = node_info.get("short_description", "") #for tooltip
+			
+			#get node properties
 			var stereo = node_info.get("stereo", false)
-			var inputtype = JSON.parse_string(node_info.get("inputtype", ""))
-			var outputtype = JSON.parse_string(node_info.get("outputtype", ""))
-			var portcount = max(inputtype.size(), outputtype.size())
-
+			var inputs = JSON.parse_string(node_info.get("inputtype", ""))
+			var outputs = JSON.parse_string(node_info.get("outputtype", ""))
+			var portcount = max(inputs.size(), outputs.size())
+			var parameters = node_info.get("parameters", {})
 			
 			var graphnode = GraphNode.new()
 			for i in range(portcount):
+				#add a number of control nodes equal to whatever is higher input or output ports
 				var control = Control.new()
 				graphnode.add_child(control)
 				
-				var enable_input = i < inputtype.size()
-				var enable_output = i < inputtype.size
+				#check if input or output is enabled
+				var enable_input = i < inputs.size()
+				var enable_output = i < outputs.size()
+				
+				#get the colour of the port for time or pvoc ins/outs
 				var input_colour = Color("#ffffff90")
 				var output_colour = Color("#ffffff90")
 				
-				if inputtype[i] == 1:
-					input_colour = Color("#000000b0")
-				if outputtype[i] == 1:
-					output_colour = Color("#000000b0")
+				if enable_input:
+					if inputs[i] == 1:
+						input_colour = Color("#000000b0")
+				if enable_output:
+					if outputs[i] == 1:
+						output_colour = Color("#000000b0")
 				
-				graphnode.set_slot(i, enable_input, inputtype[i], Color())
-			
+				#enable and set ports
+				if enable_input == true and enable_output == false:
+					graphnode.set_slot(i, true, inputs[i], input_colour, false, 0, output_colour)
+				elif enable_input == false and enable_output == true:
+					graphnode.set_slot(i, false, 0, input_colour, true, outputs[i], output_colour)
+				elif enable_input == true and enable_output == true:
+					graphnode.set_slot(i, true, inputs[i], input_colour, true, outputs[i], output_colour)
+				else:
+					pass
+			#set meta data for the process
 			graphnode.set_meta("command", command)
 			graphnode.set_meta("stereo", stereo)
 			
+			#adjust size, position and title of the node
 			graphnode.title = title
 			graphnode.tooltip_text = shortdescription
+			graphnode.size.x = 306
+			graphnode.custom_minimum_size.y = 80
 			graphnode.set_position_offset((control_script.effect_position + graph_edit.scroll_offset) / graph_edit.zoom)
+			graphnode.name = command
+			
+			
+			for param_key in parameters.keys():
+				var param_data = parameters[param_key]
+				if param_data.get("uitype", "") == "hslider":
+					#instance the slider scene
+					var slider = valueslider.instantiate()
+					
+					#get slider text
+					var slider_label = param_data.get("paramname", "")
+					var slider_tooltip  = param_data.get("paramdescription", "")
+					
+					#get slider properties
+					var brk = param_data.get("automatable", false)
+					var time = param_data.get("time", false)
+					var min = param_data.get("min", false)
+					var max = param_data.get("max", false)
+					var flag = param_data.get("flag", "")
+					var minrange = param_data.get("minrange", 0)
+					var maxrange = param_data.get("maxrange", 10)
+					var step = param_data.get("step", 0.01)
+					var value = param_data.get("value", 1)
+					var exponential = param_data.get("exponential", false)
+					
+					#set labels and tooltips
+					slider.get_node("SliderLabel").text = slider_label
+					if brk == true:
+						slider.get_node("SliderLabel").text += "~"
+					slider.tooltip_text = slider_tooltip
+					slider.get_node("SliderLabel").tooltip_text = slider_tooltip
+					
+					#set meta data
+					var hslider = slider.get_node("HSplitContainer/HSlider")
+					hslider.set_meta("brk", brk)
+					hslider.set_meta("time", time)
+					hslider.set_meta("min", min)
+					hslider.set_meta("max", max)
+					hslider.set_meta("flag", flag)
+					
+					#set slider params
+					hslider.min_value = minrange
+					hslider.max_value = maxrange
+					hslider.step = step
+					hslider.value = value
+					hslider.exp_edit = exponential
+					
+					graphnode.add_child(slider)
 			
 			
+			graphnode.set_script(node_logic)
+			
+			add_child(graphnode, true)
+			graphnode.connect("open_help", open_help)
+			_register_inputs_in_node(graphnode) #link sliders for changes tracking
+			_register_node_movement() #link nodes for tracking position changes for changes tracking
+			
+			# Remove node with UndoRedo
+			control_script.undo_redo.create_action("Add Node")
+			control_script.undo_redo.add_undo_method(Callable(graph_edit, "remove_child").bind(graphnode))
+			control_script.undo_redo.add_undo_method(Callable(graphnode, "queue_free"))
+			control_script.undo_redo.add_undo_method(Callable(self, "_track_changes"))
+			control_script.undo_redo.commit_action()
+			
 	
 
 func _on_connection_request(from_node: StringName, from_port: int, to_node: StringName, to_port: int) -> void:

+ 1 - 5
scenes/main/scripts/run_thread.gd

@@ -618,14 +618,10 @@ func _get_slider_values_ordered(node: Node) -> Array:
 	for child in node.get_children():
 		if child is Range:
 			var flag = child.get_meta("flag") if child.has_meta("flag") else ""
-			var time
+			var time = child.get_meta("time")
 			var brk_data = []
 			var min_slider = child.min_value
 			var max_slider = child.max_value
-			if child.has_meta("time"):
-				time = child.get_meta("time")
-			else:
-				time = false
 			if child.has_meta("brk_data"):
 				brk_data = child.get_meta("brk_data")
 			results.append([flag, child.value, time, brk_data, min_slider, max_slider])