Browse Source

Merge pull request #56646 from Chaosus/vst_context_menu

Rémi Verschelde 3 years ago
parent
commit
ac9f303e6d

+ 46 - 7
modules/visual_script/editor/visual_script_editor.cpp

@@ -1973,7 +1973,7 @@ void VisualScriptEditor::input(const Ref<InputEvent> &p_event) {
 	// GUI input for VS Editor Plugin
 	// GUI input for VS Editor Plugin
 	Ref<InputEventMouseButton> key = p_event;
 	Ref<InputEventMouseButton> key = p_event;
 
 
-	if (key.is_valid() && !key->is_pressed()) {
+	if (key.is_valid() && key->is_pressed()) {
 		mouse_up_position = get_screen_position() + get_local_mouse_position();
 		mouse_up_position = get_screen_position() + get_local_mouse_position();
 	}
 	}
 }
 }
@@ -1982,10 +1982,28 @@ void VisualScriptEditor::_graph_gui_input(const Ref<InputEvent> &p_event) {
 	Ref<InputEventMouseButton> key = p_event;
 	Ref<InputEventMouseButton> key = p_event;
 
 
 	if (key.is_valid() && key->is_pressed() && key->get_button_mask() == MouseButton::RIGHT) {
 	if (key.is_valid() && key->is_pressed() && key->get_button_mask() == MouseButton::RIGHT) {
-		saved_position = graph->get_local_mouse_position();
+		bool is_empty_selection = true;
 
 
-		Point2 gpos = get_screen_position() + get_local_mouse_position();
-		_generic_search(script->get_instance_base_type(), gpos);
+		for (int i = 0; i < graph->get_child_count(); i++) {
+			GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i));
+			if (gn && gn->is_selected()) {
+				is_empty_selection = false;
+				break;
+			}
+		}
+		if (is_empty_selection && clipboard->nodes.is_empty()) {
+			_generic_search(script->get_instance_base_type(), mouse_up_position);
+		} else {
+			popup_menu->set_item_disabled(int(EDIT_CUT_NODES), is_empty_selection);
+			popup_menu->set_item_disabled(int(EDIT_COPY_NODES), is_empty_selection);
+			popup_menu->set_item_disabled(int(EDIT_PASTE_NODES), clipboard->nodes.is_empty());
+			popup_menu->set_item_disabled(int(EDIT_DELETE_NODES), is_empty_selection);
+			popup_menu->set_item_disabled(int(EDIT_DUPLICATE_NODES), is_empty_selection);
+			popup_menu->set_item_disabled(int(EDIT_CLEAR_COPY_BUFFER), clipboard->nodes.is_empty());
+
+			popup_menu->set_position(mouse_up_position);
+			popup_menu->popup();
+		}
 	}
 	}
 }
 }
 
 
@@ -3873,6 +3891,9 @@ void VisualScriptEditor::_comment_node_resized(const Vector2 &p_new_size, int p_
 
 
 void VisualScriptEditor::_menu_option(int p_what) {
 void VisualScriptEditor::_menu_option(int p_what) {
 	switch (p_what) {
 	switch (p_what) {
+		case EDIT_ADD_NODE: {
+			_generic_search(script->get_instance_base_type(), mouse_up_position);
+		} break;
 		case EDIT_DELETE_NODES: {
 		case EDIT_DELETE_NODES: {
 			_on_nodes_delete();
 			_on_nodes_delete();
 		} break;
 		} break;
@@ -3913,6 +3934,9 @@ void VisualScriptEditor::_menu_option(int p_what) {
 		case EDIT_PASTE_NODES: {
 		case EDIT_PASTE_NODES: {
 			_on_nodes_paste();
 			_on_nodes_paste();
 		} break;
 		} break;
+		case EDIT_DUPLICATE_NODES: {
+			_on_nodes_duplicate();
+		} break;
 		case EDIT_CREATE_FUNCTION: {
 		case EDIT_CREATE_FUNCTION: {
 			// Create Function.
 			// Create Function.
 			Map<int, Ref<VisualScriptNode>> nodes;
 			Map<int, Ref<VisualScriptNode>> nodes;
@@ -4140,6 +4164,12 @@ void VisualScriptEditor::_menu_option(int p_what) {
 		case REFRESH_GRAPH: {
 		case REFRESH_GRAPH: {
 			_update_graph();
 			_update_graph();
 		} break;
 		} break;
+		case EDIT_CLEAR_COPY_BUFFER: {
+			clipboard->nodes.clear();
+			clipboard->nodes_positions.clear();
+			clipboard->data_connections.clear();
+			clipboard->sequence_connections.clear();
+		} break;
 	}
 	}
 }
 }
 
 
@@ -4327,9 +4357,6 @@ VisualScriptEditor::VisualScriptEditor() {
 	if (!clipboard) {
 	if (!clipboard) {
 		clipboard = memnew(Clipboard);
 		clipboard = memnew(Clipboard);
 	}
 	}
-	updating_graph = false;
-	saved_pos_dirty = false;
-	saved_position = Vector2(0, 0);
 
 
 	edit_menu = memnew(MenuButton);
 	edit_menu = memnew(MenuButton);
 	edit_menu->set_shortcut_context(this);
 	edit_menu->set_shortcut_context(this);
@@ -4561,6 +4588,18 @@ VisualScriptEditor::VisualScriptEditor() {
 	new_virtual_method_select = memnew(VisualScriptPropertySelector);
 	new_virtual_method_select = memnew(VisualScriptPropertySelector);
 	add_child(new_virtual_method_select);
 	add_child(new_virtual_method_select);
 	new_virtual_method_select->connect("selected", callable_mp(this, &VisualScriptEditor::_selected_new_virtual_method));
 	new_virtual_method_select->connect("selected", callable_mp(this, &VisualScriptEditor::_selected_new_virtual_method));
+
+	popup_menu = memnew(PopupMenu);
+	add_child(popup_menu);
+	popup_menu->add_item(TTR("Add Node"), EDIT_ADD_NODE);
+	popup_menu->add_separator();
+	popup_menu->add_item(TTR("Cut"), EDIT_CUT_NODES);
+	popup_menu->add_item(TTR("Copy"), EDIT_COPY_NODES);
+	popup_menu->add_item(TTR("Paste"), EDIT_PASTE_NODES);
+	popup_menu->add_item(TTR("Delete"), EDIT_DELETE_NODES);
+	popup_menu->add_item(TTR("Duplicate"), EDIT_DUPLICATE_NODES);
+	popup_menu->add_item(TTR("Clear Copy Buffer"), EDIT_CLEAR_COPY_BUFFER);
+	popup_menu->connect("id_pressed", callable_mp(this, &VisualScriptEditor::_menu_option));
 }
 }
 
 
 VisualScriptEditor::~VisualScriptEditor() {
 VisualScriptEditor::~VisualScriptEditor() {

+ 13 - 8
modules/visual_script/editor/visual_script_editor.h

@@ -54,13 +54,18 @@ class VisualScriptEditor : public ScriptEditorBase {
 	};
 	};
 
 
 	enum {
 	enum {
-		EDIT_DELETE_NODES,
-		EDIT_TOGGLE_BREAKPOINT,
-		EDIT_FIND_NODE_TYPE,
-		EDIT_COPY_NODES,
+		EDIT_ADD_NODE,
+		EDIT_SEPARATOR, // popup menu separator - ignored
 		EDIT_CUT_NODES,
 		EDIT_CUT_NODES,
+		EDIT_COPY_NODES,
 		EDIT_PASTE_NODES,
 		EDIT_PASTE_NODES,
+		EDIT_DELETE_NODES,
+		EDIT_DUPLICATE_NODES,
+		EDIT_CLEAR_COPY_BUFFER,
+
 		EDIT_CREATE_FUNCTION,
 		EDIT_CREATE_FUNCTION,
+		EDIT_TOGGLE_BREAKPOINT,
+		EDIT_FIND_NODE_TYPE,
 		REFRESH_GRAPH,
 		REFRESH_GRAPH,
 	};
 	};
 
 
@@ -123,7 +128,7 @@ class VisualScriptEditor : public ScriptEditorBase {
 
 
 	Label *select_func_text;
 	Label *select_func_text;
 
 
-	bool updating_graph;
+	bool updating_graph = false;
 
 
 	void _show_hint(const String &p_hint);
 	void _show_hint(const String &p_hint);
 	void _hide_timer();
 	void _hide_timer();
@@ -162,7 +167,8 @@ class VisualScriptEditor : public ScriptEditorBase {
 
 
 	static Clipboard *clipboard;
 	static Clipboard *clipboard;
 
 
-	PopupMenu *member_popup;
+	PopupMenu *popup_menu = nullptr;
+	PopupMenu *member_popup = nullptr;
 	MemberType member_type;
 	MemberType member_type;
 	String member_name;
 	String member_name;
 
 
@@ -172,8 +178,7 @@ class VisualScriptEditor : public ScriptEditorBase {
 	Vector2 port_action_pos;
 	Vector2 port_action_pos;
 	int port_action_new_node;
 	int port_action_new_node;
 
 
-	bool saved_pos_dirty;
-	Vector2 saved_position;
+	bool saved_pos_dirty = false;
 
 
 	Vector2 mouse_up_position;
 	Vector2 mouse_up_position;