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.
This commit is contained in:
RodZill4 2018-09-10 08:00:03 +02:00
parent f116aa0e22
commit cb03131b85
12 changed files with 139 additions and 72 deletions

File diff suppressed because one or more lines are too long

View File

@ -5,7 +5,7 @@
[sub_resource type="Theme" id=1]
[node name="Combine" type="GraphNode" index="0"]
[node name="Combine" type="GraphNode"]
anchor_left = 0.0
anchor_top = 0.0

View File

@ -108,7 +108,6 @@ selected = 1
[node name="Albedo" type="HBoxContainer" parent="." index="1"]
editor/display_folded = true
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
@ -170,7 +169,7 @@ group = null
flat = false
align = 1
color = Color( 1, 1, 1, 1 )
edit_alpha = true
edit_alpha = false
_sections_unfolded = [ "Rect", "Size Flags" ]
[node name="Metallic" type="HBoxContainer" parent="." index="2"]

View File

@ -7,7 +7,7 @@
[sub_resource type="Theme" id=1]
[node name="Remote" type="GraphNode" index="0"]
[node name="Remote" type="GraphNode"]
anchor_left = 0.0
anchor_top = 0.0

View File

@ -12,7 +12,7 @@ func reset():
func _get_shader_code(uv, index = 0):
var rv = { defs="", code="" }
var src = get_source(source+2*index)
var src = get_source(2*source+index)
var src_code = { defs="", code="", rgb="0.0" }
if src != null:
src_code = src.get_shader_code(uv)

View File

@ -38,13 +38,13 @@ slot/0/right_color = Color( 0.498039, 0.498039, 1, 1 )
slot/1/left_enabled = true
slot/1/left_type = 0
slot/1/left_color = Color( 0.498039, 0.498039, 1, 1 )
slot/1/right_enabled = true
slot/1/right_enabled = false
slot/1/right_type = 0
slot/1/right_color = Color( 0.498039, 0.498039, 1, 1 )
slot/2/left_enabled = true
slot/2/left_type = 0
slot/2/left_color = Color( 0.498039, 0.498039, 1, 1 )
slot/2/right_enabled = false
slot/2/right_enabled = true
slot/2/right_type = 0
slot/2/right_color = Color( 0.498039, 0.498039, 1, 1 )
slot/3/left_enabled = true
@ -70,7 +70,7 @@ anchor_right = 0.0
anchor_bottom = 0.0
margin_left = 16.0
margin_top = 24.0
margin_right = 103.0
margin_right = 70.0
margin_bottom = 44.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
@ -84,13 +84,13 @@ action_mode = 0
enabled_focus_mode = 2
shortcut = null
group = null
text = "Objet 0"
text = "1"
flat = false
align = 0
items = [ "1", null, false, 0, null, "2", null, false, 1, null ]
selected = 0
[node name="HBoxContainer1" type="HBoxContainer" parent="." index="1"]
[node name="Label1" type="Label" parent="." index="1"]
anchor_left = 0.0
anchor_top = 0.0
@ -98,10 +98,31 @@ anchor_right = 0.0
anchor_bottom = 0.0
margin_left = 16.0
margin_top = 44.0
margin_right = 103.0
margin_right = 70.0
margin_bottom = 58.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 2
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 4
text = "A1"
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
[node name="HBoxContainer1" type="HBoxContainer" parent="." index="2"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_left = 16.0
margin_top = 59.0
margin_right = 70.0
margin_bottom = 73.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 1
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
@ -114,7 +135,7 @@ anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_right = 74.0
margin_right = 41.0
margin_bottom = 14.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
@ -122,7 +143,7 @@ mouse_filter = 2
mouse_default_cursor_shape = 0
size_flags_horizontal = 3
size_flags_vertical = 4
text = "A1"
text = "B1"
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
@ -133,8 +154,8 @@ anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_left = 78.0
margin_right = 87.0
margin_left = 45.0
margin_right = 54.0
margin_bottom = 14.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
@ -147,27 +168,6 @@ percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
[node name="Label2" type="Label" parent="." index="2"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_left = 16.0
margin_top = 59.0
margin_right = 103.0
margin_bottom = 73.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 2
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 4
text = "A2"
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
[node name="HBoxContainer2" type="HBoxContainer" parent="." index="3"]
anchor_left = 0.0
@ -176,7 +176,7 @@ anchor_right = 0.0
anchor_bottom = 0.0
margin_left = 16.0
margin_top = 74.0
margin_right = 103.0
margin_right = 70.0
margin_bottom = 88.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
@ -192,7 +192,7 @@ anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_right = 74.0
margin_right = 41.0
margin_bottom = 14.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
@ -200,7 +200,7 @@ mouse_filter = 2
mouse_default_cursor_shape = 0
size_flags_horizontal = 3
size_flags_vertical = 4
text = "B1"
text = "A2"
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
@ -211,8 +211,8 @@ anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_left = 78.0
margin_right = 87.0
margin_left = 45.0
margin_right = 54.0
margin_bottom = 14.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
@ -225,7 +225,7 @@ percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
[node name="Label4" type="Label" parent="." index="4"]
[node name="Label2" type="Label" parent="." index="4"]
anchor_left = 0.0
anchor_top = 0.0
@ -233,7 +233,7 @@ anchor_right = 0.0
anchor_bottom = 0.0
margin_left = 16.0
margin_top = 89.0
margin_right = 103.0
margin_right = 70.0
margin_bottom = 103.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false

View File

@ -0,0 +1,12 @@
extends Label
func _ready():
pass
func _on_gui_input(ev):
if ev is InputEventMouseButton and ev.doubleclick and ev.button_index == BUTTON_LEFT:
var dialog = preload("res://addons/material_maker/widgets/line_dialog.tscn").instance()
add_child(dialog)
dialog.set_texts("Remote", "Enter a name this control")
dialog.connect("ok", self, "set_text", [])
dialog.popup_centered()

View File

@ -0,0 +1,27 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://addons/material_maker/widgets/linked_widgets/editable_label.gd" type="Script" id=1]
[node name="Label" type="Label"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_right = 40.0
margin_bottom = 14.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 0
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 4
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
script = ExtResource( 1 )
_sections_unfolded = [ "Mouse" ]
[connection signal="gui_input" from="." to="." method="_on_gui_input"]

View File

@ -1,38 +1,63 @@
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():
var new_widget = null
control = null
var type
if widget is SpinBox:
new_widget = SpinBox.new()
control = SpinBox.new()
type = "SpinBox"
elif widget is ColorPickerButton:
new_widget = ColorPickerButton.new()
control = ColorPickerButton.new()
type = "ColorPickerButton"
elif widget is Control && widget.filename == "res://addons/material_maker/widgets/gradient_editor.tscn":
new_widget = preload("res://addons/material_maker/widgets/gradient_editor.tscn").instance()
control = preload("res://addons/material_maker/widgets/gradient_editor.tscn").instance()
type = "GradientEditor"
elif widget is HSlider:
new_widget = HSlider.new()
control = HSlider.new()
type = "HSlider"
elif widget is OptionButton:
new_widget = OptionButton.new()
control = OptionButton.new()
type = "OptionButton"
for i in range(widget.get_item_count()):
new_widget.add_item(widget.get_item_text(i), widget.get_item_id(i))
if new_widget != null:
add_child(new_widget)
mirror(new_widget, widget, type)
new_widget.connect("mouse_entered", self, "_on_mouse_entered")
new_widget.connect("mouse_exited", self, "_on_mouse_exited")
new_widget.connect(WIDGETS[type].sig, self, WIDGETS[type].sig_handler)
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):
for a in WIDGETS[type].attrs:
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()

View File

@ -10,11 +10,11 @@ var links = null
const Link = preload("res://addons/material_maker/widgets/linked_widgets/link.gd")
const WIDGETS = {
SpinBox={ attrs=[ "min_value", "max_value", "step", "value" ], value_attr="value", sig="value_changed", sig_handler="_on_value_changed" },
HSlider={ attrs=[ "min_value", "max_value", "step", "value" ], value_attr="value", sig="value_changed", sig_handler="_on_value_changed" },
ColorPickerButton={ attrs=[ "edit_alpha", "color" ], value_attr="color", sig="color_changed", sig_handler="_on_color_changed" },
OptionButton={ attrs=[ "selected" ], value_attr="selected", sig="item_selected", sig_handler="_on_item_selected" },
GradientEditor={ attrs=[ "value" ], value_attr="value", sig="updated", sig_handler="_on_gradient_updated" }
SpinBox={ attrs=[ "min_value", "max_value", "step" ], value_attr="value", sig="value_changed", sig_handler="_on_value_changed" },
HSlider={ attrs=[ "min_value", "max_value", "step" ], value_attr="value", sig="value_changed", sig_handler="_on_value_changed" },
ColorPickerButton={ attrs=[ "edit_alpha", ], value_attr="color", sig="color_changed", sig_handler="_on_color_changed" },
OptionButton={ attrs=[ ], value_attr="selected", sig="item_selected", sig_handler="_on_item_selected" },
GradientEditor={ attrs=[ ], value_attr="value", sig="updated", sig_handler="_on_gradient_updated" }
}
func get_widget_type(widget):
@ -34,8 +34,11 @@ func get_widget_type(widget):
func _ready():
set_process_input(false)
func can_link_to(c):
return c != null
func get_associated_controls():
label = Label.new()
label = preload("res://addons/material_maker/widgets/linked_widgets/editable_label.tscn").instance()
label.set_text("Unnamed")
buttons = preload("res://addons/material_maker/widgets/linked_widgets/linked_control_buttons.tscn").instance()
buttons.control = self
@ -90,7 +93,7 @@ func _input(event):
elif event is InputEventMouseMotion:
var control = find_control(event.global_position)
link.end = event.global_position
link.target = control.widget if control != null else null
link.target = control.widget if control != null && can_link_to(control.widget) else null
link.update()
elif event is InputEventMouseButton:
if event.pressed:
@ -120,12 +123,14 @@ func pick_linked():
pointed_control = null
func serialize():
var data = { linked_widgets=[] }
var data = { label=label.text, linked_widgets=[] }
for w in linked_widgets:
data.linked_widgets.append( { node=w.node.name, widget=w.widget.name } )
return data
func deserialize(data):
if data.has("label"):
label.text = data.label
if !data.has("linked_widgets"):
return
var graph_edit = get_parent()

View File

@ -3,11 +3,6 @@ extends HBoxContainer
var control = null
func _ready():
# Called when the node is added to the scene for the first time.
# Initialization here
pass
func _on_Link_pressed():
control.pick_linked()

View File

@ -4,7 +4,7 @@
[ext_resource path="res://addons/material_maker/icons/link.png" type="Texture" id=2]
[ext_resource path="res://addons/material_maker/icons/remove.png" type="Texture" id=3]
[node name="Buttons" type="HBoxContainer"]
[node name="Buttons" type="HBoxContainer" index="0"]
anchor_left = 0.0
anchor_top = 0.0
@ -31,6 +31,7 @@ margin_right = 28.0
margin_bottom = 22.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
hint_tooltip = "Link new parameter"
focus_mode = 2
mouse_filter = 0
mouse_default_cursor_shape = 0
@ -43,6 +44,7 @@ group = null
icon = ExtResource( 2 )
flat = false
align = 1
_sections_unfolded = [ "Hint" ]
[node name="Remove" type="Button" parent="." index="1"]
@ -55,6 +57,7 @@ margin_right = 60.0
margin_bottom = 22.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
hint_tooltip = "Delete this control"
focus_mode = 2
mouse_filter = 0
mouse_default_cursor_shape = 0
@ -67,6 +70,7 @@ group = null
icon = ExtResource( 3 )
flat = false
align = 1
_sections_unfolded = [ "Hint" ]
[connection signal="pressed" from="Link" to="." method="_on_Link_pressed"]