material-maker/addons/material_maker/widgets/linked_widgets/linked_control.gd
RodZill4 cb03131b85 Added control link check and editable labels
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.
2018-09-10 08:00:03 +02:00

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