material-maker/material_maker/widgets/node_editor/node_editor.gd

94 lines
3.1 KiB
GDScript

extends WindowDialog
var model_data = null
onready var parameter_list : VBoxContainer = $Sizer/Tabs/General/Parameters/Sizer
onready var input_list : VBoxContainer = $Sizer/Tabs/General/Inputs/Sizer
onready var output_list : VBoxContainer = $Sizer/Tabs/Outputs/Outputs/Sizer
onready var main_code_editor : TextEdit = $"Sizer/Tabs/Main Code"
onready var instance_functions_editor : TextEdit = $"Sizer/Tabs/Instance Functions"
onready var global_functions_editor : TextEdit = $"Sizer/Tabs/Global Functions"
const ParameterEditor = preload("res://material_maker/widgets/node_editor/parameter.tscn")
const InputEditor = preload("res://material_maker/widgets/node_editor/input.tscn")
const OutputEditor = preload("res://material_maker/widgets/node_editor/output.tscn")
signal node_changed
func _ready() -> void:
main_code_editor.add_color_region("//", "", Color(0, 0.5, 0), true)
instance_functions_editor.add_color_region("//", "", Color(0, 0.5, 0), true)
global_functions_editor.add_color_region("//", "", Color(0, 0.5, 0), true)
func add_item(parent, scene) -> Node:
var object = scene.instance()
parent.add_child(object)
parent.move_child(object, parent.get_child_count()-2)
return object
func set_model_data(data) -> void:
if data.has("name"):
$Sizer/Tabs/General/Name/Name.text = data.name
if data.has("parameters"):
for p in data.parameters:
add_item(parameter_list, ParameterEditor).set_model_data(p)
parameter_list.update_up_down_buttons()
if data.has("inputs"):
for i in data.inputs:
add_item(input_list, InputEditor).set_model_data(i)
input_list.update_up_down_buttons()
if data.has("outputs"):
for o in data.outputs:
add_item(output_list, OutputEditor).set_model_data(o)
output_list.update_up_down_buttons()
if data.has("global"):
global_functions_editor.text = data.global
if data.has("instance"):
instance_functions_editor.text = data.instance
if data.has("code"):
main_code_editor.text = data.code
func get_model_data() -> Dictionary:
var data = {
name=$Sizer/Tabs/General/Name/Name.text,
global=global_functions_editor.text,
instance=instance_functions_editor.text,
code=main_code_editor.text
}
data.parameters = []
for p in parameter_list.get_children():
if p.has_method("get_model_data"):
data.parameters.append(p.get_model_data())
data.inputs = []
for i in input_list.get_children():
if i.has_method("get_model_data"):
data.inputs.append(i.get_model_data())
data.outputs = []
for o in output_list.get_children():
if o.has_method("get_model_data"):
data.outputs.append(o.get_model_data())
return data
func _on_AddParameter_pressed() -> void:
add_item(parameter_list, ParameterEditor)
parameter_list.update_up_down_buttons()
func _on_AddInput_pressed() -> void:
add_item(input_list, InputEditor)
input_list.update_up_down_buttons()
func _on_AddOutput_pressed() -> void:
add_item(output_list, OutputEditor)
output_list.update_up_down_buttons()
func _on_Apply_pressed() -> void:
emit_signal("node_changed", get_model_data())
func _on_OK_pressed() -> void:
emit_signal("node_changed", get_model_data())
queue_free()
func _on_Cancel_pressed() -> void:
queue_free()