From 027a31155406b5fdba882c8f8d67958e5e94ea63 Mon Sep 17 00:00:00 2001 From: RodZill4 Date: Wed, 25 Sep 2019 23:29:06 +0200 Subject: [PATCH] More remote node updates (only serialize is missing I guess...) --- addons/material_maker/engine/gen_remote.gd | 52 +++++++++++++++--- addons/material_maker/main_window.tscn | 1 + addons/material_maker/nodes/remote.gd | 31 ++++++++++- .../linked_widgets/editable_label.tscn | 17 ------ project.godot | 3 + rodz_labs_logo.png | Bin 0 -> 16387 bytes 6 files changed, 77 insertions(+), 27 deletions(-) create mode 100644 rodz_labs_logo.png diff --git a/addons/material_maker/engine/gen_remote.gd b/addons/material_maker/engine/gen_remote.gd index 713d749..42cf317 100644 --- a/addons/material_maker/engine/gen_remote.gd +++ b/addons/material_maker/engine/gen_remote.gd @@ -30,7 +30,9 @@ func get_parameter_defs(): match w.type: "config_control": var p = { name="param"+str(i), label=w.label, type="enum", values=[] } - for c in w.configurations: + var configurations = w.configurations.keys() + configurations.sort() + for c in configurations: p.values.push_back({ name=c, value=c }) rv.append(p) i += 1 @@ -61,7 +63,9 @@ func set_parameter(p, v): parent.get_node(w.node).set_parameter(w.widget, v) "config_control": if v < widget.configurations.size(): - for w in widget.configurations[widget.configurations.keys()[v]]: + var configurations = widget.configurations.keys() + configurations.sort() + for w in widget.configurations[configurations[v]]: parent.get_node(w.node).set_parameter(w.widget, w.value) else: # incorrect configuration index @@ -81,7 +85,7 @@ func create_linked_control(label): func create_config_control(label): var index = widgets.size() - widgets.push_back({ label=label, type="config_control", linked_widgets=[], configurations=[] }) + widgets.push_back({ label=label, type="config_control", linked_widgets=[], configurations={} }) return index func can_link_parameter(index, generator, param): @@ -90,13 +94,47 @@ func can_link_parameter(index, generator, param): func link_parameter(index, generator, param): if !can_link_parameter(index, generator, param): return - widgets[index].linked_widgets.push_back({ node=generator.name, widget=param }) - if widgets[index].linked_widgets.size() == 1: - parameters["param"+str(index)] = generator.parameters[param] + var widget = widgets[index] + widget.linked_widgets.push_back({ node=generator.name, widget=param }) + if widget.linked_widgets.size() == 1: + match widget.type: + "linked_control": + parameters["param"+str(index)] = generator.parameters[param] + "config_control": + parameters["param"+str(index)] = 0 emit_signal("parameter_changed", "", null) func remove_parameter(index): for i in range(index, widgets.size()-2): parameters["param"+str(i)] = parameters["param"+str(i+1)] widgets.remove(index) - emit_signal("parameter_changed", "", null) \ No newline at end of file + emit_signal("parameter_changed", "", null) + +func add_configuration(index, config_name): + var widget = widgets[index] + if widget.type == "config_control": + widget.configurations[config_name] = [] + var configurations = widget.configurations.keys() + configurations.sort() + parameters["param"+str(index)] =configurations.find(config_name) + update_configuration(index, config_name) + +func update_configuration(index, config_name): + var widget = widgets[index] + if widget.type == "config_control": + var c = [] + var parent = get_parent() + for w in widget.linked_widgets: + var g = parent.get_node(w.node) + var value = g.parameters[w.widget] + if typeof(value) == TYPE_ARRAY or typeof(value) == TYPE_DICTIONARY: + value = value.duplicate() + c.push_back({ node=w.node, widget=w.widget, value=value }) + widget.configurations[config_name] = c + emit_signal("parameter_changed", "", null) + +func remove_configuration(index, config_name): + var widget = widgets[index] + if widget.type == "config_control": + widget.configurations.erase(config_name) + emit_signal("parameter_changed", "", null) diff --git a/addons/material_maker/main_window.tscn b/addons/material_maker/main_window.tscn index fb86ec5..8812090 100644 --- a/addons/material_maker/main_window.tscn +++ b/addons/material_maker/main_window.tscn @@ -96,6 +96,7 @@ tab_align = 0 tab_close_display_policy = 1 [node name="Renderer" parent="." instance=ExtResource( 5 )] +debug_path = null [node name="NodeFactory" type="Node" parent="."] script = ExtResource( 6 ) diff --git a/addons/material_maker/nodes/remote.gd b/addons/material_maker/nodes/remote.gd index ac42697..332e48e 100644 --- a/addons/material_maker/nodes/remote.gd +++ b/addons/material_maker/nodes/remote.gd @@ -47,12 +47,37 @@ func update_node(): func _on_value_changed(new_value, variable): var param_index = variable.trim_prefix("param").to_int() var widget = generator.widgets[param_index] - if widget.type == "config_control" and new_value >= widget.configurations.size(): - var command = new_value - widget.configurations.size() - print(command) + if widget.type == "config_control": + var configuration_count = widget.configurations.size() + var control = $Controls.get_child(param_index*4+1) + if new_value < configuration_count: + ._on_value_changed(new_value, variable) + var current = control.get_item_text(new_value) + control.set_item_text(configuration_count+3, "") + control.set_item_text(configuration_count+4, "") + else: + var current = control.get_item_text(generator.parameters[variable]) + var command = new_value - widget.configurations.size() + match command: + 1: + var dialog = preload("res://addons/material_maker/widgets/line_dialog.tscn").instance() + add_child(dialog) + dialog.set_texts("Configuration", "Enter a name for the new configuration") + dialog.connect("ok", self, "do_add_configuration", [ param_index ]) + dialog.popup_centered() + 3: + generator.update_configuration(param_index, current) + 4: + generator.parameters[variable] = 0 + generator.remove_configuration(param_index, current) + _: + print(command) else: ._on_value_changed(new_value, variable) +func do_add_configuration(config_name, param_index): + generator.add_configuration(param_index, config_name) + func _on_AddLink_pressed(): var widget = Control.new() add_control("Unnamed", widget) diff --git a/addons/material_maker/widgets/linked_widgets/editable_label.tscn b/addons/material_maker/widgets/linked_widgets/editable_label.tscn index 9406658..64d4c8f 100644 --- a/addons/material_maker/widgets/linked_widgets/editable_label.tscn +++ b/addons/material_maker/widgets/linked_widgets/editable_label.tscn @@ -3,25 +3,8 @@ [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"] - - diff --git a/project.godot b/project.godot index 0aab12b..e488d5a 100644 --- a/project.godot +++ b/project.godot @@ -132,6 +132,9 @@ config/name="Material Maker" run/main_scene="res://addons/material_maker/main_window.tscn" config/use_custom_user_dir=true config/custom_user_dir_name="material_maker" +boot_splash/image="res://rodz_labs_logo.png" +boot_splash/fullsize=false +boot_splash/bg_color=Color( 0.0901961, 0.0941176, 0.141176, 1 ) config/icon="res://icon.png" config/release="0.6" diff --git a/rodz_labs_logo.png b/rodz_labs_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..dd7e4d3a8bbe109ff8e77d728e2376c17581a679 GIT binary patch literal 16387 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 literal 0 HcmV?d00001