mirror of
https://github.com/Relintai/material-maker.git
synced 2024-11-13 06:27:18 +01:00
Made IOs node editable (can add/remove ports)
This commit is contained in:
parent
cd08666123
commit
4c2274104b
@ -8,9 +8,12 @@ IOs just forward their inputs to their outputs and are used to specify graph int
|
|||||||
|
|
||||||
var ports : Array = []
|
var ports : Array = []
|
||||||
|
|
||||||
|
var editable = false
|
||||||
|
|
||||||
func can_be_deleted() -> bool:
|
func can_be_deleted() -> bool:
|
||||||
return name != "gen_inputs" and name != "gen_outputs"
|
return name != "gen_inputs" and name != "gen_outputs"
|
||||||
|
|
||||||
|
|
||||||
func get_type() -> String:
|
func get_type() -> String:
|
||||||
return "ios"
|
return "ios"
|
||||||
|
|
||||||
@ -20,6 +23,7 @@ func get_type_name() -> String:
|
|||||||
"gen_outputs": return "Outputs"
|
"gen_outputs": return "Outputs"
|
||||||
_: return "IOs"
|
_: return "IOs"
|
||||||
|
|
||||||
|
|
||||||
func get_io_defs() -> Array:
|
func get_io_defs() -> Array:
|
||||||
var rv : Array = []
|
var rv : Array = []
|
||||||
for p in ports:
|
for p in ports:
|
||||||
@ -32,6 +36,47 @@ func get_input_defs() -> Array:
|
|||||||
func get_output_defs() -> Array:
|
func get_output_defs() -> Array:
|
||||||
return [] if name == "gen_outputs" else get_io_defs()
|
return [] if name == "gen_outputs" else get_io_defs()
|
||||||
|
|
||||||
|
|
||||||
|
func toggle_editable() -> bool:
|
||||||
|
editable = !editable
|
||||||
|
if editable:
|
||||||
|
model = null
|
||||||
|
return true
|
||||||
|
|
||||||
|
func is_editable() -> bool:
|
||||||
|
return editable
|
||||||
|
|
||||||
|
|
||||||
|
func add_port() -> void:
|
||||||
|
ports.append({ name="unnamed", type="rgba" })
|
||||||
|
emit_signal("parameter_changed", "__update_all__", null)
|
||||||
|
|
||||||
|
func set_port_name(i : int, n : String) -> void:
|
||||||
|
ports[i].name = n
|
||||||
|
|
||||||
|
func delete_port(i : int) -> void:
|
||||||
|
ports.remove(i)
|
||||||
|
var input_gen = get_parent() if name == "gen_inputs" else self
|
||||||
|
var output_gen = get_parent() if name == "gen_outputs" else self
|
||||||
|
var port_reconnects = { i:-1 }
|
||||||
|
while i < ports.size():
|
||||||
|
port_reconnects[i+1] = i
|
||||||
|
i += 1
|
||||||
|
input_gen.get_parent().reconnect_inputs(input_gen, port_reconnects)
|
||||||
|
output_gen.get_parent().reconnect_outputs(output_gen, port_reconnects)
|
||||||
|
emit_signal("parameter_changed", "__update_all__", null)
|
||||||
|
|
||||||
|
func swap_ports(i1 : int, i2 : int) -> void:
|
||||||
|
var tmp = ports[i1]
|
||||||
|
ports[i1] = ports[i2]
|
||||||
|
ports[i2] = tmp
|
||||||
|
var input_gen = get_parent() if name == "gen_inputs" else self
|
||||||
|
var output_gen = get_parent() if name == "gen_outputs" else self
|
||||||
|
var port_reconnects = { i1:i2, i2:i1 }
|
||||||
|
input_gen.get_parent().reconnect_inputs(input_gen, port_reconnects)
|
||||||
|
output_gen.get_parent().reconnect_outputs(output_gen, port_reconnects)
|
||||||
|
emit_signal("parameter_changed", "__update_all__", null)
|
||||||
|
|
||||||
func source_changed(input_index : int) -> void:
|
func source_changed(input_index : int) -> void:
|
||||||
if name == "gen_outputs":
|
if name == "gen_outputs":
|
||||||
if get_parent() != null:
|
if get_parent() != null:
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
viewBox="0 0 64 64"
|
viewBox="0 0 64 64"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
id="svg8"
|
id="svg8"
|
||||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||||
sodipodi:docname="icons.svg">
|
sodipodi:docname="icons.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs2">
|
id="defs2">
|
||||||
@ -48,9 +48,9 @@
|
|||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="40.459029"
|
inkscape:zoom="14.304427"
|
||||||
inkscape:cx="17.695886"
|
inkscape:cx="23.663017"
|
||||||
inkscape:cy="7.9897925"
|
inkscape:cy="5.4603811"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="true"
|
showgrid="true"
|
||||||
@ -352,5 +352,11 @@
|
|||||||
id="path1477"
|
id="path1477"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="cccccccc" />
|
sodipodi:nodetypes="cccccccc" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4561"
|
||||||
|
d="m 33.500409,335.78733 4.34961,-0.0488 0.123047,-6.82227 h 4.27539 l 0.125,6.82227 4.34961,0.0488 -6.611328,6.8457 z"
|
||||||
|
style="fill:#ffffff;fill-opacity:0.84322037;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
41
addons/material_maker/nodes/ios.gd
Normal file
41
addons/material_maker/nodes/ios.gd
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
extends MMGraphNodeBase
|
||||||
|
|
||||||
|
func set_generator(g) -> void:
|
||||||
|
.set_generator(g)
|
||||||
|
generator.connect("parameter_changed", self, "on_parameter_changed")
|
||||||
|
update_node()
|
||||||
|
|
||||||
|
func on_parameter_changed(p, v) -> void:
|
||||||
|
if p == "__update_all__":
|
||||||
|
call_deferred("update_node")
|
||||||
|
|
||||||
|
func update_up_down_buttons() -> void:
|
||||||
|
for c in get_children():
|
||||||
|
if ! (c is Button):
|
||||||
|
c.update_up_down_button()
|
||||||
|
|
||||||
|
func update_node() -> void:
|
||||||
|
for c in get_children():
|
||||||
|
remove_child(c)
|
||||||
|
c.free()
|
||||||
|
rect_size = Vector2(0, 0)
|
||||||
|
title = generator.get_type_name()
|
||||||
|
var color = Color(0.0, 0.5, 0.0, 0.5)
|
||||||
|
for p in generator.get_io_defs():
|
||||||
|
set_slot(get_child_count(), generator.name != "gen_inputs", 0, color, generator.name != "gen_outputs", 0, color)
|
||||||
|
var port : Control
|
||||||
|
if generator.is_editable():
|
||||||
|
port = preload("res://addons/material_maker/nodes/ios/port.tscn").instance()
|
||||||
|
if p.has("name"):
|
||||||
|
port.set_label(p.name)
|
||||||
|
else:
|
||||||
|
port = Label.new()
|
||||||
|
port.text = p.name
|
||||||
|
add_child(port)
|
||||||
|
if generator.is_editable():
|
||||||
|
var add_button : Button = preload("res://addons/material_maker/nodes/ios/add.tscn").instance()
|
||||||
|
add_child(add_button)
|
||||||
|
add_button.connect("pressed", generator, "add_port")
|
||||||
|
set_slot(get_child_count()-1, false, 0, color, false, 0, color)
|
||||||
|
update_up_down_buttons()
|
||||||
|
|
8
addons/material_maker/nodes/ios.tscn
Normal file
8
addons/material_maker/nodes/ios.tscn
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[gd_scene load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://addons/material_maker/nodes/ios.gd" type="Script" id=1]
|
||||||
|
|
||||||
|
[node name="IOs" type="GraphNode"]
|
||||||
|
margin_right = 32.0
|
||||||
|
margin_bottom = 29.0
|
||||||
|
script = ExtResource( 1 )
|
16
addons/material_maker/nodes/ios/add.tscn
Normal file
16
addons/material_maker/nodes/ios/add.tscn
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
[gd_scene load_steps=3 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://addons/material_maker/icons/icons.svg" type="Texture" id=1]
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id=4]
|
||||||
|
flags = 4
|
||||||
|
atlas = ExtResource( 1 )
|
||||||
|
region = Rect2( 50, 1, 12, 14 )
|
||||||
|
|
||||||
|
[node name="Add" type="Button"]
|
||||||
|
margin_left = 16.0
|
||||||
|
margin_top = 44.0
|
||||||
|
margin_right = 40.0
|
||||||
|
margin_bottom = 64.0
|
||||||
|
size_flags_horizontal = 0
|
||||||
|
icon = SubResource( 4 )
|
23
addons/material_maker/nodes/ios/port.gd
Normal file
23
addons/material_maker/nodes/ios/port.gd
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
extends HBoxContainer
|
||||||
|
|
||||||
|
func set_label(l : String) -> void:
|
||||||
|
$Name.set_text(l)
|
||||||
|
|
||||||
|
func update_up_down_button() -> void:
|
||||||
|
var parent = get_parent()
|
||||||
|
if parent == null:
|
||||||
|
return
|
||||||
|
$Up.disabled = (get_index() == 0)
|
||||||
|
$Down.disabled = (get_index() == get_parent().get_child_count()-2)
|
||||||
|
|
||||||
|
func _on_Name_label_changed(new_label):
|
||||||
|
get_parent().generator.set_port_name(get_index(), new_label)
|
||||||
|
|
||||||
|
func _on_Delete_pressed():
|
||||||
|
get_parent().generator.delete_port(get_index())
|
||||||
|
|
||||||
|
func _on_Up_pressed():
|
||||||
|
get_parent().generator.swap_ports(get_index(), get_index()-1)
|
||||||
|
|
||||||
|
func _on_Down_pressed():
|
||||||
|
get_parent().generator.swap_ports(get_index(), get_index()+1)
|
54
addons/material_maker/nodes/ios/port.tscn
Normal file
54
addons/material_maker/nodes/ios/port.tscn
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
[gd_scene load_steps=7 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://addons/material_maker/nodes/ios/port.gd" type="Script" id=1]
|
||||||
|
[ext_resource path="res://addons/material_maker/icons/icons.svg" type="Texture" id=2]
|
||||||
|
[ext_resource path="res://addons/material_maker/widgets/linked_widgets/editable_label.tscn" type="PackedScene" id=3]
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id=1]
|
||||||
|
flags = 4
|
||||||
|
atlas = ExtResource( 2 )
|
||||||
|
region = Rect2( 2, 17, 12, 14 )
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id=2]
|
||||||
|
flags = 4
|
||||||
|
atlas = ExtResource( 2 )
|
||||||
|
region = Rect2( 18, 49, 12, 14 )
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id=3]
|
||||||
|
flags = 4
|
||||||
|
atlas = ExtResource( 2 )
|
||||||
|
region = Rect2( 34, 49, 12, 14 )
|
||||||
|
|
||||||
|
[node name="Port" type="HBoxContainer"]
|
||||||
|
margin_left = 16.0
|
||||||
|
margin_top = 24.0
|
||||||
|
margin_right = 130.0
|
||||||
|
margin_bottom = 44.0
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
|
[node name="Delete" type="Button" parent="."]
|
||||||
|
margin_right = 24.0
|
||||||
|
margin_bottom = 20.0
|
||||||
|
icon = SubResource( 1 )
|
||||||
|
|
||||||
|
[node name="Up" type="Button" parent="."]
|
||||||
|
margin_left = 28.0
|
||||||
|
margin_right = 52.0
|
||||||
|
margin_bottom = 20.0
|
||||||
|
icon = SubResource( 2 )
|
||||||
|
|
||||||
|
[node name="Down" type="Button" parent="."]
|
||||||
|
margin_left = 56.0
|
||||||
|
margin_right = 80.0
|
||||||
|
margin_bottom = 20.0
|
||||||
|
icon = SubResource( 3 )
|
||||||
|
|
||||||
|
[node name="Name" parent="." instance=ExtResource( 3 )]
|
||||||
|
margin_left = 84.0
|
||||||
|
margin_right = 114.0
|
||||||
|
margin_bottom = 20.0
|
||||||
|
rect_min_size = Vector2( 30, 0 )
|
||||||
|
[connection signal="pressed" from="Delete" to="." method="_on_Delete_pressed"]
|
||||||
|
[connection signal="pressed" from="Up" to="." method="_on_Up_pressed"]
|
||||||
|
[connection signal="pressed" from="Down" to="." method="_on_Down_pressed"]
|
||||||
|
[connection signal="label_changed" from="Name" to="." method="_on_Name_label_changed"]
|
@ -9,14 +9,17 @@ script = ExtResource( 1 )
|
|||||||
|
|
||||||
[node name="Label" type="Label" parent="."]
|
[node name="Label" type="Label" parent="."]
|
||||||
margin_top = 13.0
|
margin_top = 13.0
|
||||||
|
margin_right = 62.0
|
||||||
margin_bottom = 27.0
|
margin_bottom = 27.0
|
||||||
mouse_filter = 0
|
mouse_filter = 0
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
|
||||||
[node name="Editor" type="LineEdit" parent="."]
|
[node name="Editor" type="LineEdit" parent="."]
|
||||||
visible = false
|
visible = false
|
||||||
margin_left = 4.0
|
margin_left = 4.0
|
||||||
margin_right = 62.0
|
margin_right = 62.0
|
||||||
margin_bottom = 40.0
|
margin_bottom = 40.0
|
||||||
|
size_flags_horizontal = 3
|
||||||
[connection signal="gui_input" from="Label" to="." method="_on_gui_input"]
|
[connection signal="gui_input" from="Label" to="." method="_on_gui_input"]
|
||||||
[connection signal="focus_exited" from="Editor" to="." method="_on_Editor_focus_exited"]
|
[connection signal="focus_exited" from="Editor" to="." method="_on_Editor_focus_exited"]
|
||||||
[connection signal="text_entered" from="Editor" to="." method="_on_Editor_text_entered"]
|
[connection signal="text_entered" from="Editor" to="." method="_on_Editor_text_entered"]
|
||||||
|
Loading…
Reference in New Issue
Block a user