mirror of
https://github.com/Relintai/material-maker.git
synced 2024-11-13 06:27:18 +01:00
cb03131b85
Now linking new controls to a linked_control will check compatibility (same control type and parameters). Linked control labels are now editable. Modified the Switch node layout so it is easier to understand. Updated the bricks example to use the switch and remote nodes.
95 lines
2.5 KiB
GDScript
95 lines
2.5 KiB
GDScript
tool
|
|
extends "res://addons/material_maker/widgets/linked_widgets/linked_control_base.gd"
|
|
|
|
var control = null
|
|
|
|
func add_linked(node, widget):
|
|
if linked_widgets.empty():
|
|
control = null
|
|
var type
|
|
if widget is SpinBox:
|
|
control = SpinBox.new()
|
|
type = "SpinBox"
|
|
elif widget is ColorPickerButton:
|
|
control = ColorPickerButton.new()
|
|
type = "ColorPickerButton"
|
|
elif widget is Control && widget.filename == "res://addons/material_maker/widgets/gradient_editor.tscn":
|
|
control = preload("res://addons/material_maker/widgets/gradient_editor.tscn").instance()
|
|
type = "GradientEditor"
|
|
elif widget is HSlider:
|
|
control = HSlider.new()
|
|
type = "HSlider"
|
|
elif widget is OptionButton:
|
|
control = OptionButton.new()
|
|
type = "OptionButton"
|
|
for i in range(widget.get_item_count()):
|
|
control.add_item(widget.get_item_text(i), widget.get_item_id(i))
|
|
if control != null:
|
|
add_child(control)
|
|
mirror(control, widget, type)
|
|
control.connect("mouse_entered", self, "_on_mouse_entered")
|
|
control.connect("mouse_exited", self, "_on_mouse_exited")
|
|
control.connect(WIDGETS[type].sig, self, WIDGETS[type].sig_handler)
|
|
else:
|
|
if !can_link_to(widget):
|
|
return
|
|
linked_widgets.append({ node=node, widget=widget })
|
|
|
|
func can_link_to(c):
|
|
if c == null:
|
|
return false
|
|
var widget_type = get_widget_type(c)
|
|
if control == null:
|
|
return widget_type != null
|
|
elif widget_type != get_widget_type(control):
|
|
return false
|
|
else:
|
|
for l in linked_widgets:
|
|
if l.widget == c:
|
|
return false
|
|
var winfo = WIDGETS[widget_type]
|
|
for a in winfo.attrs:
|
|
if c.get(a) != control.get(a):
|
|
return false
|
|
return true
|
|
|
|
func mirror(to, from, type):
|
|
var winfo = WIDGETS[type]
|
|
for a in winfo.attrs:
|
|
to.set(a, from.get(a))
|
|
to.set(winfo.value_attr, from.get(winfo.value_attr))
|
|
|
|
func update_shaders():
|
|
var graph_edit = get_parent()
|
|
while !(graph_edit is GraphEdit):
|
|
graph_edit = graph_edit.get_parent()
|
|
graph_edit.send_changed_signal()
|
|
|
|
func _on_value_changed(v):
|
|
for l in linked_widgets:
|
|
l.widget.value = v
|
|
l.node.set(l.widget.name, v)
|
|
update_shaders()
|
|
|
|
func _on_color_changed(c):
|
|
for l in linked_widgets:
|
|
l.widget.color = c
|
|
l.node.set(l.widget.name, c)
|
|
update_shaders()
|
|
|
|
func _on_item_selected(i):
|
|
for l in linked_widgets:
|
|
l.widget.selected = i
|
|
l.node.set(l.widget.name, i)
|
|
update_shaders()
|
|
|
|
func _on_gradient_updated(g):
|
|
for l in linked_widgets:
|
|
l.widget.value = g
|
|
update_shaders()
|
|
|
|
func serialize():
|
|
var data = .serialize()
|
|
data.type = "linked_control"
|
|
return data
|