|
|
@@ -1735,12 +1735,26 @@ VisualShaderNode *VisualShaderEditor::_add_node(int p_idx, int p_op_idx) {
|
|
|
|
|
|
void VisualShaderEditor::_node_dragged(const Vector2 &p_from, const Vector2 &p_to, int p_node) {
|
|
|
VisualShader::Type type = get_current_shader_type();
|
|
|
+ drag_buffer.push_back({ type, p_node, p_from, p_to });
|
|
|
+ if (!drag_dirty) {
|
|
|
+ call_deferred("_nodes_dragged");
|
|
|
+ }
|
|
|
+ drag_dirty = true;
|
|
|
+}
|
|
|
+
|
|
|
+void VisualShaderEditor::_nodes_dragged() {
|
|
|
+ drag_dirty = false;
|
|
|
+
|
|
|
+ undo_redo->create_action(TTR("Node(s) Moved"));
|
|
|
+
|
|
|
+ for (List<DragOp>::Element *E = drag_buffer.front(); E; E = E->next()) {
|
|
|
+ undo_redo->add_do_method(visual_shader.ptr(), "set_node_position", E->get().type, E->get().node, E->get().to);
|
|
|
+ undo_redo->add_undo_method(visual_shader.ptr(), "set_node_position", E->get().type, E->get().node, E->get().from);
|
|
|
+ undo_redo->add_do_method(graph_plugin.ptr(), "set_node_position", E->get().type, E->get().node, E->get().to);
|
|
|
+ undo_redo->add_undo_method(graph_plugin.ptr(), "set_node_position", E->get().type, E->get().node, E->get().from);
|
|
|
+ }
|
|
|
|
|
|
- undo_redo->create_action(TTR("Node Moved"));
|
|
|
- undo_redo->add_do_method(visual_shader.ptr(), "set_node_position", type, p_node, p_to);
|
|
|
- undo_redo->add_undo_method(visual_shader.ptr(), "set_node_position", type, p_node, p_from);
|
|
|
- undo_redo->add_do_method(graph_plugin.ptr(), "set_node_position", type, p_node, p_to);
|
|
|
- undo_redo->add_undo_method(graph_plugin.ptr(), "set_node_position", type, p_node, p_from);
|
|
|
+ drag_buffer.clear();
|
|
|
undo_redo->commit_action();
|
|
|
}
|
|
|
|
|
|
@@ -2650,6 +2664,7 @@ void VisualShaderEditor::_bind_methods() {
|
|
|
ClassDB::bind_method("_clear_buffer", &VisualShaderEditor::_clear_buffer);
|
|
|
ClassDB::bind_method("_update_uniforms", &VisualShaderEditor::_update_uniforms);
|
|
|
ClassDB::bind_method("_set_mode", &VisualShaderEditor::_set_mode);
|
|
|
+ ClassDB::bind_method("_nodes_dragged", &VisualShaderEditor::_nodes_dragged);
|
|
|
|
|
|
ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &VisualShaderEditor::get_drag_data_fw);
|
|
|
ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &VisualShaderEditor::can_drop_data_fw);
|