summaryrefslogtreecommitdiff
path: root/editor
diff options
context:
space:
mode:
authorRĂ©mi Verschelde <rverschelde@gmail.com>2019-06-27 15:14:54 +0200
committerGitHub <noreply@github.com>2019-06-27 15:14:54 +0200
commitf35fd681acba34817d14e236f20a6065a069aea0 (patch)
tree91a806a5607cc198692fa7ed239e16ab2ac04d86 /editor
parent11b8bf5572405a6b19d0ec80f0141c3b1e472a44 (diff)
parent0aec3c3113ce8319ffdc795ee2d06a7ec04036fc (diff)
Merge pull request #30114 from Chaosus/vs_context_menu
Shows menu when dragging connection on empty space in visual shader
Diffstat (limited to 'editor')
-rw-r--r--editor/plugins/visual_shader_editor_plugin.cpp53
-rw-r--r--editor/plugins/visual_shader_editor_plugin.h7
2 files changed, 58 insertions, 2 deletions
diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp
index ddf49aa9ea..b4200d5662 100644
--- a/editor/plugins/visual_shader_editor_plugin.cpp
+++ b/editor/plugins/visual_shader_editor_plugin.cpp
@@ -1238,6 +1238,30 @@ void VisualShaderEditor::_add_node(int p_idx, int p_op_idx) {
undo_redo->add_do_method(expr, "set_size", Size2(250 * EDSCALE, 150 * EDSCALE));
}
+ if (to_node != -1 && to_slot != -1) {
+ if (vsnode->get_output_port_count() > 0) {
+
+ int _from_node = id_to_use;
+ int _from_slot = 0;
+
+ if (visual_shader->is_port_types_compatible(vsnode->get_output_port_type(_from_slot), visual_shader->get_node(type, to_node)->get_input_port_type(to_slot))) {
+ undo_redo->add_do_method(visual_shader.ptr(), "connect_nodes", type, _from_node, _from_slot, to_node, to_slot);
+ undo_redo->add_undo_method(visual_shader.ptr(), "disconnect_nodes", type, _from_node, _from_slot, to_node, to_slot);
+ }
+ }
+ } else if (from_node != -1 && from_slot != -1) {
+ if (vsnode->get_input_port_count() > 0) {
+
+ int _to_node = id_to_use;
+ int _to_slot = 0;
+
+ if (visual_shader->is_port_types_compatible(visual_shader->get_node(type, from_node)->get_output_port_type(from_slot), vsnode->get_input_port_type(_to_slot))) {
+ undo_redo->add_do_method(visual_shader.ptr(), "connect_nodes", type, from_node, from_slot, _to_node, _to_slot);
+ undo_redo->add_undo_method(visual_shader.ptr(), "disconnect_nodes", type, from_node, from_slot, _to_node, _to_slot);
+ }
+ }
+ }
+
undo_redo->add_do_method(this, "_update_graph");
undo_redo->add_undo_method(this, "_update_graph");
undo_redo->commit_action();
@@ -1307,6 +1331,15 @@ void VisualShaderEditor::_disconnection_request(const String &p_from, int p_from
}
void VisualShaderEditor::_connection_to_empty(const String &p_from, int p_from_slot, const Vector2 &p_release_position) {
+ from_node = p_from.to_int();
+ from_slot = p_from_slot;
+ _show_members_dialog(true);
+}
+
+void VisualShaderEditor::_connection_from_empty(const String &p_to, int p_to_slot, const Vector2 &p_release_position) {
+ to_node = p_to.to_int();
+ to_slot = p_to_slot;
+ _show_members_dialog(true);
}
void VisualShaderEditor::_delete_request(int which) {
@@ -1372,8 +1405,6 @@ void VisualShaderEditor::_graph_gui_input(const Ref<InputEvent> p_event) {
void VisualShaderEditor::_show_members_dialog(bool at_mouse_pos) {
- members_dialog->popup();
-
if (at_mouse_pos) {
saved_node_pos_dirty = true;
saved_node_pos = graph->get_local_mouse_position();
@@ -1382,6 +1413,7 @@ void VisualShaderEditor::_show_members_dialog(bool at_mouse_pos) {
members_dialog->popup();
members_dialog->set_position(gpos);
} else {
+ members_dialog->popup();
saved_node_pos_dirty = false;
members_dialog->set_position(graph->get_global_position() + Point2(5 * EDSCALE, 65 * EDSCALE));
}
@@ -1698,6 +1730,13 @@ void VisualShaderEditor::_member_create() {
}
}
+void VisualShaderEditor::_member_cancel() {
+ to_node = -1;
+ to_slot = -1;
+ from_node = -1;
+ from_slot = -1;
+}
+
void VisualShaderEditor::_tools_menu_option(int p_idx) {
TreeItem *category = members->get_root()->get_children();
@@ -1809,6 +1848,7 @@ void VisualShaderEditor::_bind_methods() {
ClassDB::bind_method("_edit_port_default_input", &VisualShaderEditor::_edit_port_default_input);
ClassDB::bind_method("_port_edited", &VisualShaderEditor::_port_edited);
ClassDB::bind_method("_connection_to_empty", &VisualShaderEditor::_connection_to_empty);
+ ClassDB::bind_method("_connection_from_empty", &VisualShaderEditor::_connection_from_empty);
ClassDB::bind_method("_line_edit_focus_out", &VisualShaderEditor::_line_edit_focus_out);
ClassDB::bind_method("_line_edit_changed", &VisualShaderEditor::_line_edit_changed);
ClassDB::bind_method("_port_name_focus_out", &VisualShaderEditor::_port_name_focus_out);
@@ -1840,6 +1880,7 @@ void VisualShaderEditor::_bind_methods() {
ClassDB::bind_method("_member_selected", &VisualShaderEditor::_member_selected);
ClassDB::bind_method("_member_unselected", &VisualShaderEditor::_member_unselected);
ClassDB::bind_method("_member_create", &VisualShaderEditor::_member_create);
+ ClassDB::bind_method("_member_cancel", &VisualShaderEditor::_member_cancel);
}
VisualShaderEditor *VisualShaderEditor::singleton = NULL;
@@ -1852,6 +1893,11 @@ VisualShaderEditor::VisualShaderEditor() {
saved_node_pos = Point2(0, 0);
ShaderLanguage::get_keyword_list(&keyword_list);
+ to_node = -1;
+ to_slot = -1;
+ from_node = -1;
+ from_slot = -1;
+
graph = memnew(GraphEdit);
add_child(graph);
graph->set_drag_forwarding(this);
@@ -1868,6 +1914,8 @@ VisualShaderEditor::VisualShaderEditor() {
graph->connect("duplicate_nodes_request", this, "_duplicate_nodes");
graph->connect("delete_nodes_request", this, "_on_nodes_delete");
graph->connect("gui_input", this, "_graph_gui_input");
+ graph->connect("connection_to_empty", this, "_connection_to_empty");
+ graph->connect("connection_from_empty", this, "_connection_from_empty");
graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_SCALAR);
graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_VECTOR);
graph->add_valid_connection_type(VisualShaderNode::PORT_TYPE_SCALAR, VisualShaderNode::PORT_TYPE_BOOLEAN);
@@ -1953,6 +2001,7 @@ VisualShaderEditor::VisualShaderEditor() {
members_dialog->get_ok()->set_disabled(true);
members_dialog->set_resizable(true);
members_dialog->set_as_minsize();
+ members_dialog->connect("hide", this, "_member_cancel");
add_child(members_dialog);
alert = memnew(AcceptDialog);
diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h
index e89814df3d..49a7a21ea7 100644
--- a/editor/plugins/visual_shader_editor_plugin.h
+++ b/editor/plugins/visual_shader_editor_plugin.h
@@ -160,7 +160,13 @@ class VisualShaderEditor : public VBoxContainer {
void _edit_port_default_input(Object *p_button, int p_node, int p_port);
void _port_edited();
+ int to_node;
+ int to_slot;
+ int from_node;
+ int from_slot;
+
void _connection_to_empty(const String &p_from, int p_from_slot, const Vector2 &p_release_position);
+ void _connection_from_empty(const String &p_to, int p_to_slot, const Vector2 &p_release_position);
void _line_edit_changed(const String &p_text, Object *line_edit, int p_node_id);
void _line_edit_focus_out(Object *line_edit, int p_node_id);
@@ -199,6 +205,7 @@ class VisualShaderEditor : public VBoxContainer {
void _member_selected();
void _member_unselected();
void _member_create();
+ void _member_cancel();
Variant get_drag_data_fw(const Point2 &p_point, Control *p_from);
bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;