2017-03-05 15:47:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*************************************************************************/  
						 
					
						
							
								
									
										
										
										
											2017-09-01 21:07:55 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*  visual_script_editor.cpp                                             */  
						 
					
						
							
								
									
										
										
										
											2017-03-05 15:47:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*************************************************************************/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                       This file is part of:                           */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                           GODOT ENGINE                                */  
						 
					
						
							
								
									
										
										
										
											2017-08-27 14:16:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*                      https://godotengine.org                          */  
						 
					
						
							
								
									
										
										
										
											2017-03-05 15:47:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*************************************************************************/  
						 
					
						
							
								
									
										
										
										
											2022-01-13 09:45:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */  
						 
					
						
							
								
									
										
										
										
											2017-03-05 15:47:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*                                                                       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Permission is hereby granted, free of charge, to any person obtaining */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* a copy of this software and associated documentation files (the       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* "Software"), to deal in the Software without restriction, including   */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* without limitation the rights to use, copy, modify, merge, publish,   */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* distribute, sublicense, and/or sell copies of the Software, and to    */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* permit persons to whom the Software is furnished to do so, subject to */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* the following conditions:                                             */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                                                                       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* The above copyright notice and this permission notice shall be        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* included in all copies or substantial portions of the Software.       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                                                                       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*************************************************************************/  
						 
					
						
							
								
									
										
										
										
											2018-01-05 00:50:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  "visual_script_editor.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 15:47:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-09-11 18:13:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/object.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "core/os/input.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "core/os/keyboard.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-11-15 13:57:24 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/script_language.h" 
  
						 
					
						
							
								
									
										
										
										
											2018-09-11 18:13:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/variant.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 14:21:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_node.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "editor/editor_resource_preview.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-12-24 15:17:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_scale.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-04-18 13:58:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/main/viewport.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "visual_script_expression.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "visual_script_flow_control.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "visual_script_func_nodes.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "visual_script_nodes.h" 
  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-15 13:24:02 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								class  VisualScriptEditorSignalEdit  :  public  Object  {  
						 
					
						
							
								
									
										
										
										
											2019-03-19 14:35:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDCLASS ( VisualScriptEditorSignalEdit ,  Object ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									StringName  sig ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								public :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									UndoRedo  * undo_redo ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScript >  script ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								protected :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									static  void  _bind_methods ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ClassDB : : bind_method ( " _sig_changed " ,  & VisualScriptEditorSignalEdit : : _sig_changed ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ADD_SIGNAL ( MethodInfo ( " changed " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									void  _sig_changed ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_change_notify ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										emit_signal ( " changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  _set ( const  StringName  & p_name ,  const  Variant  & p_value )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( sig  = =  StringName ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( p_name  = =  " argument_count " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  new_argc  =  p_value ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											int  argc  =  script - > custom_signal_get_argument_count ( sig ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( argc  = =  new_argc )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-23 22:25:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > create_action ( TTR ( " Change Signal Arguments " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( new_argc  <  argc )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  ( int  i  =  new_argc ;  i  <  argc ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_do_method ( script . ptr ( ) ,  " custom_signal_remove_argument " ,  sig ,  new_argc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_undo_method ( script . ptr ( ) ,  " custom_signal_add_argument " ,  sig ,  script - > custom_signal_get_argument_name ( sig ,  i ) ,  script - > custom_signal_get_argument_type ( sig ,  i ) ,  - 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  if  ( new_argc  >  argc )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( int  i  =  argc ;  i  <  new_argc ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_do_method ( script . ptr ( ) ,  " custom_signal_add_argument " ,  sig ,  Variant : : NIL ,  " arg "  +  itos ( i  +  1 ) ,  - 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_undo_method ( script . ptr ( ) ,  " custom_signal_remove_argument " ,  sig ,  argc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " _sig_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " _sig_changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( String ( p_name ) . begins_with ( " argument/ " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  idx  =  String ( p_name ) . get_slice ( " / " ,  1 ) . to_int ( )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ERR_FAIL_INDEX_V ( idx ,  script - > custom_signal_get_argument_count ( sig ) ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  what  =  String ( p_name ) . get_slice ( " / " ,  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( what  = =  " type " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  old_type  =  script - > custom_signal_get_argument_type ( sig ,  idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  new_type  =  p_value ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-23 22:25:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > create_action ( TTR ( " Change Argument Type " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " custom_signal_set_argument_type " ,  sig ,  idx ,  new_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " custom_signal_set_argument_type " ,  sig ,  idx ,  old_type ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( what  = =  " name " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												String  old_name  =  script - > custom_signal_get_argument_name ( sig ,  idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												String  new_name  =  p_value ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-23 22:25:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > create_action ( TTR ( " Change Argument name " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " custom_signal_set_argument_name " ,  sig ,  idx ,  new_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " custom_signal_set_argument_name " ,  sig ,  idx ,  old_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  _get ( const  StringName  & p_name ,  Variant  & r_ret )  const  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( sig  = =  StringName ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( p_name  = =  " argument_count " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											r_ret  =  script - > custom_signal_get_argument_count ( sig ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( String ( p_name ) . begins_with ( " argument/ " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  idx  =  String ( p_name ) . get_slice ( " / " ,  1 ) . to_int ( )  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ERR_FAIL_INDEX_V ( idx ,  script - > custom_signal_get_argument_count ( sig ) ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  what  =  String ( p_name ) . get_slice ( " / " ,  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( what  = =  " type " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												r_ret  =  script - > custom_signal_get_argument_type ( sig ,  idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( what  = =  " name " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												r_ret  =  script - > custom_signal_get_argument_name ( sig ,  idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									void  _get_property_list ( List < PropertyInfo >  * p_list )  const  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( sig  = =  StringName ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										p_list - > push_back ( PropertyInfo ( Variant : : INT ,  " argument_count " ,  PROPERTY_HINT_RANGE ,  " 0,256 " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										String  argt  =  " Variant " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  1 ;  i  <  Variant : : VARIANT_MAX ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											argt  + =  " , "  +  Variant : : get_type_name ( Variant : : Type ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  script - > custom_signal_get_argument_count ( sig ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_list - > push_back ( PropertyInfo ( Variant : : INT ,  " argument/ "  +  itos ( i  +  1 )  +  " /type " ,  PROPERTY_HINT_ENUM ,  argt ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_list - > push_back ( PropertyInfo ( Variant : : STRING ,  " argument/ "  +  itos ( i  +  1 )  +  " /name " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								public :  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									void  edit ( const  StringName  & p_sig )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sig  =  p_sig ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										_change_notify ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 16:00:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									VisualScriptEditorSignalEdit ( )  {  undo_redo  =  nullptr ;  } 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  VisualScriptEditorVariableEdit  :  public  Object  {  
						 
					
						
							
								
									
										
										
										
											2019-03-19 14:35:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDCLASS ( VisualScriptEditorVariableEdit ,  Object ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									StringName  var ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								public :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									UndoRedo  * undo_redo ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScript >  script ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								protected :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									static  void  _bind_methods ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ClassDB : : bind_method ( " _var_changed " ,  & VisualScriptEditorVariableEdit : : _var_changed ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ClassDB : : bind_method ( " _var_value_changed " ,  & VisualScriptEditorVariableEdit : : _var_value_changed ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ADD_SIGNAL ( MethodInfo ( " changed " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									void  _var_changed ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_change_notify ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										emit_signal ( " changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									void  _var_value_changed ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_change_notify ( " value " ) ;  //so the whole tree is not redrawn, makes editing smoother in general
 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										emit_signal ( " changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  _set ( const  StringName  & p_name ,  const  Variant  & p_value )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( var  = =  StringName ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( String ( p_name )  = =  " value " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-23 22:25:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > create_action ( TTR ( " Set Variable Default Value " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Variant  current  =  script - > get_variable_default_value ( var ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " set_variable_default_value " ,  var ,  p_value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " set_variable_default_value " ,  var ,  current ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " _var_value_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " _var_value_changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Dictionary  d  =  script - > call ( " get_variable_info " ,  var ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( String ( p_name )  = =  " type " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-17 16:07:15 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Dictionary  dc  =  d . duplicate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											dc [ " type " ]  =  p_value ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-23 22:25:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > create_action ( TTR ( " Set Variable Type " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " set_variable_info " ,  var ,  dc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " set_variable_info " ,  var ,  d ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-11 10:29:12 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Setting the default value.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Variant : : Type  type  =  ( Variant : : Type ) ( int ) p_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( type  ! =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant  default_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant : : CallError  ce ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 16:00:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												default_value  =  Variant : : construct ( type ,  nullptr ,  0 ,  ce ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-11 10:29:12 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ce . error  = =  Variant : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_do_method ( script . ptr ( ) ,  " set_variable_default_value " ,  var ,  default_value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_undo_method ( script . ptr ( ) ,  " set_variable_default_value " ,  var ,  dc [ " value " ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " _var_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " _var_changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-13 22:36:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( String ( p_name )  = =  " hint " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Dictionary  dc  =  d . duplicate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dc [ " hint " ]  =  p_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > create_action ( TTR ( " Set Variable Type " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " set_variable_info " ,  var ,  dc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " set_variable_info " ,  var ,  d ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " _var_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " _var_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( String ( p_name )  = =  " hint_string " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-17 16:07:15 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Dictionary  dc  =  d . duplicate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											dc [ " hint_string " ]  =  p_value ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-23 22:25:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > create_action ( TTR ( " Set Variable Type " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " set_variable_info " ,  var ,  dc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " set_variable_info " ,  var ,  d ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " _var_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " _var_changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( String ( p_name )  = =  " export " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											script - > set_variable_export ( var ,  p_value ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-15 17:12:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											EditorNode : : get_singleton ( ) - > get_inspector ( ) - > update_tree ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-30 23:44:14 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  _get ( const  StringName  & p_name ,  Variant  & r_ret )  const  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( var  = =  StringName ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( String ( p_name )  = =  " value " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											r_ret  =  script - > get_variable_default_value ( var ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										PropertyInfo  pinfo  =  script - > get_variable_info ( var ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( String ( p_name )  = =  " type " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											r_ret  =  pinfo . type ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( String ( p_name )  = =  " hint " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											r_ret  =  pinfo . hint ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( String ( p_name )  = =  " hint_string " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											r_ret  =  pinfo . hint_string ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( String ( p_name )  = =  " export " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											r_ret  =  script - > get_variable_export ( var ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-30 23:44:14 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									void  _get_property_list ( List < PropertyInfo >  * p_list )  const  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( var  = =  StringName ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										String  argt  =  " Variant " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  1 ;  i  <  Variant : : VARIANT_MAX ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											argt  + =  " , "  +  Variant : : get_type_name ( Variant : : Type ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										p_list - > push_back ( PropertyInfo ( Variant : : INT ,  " type " ,  PROPERTY_HINT_ENUM ,  argt ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_list - > push_back ( PropertyInfo ( script - > get_variable_info ( var ) . type ,  " value " ,  script - > get_variable_info ( var ) . hint ,  script - > get_variable_info ( var ) . hint_string ,  PROPERTY_USAGE_DEFAULT ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-13 18:13:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Update this when PropertyHint changes
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-13 22:36:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										p_list - > push_back ( PropertyInfo ( Variant : : INT ,  " hint " ,  PROPERTY_HINT_ENUM ,  " None,Range,ExpRange,Enum,ExpEasing,Length,SpriteFrame,KeyAccel,Flags,Layers2dRender,Layers2dPhysics,Layer3dRender,Layer3dPhysics,File,Dir,GlobalFile,GlobalDir,ResourceType,MultilineText,PlaceholderText,ColorNoAlpha,ImageCompressLossy,ImageCompressLossLess,ObjectId,TypeString,NodePathToEditedNode,MethodOfVariantType,MethodOfBaseType,MethodOfInstance,MethodOfScript,PropertyOfVariantType,PropertyOfBaseType,PropertyOfInstance,PropertyOfScript,ObjectTooBig,NodePathValidTypes,SaveFile " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										p_list - > push_back ( PropertyInfo ( Variant : : STRING ,  " hint_string " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_list - > push_back ( PropertyInfo ( Variant : : BOOL ,  " export " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								public :  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									void  edit ( const  StringName  & p_var )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										var  =  p_var ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										_change_notify ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 16:00:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									VisualScriptEditorVariableEdit ( )  {  undo_redo  =  nullptr ;  } 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-10-02 21:31:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  Color  _color_from_type ( Variant : : Type  p_type ,  bool  dark_theme  =  true )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									Color  color ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dark_theme )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-02 21:31:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										switch  ( p_type )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:35:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											case  Variant : : NIL : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.41 ,  0.93 ,  0.74 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : BOOL : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.55 ,  0.65 ,  0.94 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : INT : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.49 ,  0.78 ,  0.94 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : REAL : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.38 ,  0.85 ,  0.96 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : STRING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.42 ,  0.65 ,  0.93 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : VECTOR2 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.74 ,  0.57 ,  0.95 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : RECT2 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.95 ,  0.57 ,  0.65 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : VECTOR3 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.84 ,  0.49 ,  0.93 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : TRANSFORM2D : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.77 ,  0.93 ,  0.41 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : PLANE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.97 ,  0.44 ,  0.44 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : QUAT : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.93 ,  0.41 ,  0.64 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : AABB : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.93 ,  0.47 ,  0.57 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : BASIS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.89 ,  0.93 ,  0.41 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : TRANSFORM : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.96 ,  0.66 ,  0.43 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : COLOR : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.62 ,  1.0 ,  0.44 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : NODE_PATH : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.41 ,  0.58 ,  0.93 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : _RID : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.41 ,  0.93 ,  0.6 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : OBJECT : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.47 ,  0.95 ,  0.91 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : DICTIONARY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.47 ,  0.93 ,  0.69 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.88 ,  0.88 ,  0.88 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : POOL_BYTE_ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.67 ,  0.96 ,  0.78 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : POOL_INT_ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.69 ,  0.86 ,  0.96 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : POOL_REAL_ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.59 ,  0.91 ,  0.97 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : POOL_STRING_ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.62 ,  0.77 ,  0.95 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : POOL_VECTOR2_ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.82 ,  0.7 ,  0.96 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : POOL_VECTOR3_ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.87 ,  0.61 ,  0.95 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : POOL_COLOR_ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.91 ,  1.0 ,  0.59 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-02 21:31:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color . set_hsv ( p_type  /  float ( Variant : : VARIANT_MAX ) ,  0.7 ,  0.7 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-02 21:31:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										switch  ( p_type )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:35:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											case  Variant : : NIL : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.15 ,  0.89 ,  0.63 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : BOOL : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.43 ,  0.56 ,  0.92 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : INT : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.31 ,  0.7 ,  0.91 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : REAL : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.15 ,  0.8 ,  0.94 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : STRING : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.27 ,  0.56 ,  0.91 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : VECTOR2 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.68 ,  0.46 ,  0.93 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : RECT2 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.93 ,  0.46 ,  0.56 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : VECTOR3 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.86 ,  0.42 ,  0.93 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : TRANSFORM2D : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.59 ,  0.81 ,  0.1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : PLANE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.97 ,  0.44 ,  0.44 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : QUAT : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.93 ,  0.41 ,  0.64 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : AABB : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.93 ,  0.47 ,  0.57 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : BASIS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.7 ,  0.73 ,  0.1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : TRANSFORM : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.96 ,  0.56 ,  0.28 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : COLOR : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.24 ,  0.75 ,  0.0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : NODE_PATH : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.41 ,  0.58 ,  0.93 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : _RID : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.17 ,  0.9 ,  0.45 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : OBJECT : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.07 ,  0.84 ,  0.76 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : DICTIONARY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.34 ,  0.91 ,  0.62 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.45 ,  0.45 ,  0.45 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : POOL_BYTE_ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.38 ,  0.92 ,  0.6 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : POOL_INT_ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.38 ,  0.73 ,  0.92 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : POOL_REAL_ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.25 ,  0.83 ,  0.95 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : POOL_STRING_ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.38 ,  0.62 ,  0.92 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : POOL_VECTOR2_ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.62 ,  0.36 ,  0.92 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : POOL_VECTOR3_ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.79 ,  0.35 ,  0.92 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  Variant : : POOL_COLOR_ARRAY : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color  =  Color ( 0.57 ,  0.73 ,  0.0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-02 21:31:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												color . set_hsv ( p_type  /  float ( Variant : : VARIANT_MAX ) ,  0.3 ,  0.3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-02 21:31:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  color ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _update_graph_connections ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									graph - > clear_connections ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < StringName >  funcs ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > get_function_list ( & funcs ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( funcs . size ( )  < =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										updating_graph  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( List < StringName > : : Element  * F  =  funcs . front ( ) ;  F ;  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < VisualScript : : SequenceConnection >  sequence_conns ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > get_sequence_connection_list ( F - > get ( ) ,  & sequence_conns ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( List < VisualScript : : SequenceConnection > : : Element  * E  =  sequence_conns . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											graph - > connect_node ( itos ( E - > get ( ) . from_node ) ,  E - > get ( ) . from_output ,  itos ( E - > get ( ) . to_node ) ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										List < VisualScript : : DataConnection >  data_conns ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > get_data_connection_list ( F - > get ( ) ,  & data_conns ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( List < VisualScript : : DataConnection > : : Element  * E  =  data_conns . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											VisualScript : : DataConnection  dc  =  E - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < VisualScriptNode >  from_node  =  script - > get_node ( F - > get ( ) ,  E - > get ( ) . from_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < VisualScriptNode >  to_node  =  script - > get_node ( F - > get ( ) ,  E - > get ( ) . to_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( to_node - > has_input_sequence_port ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												dc . to_port + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dc . from_port  + =  from_node - > get_output_sequence_port_count ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											graph - > connect_node ( itos ( E - > get ( ) . from_node ) ,  dc . from_port ,  itos ( E - > get ( ) . to_node ) ,  dc . to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _update_graph ( int  p_only_id )  {  
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( updating_graph )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_graph  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									//byebye all nodes
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_only_id  > =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  ( graph - > has_node ( itos ( p_only_id ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Node  * gid  =  graph - > get_node ( itos ( p_only_id ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( gid )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												memdelete ( gid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  graph - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( Object : : cast_to < GraphNode > ( graph - > get_child ( i ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												memdelete ( graph - > get_child ( i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												i - - ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < StringName >  funcs ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > get_function_list ( & funcs ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( funcs . size ( )  < =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										graph - > hide ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										select_func_text - > show ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										updating_graph  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									graph - > show ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									select_func_text - > hide ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < Texture >  type_icons [ Variant : : VARIANT_MAX ]  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-17 12:07:35 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Control : : get_icon ( " Variant " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-17 14:04:59 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Control : : get_icon ( " bool " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " int " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " float " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-17 12:07:35 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Control : : get_icon ( " String " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Vector2 " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Rect2 " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Vector3 " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Transform2D " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Plane " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Quat " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-17 14:04:59 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Control : : get_icon ( " AABB " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-17 12:07:35 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Control : : get_icon ( " Basis " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Transform " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Color " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " NodePath " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " RID " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Control : : get_icon ( " MiniObject " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-17 12:07:35 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Control : : get_icon ( " Dictionary " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Array " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " PoolByteArray " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " PoolIntArray " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " PoolRealArray " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " PoolStringArray " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " PoolVector2Array " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " PoolVector3Array " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " PoolColorArray " ,  " EditorIcons " ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < Texture >  seq_port  =  Control : : get_icon ( " VisualShaderPort " ,  " EditorIcons " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( List < StringName > : : Element  * F  =  funcs . front ( ) ;  F ;  F  =  F - > next ( ) )  {  // loop through all the functions
 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										List < int >  ids ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > get_node_list ( F - > get ( ) ,  & ids ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										StringName  editor_icons  =  " EditorIcons " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( List < int > : : Element  * E  =  ids . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( p_only_id  > =  0  & &  p_only_id  ! =  E - > get ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < VisualScriptNode >  node  =  script - > get_node ( F - > get ( ) ,  E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Vector2  pos  =  script - > get_node_position ( F - > get ( ) ,  E - > get ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											GraphNode  * gnode  =  memnew ( GraphNode ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											gnode - > set_title ( node - > get_caption ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											gnode - > set_offset ( pos  *  EDSCALE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( error_line  = =  E - > get ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gnode - > set_overlay ( GraphNode : : OVERLAY_POSITION ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  if  ( node - > is_breakpoint ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gnode - > set_overlay ( GraphNode : : OVERLAY_BREAKPOINT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											gnode - > set_meta ( " __vnode " ,  node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											gnode - > set_name ( itos ( E - > get ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											gnode - > connect ( " dragged " ,  this ,  " _node_moved " ,  varray ( E - > get ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											gnode - > connect ( " close_request " ,  this ,  " _remove_node " ,  varray ( E - > get ( ) ) ,  CONNECT_DEFERRED ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( E - > get ( )  ! =  script - > get_function_node_id ( F - > get ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												//function can't be erased
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gnode - > set_show_close_button ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-06 20:34:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											bool  has_gnode_text  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < VisualScriptLists >  nd_list  =  node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bool  is_vslist  =  nd_list . is_valid ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( is_vslist )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												HBoxContainer  * hbnc  =  memnew ( HBoxContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( nd_list - > is_input_port_editable ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													has_gnode_text  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Button  * btn  =  memnew ( Button ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-21 14:57:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													btn - > set_text ( TTR ( " Add Input Port " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													hbnc - > add_child ( btn ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 21:03:09 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													btn - > connect ( " pressed " ,  this ,  " _add_input_port " ,  varray ( E - > get ( ) ) ,  CONNECT_DEFERRED ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( nd_list - > is_output_port_editable ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( nd_list - > is_input_port_editable ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														hbnc - > add_spacer ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													has_gnode_text  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Button  * btn  =  memnew ( Button ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-21 14:57:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													btn - > set_text ( TTR ( " Add Output Port " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													hbnc - > add_child ( btn ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 21:03:09 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													btn - > connect ( " pressed " ,  this ,  " _add_output_port " ,  varray ( E - > get ( ) ) ,  CONNECT_DEFERRED ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gnode - > add_child ( hbnc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  if  ( Object : : cast_to < VisualScriptExpression > ( node . ptr ( ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-04-30 01:28:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												has_gnode_text  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												LineEdit  * line_edit  =  memnew ( LineEdit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												line_edit - > set_text ( node - > get_text ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												line_edit - > set_expand_to_text_length ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												line_edit - > add_font_override ( " font " ,  get_font ( " source " ,  " EditorFonts " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gnode - > add_child ( line_edit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												line_edit - > connect ( " text_changed " ,  this ,  " _expression_text_changed " ,  varray ( E - > get ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												String  text  =  node - > get_text ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! text . empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													has_gnode_text  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Label  * label  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													label - > set_text ( text ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													gnode - > add_child ( label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2018-04-30 01:28:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( Object : : cast_to < VisualScriptComment > ( node . ptr ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < VisualScriptComment >  vsc  =  node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gnode - > set_comment ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gnode - > set_resizable ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gnode - > set_custom_minimum_size ( vsc - > get_size ( )  *  EDSCALE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gnode - > connect ( " resize_request " ,  this ,  " _comment_node_resized " ,  varray ( E - > get ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-14 00:45:00 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( node_styles . has ( node - > get_category ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < StyleBoxFlat >  sbf  =  node_styles [ node - > get_category ( ) ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( gnode - > is_comment ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													sbf  =  EditorNode : : get_singleton ( ) - > get_theme_base ( ) - > get_theme ( ) - > get_stylebox ( " comment " ,  " GraphNode " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Color  c  =  sbf - > get_border_color ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												c . a  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( EditorSettings : : get_singleton ( ) - > get ( " interface/theme/use_graph_node_headers " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Color  mono_color  =  ( ( c . r  +  c . g  +  c . b )  /  3 )  <  0.7  ?  Color ( 1.0 ,  1.0 ,  1.0 )  :  Color ( 0.0 ,  0.0 ,  0.0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													mono_color . a  =  0.85 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													c  =  mono_color ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gnode - > add_color_override ( " title_color " ,  c ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												c . a  =  0.7 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gnode - > add_color_override ( " close_color " ,  c ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gnode - > add_color_override ( " resizer_color " ,  c ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gnode - > add_style_override ( " frame " ,  sbf ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-04-30 01:28:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											const  Color  mono_color  =  get_color ( " mono_color " ,  " Editor " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-01 20:04:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  slot_idx  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											bool  single_seq_output  =  node - > get_output_sequence_port_count ( )  = =  1  & &  node - > get_output_sequence_port_text ( 0 )  = =  String ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ( node - > has_input_sequence_port ( )  | |  single_seq_output )  | |  has_gnode_text )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// IF has_gnode_text is true BUT we have no sequence ports to draw (in here),
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// we still draw the disabled default ones to shift up the slots by one,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// so the slots DON'T start with the content text.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-01 20:04:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// IF has_gnode_text is false, but we DO want to draw default sequence ports,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// we draw a dummy text to take up the position of the sequence nodes, so all the other ports are still aligned correctly.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! has_gnode_text )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Label  * dummy  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													dummy - > set_text ( "   " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													gnode - > add_child ( dummy ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-01 20:04:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												gnode - > set_slot ( 0 ,  node - > has_input_sequence_port ( ) ,  TYPE_SEQUENCE ,  mono_color ,  single_seq_output ,  TYPE_SEQUENCE ,  mono_color ,  seq_port ,  seq_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												slot_idx + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  mixed_seq_ports  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! single_seq_output )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( node - > has_mixed_input_and_sequence_ports ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													mixed_seq_ports  =  node - > get_output_sequence_port_count ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													for  ( int  i  =  0 ;  i  <  node - > get_output_sequence_port_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Label  * text2  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														text2 - > set_text ( node - > get_output_sequence_port_text ( i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														text2 - > set_align ( Label : : ALIGN_RIGHT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														gnode - > add_child ( text2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														gnode - > set_slot ( slot_idx ,  false ,  0 ,  Color ( ) ,  true ,  TYPE_SEQUENCE ,  mono_color ,  seq_port ,  seq_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														slot_idx + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( int  i  =  0 ;  i  <  MAX ( node - > get_output_value_port_count ( ) ,  MAX ( mixed_seq_ports ,  node - > get_input_value_port_count ( ) ) ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  left_ok  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant : : Type  left_type  =  Variant : : NIL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												String  left_name ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( i  <  node - > get_input_value_port_count ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													PropertyInfo  pi  =  node - > get_input_value_port_info ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													left_ok  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													left_type  =  pi . type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													left_name  =  pi . name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												bool  right_ok  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant : : Type  right_type  =  Variant : : NIL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												String  right_name ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( i  > =  mixed_seq_ports  & &  i  <  node - > get_output_value_port_count ( )  +  mixed_seq_ports )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													PropertyInfo  pi  =  node - > get_output_value_port_info ( i  -  mixed_seq_ports ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													right_ok  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													right_type  =  pi . type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													right_name  =  pi . name ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												VBoxContainer  * vbc  =  memnew ( VBoxContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												HBoxContainer  * hbc  =  memnew ( HBoxContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												HBoxContainer  * hbc2  =  memnew ( HBoxContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vbc - > add_child ( hbc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vbc - > add_child ( hbc2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( left_ok )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Ref < Texture >  t ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( left_type  > =  0  & &  left_type  <  Variant : : VARIANT_MAX )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														t  =  type_icons [ left_type ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( t . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														TextureRect  * tf  =  memnew ( TextureRect ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														tf - > set_texture ( t ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														tf - > set_stretch_mode ( TextureRect : : STRETCH_KEEP_CENTERED ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														hbc - > add_child ( tf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( is_vslist )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( nd_list - > is_input_port_name_editable ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															LineEdit  * name_box  =  memnew ( LineEdit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															hbc - > add_child ( name_box ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															name_box - > set_custom_minimum_size ( Size2 ( 60  *  EDSCALE ,  0 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															name_box - > set_text ( left_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															name_box - > set_expand_to_text_length ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															name_box - > connect ( " resized " ,  this ,  " _update_node_size " ,  varray ( E - > get ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															name_box - > connect ( " focus_exited " ,  this ,  " _port_name_focus_out " ,  varray ( name_box ,  E - > get ( ) ,  i ,  true ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															hbc - > add_child ( memnew ( Label ( left_name ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if  ( nd_list - > is_input_port_type_editable ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															OptionButton  * opbtn  =  memnew ( OptionButton ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															for  ( int  j  =  Variant : : NIL ;  j  <  Variant : : VARIANT_MAX ;  j + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																opbtn - > add_item ( Variant : : get_type_name ( Variant : : Type ( j ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															opbtn - > select ( left_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															opbtn - > set_custom_minimum_size ( Size2 ( 100  *  EDSCALE ,  0 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															hbc - > add_child ( opbtn ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															opbtn - > connect ( " item_selected " ,  this ,  " _change_port_type " ,  varray ( E - > get ( ) ,  i ,  true ) ,  CONNECT_DEFERRED ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Button  * rmbtn  =  memnew ( Button ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														rmbtn - > set_icon ( EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_icon ( " Remove " ,  " EditorIcons " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														hbc - > add_child ( rmbtn ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														rmbtn - > connect ( " pressed " ,  this ,  " _remove_input_port " ,  varray ( E - > get ( ) ,  i ) ,  CONNECT_DEFERRED ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														hbc - > add_child ( memnew ( Label ( left_name ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( left_type  ! =  Variant : : NIL  & &  ! script - > is_input_value_port_connected ( F - > get ( ) ,  E - > get ( ) ,  i ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														PropertyInfo  pi  =  node - > get_input_value_port_info ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Button  * button  =  memnew ( Button ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Variant  value  =  node - > get_default_input_value ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( value . get_type ( )  ! =  left_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															//different type? for now convert
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															//not the same, reconvert
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Variant : : CallError  ce ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															const  Variant  * existingp  =  & value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															value  =  Variant : : construct ( left_type ,  & existingp ,  1 ,  ce ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if  ( left_type  = =  Variant : : COLOR )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															button - > set_custom_minimum_size ( Size2 ( 30 ,  0 )  *  EDSCALE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															button - > connect ( " draw " ,  this ,  " _draw_color_over_button " ,  varray ( button ,  value ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														}  else  if  ( left_type  = =  Variant : : OBJECT  & &  Ref < Resource > ( value ) . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Ref < Resource >  res  =  value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Array  arr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															arr . push_back ( button - > get_instance_id ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															arr . push_back ( String ( value ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															EditorResourcePreview : : get_singleton ( ) - > queue_edited_resource_preview ( res ,  this ,  " _button_resource_previewed " ,  arr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														}  else  if  ( pi . type  = =  Variant : : INT  & &  pi . hint  = =  PROPERTY_HINT_ENUM )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															button - > set_text ( pi . hint_string . get_slice ( " , " ,  value ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															button - > set_text ( value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														button - > connect ( " pressed " ,  this ,  " _default_value_edited " ,  varray ( button ,  E - > get ( ) ,  i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														hbc2 - > add_child ( button ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Control  * c  =  memnew ( Control ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													c - > set_custom_minimum_size ( Size2 ( 10 ,  0 )  *  EDSCALE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													hbc - > add_child ( c ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												hbc - > add_spacer ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												hbc2 - > add_spacer ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( i  <  mixed_seq_ports )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Label  * text2  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													text2 - > set_text ( node - > get_output_sequence_port_text ( i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													text2 - > set_align ( Label : : ALIGN_RIGHT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													hbc - > add_child ( text2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-01 20:04:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( right_ok )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( is_vslist )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Button  * rmbtn  =  memnew ( Button ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														rmbtn - > set_icon ( EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_icon ( " Remove " ,  " EditorIcons " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														hbc - > add_child ( rmbtn ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														rmbtn - > connect ( " pressed " ,  this ,  " _remove_output_port " ,  varray ( E - > get ( ) ,  i ) ,  CONNECT_DEFERRED ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( nd_list - > is_output_port_type_editable ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															OptionButton  * opbtn  =  memnew ( OptionButton ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															for  ( int  j  =  Variant : : NIL ;  j  <  Variant : : VARIANT_MAX ;  j + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																opbtn - > add_item ( Variant : : get_type_name ( Variant : : Type ( j ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															opbtn - > select ( right_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															opbtn - > set_custom_minimum_size ( Size2 ( 100  *  EDSCALE ,  0 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															hbc - > add_child ( opbtn ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															opbtn - > connect ( " item_selected " ,  this ,  " _change_port_type " ,  varray ( E - > get ( ) ,  i ,  false ) ,  CONNECT_DEFERRED ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if  ( nd_list - > is_output_port_name_editable ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															LineEdit  * name_box  =  memnew ( LineEdit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															hbc - > add_child ( name_box ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															name_box - > set_custom_minimum_size ( Size2 ( 60  *  EDSCALE ,  0 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															name_box - > set_text ( right_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															name_box - > set_expand_to_text_length ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															name_box - > connect ( " resized " ,  this ,  " _update_node_size " ,  varray ( E - > get ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															name_box - > connect ( " focus_exited " ,  this ,  " _port_name_focus_out " ,  varray ( name_box ,  E - > get ( ) ,  i ,  false ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															hbc - > add_child ( memnew ( Label ( right_name ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														hbc - > add_child ( memnew ( Label ( right_name ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Ref < Texture >  t ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( right_type  > =  0  & &  right_type  <  Variant : : VARIANT_MAX )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														t  =  type_icons [ right_type ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( t . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														TextureRect  * tf  =  memnew ( TextureRect ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														tf - > set_texture ( t ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														tf - > set_stretch_mode ( TextureRect : : STRETCH_KEEP_CENTERED ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														hbc - > add_child ( tf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gnode - > add_child ( vbc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  dark_theme  =  get_constant ( " dark_theme " ,  " Editor " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( i  <  mixed_seq_ports )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													gnode - > set_slot ( slot_idx ,  left_ok ,  left_type ,  _color_from_type ( left_type ,  dark_theme ) ,  true ,  TYPE_SEQUENCE ,  mono_color ,  Ref < Texture > ( ) ,  seq_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													gnode - > set_slot ( slot_idx ,  left_ok ,  left_type ,  _color_from_type ( left_type ,  dark_theme ) ,  right_ok ,  right_type ,  _color_from_type ( right_type ,  dark_theme ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												slot_idx + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											graph - > add_child ( gnode ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( gnode - > is_comment ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												graph - > move_child ( gnode ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-01 20:04:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_graph_connections ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-25 18:17:21 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									float  graph_minimap_opacity  =  EditorSettings : : get_singleton ( ) - > get ( " editors/visual_editors/minimap_opacity " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									graph - > set_minimap_opacity ( graph_minimap_opacity ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// use default_func instead of default_func for now I think that should be good stop gap solution to ensure not breaking anything
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									graph - > call_deferred ( " set_scroll_ofs " ,  script - > get_function_scroll ( default_func )  *  EDSCALE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									updating_graph  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _change_port_type ( int  p_select ,  int  p_id ,  int  p_port ,  bool  is_input )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( p_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptLists >  vsn  =  script - > get_node ( func ,  p_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! vsn . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-31 22:19:47 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Change Port Type " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( is_input )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( vsn . ptr ( ) ,  " set_input_data_port_type " ,  p_port ,  Variant : : Type ( p_select ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( vsn . ptr ( ) ,  " set_input_data_port_type " ,  p_port ,  vsn - > get_input_value_port_info ( p_port ) . type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( vsn . ptr ( ) ,  " set_output_data_port_type " ,  p_port ,  Variant : : Type ( p_select ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( vsn . ptr ( ) ,  " set_output_data_port_type " ,  p_port ,  vsn - > get_output_value_port_info ( p_port ) . type ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _update_node_size ( int  p_id )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Node  * node  =  graph - > get_node ( itos ( p_id ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( Object : : cast_to < Control > ( node ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Object : : cast_to < Control > ( node ) - > set_size ( Vector2 ( 1 ,  1 ) ) ;  //shrink if text is smaller
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _port_name_focus_out ( const  Node  * p_name_box ,  int  p_id ,  int  p_port ,  bool  is_input )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( p_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptLists >  vsn  =  script - > get_node ( func ,  p_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! vsn . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  text ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( Object : : cast_to < LineEdit > ( p_name_box ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										text  =  Object : : cast_to < LineEdit > ( p_name_box ) - > get_text ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-31 22:19:47 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Change Port Name " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( is_input )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( vsn . ptr ( ) ,  " set_input_data_port_name " ,  p_port ,  text ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( vsn . ptr ( ) ,  " set_input_data_port_name " ,  p_port ,  vsn - > get_input_value_port_info ( p_port ) . name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( vsn . ptr ( ) ,  " set_output_data_port_name " ,  p_port ,  text ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( vsn . ptr ( ) ,  " set_output_data_port_name " ,  p_port ,  vsn - > get_output_value_port_info ( p_port ) . name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _update_members ( )  {  
						 
					
						
							
								
									
										
										
										
											2018-11-05 13:15:42 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND ( ! script . is_valid ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_members  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									members - > clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									TreeItem  * root  =  members - > create_item ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									TreeItem  * functions  =  members - > create_item ( root ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									functions - > set_selectable ( 0 ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									functions - > set_text ( 0 ,  TTR ( " Functions: " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-31 20:09:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									functions - > add_button ( 0 ,  Control : : get_icon ( " Override " ,  " EditorIcons " ) ,  1 ,  false ,  TTR ( " Override an existing built-in function. " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									functions - > add_button ( 0 ,  Control : : get_icon ( " Add " ,  " EditorIcons " ) ,  0 ,  false ,  TTR ( " Create a new function. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-02 18:33:42 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									functions - > set_custom_color ( 0 ,  Control : : get_color ( " mono_color " ,  " Editor " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < StringName >  func_names ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > get_function_list ( & func_names ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( List < StringName > : : Element  * E  =  func_names . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( E - > get ( )  = =  default_func )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										TreeItem  * ti  =  members - > create_item ( functions ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ti - > set_text ( 0 ,  E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ti - > set_selectable ( 0 ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ti - > set_metadata ( 0 ,  E - > get ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ti - > add_button ( 0 ,  Control : : get_icon ( " Edit " ,  " EditorIcons " ) ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( selected  = =  E - > get ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											ti - > select ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									TreeItem  * variables  =  members - > create_item ( root ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									variables - > set_selectable ( 0 ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									variables - > set_text ( 0 ,  TTR ( " Variables: " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-31 20:09:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									variables - > add_button ( 0 ,  Control : : get_icon ( " Add " ,  " EditorIcons " ) ,  - 1 ,  false ,  TTR ( " Create a new variable. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-02 18:33:42 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									variables - > set_custom_color ( 0 ,  Control : : get_color ( " mono_color " ,  " Editor " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < Texture >  type_icons [ Variant : : VARIANT_MAX ]  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-17 12:07:35 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Control : : get_icon ( " Variant " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-17 14:04:59 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Control : : get_icon ( " bool " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " int " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " float " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-17 12:07:35 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Control : : get_icon ( " String " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Vector2 " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Rect2 " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Vector3 " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Transform2D " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Plane " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Quat " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-17 14:04:59 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Control : : get_icon ( " AABB " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-17 12:07:35 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Control : : get_icon ( " Basis " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Transform " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Color " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " NodePath " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " RID " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Control : : get_icon ( " MiniObject " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-17 12:07:35 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Control : : get_icon ( " Dictionary " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " Array " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " PoolByteArray " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " PoolIntArray " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " PoolRealArray " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " PoolStringArray " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " PoolVector2Array " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " PoolVector3Array " ,  " EditorIcons " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Control : : get_icon ( " PoolColorArray " ,  " EditorIcons " ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-30 23:44:14 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < StringName >  var_names ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > get_variable_list ( & var_names ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( List < StringName > : : Element  * E  =  var_names . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 07:26:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										TreeItem  * ti  =  members - > create_item ( variables ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-30 23:44:14 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ti - > set_text ( 0 ,  E - > get ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-07 15:34:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ti - > set_suffix ( 0 ,  " =  "  +  _sanitized_variant_text ( E - > get ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ti - > set_icon ( 0 ,  type_icons [ script - > get_variable_info ( E - > get ( ) ) . type ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ti - > set_selectable ( 0 ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ti - > set_editable ( 0 ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ti - > set_metadata ( 0 ,  E - > get ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( selected  = =  E - > get ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											ti - > select ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									TreeItem  * _signals  =  members - > create_item ( root ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_signals - > set_selectable ( 0 ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_signals - > set_text ( 0 ,  TTR ( " Signals: " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-31 20:09:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_signals - > add_button ( 0 ,  Control : : get_icon ( " Add " ,  " EditorIcons " ) ,  - 1 ,  false ,  TTR ( " Create a new signal. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-02 18:33:42 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_signals - > set_custom_color ( 0 ,  Control : : get_color ( " mono_color " ,  " Editor " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < StringName >  signal_names ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > get_custom_signal_list ( & signal_names ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( List < StringName > : : Element  * E  =  signal_names . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 07:26:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										TreeItem  * ti  =  members - > create_item ( _signals ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ti - > set_text ( 0 ,  E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ti - > set_selectable ( 0 ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ti - > set_editable ( 0 ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ti - > set_metadata ( 0 ,  E - > get ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( selected  = =  E - > get ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											ti - > select ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  base_type  =  script - > get_instance_base_type ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  icon_type  =  base_type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! Control : : has_icon ( base_type ,  " EditorIcons " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										icon_type  =  " Object " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									base_type_select - > set_text ( base_type ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									base_type_select - > set_icon ( Control : : get_icon ( icon_type ,  " EditorIcons " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_members  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-09-07 15:34:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								String  VisualScriptEditor : : _sanitized_variant_text ( const  StringName  & property_name )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Variant  var  =  script - > get_variable_default_value ( property_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( script - > get_variable_info ( property_name ) . type  ! =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Variant : : CallError  ce ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  Variant  * converted  =  & var ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										var  =  Variant : : construct ( script - > get_variable_info ( property_name ) . type ,  & converted ,  1 ,  ce ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  String ( var ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _member_selected ( )  {  
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( updating_members )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									TreeItem  * ti  =  members - > get_selected ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( ! ti ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									selected  =  ti - > get_metadata ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ti - > get_parent ( )  = =  members - > get_root ( ) - > get_children ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef OSX_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bool  held_ctrl  =  Input : : get_singleton ( ) - > is_key_pressed ( KEY_META ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bool  held_ctrl  =  Input : : get_singleton ( ) - > is_key_pressed ( KEY_CONTROL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( held_ctrl )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ERR_FAIL_COND ( ! script - > has_function ( selected ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_center_on_node ( selected ,  script - > get_function_node_id ( selected ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _member_edited ( )  {  
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( updating_members )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									TreeItem  * ti  =  members - > get_edited ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( ! ti ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  name  =  ti - > get_metadata ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  new_name  =  ti - > get_text ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( name  = =  new_name )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! new_name . is_valid_identifier ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorNode : : get_singleton ( ) - > show_warning ( TTR ( " Name is not a valid identifier: " )  +  "   "  +  new_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										updating_members  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ti - > set_text ( 0 ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										updating_members  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( script - > has_function ( new_name )  | |  script - > has_variable ( new_name )  | |  script - > has_custom_signal ( new_name ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorNode : : get_singleton ( ) - > show_warning ( TTR ( " Name already in use by another func/var/signal: " )  +  "   "  +  new_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										updating_members  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ti - > set_text ( 0 ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										updating_members  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									TreeItem  * root  =  members - > get_root ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ti - > get_parent ( )  = =  root - > get_children ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										selected  =  new_name ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-08 11:32:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  node_id  =  script - > get_function_node_id ( name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < VisualScriptFunction >  func ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( script - > has_node ( name ,  node_id ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											func  =  script - > get_node ( name ,  node_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										undo_redo - > create_action ( TTR ( " Rename Function " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " rename_function " ,  name ,  new_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " rename_function " ,  new_name ,  name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-08 11:32:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( func . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( func . ptr ( ) ,  " set_name " ,  new_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( func . ptr ( ) ,  " set_name " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// also fix all function calls
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < StringName >  flst ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > get_function_list ( & flst ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( List < StringName > : : Element  * E  =  flst . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											List < int >  lst ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											script - > get_node_list ( E - > get ( ) ,  & lst ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( List < int > : : Element  * F  =  lst . front ( ) ;  F ;  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < VisualScriptFunctionCall >  fncall  =  script - > get_node ( E - > get ( ) ,  F - > get ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! fncall . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( fncall - > get_function ( )  = =  name )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_do_method ( fncall . ptr ( ) ,  " set_function " ,  new_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_undo_method ( fncall . ptr ( ) ,  " set_function " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-08 11:32:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-29 06:00:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ;  //or crash because it will become invalid
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ti - > get_parent ( )  = =  root - > get_children ( ) - > get_next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										selected  =  new_name ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										undo_redo - > create_action ( TTR ( " Rename Variable " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " rename_variable " ,  name ,  new_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " rename_variable " ,  new_name ,  name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-11 17:37:58 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// also fix all variable setter & getter calls
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < StringName >  vlst ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > get_variable_list ( & vlst ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( List < StringName > : : Element  * E  =  vlst . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											List < int >  lst ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											script - > get_node_list ( E - > get ( ) ,  & lst ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( List < int > : : Element  * F  =  lst . front ( ) ;  F ;  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < VisualScriptVariableGet >  vget  =  script - > get_node ( E - > get ( ) ,  F - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( vget . is_valid ( )  & &  vget - > get_variable ( )  = =  name )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_do_method ( vget . ptr ( ) ,  " set_variable " ,  new_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_undo_method ( vget . ptr ( ) ,  " set_variable " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < VisualScriptVariableSet >  vset  =  script - > get_node ( E - > get ( ) ,  F - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( vset . is_valid ( )  & &  vset - > get_variable ( )  = =  name )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_do_method ( vset . ptr ( ) ,  " set_variable " ,  new_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_undo_method ( vset . ptr ( ) ,  " set_variable " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-11 17:37:58 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-29 06:00:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ;  //or crash because it will become invalid
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ti - > get_parent ( )  = =  root - > get_children ( ) - > get_next ( ) - > get_next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										selected  =  new_name ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										undo_redo - > create_action ( TTR ( " Rename Signal " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " rename_custom_signal " ,  name ,  new_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " rename_custom_signal " ,  new_name ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-29 06:00:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ;  //or crash because it will become invalid
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _create_function_dialog ( )  {  
						 
					
						
							
								
									
										
										
										
											2019-09-27 19:59:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									function_create_dialog - > popup_centered ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									func_name_box - > set_text ( " " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_name_box - > grab_focus ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  func_input_vbox - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * nd  =  func_input_vbox - > get_child ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										nd - > queue_delete ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _create_function ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  name  =  _validate_name ( ( func_name_box - > get_text ( )  = =  " " )  ?  " new_func "  :  func_name_box - > get_text ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									selected  =  name ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Vector2  pos  =  _get_available_pos ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptFunction >  func_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_node . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_node - > set_name ( name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  func_input_vbox - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										OptionButton  * opbtn  =  Object : : cast_to < OptionButton > ( func_input_vbox - > get_child ( i ) - > get_child ( 3 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										LineEdit  * lne  =  Object : : cast_to < LineEdit > ( func_input_vbox - > get_child ( i ) - > get_child ( 1 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! opbtn  | |  ! lne )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Variant : : Type  arg_type  =  Variant : : Type ( opbtn - > get_selected ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										String  arg_name  =  lne - > get_text ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										func_node - > add_argument ( arg_type ,  arg_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Add Function " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( script . ptr ( ) ,  " add_function " ,  name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  name ,  script - > get_available_id ( ) ,  func_node ,  pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_function " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_graph ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _add_node_dialog ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_generic_search ( script - > get_instance_base_type ( ) ,  graph - > get_global_position ( )  +  Vector2 ( 55 ,  80 ) ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _add_func_input ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HBoxContainer  * hbox  =  memnew ( HBoxContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									hbox - > set_h_size_flags ( SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Label  * name_label  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									name_label - > set_text ( TTR ( " Name: " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									hbox - > add_child ( name_label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									LineEdit  * name_box  =  memnew ( LineEdit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									name_box - > set_h_size_flags ( SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									name_box - > set_text ( " input " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									name_box - > connect ( " focus_entered " ,  this ,  " _deselect_input_names " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									hbox - > add_child ( name_box ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Label  * type_label  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									type_label - > set_text ( TTR ( " Type: " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									hbox - > add_child ( type_label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									OptionButton  * type_box  =  memnew ( OptionButton ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									type_box - > set_custom_minimum_size ( Size2 ( 120  *  EDSCALE ,  0 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  Variant : : NIL ;  i  <  Variant : : VARIANT_MAX ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										type_box - > add_item ( Variant : : get_type_name ( Variant : : Type ( i ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									type_box - > select ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									hbox - > add_child ( type_box ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Button  * delete_button  =  memnew ( Button ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									delete_button - > set_icon ( EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_icon ( " Remove " ,  " EditorIcons " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									delete_button - > set_tooltip ( vformat ( TTR ( " Delete input port " ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									hbox - > add_child ( delete_button ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  func_input_vbox - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										LineEdit  * line_edit  =  ( LineEdit  * ) func_input_vbox - > get_child ( i ) - > get_child ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										line_edit - > deselect ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_input_vbox - > add_child ( hbox ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									hbox - > set_meta ( " id " ,  hbox - > get_position_in_parent ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									delete_button - > connect ( " pressed " ,  this ,  " _remove_func_input " ,  varray ( hbox ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									name_box - > select_all ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									name_box - > grab_focus ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _remove_func_input ( Node  * p_node )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_input_vbox - > remove_child ( p_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p_node - > queue_delete ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _deselect_input_names ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  cn  =  func_input_vbox - > get_child_count ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  cn ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										LineEdit  * lne  =  Object : : cast_to < LineEdit > ( func_input_vbox - > get_child ( i ) - > get_child ( 1 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( lne )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											lne - > deselect ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _member_button ( Object  * p_item ,  int  p_column ,  int  p_button )  {  
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									TreeItem  * ti  =  Object : : cast_to < TreeItem > ( p_item ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									TreeItem  * root  =  members - > get_root ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ti - > get_parent ( )  = =  root )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										//main buttons
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ti  = =  root - > get_children ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											//add function, this one uses menu
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( p_button  = =  1 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-12 07:58:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												new_virtual_method_select - > select_method_from_base_type ( script - > get_instance_base_type ( ) ,  String ( ) ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  if  ( p_button  = =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												String  name  =  _validate_name ( " new_function " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												selected  =  name ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Vector2  pos  =  _get_available_pos ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < VisualScriptFunction >  func_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												func_node . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												func_node - > set_name ( name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > create_action ( TTR ( " Add Function " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " add_function " ,  name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  name ,  script - > get_available_id ( ) ,  func_node ,  pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_function " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-29 06:00:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_update_graph ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ;  //or crash because it will become invalid
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ti  = =  root - > get_children ( ) - > get_next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											//add variable
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  name  =  _validate_name ( " new_variable " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											selected  =  name ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > create_action ( TTR ( " Add Variable " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " add_variable " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_variable " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-29 06:00:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ;  //or crash because it will become invalid
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ti  = =  root - > get_children ( ) - > get_next ( ) - > get_next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											//add variable
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  name  =  _validate_name ( " new_signal " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											selected  =  name ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > create_action ( TTR ( " Add Signal " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " add_custom_signal " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_custom_signal " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-29 06:00:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ;  //or crash because it will become invalid
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( ti - > get_parent ( )  = =  root - > get_children ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-28 02:16:11 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										selected  =  ti - > get_text ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										function_name_edit - > set_position ( Input : : get_singleton ( ) - > get_mouse_position ( )  -  Vector2 ( 60 ,  - 10 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										function_name_edit - > popup ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-29 17:25:09 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										function_name_box - > set_text ( selected ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										function_name_box - > select_all ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _add_input_port ( int  p_id )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( p_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptLists >  vsn  =  script - > get_node ( func ,  p_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! vsn . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-06 20:34:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-06 20:34:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_graph  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-06 20:34:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Add Input Port " ) ,  UndoRedo : : MERGE_ENDS ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( vsn . ptr ( ) ,  " add_input_data_port " ,  Variant : : NIL ,  " arg " ,  - 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ,  p_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( vsn . ptr ( ) ,  " remove_input_data_port " ,  vsn - > get_input_value_port_count ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ,  p_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									updating_graph  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-09-06 20:34:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-09-06 20:34:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _add_output_port ( int  p_id )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( p_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptLists >  vsn  =  script - > get_node ( func ,  p_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! vsn . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									updating_graph  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Add Output Port " ) ,  UndoRedo : : MERGE_ENDS ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( vsn . ptr ( ) ,  " add_output_data_port " ,  Variant : : NIL ,  " arg " ,  - 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ,  p_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( vsn . ptr ( ) ,  " remove_output_data_port " ,  vsn - > get_output_value_port_count ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ,  p_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-06 20:34:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_graph  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-06 20:34:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _remove_input_port ( int  p_id ,  int  p_port )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( p_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < VisualScriptLists >  vsn  =  script - > get_node ( func ,  p_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! vsn . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-30 19:10:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-30 19:10:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_graph  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Remove Input Port " ) ,  UndoRedo : : MERGE_ENDS ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  conn_from  =  - 1 ,  conn_port  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > get_input_value_port_connection_source ( func ,  p_id ,  p_port ,  & conn_from ,  & conn_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( conn_from  ! =  - 1 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " data_disconnect " ,  func ,  conn_from ,  conn_port ,  p_id ,  p_port ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( vsn . ptr ( ) ,  " remove_input_data_port " ,  p_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ,  p_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( conn_from  ! =  - 1 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_connect " ,  func ,  conn_from ,  conn_port ,  p_id ,  p_port ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( vsn . ptr ( ) ,  " add_input_data_port " ,  vsn - > get_input_value_port_info ( p_port ) . type ,  vsn - > get_input_value_port_info ( p_port ) . name ,  p_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ,  p_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									updating_graph  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _remove_output_port ( int  p_id ,  int  p_port )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( p_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < VisualScriptLists >  vsn  =  script - > get_node ( func ,  p_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! vsn . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-04 00:05:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_graph  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-04 00:05:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Remove Output Port " ) ,  UndoRedo : : MERGE_ENDS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < VisualScript : : DataConnection >  data_connections ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > get_data_connection_list ( func ,  & data_connections ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HashMap < int ,  Set < int > >  conn_map ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  List < VisualScript : : DataConnection > : : Element  * E  =  data_connections . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( E - > get ( ) . from_node  = =  p_id  & &  E - > get ( ) . from_port  = =  p_port )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// push into the connections map
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! conn_map . has ( E - > get ( ) . to_node ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												conn_map . set ( E - > get ( ) . to_node ,  Set < int > ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											conn_map [ E - > get ( ) . to_node ] . insert ( E - > get ( ) . to_port ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( vsn . ptr ( ) ,  " remove_output_data_port " ,  p_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ,  p_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < int >  keys ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									conn_map . get_key_list ( & keys ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( const  List < int > : : Element  * E  =  keys . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( const  Set < int > : : Element  * F  =  conn_map [ E - > get ( ) ] . front ( ) ;  F ;  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_connect " ,  func ,  p_id ,  p_port ,  E - > get ( ) ,  F - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( vsn . ptr ( ) ,  " add_output_data_port " ,  vsn - > get_output_value_port_info ( p_port ) . type ,  vsn - > get_output_value_port_info ( p_port ) . name ,  p_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ,  p_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_graph  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _expression_text_changed ( const  String  & p_text ,  int  p_id )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( p_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < VisualScriptExpression >  vse  =  script - > get_node ( func ,  p_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! vse . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_graph  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Change Expression " ) ,  UndoRedo : : MERGE_ENDS ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_property ( vse . ptr ( ) ,  " expression " ,  p_text ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_property ( vse . ptr ( ) ,  " expression " ,  vse - > get ( " expression " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ,  p_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ,  p_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Node  * node  =  graph - > get_node ( itos ( p_id ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( Object : : cast_to < Control > ( node ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Object : : cast_to < Control > ( node ) - > set_size ( Vector2 ( 1 ,  1 ) ) ;  //shrink if text is smaller
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_graph  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Vector2  VisualScriptEditor : : _get_pos_in_graph ( Vector2  p_point )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector2  pos  =  ( graph - > get_scroll_ofs ( )  +  p_point )  /  ( graph - > get_zoom ( )  *  EDSCALE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( graph - > is_using_snap ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  snap  =  graph - > get_snap ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										pos  =  pos . snapped ( Vector2 ( snap ,  snap ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  pos ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Vector2  VisualScriptEditor : : _get_available_pos ( bool  p_centered ,  Vector2  p_pos )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_centered )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_pos  =  _get_pos_in_graph ( graph - > get_size ( )  *  0.5 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									while  ( true )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bool  exists  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < StringName >  all_fn ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > get_function_list ( & all_fn ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( List < StringName > : : Element  * F  =  all_fn . front ( ) ;  F ;  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											StringName  curr_fn  =  F - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											List < int >  existing ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											script - > get_node_list ( curr_fn ,  & existing ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( List < int > : : Element  * E  =  existing . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Point2  pos  =  script - > get_node_position ( curr_fn ,  E - > get ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( pos . distance_to ( p_pos )  <  50 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													p_pos  + =  Vector2 ( graph - > get_snap ( ) ,  graph - > get_snap ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													exists  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													break ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( exists )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  p_pos ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								String  VisualScriptEditor : : _validate_name ( const  String  & p_name )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  valid  =  p_name ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  counter  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( true )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										bool  exists  =  script - > has_function ( valid )  | |  script - > has_variable ( valid )  | |  script - > has_custom_signal ( valid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( exists )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											counter + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											valid  =  p_name  +  " _ "  +  itos ( counter ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  valid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-05 15:10:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _on_nodes_copy ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									clipboard - > nodes . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									clipboard - > data_connections . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									clipboard - > sequence_connections . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Set < String >  funcs ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  graph - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GraphNode  * gn  =  Object : : cast_to < GraphNode > ( graph - > get_child ( i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( gn )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( gn - > is_selected ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  id  =  String ( gn - > get_name ( ) ) . to_int ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												StringName  func  =  _get_function_of_node ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < VisualScriptNode >  node  =  script - > get_node ( func ,  id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( Object : : cast_to < VisualScriptFunction > ( * node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													EditorNode : : get_singleton ( ) - > show_warning ( TTR ( " Can't copy the function node. " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( node . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													clipboard - > nodes [ id ]  =  node - > duplicate ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													clipboard - > nodes_positions [ id ]  =  script - > get_node_position ( func ,  id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													funcs . insert ( String ( func ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( clipboard - > nodes . empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( Set < String > : : Element  * F  =  funcs . front ( ) ;  F ;  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < VisualScript : : SequenceConnection >  sequence_connections ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > get_sequence_connection_list ( F - > get ( ) ,  & sequence_connections ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( List < VisualScript : : SequenceConnection > : : Element  * E  =  sequence_connections . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( clipboard - > nodes . has ( E - > get ( ) . from_node )  & &  clipboard - > nodes . has ( E - > get ( ) . to_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												clipboard - > sequence_connections . insert ( E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < VisualScript : : DataConnection >  data_connections ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > get_data_connection_list ( F - > get ( ) ,  & data_connections ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( List < VisualScript : : DataConnection > : : Element  * E  =  data_connections . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( clipboard - > nodes . has ( E - > get ( ) . from_node )  & &  clipboard - > nodes . has ( E - > get ( ) . to_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												clipboard - > data_connections . insert ( E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _on_nodes_paste ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( clipboard - > nodes . empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorNode : : get_singleton ( ) - > show_warning ( TTR ( " Clipboard is empty! " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Map < int ,  int >  remap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Paste VisualScript Nodes " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  idc  =  script - > get_available_id ( )  +  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Set < int >  to_select ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Set < Vector2 >  existing_positions ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < StringName >  functions ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > get_function_list ( & functions ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( List < StringName > : : Element  * F  =  functions . front ( ) ;  F ;  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											List < int >  nodes ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											script - > get_node_list ( F - > get ( ) ,  & nodes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( List < int > : : Element  * E  =  nodes . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Vector2  pos  =  script - > get_node_position ( F - > get ( ) ,  E - > get ( ) ) . snapped ( Vector2 ( 2 ,  2 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												existing_positions . insert ( pos ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  first_paste  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector2  position_offset  =  Vector2 ( 0 ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( Map < int ,  Ref < VisualScriptNode > > : : Element  * E  =  clipboard - > nodes . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < VisualScriptNode >  node  =  E - > get ( ) - > duplicate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  new_id  =  idc + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										to_select . insert ( new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										remap [ E - > key ( ) ]  =  new_id ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Vector2  paste_pos  =  clipboard - > nodes_positions [ E - > key ( ) ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( first_paste )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											position_offset  =  _get_pos_in_graph ( mouse_up_position  -  graph - > get_global_position ( ) )  -  paste_pos ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											first_paste  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										paste_pos  + =  position_offset ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( existing_positions . has ( paste_pos . snapped ( Vector2 ( 2 ,  2 ) ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											paste_pos  + =  Vector2 ( 20 ,  20 )  *  EDSCALE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  default_func ,  new_id ,  node ,  paste_pos ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  default_func ,  new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( Set < VisualScript : : SequenceConnection > : : Element  * E  =  clipboard - > sequence_connections . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " sequence_connect " ,  default_func ,  remap [ E - > get ( ) . from_node ] ,  E - > get ( ) . from_output ,  remap [ E - > get ( ) . to_node ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " sequence_disconnect " ,  default_func ,  remap [ E - > get ( ) . from_node ] ,  E - > get ( ) . from_output ,  remap [ E - > get ( ) . to_node ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( Set < VisualScript : : DataConnection > : : Element  * E  =  clipboard - > data_connections . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " data_connect " ,  default_func ,  remap [ E - > get ( ) . from_node ] ,  E - > get ( ) . from_port ,  remap [ E - > get ( ) . to_node ] ,  E - > get ( ) . to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_disconnect " ,  default_func ,  remap [ E - > get ( ) . from_node ] ,  E - > get ( ) . from_port ,  remap [ E - > get ( ) . to_node ] ,  E - > get ( ) . to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  graph - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GraphNode  * gn  =  Object : : cast_to < GraphNode > ( graph - > get_child ( i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( gn )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  id  =  gn - > get_name ( ) . operator  String ( ) . to_int ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											gn - > set_selected ( to_select . has ( id ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _on_nodes_delete ( )  {  
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// delete all the selected nodes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									List < int >  to_erase ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  graph - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										GraphNode  * gn  =  Object : : cast_to < GraphNode > ( graph - > get_child ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  ( gn )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( gn - > is_selected ( )  & &  gn - > is_close_button_visible ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												to_erase . push_back ( gn - > get_name ( ) . operator  String ( ) . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( to_erase . empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-23 22:25:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Remove VisualScript Nodes " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( List < int > : : Element  * F  =  to_erase . front ( ) ;  F ;  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  cr_node  =  F - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										StringName  func  =  _get_function_of_node ( cr_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " remove_node " ,  func ,  cr_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " add_node " ,  func ,  cr_node ,  script - > get_node ( func ,  cr_node ) ,  script - > get_node_position ( func ,  cr_node ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < VisualScript : : SequenceConnection >  sequence_conns ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										script - > get_sequence_connection_list ( func ,  & sequence_conns ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( List < VisualScript : : SequenceConnection > : : Element  * E  =  sequence_conns . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( E - > get ( ) . from_node  = =  cr_node  | |  E - > get ( ) . to_node  = =  cr_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " sequence_connect " ,  func ,  E - > get ( ) . from_node ,  E - > get ( ) . from_output ,  E - > get ( ) . to_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < VisualScript : : DataConnection >  data_conns ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										script - > get_data_connection_list ( func ,  & data_conns ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( List < VisualScript : : DataConnection > : : Element  * E  =  data_conns . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E - > get ( ) . from_node  = =  F - > get ( )  | |  E - > get ( ) . to_node  = =  F - > get ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_connect " ,  func ,  E - > get ( ) . from_node ,  E - > get ( ) . from_port ,  E - > get ( ) . to_node ,  E - > get ( ) . to_port ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _on_nodes_duplicate ( )  {  
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Set < int >  to_duplicate ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < StringName >  funcs ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  graph - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										GraphNode  * gn  =  Object : : cast_to < GraphNode > ( graph - > get_child ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  ( gn )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( gn - > is_selected ( )  & &  gn - > is_close_button_visible ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  id  =  gn - > get_name ( ) . operator  String ( ) . to_int ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												to_duplicate . insert ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												funcs . push_back ( _get_function_of_node ( id ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( to_duplicate . empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-23 22:25:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Duplicate VisualScript Nodes " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  idc  =  script - > get_available_id ( )  +  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Set < int >  to_select ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HashMap < int ,  int >  remap ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( Set < int > : : Element  * F  =  to_duplicate . front ( ) ;  F ;  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-22 08:35:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// duplicate from the specific function but place it into the default func as it would lack the connections
 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										StringName  func  =  _get_function_of_node ( F - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < VisualScriptNode >  node  =  script - > get_node ( func ,  F - > get ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-26 14:01:48 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < VisualScriptNode >  dupe  =  node - > duplicate ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  new_id  =  idc + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										remap . set ( F - > get ( ) ,  new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										to_select . insert ( new_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  default_func ,  new_id ,  dupe ,  script - > get_node_position ( func ,  F - > get ( ) )  +  Vector2 ( 20 ,  20 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  default_func ,  new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( List < StringName > : : Element  * F  =  funcs . front ( ) ;  F ;  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < VisualScript : : SequenceConnection >  seqs ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > get_sequence_connection_list ( F - > get ( ) ,  & seqs ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( List < VisualScript : : SequenceConnection > : : Element  * E  =  seqs . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( to_duplicate . has ( E - > get ( ) . from_node )  & &  to_duplicate . has ( E - > get ( ) . to_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " sequence_connect " ,  default_func ,  remap [ E - > get ( ) . from_node ] ,  E - > get ( ) . from_output ,  remap [ E - > get ( ) . to_node ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < VisualScript : : DataConnection >  data ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > get_data_connection_list ( F - > get ( ) ,  & data ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( List < VisualScript : : DataConnection > : : Element  * E  =  data . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( to_duplicate . has ( E - > get ( ) . from_node )  & &  to_duplicate . has ( E - > get ( ) . to_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " data_connect " ,  default_func ,  remap [ E - > get ( ) . from_node ] ,  E - > get ( ) . from_port ,  remap [ E - > get ( ) . to_node ] ,  E - > get ( ) . to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  graph - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										GraphNode  * gn  =  Object : : cast_to < GraphNode > ( graph - > get_child ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  ( gn )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  id  =  gn - > get_name ( ) . operator  String ( ) . to_int ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											gn - > set_selected ( to_select . has ( id ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( to_select . size ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										EditorNode : : get_singleton ( ) - > push_item ( script - > get_node ( default_func ,  to_select . front ( ) - > get ( ) ) . ptr ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _generic_search ( String  p_base_type ,  Vector2  pos ,  bool  node_centered )  {  
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( node_centered )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										port_action_pos  =  graph - > get_size ( )  /  2.0f ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										port_action_pos  =  graph - > get_viewport ( ) - > get_mouse_position ( )  -  graph - > get_global_position ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									new_connect_node_select - > select_from_visual_script ( p_base_type ,  false ,  false ) ;  // neither connecting nor reset text
 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// ensure that the dialog fits inside the graph
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Size2  bounds  =  graph - > get_global_position ( )  +  graph - > get_size ( )  -  new_connect_node_select - > get_size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pos . x  =  pos . x  >  bounds . x  ?  bounds . x  :  pos . x ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pos . y  =  pos . y  >  bounds . y  ?  bounds . y  :  pos . y ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pos  ! =  Vector2 ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										new_connect_node_select - > set_position ( pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _input ( const  Ref < InputEvent >  & p_event )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// GUI input for VS Editor Plugin
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < InputEventMouseButton >  key  =  p_event ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 12:38:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( key . is_valid ( )  & &  ! key - > is_pressed ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mouse_up_position  =  Input : : get_singleton ( ) - > get_mouse_position ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 08:25:03 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _graph_gui_input ( const  Ref < InputEvent >  & p_event )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < InputEventMouseButton >  key  =  p_event ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( key . is_valid ( )  & &  key - > is_pressed ( )  & &  key - > get_button_mask ( )  = =  BUTTON_RIGHT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										saved_position  =  graph - > get_local_mouse_position ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Point2  gpos  =  Input : : get_singleton ( ) - > get_mouse_position ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_generic_search ( script - > get_instance_base_type ( ) ,  gpos ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-05 14:45:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _members_gui_input ( const  Ref < InputEvent >  & p_event )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < InputEventKey >  key  =  p_event ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( key . is_valid ( )  & &  key - > is_pressed ( )  & &  ! key - > is_echo ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( members - > has_focus ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TreeItem  * ti  =  members - > get_selected ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ti )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												TreeItem  * root  =  members - > get_root ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ti - > get_parent ( )  = =  root - > get_children ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													member_type  =  MEMBER_FUNCTION ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ti - > get_parent ( )  = =  root - > get_children ( ) - > get_next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													member_type  =  MEMBER_VARIABLE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ti - > get_parent ( )  = =  root - > get_children ( ) - > get_next ( ) - > get_next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													member_type  =  MEMBER_SIGNAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												member_name  =  ti - > get_text ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ED_IS_SHORTCUT ( " visual_script_editor/delete_selected " ,  p_event ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_member_option ( MEMBER_REMOVE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ED_IS_SHORTCUT ( " visual_script_editor/edit_member " ,  p_event ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_member_option ( MEMBER_EDIT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < InputEventMouseButton >  btn  =  p_event ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( btn . is_valid ( )  & &  btn - > is_doubleclick ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										TreeItem  * ti  =  members - > get_selected ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ti  & &  ti - > get_parent ( )  = =  members - > get_root ( ) - > get_children ( ) )  {  // to check if it's a function
 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_center_on_node ( ti - > get_metadata ( 0 ) ,  script - > get_function_node_id ( ti - > get_metadata ( 0 ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-05 14:45:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _rename_function ( const  String  & name ,  const  String  & new_name )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! new_name . is_valid_identifier ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorNode : : get_singleton ( ) - > show_warning ( TTR ( " Name is not a valid identifier: " )  +  "   "  +  new_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( script - > has_function ( new_name )  | |  script - > has_variable ( new_name )  | |  script - > has_custom_signal ( new_name ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorNode : : get_singleton ( ) - > show_warning ( TTR ( " Name already in use by another func/var/signal: " )  +  "   "  +  new_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  node_id  =  script - > get_function_node_id ( name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptFunction >  func ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( script - > has_node ( name ,  node_id ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										func  =  script - > get_node ( name ,  node_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Rename Function " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( script . ptr ( ) ,  " rename_function " ,  name ,  new_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( script . ptr ( ) ,  " rename_function " ,  new_name ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( func . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( func . ptr ( ) ,  " set_name " ,  new_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( func . ptr ( ) ,  " set_name " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// also fix all function calls
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < StringName >  flst ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > get_function_list ( & flst ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( List < StringName > : : Element  * E  =  flst . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < int >  lst ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > get_node_list ( E - > get ( ) ,  & lst ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( List < int > : : Element  * F  =  lst . front ( ) ;  F ;  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < VisualScriptFunctionCall >  fncall  =  script - > get_node ( E - > get ( ) ,  F - > get ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! fncall . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( fncall - > get_function ( )  = =  name )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( fncall . ptr ( ) ,  " set_function " ,  new_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( fncall . ptr ( ) ,  " set_function " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _fn_name_box_input ( const  Ref < InputEvent >  & p_event )  {  
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! function_name_edit - > is_visible ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < InputEventKey >  key  =  p_event ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( key . is_valid ( )  & &  key - > is_pressed ( )  & &  key - > get_scancode ( )  = =  KEY_ENTER )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										function_name_edit - > hide ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_rename_function ( selected ,  function_name_box - > get_text ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										function_name_box - > clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Variant  VisualScriptEditor : : get_drag_data_fw ( const  Point2  & p_point ,  Control  * p_from )  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_from  = =  members )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-10 15:37:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										TreeItem  * it  =  members - > get_item_at_position ( p_point ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! it )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  Variant ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										String  type  =  it - > get_metadata ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( type  = =  String ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  Variant ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Dictionary  dd ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										TreeItem  * root  =  members - > get_root ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( it - > get_parent ( )  = =  root - > get_children ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dd [ " type " ]  =  " visual_script_function_drag " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dd [ " function " ]  =  type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( it - > get_parent ( )  = =  root - > get_children ( ) - > get_next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dd [ " type " ]  =  " visual_script_variable_drag " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dd [ " variable " ]  =  type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( it - > get_parent ( )  = =  root - > get_children ( ) - > get_next ( ) - > get_next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dd [ " type " ]  =  " visual_script_signal_drag " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dd [ " signal " ]  =  type ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  Variant ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Label  * label  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										label - > set_text ( it - > get_text ( 0 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_drag_preview ( label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  dd ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  Variant ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  VisualScriptEditor : : can_drop_data_fw ( const  Point2  & p_point ,  const  Variant  & p_data ,  Control  * p_from )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_from  = =  graph )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										Dictionary  d  =  p_data ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( d . has ( " type " )  & & 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												( String ( d [ " type " ] )  = =  " visual_script_node_drag "  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														String ( d [ " type " ] )  = =  " visual_script_function_drag "  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														String ( d [ " type " ] )  = =  " visual_script_variable_drag "  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														String ( d [ " type " ] )  = =  " visual_script_signal_drag "  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														String ( d [ " type " ] )  = =  " obj_property "  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														String ( d [ " type " ] )  = =  " resource "  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														String ( d [ " type " ] )  = =  " files "  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														String ( d [ " type " ] )  = =  " nodes " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( String ( d [ " type " ] )  = =  " obj_property " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef OSX_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-10-13 20:12:58 +11:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												const_cast < VisualScriptEditor  * > ( this ) - > _show_hint ( vformat ( TTR ( " Hold %s to drop a Getter. Hold Shift to drop a generic signature. " ) ,  find_keycode_name ( KEY_META ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												const_cast < VisualScriptEditor  * > ( this ) - > _show_hint ( TTR ( " Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( String ( d [ " type " ] )  = =  " nodes " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef OSX_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-10-13 20:12:58 +11:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												const_cast < VisualScriptEditor  * > ( this ) - > _show_hint ( vformat ( TTR ( " Hold %s to drop a simple reference to the node. " ) ,  find_keycode_name ( KEY_META ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												const_cast < VisualScriptEditor  * > ( this ) - > _show_hint ( TTR ( " Hold Ctrl to drop a simple reference to the node. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-05 22:46:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( String ( d [ " type " ] )  = =  " visual_script_variable_drag " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-05 22:46:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef OSX_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-10-13 20:12:58 +11:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												const_cast < VisualScriptEditor  * > ( this ) - > _show_hint ( vformat ( TTR ( " Hold %s to drop a Variable Setter. " ) ,  find_keycode_name ( KEY_META ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-05 22:46:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												const_cast < VisualScriptEditor  * > ( this ) - > _show_hint ( TTR ( " Hold Ctrl to drop a Variable Setter. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-05 22:46:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  Node  * _find_script_node ( Node  * p_edited_scene ,  Node  * p_current_node ,  const  Ref < Script >  & script )  {  
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_edited_scene  ! =  p_current_node  & &  p_current_node - > get_owner ( )  ! =  p_edited_scene )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 16:00:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < Script >  scr  =  p_current_node - > get_script ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( scr . is_valid ( )  & &  scr  = =  script )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  p_current_node ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  p_current_node - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * n  =  _find_script_node ( p_edited_scene ,  p_current_node - > get_child ( i ) ,  script ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( n )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  n ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 16:00:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : drop_data_fw ( const  Point2  & p_point ,  const  Variant  & p_data ,  Control  * p_from )  {  
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_from  ! =  graph )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Dictionary  d  =  p_data ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! d . has ( " type " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( String ( d [ " type " ] )  = =  " visual_script_node_drag " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! d . has ( " node_type " )  | |  String ( d [ " node_type " ] )  = =  " Null " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-04 00:05:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Vector2  pos  =  _get_pos_in_graph ( p_point ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  new_id  =  _create_new_node_from_name ( d [ " node_type " ] ,  pos ,  default_func ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * node  =  graph - > get_node ( itos ( new_id ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											graph - > set_selected ( node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_node_selected ( node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( String ( d [ " type " ] )  = =  " visual_script_variable_drag " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-05 22:46:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef OSX_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bool  use_set  =  Input : : get_singleton ( ) - > is_key_pressed ( KEY_META ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-05 22:46:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bool  use_set  =  Input : : get_singleton ( ) - > is_key_pressed ( KEY_CONTROL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-05 22:46:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Vector2  pos  =  _get_pos_in_graph ( p_point ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < VisualScriptNode >  vnode ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( use_set )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < VisualScriptVariableSet >  vnodes ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vnodes . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vnodes - > set_variable ( d [ " variable " ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vnode  =  vnodes ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < VisualScriptVariableGet >  vnodeg ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vnodeg . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vnodeg - > set_variable ( d [ " variable " ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vnode  =  vnodeg ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  new_id  =  script - > get_available_id ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > create_action ( TTR ( " Add Node " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  default_func ,  new_id ,  vnode ,  pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  default_func ,  new_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Node  * node  =  graph - > get_node ( itos ( new_id ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											graph - > set_selected ( node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_node_selected ( node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( String ( d [ " type " ] )  = =  " visual_script_function_drag " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Vector2  pos  =  _get_pos_in_graph ( p_point ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < VisualScriptFunctionCall >  vnode ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vnode . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vnode - > set_call_mode ( VisualScriptFunctionCall : : CALL_MODE_SELF ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  new_id  =  script - > get_available_id ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > create_action ( TTR ( " Add Node " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  default_func ,  new_id ,  vnode ,  pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( vnode . ptr ( ) ,  " set_base_type " ,  script - > get_instance_base_type ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( vnode . ptr ( ) ,  " set_function " ,  d [ " function " ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  default_func ,  new_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Node  * node  =  graph - > get_node ( itos ( new_id ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											graph - > set_selected ( node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_node_selected ( node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( String ( d [ " type " ] )  = =  " visual_script_signal_drag " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Vector2  pos  =  _get_pos_in_graph ( p_point ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < VisualScriptEmitSignal >  vnode ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vnode . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vnode - > set_signal ( d [ " signal " ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  new_id  =  script - > get_available_id ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > create_action ( TTR ( " Add Node " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  default_func ,  new_id ,  vnode ,  pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  default_func ,  new_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Node  * node  =  graph - > get_node ( itos ( new_id ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											graph - > set_selected ( node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_node_selected ( node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( String ( d [ " type " ] )  = =  " resource " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Vector2  pos  =  _get_pos_in_graph ( p_point ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < VisualScriptPreload >  prnode ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										prnode . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										prnode - > set_preload ( d [ " resource " ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  new_id  =  script - > get_available_id ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > create_action ( TTR ( " Add Preload Node " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  default_func ,  new_id ,  prnode ,  pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  default_func ,  new_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Node  * node  =  graph - > get_node ( itos ( new_id ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											graph - > set_selected ( node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_node_selected ( node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( String ( d [ " type " ] )  = =  " files " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-21 15:00:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef OSX_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bool  use_preload  =  Input : : get_singleton ( ) - > is_key_pressed ( KEY_META ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bool  use_preload  =  Input : : get_singleton ( ) - > is_key_pressed ( KEY_CONTROL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Vector2  pos  =  _get_pos_in_graph ( p_point ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Array  files  =  d [ " files " ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										List < int >  new_ids ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  new_id  =  script - > get_available_id ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( files . size ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-25 13:47:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > create_action ( TTR ( " Add Node(s) " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( int  i  =  0 ;  i  <  files . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < Resource >  res  =  ResourceLoader : : load ( files [ i ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! res . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-21 15:00:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Ref < Script >  drop_script  =  ResourceLoader : : load ( files [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( drop_script . is_valid ( )  & &  drop_script - > is_tool ( )  & &  drop_script - > get_instance_base_type ( )  = =  " VisualScriptCustomNode "  & &  ! use_preload )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Ref < VisualScriptCustomNode >  vscn ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													vscn . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													vscn - > set_script ( drop_script . get_ref_ptr ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  default_func ,  new_id ,  vscn ,  pos ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  default_func ,  new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Ref < VisualScriptPreload >  prnode ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													prnode . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													prnode - > set_preload ( res ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-21 15:00:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  default_func ,  new_id ,  prnode ,  pos ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  default_func ,  new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												new_ids . push_back ( new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												new_id + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												pos  + =  Vector2 ( 20 ,  20 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( List < int > : : Element  * E  =  new_ids . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * node  =  graph - > get_node ( itos ( E - > get ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												graph - > set_selected ( node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_node_selected ( node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-28 20:57:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( String ( d [ " type " ] )  = =  " nodes " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * sn  =  _find_script_node ( get_tree ( ) - > get_edited_scene_root ( ) ,  get_tree ( ) - > get_edited_scene_root ( ) ,  script ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! sn )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-29 13:57:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											EditorNode : : get_singleton ( ) - > show_warning ( vformat ( TTR ( " Can't drop nodes because script '%s' is not used in this scene. " ) ,  get_name ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef OSX_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bool  use_node  =  Input : : get_singleton ( ) - > is_key_pressed ( KEY_META ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bool  use_node  =  Input : : get_singleton ( ) - > is_key_pressed ( KEY_CONTROL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Array  nodes  =  d [ " nodes " ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Vector2  pos  =  _get_pos_in_graph ( p_point ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > create_action ( TTR ( " Add Node(s) From Tree " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  base_id  =  script - > get_available_id ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-21 20:28:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( use_node  | |  nodes . size ( )  >  1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( int  i  =  0 ;  i  <  nodes . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												NodePath  np  =  nodes [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Node  * node  =  get_node ( np ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-21 20:28:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Ref < VisualScriptNode >  n ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Ref < VisualScriptSceneNode >  scene_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												scene_node . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												scene_node - > set_node_path ( sn - > get_path_to ( node ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												n  =  scene_node ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-21 20:28:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  default_func ,  base_id ,  n ,  pos ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  default_func ,  base_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												base_id + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pos  + =  Vector2 ( 25 ,  25 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											NodePath  np  =  nodes [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * node  =  get_node ( np ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											drop_position  =  pos ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											drop_node  =  node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											drop_path  =  sn - > get_path_to ( node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											new_connect_node_select - > select_from_instance ( node ,  " " ,  false ,  node - > get_class ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( String ( d [ " type " ] )  = =  " obj_property " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * sn  =  _find_script_node ( get_tree ( ) - > get_edited_scene_root ( ) ,  get_tree ( ) - > get_edited_scene_root ( ) ,  script ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! sn  & &  ! Input : : get_singleton ( ) - > is_key_pressed ( KEY_SHIFT ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-29 13:57:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											EditorNode : : get_singleton ( ) - > show_warning ( vformat ( TTR ( " Can't drop properties because script '%s' is not used in this scene. \n Drop holding 'Shift' to just copy the signature. " ) ,  get_name ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Object  * obj  =  d [ " object " ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! obj )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Node  * node  =  Object : : cast_to < Node > ( obj ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Vector2  pos  =  _get_pos_in_graph ( p_point ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-04 00:05:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef OSX_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bool  use_get  =  Input : : get_singleton ( ) - > is_key_pressed ( KEY_META ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bool  use_get  =  Input : : get_singleton ( ) - > is_key_pressed ( KEY_CONTROL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! node  | |  Input : : get_singleton ( ) - > is_key_pressed ( KEY_SHIFT ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( use_get )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > create_action ( TTR ( " Add Getter Property " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > create_action ( TTR ( " Add Setter Property " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  base_id  =  script - > get_available_id ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < VisualScriptNode >  vnode ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! use_get )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < VisualScriptPropertySet >  pset ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pset . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pset - > set_call_mode ( VisualScriptPropertySet : : CALL_MODE_INSTANCE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pset - > set_base_type ( obj - > get_class ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vnode  =  pset ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < VisualScriptPropertyGet >  pget ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pget . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pget - > set_call_mode ( VisualScriptPropertyGet : : CALL_MODE_INSTANCE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pget - > set_base_type ( obj - > get_class ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												vnode  =  pget ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  default_func ,  base_id ,  vnode ,  pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( vnode . ptr ( ) ,  " set_property " ,  d [ " property " ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! use_get )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( vnode . ptr ( ) ,  " set_default_input_value " ,  0 ,  d [ " value " ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  default_func ,  base_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( use_get )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > create_action ( TTR ( " Add Getter Property " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > create_action ( TTR ( " Add Setter Property " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  base_id  =  script - > get_available_id ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < VisualScriptNode >  vnode ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! use_get )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < VisualScriptPropertySet >  pset ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pset . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( sn  = =  node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													pset - > set_call_mode ( VisualScriptPropertySet : : CALL_MODE_SELF ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													pset - > set_call_mode ( VisualScriptPropertySet : : CALL_MODE_NODE_PATH ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													pset - > set_base_path ( sn - > get_path_to ( node ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												vnode  =  pset ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < VisualScriptPropertyGet >  pget ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pget . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( sn  = =  node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													pget - > set_call_mode ( VisualScriptPropertyGet : : CALL_MODE_SELF ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													pget - > set_call_mode ( VisualScriptPropertyGet : : CALL_MODE_NODE_PATH ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													pget - > set_base_path ( sn - > get_path_to ( node ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vnode  =  pget ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  default_func ,  base_id ,  vnode ,  pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( vnode . ptr ( ) ,  " set_property " ,  d [ " property " ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! use_get )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( vnode . ptr ( ) ,  " set_default_input_value " ,  0 ,  d [ " value " ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  default_func ,  base_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-09 00:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-21 21:25:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _selected_method ( const  String  & p_method ,  const  String  & p_type ,  const  bool  p_connecting )  {  
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < VisualScriptFunctionCall >  vsfc  =  script - > get_node ( default_func ,  selecting_method_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! vsfc . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									vsfc - > set_function ( p_method ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _draw_color_over_button ( Object  * obj ,  Color  p_color )  {  
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Button  * button  =  Object : : cast_to < Button > ( obj ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! button )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < StyleBox >  normal  =  get_stylebox ( " normal " ,  " Button " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									button - > draw_rect ( Rect2 ( normal - > get_offset ( ) ,  button - > get_size ( )  -  normal - > get_minimum_size ( ) ) ,  p_color ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-05 16:16:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _button_resource_previewed ( const  String  & p_path ,  const  Ref < Texture >  & p_preview ,  const  Ref < Texture >  & p_small_preview ,  Variant  p_ud )  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Array  ud  =  p_ud ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( ud . size ( )  ! =  2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ObjectID  id  =  ud [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Object  * obj  =  ObjectDB : : get_instance ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! obj )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Button  * b  =  Object : : cast_to < Button > ( obj ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND ( ! b ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_preview . is_null ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										b - > set_text ( ud [ 1 ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										b - > set_icon ( p_preview ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/////////////////////////
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : apply_code ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-28 16:52:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								RES  VisualScriptEditor : : get_edited_resource ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  script ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-28 16:52:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : set_edited_resource ( const  RES  & p_res )  {  
						 
					
						
							
								
									
										
										
										
											2020-07-15 16:15:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND ( script . is_valid ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( p_res . is_null ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-28 16:52:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									script  =  p_res ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									signal_editor - > script  =  script ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									signal_editor - > undo_redo  =  undo_redo ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-28 16:52:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									variable_editor - > script  =  script ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									variable_editor - > undo_redo  =  undo_redo ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									script - > connect ( " node_ports_changed " ,  this ,  " _node_ports_changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default_func  =  script - > get_default_func ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! script - > has_function ( default_func ) )  // this is the supposed default function
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > add_function ( default_func ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > set_edited ( true ) ;  //so that if a function was added it's saved
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_graph ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-18 13:40:55 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									call_deferred ( " _update_members " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-15 16:15:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : enable_editor ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-28 16:52:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Vector < String >  VisualScriptEditor : : get_functions ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  Vector < String > ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : reload_text ( )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								String  VisualScriptEditor : : get_name ( )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									String  name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-04 01:12:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									name  =  script - > get_path ( ) . get_file ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( name . empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// This appears for newly created built-in scripts before saving the scene.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										name  =  TTR ( " [unsaved] " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-08 14:04:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( script - > get_path ( ) . find ( " local:// " )  = =  - 1  | |  script - > get_path ( ) . find ( " :: " )  = =  - 1 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-04 01:12:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  String  & script_name  =  script - > get_name ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( script_name  ! =  " " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// If the built-in script has a custom resource name defined,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// display the built-in script name as follows: `ResourceName (scene_file.tscn)`
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											name  =  vformat ( " %s (%s) " ,  script_name ,  name . get_slice ( " :: " ,  0 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-04 01:12:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( is_unsaved ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										name  + =  " (*) " ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Ref < Texture >  VisualScriptEditor : : get_icon ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  Control : : get_icon ( " VisualScript " ,  " EditorIcons " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  VisualScriptEditor : : is_unsaved ( )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-31 17:58:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  script - > is_edited ( )  | |  script - > are_subnodes_edited ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Variant  VisualScriptEditor : : get_edit_state ( )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Dictionary  d ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									d [ " function " ]  =  default_func ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									d [ " scroll " ]  =  graph - > get_scroll_ofs ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									d [ " zoom " ]  =  graph - > get_zoom ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									d [ " using_snap " ]  =  graph - > is_using_snap ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									d [ " snap " ]  =  graph - > get_snap ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  d ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : set_edit_state ( const  Variant  & p_state )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Dictionary  d  =  p_state ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( d . has ( " function " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										selected  =  default_func ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_graph ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_members ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( d . has ( " scroll " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										graph - > set_scroll_ofs ( d [ " scroll " ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( d . has ( " zoom " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										graph - > set_zoom ( d [ " zoom " ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( d . has ( " snap " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										graph - > set_snap ( d [ " snap " ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( d . has ( " snap_enabled " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										graph - > set_use_snap ( d [ " snap_enabled " ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _center_on_node ( const  StringName  & p_func ,  int  p_id )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Node  * n  =  graph - > get_node ( itos ( p_id ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GraphNode  * gn  =  Object : : cast_to < GraphNode > ( n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// clear selection
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  graph - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GraphNode  * gnd  =  Object : : cast_to < GraphNode > ( graph - > get_child ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( gnd )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											gnd - > set_selected ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( gn )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										gn - > set_selected ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-08 05:18:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Vector2  new_scroll  =  gn - > get_offset ( )  *  graph - > get_zoom ( )  -  graph - > get_size ( )  *  0.5  +  gn - > get_size ( )  *  0.5 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										graph - > set_scroll_ofs ( new_scroll ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										script - > set_function_scroll ( p_func ,  new_scroll  /  EDSCALE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > set_edited ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : goto_line ( int  p_line ,  bool  p_with_error )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p_line  + =  1 ;  //add one because script lines begin from 0.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_with_error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										error_line  =  p_line ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < StringName >  functions ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > get_function_list ( & functions ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( List < StringName > : : Element  * E  =  functions . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( script - > has_node ( E - > get ( ) ,  p_line ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_update_graph ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_update_members ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											call_deferred ( " call_deferred " ,  " _center_on_node " ,  E - > get ( ) ,  p_line ) ;  //editor might be just created and size might not exist yet
 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-22 17:20:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : set_executing_line ( int  p_line )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// todo: add a way to show which node is executing right now.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : clear_executing_line ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// todo: add a way to show which node is executing right now.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : trim_trailing_whitespace ( )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-28 18:27:32 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : insert_final_newline ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-17 14:46:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : convert_indent_to_spaces ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : convert_indent_to_tabs ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : ensure_focus ( )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graph - > grab_focus ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : tag_saved_version ( )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : reload ( bool  p_soft )  {  
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_update_graph ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : get_breakpoints ( List < int >  * p_breakpoints )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < StringName >  functions ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > get_function_list ( & functions ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( List < StringName > : : Element  * E  =  functions . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										List < int >  nodes ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										script - > get_node_list ( E - > get ( ) ,  & nodes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( List < int > : : Element  * F  =  nodes . front ( ) ;  F ;  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < VisualScriptNode >  vsn  =  script - > get_node ( E - > get ( ) ,  F - > get ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( vsn - > is_breakpoint ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												p_breakpoints - > push_back ( F - > get ( )  -  1 ) ;  //subtract 1 because breakpoints in text start from zero
 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : add_callback ( const  String  & p_function ,  PoolStringArray  p_args )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( script - > has_function ( p_function ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_update_members ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_update_graph ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_center_on_node ( p_function ,  script - > get_function_node_id ( p_function ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptFunction >  func ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func . instance ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  p_args . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										String  name  =  p_args [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Variant : : Type  type  =  Variant : : NIL ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( name . find ( " : " )  ! =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  tt  =  name . get_slice ( " : " ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											name  =  name . get_slice ( " : " ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( int  j  =  0 ;  j  <  Variant : : VARIANT_MAX ;  j + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												String  tname  =  Variant : : get_type_name ( Variant : : Type ( j ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( tname  = =  tt )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													type  =  Variant : : Type ( j ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										func - > add_argument ( type ,  name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func - > set_name ( p_function ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > add_function ( p_function ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									script - > add_node ( p_function ,  script - > get_available_id ( ) ,  func ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_members ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_graph ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_center_on_node ( p_function ,  script - > get_function_node_id ( p_function ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-28 15:20:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  VisualScriptEditor : : show_members_overview ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : update_settings ( )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_update_graph ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : set_debugger_active ( bool  p_active )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! p_active )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										error_line  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_update_graph ( ) ;  //clear line break
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : set_tooltip_request_func ( String  p_method ,  Object  * p_obj )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Control  * VisualScriptEditor : : get_edit_menu ( )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  edit_menu ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _change_base_type ( )  {  
						 
					
						
							
								
									
										
										
										
											2019-05-18 09:59:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									select_base_type - > popup_create ( true ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-27 01:30:23 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _toggle_tool_script ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > set_tool_enabled ( ! script - > is_tool ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : clear_edit_menu ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									memdelete ( edit_menu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 17:10:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memdelete ( members_section ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _change_base_type_callback ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  bt  =  select_base_type - > get_selected_type ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND ( bt  = =  String ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-23 22:25:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Change Base Type " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( script . ptr ( ) ,  " set_instance_base_type " ,  bt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( script . ptr ( ) ,  " set_instance_base_type " ,  script - > get_instance_base_type ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _node_selected ( Node  * p_node )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptNode >  vnode  =  p_node - > get_meta ( " __vnode " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( vnode . is_null ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorNode : : get_singleton ( ) - > push_item ( vnode . ptr ( ) ) ;  //edit node in inspector
 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  bool  _get_out_slot ( const  Ref < VisualScriptNode >  & p_node ,  int  p_slot ,  int  & r_real_slot ,  bool  & r_sequence )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_slot  <  p_node - > get_output_sequence_port_count ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										r_sequence  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										r_real_slot  =  p_slot ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									r_real_slot  =  p_slot  -  p_node - > get_output_sequence_port_count ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									r_sequence  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  ( r_real_slot  <  p_node - > get_output_value_port_count ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  bool  _get_in_slot ( const  Ref < VisualScriptNode >  & p_node ,  int  p_slot ,  int  & r_real_slot ,  bool  & r_sequence )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_slot  = =  0  & &  p_node - > has_input_sequence_port ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										r_sequence  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										r_real_slot  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									r_real_slot  =  p_slot  -  ( p_node - > has_input_sequence_port ( )  ?  1  :  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									r_sequence  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  r_real_slot  <  p_node - > get_input_value_port_count ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _begin_node_move ( )  {  
						 
					
						
							
								
									
										
										
										
											2017-08-23 22:25:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Move Node(s) " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _end_node_move ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _move_node ( const  StringName  & p_func ,  int  p_id ,  const  Vector2  & p_to )  {  
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! script - > has_function ( p_func ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Node  * node  =  graph - > get_node ( itos ( p_id ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( Object : : cast_to < GraphNode > ( node ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Object : : cast_to < GraphNode > ( node ) - > set_offset ( p_to ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > set_node_position ( p_func ,  p_id ,  p_to  /  EDSCALE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								StringName  VisualScriptEditor : : _get_function_of_node ( int  p_id )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < StringName >  funcs ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > get_function_list ( & funcs ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( List < StringName > : : Element  * E  =  funcs . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( script - > has_node ( E - > get ( ) ,  p_id ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  E - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  " " ;  // this is passed to avoid crash and is tested against later
 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _node_moved ( Vector2  p_from ,  Vector2  p_to ,  int  p_id )  {  
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( p_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _move_node " ,  func ,  p_id ,  p_to ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _move_node " ,  func ,  p_id ,  p_from ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _remove_node ( int  p_id )  {  
						 
					
						
							
								
									
										
										
										
											2017-08-23 22:25:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Remove VisualScript Node " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( p_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( script . ptr ( ) ,  " remove_node " ,  func ,  p_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( script . ptr ( ) ,  " add_node " ,  func ,  p_id ,  script - > get_node ( func ,  p_id ) ,  script - > get_node_position ( func ,  p_id ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < VisualScript : : SequenceConnection >  sequence_conns ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									script - > get_sequence_connection_list ( func ,  & sequence_conns ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( List < VisualScript : : SequenceConnection > : : Element  * E  =  sequence_conns . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( E - > get ( ) . from_node  = =  p_id  | |  E - > get ( ) . to_node  = =  p_id )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " sequence_connect " ,  func ,  E - > get ( ) . from_node ,  E - > get ( ) . from_output ,  E - > get ( ) . to_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < VisualScript : : DataConnection >  data_conns ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									script - > get_data_connection_list ( func ,  & data_conns ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( List < VisualScript : : DataConnection > : : Element  * E  =  data_conns . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( E - > get ( ) . from_node  = =  p_id  | |  E - > get ( ) . to_node  = =  p_id )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_connect " ,  func ,  E - > get ( ) . from_node ,  E - > get ( ) . from_port ,  E - > get ( ) . to_node ,  E - > get ( ) . to_port ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _node_ports_changed ( const  String  & p_func ,  int  p_id )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									_update_graph ( p_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  VisualScriptEditor : : node_has_sequence_connections ( const  StringName  & p_func ,  int  p_id )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < VisualScript : : SequenceConnection >  sequence_conns ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > get_sequence_connection_list ( p_func ,  & sequence_conns ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( List < VisualScript : : SequenceConnection > : : Element  * E  =  sequence_conns . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  from  =  E - > get ( ) . from_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  to  =  E - > get ( ) . to_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( to  = =  p_id  | |  from  = =  p_id )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _graph_connected ( const  String  & p_from ,  int  p_from_slot ,  const  String  & p_to ,  int  p_to_slot )  {  
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									StringName  from_func  =  _get_function_of_node ( p_from . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptNode >  from_node  =  script - > get_node ( from_func ,  p_from . to_int ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( ! from_node . is_valid ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  from_seq ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  from_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! _get_out_slot ( from_node ,  p_from_slot ,  from_port ,  from_seq ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-12 21:38:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ;  //can't connect this, it's invalid
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									StringName  to_func  =  _get_function_of_node ( p_to . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptNode >  to_node  =  script - > get_node ( to_func ,  p_to . to_int ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( ! to_node . is_valid ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  to_seq ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  to_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! _get_in_slot ( to_node ,  p_to_slot ,  to_port ,  to_seq ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-12 21:38:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ;  //can't connect this, it's invalid
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND ( from_seq  ! =  to_seq ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-03 11:27:45 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Checking to prevent warnings.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( from_seq )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( script - > has_sequence_connection ( from_func ,  p_from . to_int ( ) ,  from_port ,  p_to . to_int ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( script - > has_data_connection ( from_func ,  p_from . to_int ( ) ,  from_port ,  p_to . to_int ( ) ,  to_port ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Preventing connection to itself.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_from . to_int ( )  = =  p_to . to_int ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Do all the checks here
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									StringName  func ;  // this the func where we store the one the nodes at the end of the resolution on having multiple nodes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-23 22:25:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Connect Nodes " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( from_func  = =  to_func )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										func  =  to_func ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( from_seq )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// this is a sequence connection
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_move_nodes_with_rescan ( to_func ,  from_func ,  p_to . to_int ( ) ) ;  // this function moves the nodes from func1 to func2
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										func  =  from_func ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( node_has_sequence_connections ( to_func ,  p_to . to_int ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( node_has_sequence_connections ( from_func ,  p_from . to_int ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ERR_PRINT ( " Trying to connect between different sequence node trees " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_move_nodes_with_rescan ( from_func ,  to_func ,  p_from . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												func  =  to_func ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( node_has_sequence_connections ( from_func ,  p_from . to_int ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( from_func  = =  default_func )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_move_nodes_with_rescan ( from_func ,  to_func ,  p_from . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												func  =  to_func ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_move_nodes_with_rescan ( to_func ,  from_func ,  p_to . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												func  =  from_func ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( to_func  = =  default_func )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_move_nodes_with_rescan ( to_func ,  from_func ,  p_to . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												func  =  from_func ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_move_nodes_with_rescan ( from_func ,  to_func ,  p_from . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												func  =  to_func ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( from_seq )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " sequence_connect " ,  func ,  p_from . to_int ( ) ,  from_port ,  p_to . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// this undo error on undo after move can't be removed without painful gymnastics
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " sequence_disconnect " ,  func ,  p_from . to_int ( ) ,  from_port ,  p_to . to_int ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bool  converted  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  conv_node  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < VisualScriptOperator >  oper  =  to_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( oper . is_valid ( )  & &  oper - > get_typed ( )  = =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// it's an operator Node and if the type is already nil
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( from_node - > get_output_value_port_info ( from_port ) . type  ! =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												oper - > set_typed ( from_node - > get_output_value_port_info ( from_port ) . type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < VisualScriptOperator >  operf  =  from_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( operf . is_valid ( )  & &  operf - > get_typed ( )  = =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// it's an operator Node and if the type is already nil
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( to_node - > get_input_value_port_info ( to_port ) . type  ! =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												operf - > set_typed ( to_node - > get_input_value_port_info ( to_port ) . type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Variant : : Type  to_type  =  to_node - > get_input_value_port_info ( to_port ) . type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Variant : : Type  from_type  =  from_node - > get_output_value_port_info ( from_port ) . type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( to_type  ! =  Variant : : NIL  & &  from_type  ! =  Variant : : NIL  & &  to_type  ! =  from_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// add a constructor node between the ports
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bool  exceptions  =  false ;  // true if there are any exceptions
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											exceptions  =  exceptions  | |  ( to_type  = =  Variant : : INT  & &  from_type  = =  Variant : : REAL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											exceptions  =  exceptions  | |  ( to_type  = =  Variant : : REAL  & &  from_type  = =  Variant : : INT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( Variant : : can_convert ( from_type ,  to_type )  & &  ! exceptions )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												MethodInfo  mi ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												mi . name  =  Variant : : get_type_name ( to_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												PropertyInfo  pi ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pi . name  =  " from " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pi . type  =  from_type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												mi . arguments . push_back ( pi ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												mi . return_val . type  =  to_type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// we know that this is allowed so create a new constructor node
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < VisualScriptConstructor >  constructor ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												constructor . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												constructor - > set_constructor_type ( to_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												constructor - > set_constructor ( mi ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// add the new constructor node
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GraphNode  * gn  =  Object : : cast_to < GraphNode > ( graph - > get_node ( p_from ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GraphNode  * gn2  =  Object : : cast_to < GraphNode > ( graph - > get_node ( p_to ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( gn  & &  gn2 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Vector2  from_node_size  =  gn - > get_rect ( ) . get_size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Vector2  to_node_size  =  gn2 - > get_rect ( ) . get_size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Vector2  to_node_pos  =  script - > get_node_position ( func ,  p_to . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Vector2  from_node_pos  =  script - > get_node_position ( func ,  p_from . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Vector2  new_to_node_pos  =  from_node_pos ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Vector2  constructor_pos ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( ( to_node_pos . x  -  from_node_pos . x )  <  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														// to is behind from node
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if  ( to_node_pos . x  >  ( from_node_pos . x  -  to_node_size . x  -  240 ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-22 08:35:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															new_to_node_pos . x  =  from_node_pos . x  -  to_node_size . x  -  240 ;  // approx size of constructor node + padding
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															new_to_node_pos . x  =  to_node_pos . x ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														new_to_node_pos . y  =  to_node_pos . y ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														constructor_pos . x  =  from_node_pos . x  -  210 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														constructor_pos . y  =  to_node_pos . y ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														// to is ahead of from node
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if  ( to_node_pos . x  <  ( from_node_size . x  +  from_node_pos . x  +  240 ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-22 08:35:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															new_to_node_pos . x  =  from_node_size . x  +  from_node_pos . x  +  240 ;  // approx size of constructor node + padding
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															new_to_node_pos . x  =  to_node_pos . x ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														new_to_node_pos . y  =  to_node_pos . y ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														constructor_pos . x  =  from_node_size . x  +  from_node_pos . x  +  10 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														constructor_pos . y  =  to_node_pos . y ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_do_method ( this ,  " _move_node " ,  func ,  p_to . to_int ( ) ,  new_to_node_pos ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_undo_method ( this ,  " _move_node " ,  func ,  p_to . to_int ( ) ,  to_node_pos ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													conv_node  =  script - > get_available_id ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  func ,  conv_node ,  constructor ,  _get_available_pos ( false ,  constructor_pos ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  func ,  conv_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													converted  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// disconnect current, and connect the new one
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( script - > is_input_value_port_connected ( func ,  p_to . to_int ( ) ,  to_port ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( can_swap  & &  data_disconnect_node  = =  p_to . to_int ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  conn_from ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  conn_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												script - > get_input_value_port_connection_source ( func ,  p_to . to_int ( ) ,  to_port ,  & conn_from ,  & conn_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " data_disconnect " ,  func ,  conn_from ,  conn_port ,  p_to . to_int ( ) ,  to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " data_connect " ,  func ,  conn_from ,  conn_port ,  data_disconnect_node ,  data_disconnect_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_disconnect " ,  func ,  conn_from ,  conn_port ,  data_disconnect_node ,  data_disconnect_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_connect " ,  func ,  conn_from ,  conn_port ,  p_to . to_int ( ) ,  to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												can_swap  =  false ;  // swapped
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  conn_from ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  conn_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												script - > get_input_value_port_connection_source ( func ,  p_to . to_int ( ) ,  to_port ,  & conn_from ,  & conn_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " data_disconnect " ,  func ,  conn_from ,  conn_port ,  p_to . to_int ( ) ,  to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_connect " ,  func ,  conn_from ,  conn_port ,  p_to . to_int ( ) ,  to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! converted )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " data_connect " ,  func ,  p_from . to_int ( ) ,  from_port ,  p_to . to_int ( ) ,  to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_disconnect " ,  func ,  p_from . to_int ( ) ,  from_port ,  p_to . to_int ( ) ,  to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// this is noice
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " data_connect " ,  func ,  p_from . to_int ( ) ,  from_port ,  conv_node ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " data_connect " ,  func ,  conv_node ,  0 ,  p_to . to_int ( ) ,  to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// I don't think this is needed but gonna leave it here for now... until I need to finalise it all
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_disconnect " ,  func ,  p_from . to_int ( ) ,  from_port ,  conv_node ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_disconnect " ,  func ,  conv_node ,  0 ,  p_to . to_int ( ) ,  to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//update nodes in graph
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! converted )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " _update_graph " ,  p_from . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " _update_graph " ,  p_to . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " _update_graph " ,  p_from . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " _update_graph " ,  p_to . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph_connections " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph_connections " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _graph_disconnected ( const  String  & p_from ,  int  p_from_slot ,  const  String  & p_to ,  int  p_to_slot )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( p_from . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( func  ! =  _get_function_of_node ( p_to . to_int ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptNode >  from_node  =  script - > get_node ( func ,  p_from . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( ! from_node . is_valid ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  from_seq ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  from_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! _get_out_slot ( from_node ,  p_from_slot ,  from_port ,  from_seq ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ;  //can't connect this, it's invalid
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptNode >  to_node  =  script - > get_node ( func ,  p_to . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( ! to_node . is_valid ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  to_seq ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  to_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! _get_in_slot ( to_node ,  p_to_slot ,  to_port ,  to_seq ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ;  //can't connect this, it's invalid
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( from_seq  ! =  to_seq ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Disconnect Nodes " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( from_seq )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " sequence_disconnect " ,  func ,  p_from . to_int ( ) ,  from_port ,  p_to . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " sequence_connect " ,  func ,  p_from . to_int ( ) ,  from_port ,  p_to . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										can_swap  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										data_disconnect_node  =  p_to . to_int ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										data_disconnect_port  =  to_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " data_disconnect " ,  func ,  p_from . to_int ( ) ,  from_port ,  p_to . to_int ( ) ,  to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_connect " ,  func ,  p_from . to_int ( ) ,  from_port ,  p_to . to_int ( ) ,  to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//update relevant nodes in the graph
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " _update_graph " ,  p_from . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " _update_graph " ,  p_to . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " _update_graph " ,  p_from . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " _update_graph " ,  p_to . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph_connections " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph_connections " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _move_nodes_with_rescan ( const  StringName  & p_func_from ,  const  StringName  & p_func_to ,  int  p_id )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Set < int >  nodes_to_move ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HashMap < int ,  Map < int ,  int > >  seqconns_to_move ;  // from => List(outp, to)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HashMap < int ,  Map < int ,  Pair < int ,  int > > >  dataconns_to_move ;  // to => List(inp_p => from, outp)
 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									nodes_to_move . insert ( p_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Set < int >  sequence_connections ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < VisualScript : : SequenceConnection >  sequence_conns ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > get_sequence_connection_list ( p_func_from ,  & sequence_conns ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										HashMap < int ,  Map < int ,  int > >  seqcons ;  // from => List(out_p => to)
 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( List < VisualScript : : SequenceConnection > : : Element  * E  =  sequence_conns . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  from  =  E - > get ( ) . from_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  to  =  E - > get ( ) . to_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  out_p  =  E - > get ( ) . from_output ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! seqcons . has ( from ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												seqcons . set ( from ,  Map < int ,  int > ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											seqcons [ from ] . insert ( out_p ,  to ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											sequence_connections . insert ( to ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											sequence_connections . insert ( from ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  conn  =  p_id ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < int >  stack ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										HashMap < int ,  Set < int > >  seen ;  // from, outp
 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										while  ( seqcons . has ( conn ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( auto  E  =  seqcons [ conn ] . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( seen . has ( conn )  & &  seen [ conn ] . has ( E - > key ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( ! E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( stack . size ( )  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															conn  =  stack . back ( ) - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															stack . pop_back ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														conn  =  - 101 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! seen . has ( conn ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													seen . set ( conn ,  Set < int > ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												seen [ conn ] . insert ( E - > key ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												stack . push_back ( conn ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! seqconns_to_move . has ( conn ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													seqconns_to_move . set ( conn ,  Map < int ,  int > ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												seqconns_to_move [ conn ] . insert ( E - > key ( ) ,  E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												conn  =  E - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												nodes_to_move . insert ( conn ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! seqcons . has ( conn )  & &  stack . size ( )  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												conn  =  stack . back ( ) - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												stack . pop_back ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < VisualScript : : DataConnection >  data_connections ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > get_data_connection_list ( p_func_from ,  & data_connections ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-25 19:49:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  func_from_node_id  =  script - > get_function_node_id ( p_func_from ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										HashMap < int ,  Map < int ,  Pair < int ,  int > > >  connections ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( List < VisualScript : : DataConnection > : : Element  * E  =  data_connections . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  from  =  E - > get ( ) . from_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  to  =  E - > get ( ) . to_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  out_p  =  E - > get ( ) . from_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  in_p  =  E - > get ( ) . to_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-25 19:49:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// skip if the from_node is a function node
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( from  = =  func_from_node_id )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! connections . has ( to ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												connections . set ( to ,  Map < int ,  Pair < int ,  int > > ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											connections [ to ] . insert ( in_p ,  Pair < int ,  int > ( from ,  out_p ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// go through the HashMap and do all sorts of crazy ass stuff now...
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Set < int >  nodes_to_be_added ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( Set < int > : : Element  * F  =  nodes_to_move . front ( ) ;  F ;  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											HashMap < int ,  Set < int > >  seen ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											List < int >  stack ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  id  =  F - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											while  ( connections . has ( id ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( auto  E  =  connections [ id ] . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( seen . has ( id )  & &  seen [ id ] . has ( E - > key ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( ! E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															if  ( stack . size ( )  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																id  =  stack . back ( ) - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																stack . pop_back ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															id  =  - 11 ;  // I assume ids can't be negative should confirm it...
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-27 16:39:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( sequence_connections . has ( E - > get ( ) . first ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( ! nodes_to_move . has ( E - > get ( ) . first ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															if  ( stack . size ( )  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																id  =  stack . back ( ) - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																stack . pop_back ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															id  =  - 11 ;  // I assume ids can't be negative should confirm it...
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-27 16:39:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( ! seen . has ( id ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														seen . set ( id ,  Set < int > ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													seen [ id ] . insert ( E - > key ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													stack . push_back ( id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( ! dataconns_to_move . has ( id ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														dataconns_to_move . set ( id ,  Map < int ,  Pair < int ,  int > > ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													dataconns_to_move [ id ] . insert ( E - > key ( ) ,  Pair < int ,  int > ( E - > get ( ) . first ,  E - > get ( ) . second ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													id  =  E - > get ( ) . first ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													nodes_to_be_added . insert ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! connections . has ( id )  & &  stack . size ( )  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													id  =  stack . back ( ) - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													stack . pop_back ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( Set < int > : : Element  * E  =  nodes_to_be_added . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nodes_to_move . insert ( E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// * this is primarily for the sake of the having proper undo
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < VisualScript : : SequenceConnection >  seqext ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < VisualScript : : DataConnection >  dataext ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < VisualScript : : SequenceConnection >  seq_connections ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > get_sequence_connection_list ( p_func_from ,  & seq_connections ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( List < VisualScript : : SequenceConnection > : : Element  * E  =  seq_connections . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! nodes_to_move . has ( E - > get ( ) . from_node )  & &  nodes_to_move . has ( E - > get ( ) . to_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											seqext . push_back ( E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( nodes_to_move . has ( E - > get ( ) . from_node )  & &  ! nodes_to_move . has ( E - > get ( ) . to_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											seqext . push_back ( E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < VisualScript : : DataConnection >  data_connections ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script - > get_data_connection_list ( p_func_from ,  & data_connections ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( List < VisualScript : : DataConnection > : : Element  * E  =  data_connections . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! nodes_to_move . has ( E - > get ( ) . from_node )  & &  nodes_to_move . has ( E - > get ( ) . to_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dataext . push_back ( E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( nodes_to_move . has ( E - > get ( ) . from_node )  & &  ! nodes_to_move . has ( E - > get ( ) . to_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dataext . push_back ( E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// undo_redo->create_action("Rescan Functions");
 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( Set < int > : : Element  * E  =  nodes_to_move . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  id  =  E - > get ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " remove_node " ,  p_func_from ,  id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  p_func_to ,  id ,  script - > get_node ( p_func_from ,  id ) ,  script - > get_node_position ( p_func_from ,  id ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  p_func_to ,  id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " add_node " ,  p_func_from ,  id ,  script - > get_node ( p_func_from ,  id ) ,  script - > get_node_position ( p_func_from ,  id ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < int >  skeys ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									seqconns_to_move . get_key_list ( & skeys ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( List < int > : : Element  * E  =  skeys . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  from_node  =  E - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( Map < int ,  int > : : Element  * F  =  seqconns_to_move [ from_node ] . front ( ) ;  F ;  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  from_port  =  F - > key ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  to_node  =  F - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " sequence_connect " ,  p_func_to ,  from_node ,  from_port ,  to_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " sequence_connect " ,  p_func_from ,  from_node ,  from_port ,  to_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < int >  keys ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dataconns_to_move . get_key_list ( & keys ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( List < int > : : Element  * E  =  keys . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  to_node  =  E - > get ( ) ;  // to_node
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( Map < int ,  Pair < int ,  int > > : : Element  * F  =  dataconns_to_move [ E - > get ( ) ] . front ( ) ;  F ;  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  inp_p  =  F - > key ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Pair < int ,  int >  fro  =  F - > get ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " data_connect " ,  p_func_to ,  fro . first ,  fro . second ,  to_node ,  inp_p ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_connect " ,  p_func_from ,  fro . first ,  fro . second ,  to_node ,  inp_p ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// this to have proper undo operations
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( List < VisualScript : : SequenceConnection > : : Element  * E  =  seqext . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " sequence_connect " ,  p_func_from ,  E - > get ( ) . from_node ,  E - > get ( ) . from_output ,  E - > get ( ) . to_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( List < VisualScript : : DataConnection > : : Element  * E  =  dataext . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_connect " ,  p_func_from ,  E - > get ( ) . from_node ,  E - > get ( ) . from_port ,  E - > get ( ) . to_node ,  E - > get ( ) . to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// this doesn't need do methods as they are handled by the subsequent do calls implicitly
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// undo_redo->commit_action();
 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _graph_connect_to_empty ( const  String  & p_from ,  int  p_from_slot ,  const  Vector2  & p_release_pos )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Node  * node  =  graph - > get_node ( p_from ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GraphNode  * gn  =  Object : : cast_to < GraphNode > ( node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! gn )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( p_from . to_int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptNode >  vsn  =  script - > get_node ( func ,  p_from . to_int ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! vsn . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( vsn - > get_output_value_port_count ( )  | |  vsn - > get_output_sequence_port_count ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										port_action_pos  =  p_release_pos ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-23 19:29:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_from_slot  <  vsn - > get_output_sequence_port_count ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										port_action_node  =  p_from . to_int ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										port_action_output  =  p_from_slot ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_port_action_menu ( CREATE_ACTION ,  func ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										port_action_output  =  p_from_slot  -  vsn - > get_output_sequence_port_count ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										port_action_node  =  p_from . to_int ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_port_action_menu ( CREATE_CALL_SET_GET ,  func ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-23 19:29:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-12 12:52:50 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								VisualScriptNode : : TypeGuess  VisualScriptEditor : : _guess_output_type ( int  p_port_action_node ,  int  p_port_action_output ,  Set < int >  & visited_nodes )  {  
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									VisualScriptNode : : TypeGuess  tg ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tg . type  =  Variant : : NIL ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( visited_nodes . has ( p_port_action_node ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  tg ;  //no loop
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-12 12:52:50 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									visited_nodes . insert ( p_port_action_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( p_port_action_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptNode >  node  =  script - > get_node ( func ,  p_port_action_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-03 11:27:45 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! node . is_valid ( )  | |  node - > get_output_value_port_count ( )  < =  p_port_action_output )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  tg ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector < VisualScriptNode : : TypeGuess >  in_guesses ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  node - > get_input_value_port_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										PropertyInfo  pi  =  node - > get_input_value_port_info ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										VisualScriptNode : : TypeGuess  g ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										g . type  =  pi . type ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( g . type  = =  Variant : : NIL  | |  g . type  = =  Variant : : OBJECT )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											//any or object input, must further guess what this is
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  from_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  from_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( script - > get_input_value_port_connection_source ( func ,  p_port_action_node ,  i ,  & from_node ,  & from_port ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												g  =  _guess_output_type ( from_node ,  from_port ,  visited_nodes ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant  defval  =  node - > get_default_input_value ( i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( defval . get_type ( )  = =  Variant : : OBJECT )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Object  * obj  =  defval ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( obj )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														g . type  =  Variant : : OBJECT ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														g . gdclass  =  obj - > get_class ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														g . script  =  obj - > get_script ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										in_guesses . push_back ( g ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-25 00:07:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  node - > guess_output_type ( in_guesses . ptrw ( ) ,  p_port_action_output ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _port_action_menu ( int  p_option ,  const  StringName  & func )  {  
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Set < int >  vn ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( p_option )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  CREATE_CALL_SET_GET :  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < VisualScriptFunctionCall >  n ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											n . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											VisualScriptNode : : TypeGuess  tg  =  _guess_output_type ( port_action_node ,  port_action_output ,  vn ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( tg . gdclass  ! =  StringName ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												n - > set_base_type ( tg . gdclass ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												n - > set_base_type ( " Object " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											String  type_string ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( script - > get_node ( func ,  port_action_node ) - > get_output_value_port_count ( )  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												type_string  =  script - > get_node ( func ,  port_action_node ) - > get_output_value_port_info ( port_action_output ) . hint_string ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( tg . type  = =  Variant : : OBJECT )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( tg . script . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													new_connect_node_select - > select_from_script ( tg . script ,  " " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  if  ( type_string  ! =  String ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													new_connect_node_select - > select_from_base_type ( type_string ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													new_connect_node_select - > select_from_base_type ( n - > get_base_type ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  if  ( tg . type  = =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												new_connect_node_select - > select_from_base_type ( " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												new_connect_node_select - > select_from_basic_type ( tg . type ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// ensure that the dialog fits inside the graph
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Vector2  pos  =  mouse_up_position ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Size2  bounds  =  graph - > get_global_position ( )  +  graph - > get_size ( )  -  new_connect_node_select - > get_size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											pos . x  =  pos . x  >  bounds . x  ?  bounds . x  :  pos . x ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											pos . y  =  pos . y  >  bounds . y  ?  bounds . y  :  pos . y ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											new_connect_node_select - > set_position ( pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  CREATE_ACTION :  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											VisualScriptNode : : TypeGuess  tg  =  _guess_output_type ( port_action_node ,  port_action_output ,  vn ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PropertyInfo  property_info ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( script - > get_node ( func ,  port_action_node ) - > get_output_value_port_count ( )  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												property_info  =  script - > get_node ( func ,  port_action_node ) - > get_output_value_port_info ( port_action_output ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( tg . type  = =  Variant : : OBJECT )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( property_info . type  = =  Variant : : OBJECT  & &  property_info . hint_string  ! =  String ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													new_connect_node_select - > select_from_action ( property_info . hint_string ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													new_connect_node_select - > select_from_action ( " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  if  ( tg . type  = =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												new_connect_node_select - > select_from_action ( " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												new_connect_node_select - > select_from_action ( Variant : : get_type_name ( tg . type ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// ensure that the dialog fits inside the graph
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Vector2  pos  =  mouse_up_position ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Size2  bounds  =  graph - > get_global_position ( )  +  graph - > get_size ( )  -  new_connect_node_select - > get_size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											pos . x  =  pos . x  >  bounds . x  ?  bounds . x  :  pos . x ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											pos . y  =  pos . y  >  bounds . y  ?  bounds . y  :  pos . y ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											new_connect_node_select - > set_position ( pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : connect_data ( Ref < VisualScriptNode >  vnode_old ,  Ref < VisualScriptNode >  vnode ,  int  new_id )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Connect Node Data " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									VisualScriptReturn  * vnode_return  =  Object : : cast_to < VisualScriptReturn > ( vnode . ptr ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 16:00:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( vnode_return  ! =  nullptr  & &  vnode_old - > get_output_value_port_count ( )  >  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vnode_return - > set_enable_return_value ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( vnode_old - > get_output_value_port_count ( )  < =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( vnode - > get_input_value_port_count ( )  < =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  port  =  port_action_output ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  value_count  =  vnode_old - > get_output_value_port_count ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( port  > =  value_count )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										port  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( port_action_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( script . ptr ( ) ,  " data_connect " ,  func ,  port_action_node ,  port ,  new_id ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_disconnect " ,  func ,  port_action_node ,  port ,  new_id ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 11:49:41 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _selected_connect_node ( const  String  & p_text ,  const  String  & p_category ,  const  bool  p_connecting )  {  
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Vector2  pos  =  _get_pos_in_graph ( port_action_pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Set < int >  vn ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-21 20:28:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( drop_position  ! =  Vector2 ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pos  =  drop_position ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									drop_position  =  Vector2 ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  port_node_exists  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( port_action_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( func  = =  StringName ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										func  =  default_func ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										port_node_exists  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_category  = =  " visualscript " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < VisualScriptNode >  vnode_new  =  VisualScriptLanguage : : singleton - > create_node_from_name ( p_text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < VisualScriptNode >  vnode_old ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( port_node_exists )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vnode_old  =  script - > get_node ( func ,  port_action_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  new_id  =  script - > get_available_id ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( Object : : cast_to < VisualScriptOperator > ( vnode_new . ptr ( ) )  & &  vnode_old . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Variant : : Type  type  =  vnode_old - > get_output_value_port_info ( port_action_output ) . type ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Object : : cast_to < VisualScriptOperator > ( vnode_new . ptr ( ) ) - > set_typed ( type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( Object : : cast_to < VisualScriptTypeCast > ( vnode_new . ptr ( ) )  & &  vnode_old . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Variant : : Type  type  =  vnode_old - > get_output_value_port_info ( port_action_output ) . type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  hint_name  =  vnode_old - > get_output_value_port_info ( port_action_output ) . hint_string ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( type  = =  Variant : : OBJECT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Object : : cast_to < VisualScriptTypeCast > ( vnode_new . ptr ( ) ) - > set_base_type ( hint_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  if  ( type  = =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Object : : cast_to < VisualScriptTypeCast > ( vnode_new . ptr ( ) ) - > set_base_type ( " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Object : : cast_to < VisualScriptTypeCast > ( vnode_new . ptr ( ) ) - > set_base_type ( Variant : : get_type_name ( type ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > create_action ( TTR ( " Add Node " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  func ,  new_id ,  vnode_new ,  pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-03 13:40:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( vnode_old . is_valid ( )  & &  p_connecting )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 11:49:41 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											connect_seq ( vnode_old ,  vnode_new ,  new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											connect_data ( vnode_old ,  vnode_new ,  new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  func ,  new_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < VisualScriptNode >  vnode ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-15 21:42:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < VisualScriptPropertySet >  script_prop_set ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_category  = =  String ( " method " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < VisualScriptFunctionCall >  n ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										n . instance ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-21 20:28:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! drop_path . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( drop_path  = =  String ( " . " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												n - > set_call_mode ( VisualScriptFunctionCall : : CALL_MODE_SELF ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												n - > set_call_mode ( VisualScriptFunctionCall : : CALL_MODE_NODE_PATH ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												n - > set_base_path ( drop_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( drop_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											n - > set_base_type ( drop_node - > get_class ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( drop_node - > get_script_instance ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												n - > set_base_script ( drop_node - > get_script_instance ( ) - > get_script ( ) - > get_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vnode  =  n ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( p_category  = =  String ( " set " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < VisualScriptPropertySet >  n ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										n . instance ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-21 20:28:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! drop_path . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( drop_path  = =  String ( " . " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												n - > set_call_mode ( VisualScriptPropertySet : : CALL_MODE_SELF ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												n - > set_call_mode ( VisualScriptPropertySet : : CALL_MODE_NODE_PATH ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												n - > set_base_path ( drop_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( drop_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											n - > set_base_type ( drop_node - > get_class ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( drop_node - > get_script_instance ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												n - > set_base_script ( drop_node - > get_script_instance ( ) - > get_script ( ) - > get_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vnode  =  n ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-15 21:42:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										script_prop_set  =  n ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( p_category  = =  String ( " get " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < VisualScriptPropertyGet >  n ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										n . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										n - > set_property ( p_text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-21 20:28:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! drop_path . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( drop_path  = =  String ( " . " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												n - > set_call_mode ( VisualScriptPropertyGet : : CALL_MODE_SELF ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												n - > set_call_mode ( VisualScriptPropertyGet : : CALL_MODE_NODE_PATH ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												n - > set_base_path ( drop_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( drop_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											n - > set_base_type ( drop_node - > get_class ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( drop_node - > get_script_instance ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												n - > set_base_script ( drop_node - > get_script_instance ( ) - > get_script ( ) - > get_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vnode  =  n ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-21 20:28:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									drop_path  =  String ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									drop_node  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_category  = =  String ( " action " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( p_text  = =  " VisualScriptCondition " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < VisualScriptCondition >  n ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											n . instance ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vnode  =  n ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( p_text  = =  " VisualScriptSwitch " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < VisualScriptSwitch >  n ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											n . instance ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vnode  =  n ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( p_text  = =  " VisualScriptSequence " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < VisualScriptSequence >  n ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											n . instance ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vnode  =  n ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( p_text  = =  " VisualScriptIterator " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < VisualScriptIterator >  n ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											n . instance ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vnode  =  n ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( p_text  = =  " VisualScriptWhile " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < VisualScriptWhile >  n ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											n . instance ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vnode  =  n ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( p_text  = =  " VisualScriptReturn " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < VisualScriptReturn >  n ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											n . instance ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vnode  =  n ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  new_id  =  script - > get_available_id ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Add Node " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  func ,  new_id ,  vnode ,  pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  func ,  new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ,  new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ,  new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( script_prop_set . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-15 21:42:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										script_prop_set - > set_property ( p_text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-15 21:42:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									port_action_new_node  =  new_id ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < VisualScriptNode >  vsn  =  script - > get_node ( func ,  port_action_new_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-12 07:58:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( Object : : cast_to < VisualScriptFunctionCall > ( vsn . ptr ( ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < VisualScriptFunctionCall >  vsfc  =  vsn ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vsfc - > set_function ( p_text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( port_node_exists  & &  p_connecting )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-12 09:27:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											VisualScriptNode : : TypeGuess  tg  =  _guess_output_type ( port_action_node ,  port_action_output ,  vn ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-12 09:27:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( tg . type  = =  Variant : : OBJECT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsfc - > set_call_mode ( VisualScriptFunctionCall : : CALL_MODE_INSTANCE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsfc - > set_base_type ( String ( " " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( tg . gdclass  ! =  StringName ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													vsfc - > set_base_type ( tg . gdclass ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  if  ( script - > get_node ( func ,  port_action_node ) . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													PropertyHint  hint  =  script - > get_node ( func ,  port_action_node ) - > get_output_value_port_info ( port_action_output ) . hint ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													String  base_type  =  script - > get_node ( func ,  port_action_node ) - > get_output_value_port_info ( port_action_output ) . hint_string ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-12 09:27:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( base_type  ! =  String ( )  & &  hint  = =  PROPERTY_HINT_TYPE_STRING )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														vsfc - > set_base_type ( base_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( p_text  = =  " call "  | |  p_text  = =  " call_deferred " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														vsfc - > set_function ( String ( " " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-12 09:27:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( tg . script . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													vsfc - > set_base_script ( tg . script - > get_path ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-12 09:27:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  if  ( tg . type  = =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsfc - > set_call_mode ( VisualScriptFunctionCall : : CALL_MODE_INSTANCE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsfc - > set_base_type ( String ( " " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsfc - > set_call_mode ( VisualScriptFunctionCall : : CALL_MODE_BASIC_TYPE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsfc - > set_basic_type ( tg . type ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( port_node_exists  & &  p_connecting )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-12 09:27:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( Object : : cast_to < VisualScriptPropertySet > ( vsn . ptr ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < VisualScriptPropertySet >  vsp  =  vsn ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-12 09:27:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											VisualScriptNode : : TypeGuess  tg  =  _guess_output_type ( port_action_node ,  port_action_output ,  vn ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( tg . type  = =  Variant : : OBJECT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsp - > set_call_mode ( VisualScriptPropertySet : : CALL_MODE_INSTANCE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsp - > set_base_type ( String ( " " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( tg . gdclass  ! =  StringName ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													vsp - > set_base_type ( tg . gdclass ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  if  ( script - > get_node ( func ,  port_action_node ) . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													PropertyHint  hint  =  script - > get_node ( func ,  port_action_node ) - > get_output_value_port_info ( port_action_output ) . hint ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													String  base_type  =  script - > get_node ( func ,  port_action_node ) - > get_output_value_port_info ( port_action_output ) . hint_string ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-12 09:27:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( base_type  ! =  String ( )  & &  hint  = =  PROPERTY_HINT_TYPE_STRING )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														vsp - > set_base_type ( base_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-12 09:27:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( tg . script . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													vsp - > set_base_script ( tg . script - > get_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  if  ( tg . type  = =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsp - > set_call_mode ( VisualScriptPropertySet : : CALL_MODE_INSTANCE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsp - > set_base_type ( String ( " " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsp - > set_call_mode ( VisualScriptPropertySet : : CALL_MODE_BASIC_TYPE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsp - > set_basic_type ( tg . type ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-12 09:27:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( Object : : cast_to < VisualScriptPropertyGet > ( vsn . ptr ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < VisualScriptPropertyGet >  vsp  =  vsn ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-12 09:27:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											VisualScriptNode : : TypeGuess  tg  =  _guess_output_type ( port_action_node ,  port_action_output ,  vn ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( tg . type  = =  Variant : : OBJECT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsp - > set_call_mode ( VisualScriptPropertyGet : : CALL_MODE_INSTANCE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsp - > set_base_type ( String ( " " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( tg . gdclass  ! =  StringName ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													vsp - > set_base_type ( tg . gdclass ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  if  ( script - > get_node ( func ,  port_action_node ) . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													PropertyHint  hint  =  script - > get_node ( func ,  port_action_node ) - > get_output_value_port_info ( port_action_output ) . hint ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													String  base_type  =  script - > get_node ( func ,  port_action_node ) - > get_output_value_port_info ( port_action_output ) . hint_string ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-12 09:27:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( base_type  ! =  String ( )  & &  hint  = =  PROPERTY_HINT_TYPE_STRING )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														vsp - > set_base_type ( base_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-12 09:27:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( tg . script . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													vsp - > set_base_script ( tg . script - > get_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  if  ( tg . type  = =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsp - > set_call_mode ( VisualScriptPropertyGet : : CALL_MODE_INSTANCE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsp - > set_base_type ( String ( " " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsp - > set_call_mode ( VisualScriptPropertyGet : : CALL_MODE_BASIC_TYPE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vsp - > set_basic_type ( tg . type ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( port_node_exists )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < VisualScriptNode >  vnode_old  =  script - > get_node ( func ,  port_action_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( vnode_old . is_valid ( )  & &  p_connecting )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											connect_seq ( vnode_old ,  vnode ,  port_action_new_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											connect_data ( vnode_old ,  vnode ,  port_action_new_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 11:49:41 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:59:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_update_graph ( port_action_new_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( port_node_exists )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_update_graph_connections ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : connect_seq ( Ref < VisualScriptNode >  vnode_old ,  Ref < VisualScriptNode >  vnode_new ,  int  new_id )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									VisualScriptOperator  * vnode_operator  =  Object : : cast_to < VisualScriptOperator > ( vnode_new . ptr ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 16:00:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( vnode_operator  ! =  nullptr  & &  ! vnode_operator - > has_input_sequence_port ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									VisualScriptConstructor  * vnode_constructor  =  Object : : cast_to < VisualScriptConstructor > ( vnode_new . ptr ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 16:00:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( vnode_constructor  ! =  nullptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( vnode_old - > get_output_sequence_port_count ( )  < =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-06 16:20:41 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! vnode_new - > has_input_sequence_port ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-27 11:24:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( port_action_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Connect Node Sequence " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  pass_port  =  - vnode_old - > get_output_sequence_port_count ( )  +  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  return_port  =  port_action_output  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( vnode_old - > get_output_value_port_info ( port_action_output ) . name  = =  String ( " pass " )  & & 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											! script - > get_output_sequence_ports_connected ( func ,  port_action_node ) . has ( pass_port ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " sequence_connect " ,  func ,  port_action_node ,  pass_port ,  new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " sequence_disconnect " ,  func ,  port_action_node ,  pass_port ,  new_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( vnode_old - > get_output_value_port_info ( port_action_output ) . name  = =  String ( " return " )  & & 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-28 13:23:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											! script - > get_output_sequence_ports_connected ( func ,  port_action_node ) . has ( return_port ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " sequence_connect " ,  func ,  port_action_node ,  return_port ,  new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										undo_redo - > add_undo_method ( script . ptr ( ) ,  " sequence_disconnect " ,  func ,  port_action_node ,  return_port ,  new_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  port  =  0 ;  port  <  vnode_old - > get_output_sequence_port_count ( ) ;  port + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  count  =  vnode_old - > get_output_sequence_port_count ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( port_action_output  <  count  & &  ! script - > get_output_sequence_ports_connected ( func ,  port_action_node ) . has ( port_action_output ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " sequence_connect " ,  func ,  port_action_node ,  port_action_output ,  new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " sequence_disconnect " ,  func ,  port_action_node ,  port_action_output ,  new_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  if  ( ! script - > get_output_sequence_ports_connected ( func ,  port_action_node ) . has ( port ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " sequence_connect " ,  func ,  port_action_node ,  port ,  new_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " sequence_disconnect " ,  func ,  port_action_node ,  port ,  new_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 11:49:41 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _selected_new_virtual_method ( const  String  & p_text ,  const  String  & p_category ,  const  bool  p_connecting )  {  
						 
					
						
							
								
									
										
										
										
											2017-09-12 07:58:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  name  =  p_text ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( script - > has_function ( name ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EditorNode : : get_singleton ( ) - > show_warning ( vformat ( TTR ( " Script already has function '%s' " ) ,  name ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									MethodInfo  minfo ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										List < MethodInfo >  methods ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bool  found  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ClassDB : : get_virtual_methods ( script - > get_instance_base_type ( ) ,  & methods ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( List < MethodInfo > : : Element  * E  =  methods . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E - > get ( ) . name  = =  name )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												minfo  =  E - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												found  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ERR_FAIL_COND ( ! found ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									selected  =  name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptFunction >  func_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_node . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_node - > set_name ( name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Add Function " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( script . ptr ( ) ,  " add_function " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  minfo . arguments . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 14:23:26 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										func_node - > add_argument ( minfo . arguments [ i ] . type ,  minfo . arguments [ i ] . name ,  - 1 ,  minfo . arguments [ i ] . hint ,  minfo . arguments [ i ] . hint_string ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-12 07:58:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Vector2  pos  =  _get_available_pos ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  name ,  script - > get_available_id ( ) ,  func_node ,  pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-12 07:58:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( minfo . return_val . type  ! =  Variant : : NIL  | |  minfo . return_val . usage  &  PROPERTY_USAGE_NIL_IS_VARIANT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < VisualScriptReturn >  ret_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ret_node . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ret_node - > set_return_type ( minfo . return_val . type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ret_node - > set_enable_return_value ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ret_node - > set_name ( name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  name ,  script - > get_available_id ( )  +  1 ,  ret_node ,  _get_available_pos ( false ,  pos  +  Vector2 ( 500 ,  0 ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-12 07:58:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_function " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_update_graph ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _cancel_connect_node ( )  {  
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// ensure the cancel is done
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									port_action_new_node  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-22 21:55:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  VisualScriptEditor : : _create_new_node_from_name ( const  String  & p_text ,  const  Vector2  & p_point ,  const  StringName  & p_func )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									StringName  func  =  default_func ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_func  ! =  StringName ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										func  =  p_func ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < VisualScriptNode >  vnode  =  VisualScriptLanguage : : singleton - > create_node_from_name ( p_text ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  new_id  =  script - > get_available_id ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Add Node " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  func ,  new_id ,  vnode ,  p_point ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  func ,  new_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  new_id ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _default_value_changed ( )  {  
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < VisualScriptNode >  vsn  =  script - > get_node ( _get_function_of_node ( editing_id ) ,  editing_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( vsn . is_null ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-23 22:25:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Change Input Value " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( vsn . ptr ( ) ,  " set_default_input_value " ,  editing_input ,  default_value_edit - > get_variant ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( vsn . ptr ( ) ,  " set_default_input_value " ,  editing_input ,  vsn - > get_default_input_value ( editing_input ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( this ,  " _update_graph " ,  editing_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( this ,  " _update_graph " ,  editing_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _default_value_edited ( Node  * p_button ,  int  p_id ,  int  p_input_port )  {  
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < VisualScriptNode >  vsn  =  script - > get_node ( _get_function_of_node ( p_id ) ,  p_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( vsn . is_null ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									PropertyInfo  pinfo  =  vsn - > get_input_value_port_info ( p_input_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Variant  existing  =  vsn - > get_default_input_value ( p_input_port ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pinfo . type  ! =  Variant : : NIL  & &  existing . get_type ( )  ! =  pinfo . type )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Variant : : CallError  ce ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  Variant  * existingp  =  & existing ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										existing  =  Variant : : construct ( pinfo . type ,  & existingp ,  1 ,  ce ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default_value_edit - > set_position ( Object : : cast_to < Control > ( p_button ) - > get_global_position ( )  +  Vector2 ( 0 ,  Object : : cast_to < Control > ( p_button ) - > get_size ( ) . y ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default_value_edit - > set_size ( Size2 ( 1 ,  1 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-12 09:20:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( pinfo . type  = =  Variant : : NODE_PATH )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Node  * edited_scene  =  get_tree ( ) - > get_edited_scene_root ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( edited_scene )  {  // Fixing an old crash bug ( Visual Script Crashes on editing NodePath with an empty scene open)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Node  * script_node  =  _find_script_node ( edited_scene ,  edited_scene ,  script ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-12 09:20:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( script_node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												//pick a node relative to the script, IF the script exists
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pinfo . hint  =  PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pinfo . hint_string  =  script_node - > get_path ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												//pick a path relative to edited scene
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pinfo . hint  =  PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pinfo . hint_string  =  get_tree ( ) - > get_edited_scene_root ( ) - > get_path ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-12 09:20:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 16:00:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( default_value_edit - > edit ( nullptr ,  pinfo . name ,  pinfo . type ,  existing ,  pinfo . hint ,  pinfo . hint_string ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( pinfo . hint  = =  PROPERTY_HINT_MULTILINE_TEXT )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											default_value_edit - > popup_centered_ratio ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											default_value_edit - > popup ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									editing_id  =  p_id ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									editing_input  =  p_input_port ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _show_hint ( const  String  & p_hint )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									hint_text - > set_text ( p_hint ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									hint_text - > show ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									hint_text_timer - > start ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _hide_timer ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									hint_text - > hide ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _notification ( int  p_what )  {  
						 
					
						
							
								
									
										
										
										
											2019-09-27 19:59:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( p_what )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  NOTIFICATION_READY :  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-28 16:14:14 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											variable_editor - > connect ( " changed " ,  this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											signal_editor - > connect ( " changed " ,  this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 19:59:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											FALLTHROUGH ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-28 16:14:14 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 19:59:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  NOTIFICATION_THEME_CHANGED :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( p_what  ! =  NOTIFICATION_READY  & &  ! is_visible_in_tree ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-08 14:41:44 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-30 10:42:37 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											edit_variable_edit - > add_style_override ( " bg " ,  get_stylebox ( " bg " ,  " Tree " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											edit_signal_edit - > add_style_override ( " bg " ,  get_stylebox ( " bg " ,  " Tree " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 19:59:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											func_input_scroll - > add_style_override ( " bg " ,  get_stylebox ( " bg " ,  " Tree " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-02 21:31:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 19:59:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Ref < Theme >  tm  =  EditorNode : : get_singleton ( ) - > get_theme_base ( ) - > get_theme ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-02 21:31:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 19:59:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											bool  dark_theme  =  tm - > get_constant ( " dark_theme " ,  " Editor " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-08 14:41:44 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											List < Pair < String ,  Color > >  colors ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 19:59:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( dark_theme )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												colors . push_back ( Pair < String ,  Color > ( " flow_control " ,  Color ( 0.96 ,  0.96 ,  0.96 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												colors . push_back ( Pair < String ,  Color > ( " functions " ,  Color ( 0.96 ,  0.52 ,  0.51 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												colors . push_back ( Pair < String ,  Color > ( " data " ,  Color ( 0.5 ,  0.96 ,  0.81 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												colors . push_back ( Pair < String ,  Color > ( " operators " ,  Color ( 0.67 ,  0.59 ,  0.87 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												colors . push_back ( Pair < String ,  Color > ( " custom " ,  Color ( 0.5 ,  0.73 ,  0.96 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												colors . push_back ( Pair < String ,  Color > ( " constants " ,  Color ( 0.96 ,  0.5 ,  0.69 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												colors . push_back ( Pair < String ,  Color > ( " flow_control " ,  Color ( 0.26 ,  0.26 ,  0.26 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												colors . push_back ( Pair < String ,  Color > ( " functions " ,  Color ( 0.95 ,  0.4 ,  0.38 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												colors . push_back ( Pair < String ,  Color > ( " data " ,  Color ( 0.07 ,  0.73 ,  0.51 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												colors . push_back ( Pair < String ,  Color > ( " operators " ,  Color ( 0.51 ,  0.4 ,  0.82 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												colors . push_back ( Pair < String ,  Color > ( " custom " ,  Color ( 0.31 ,  0.63 ,  0.95 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												colors . push_back ( Pair < String ,  Color > ( " constants " ,  Color ( 0.94 ,  0.18 ,  0.49 ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-08 14:41:44 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-28 16:14:14 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( List < Pair < String ,  Color > > : : Element  * E  =  colors . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 19:59:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Ref < StyleBoxFlat >  sb  =  tm - > get_stylebox ( " frame " ,  " GraphNode " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! sb . is_null ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Ref < StyleBoxFlat >  frame_style  =  sb - > duplicate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Color  c  =  sb - > get_border_color ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Color  cn  =  E - > get ( ) . second ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													cn . a  =  c . a ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													frame_style - > set_border_color ( cn ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													node_styles [ E - > get ( ) . first ]  =  frame_style ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( is_visible_in_tree ( )  & &  script . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_update_members ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_update_graph ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  NOTIFICATION_VISIBILITY_CHANGED :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											members_section - > set_visible ( is_visible_in_tree ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _graph_ofs_changed ( const  Vector2  & p_ofs )  {  
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( updating_graph  | |  ! script . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_graph  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Just use the default func for all the properties that need to be handled for drawing rather than adding to the Visual Script Class
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( script - > has_function ( default_func ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script - > set_function_scroll ( default_func ,  graph - > get_scroll_ofs ( )  /  EDSCALE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										script - > set_edited ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_graph  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _comment_node_resized ( const  Vector2  & p_new_size ,  int  p_node )  {  
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( updating_graph )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									StringName  func  =  _get_function_of_node ( p_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptComment >  vsc  =  script - > get_node ( func ,  p_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( vsc . is_null ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Node  * node  =  graph - > get_node ( itos ( p_node ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GraphNode  * gn  =  Object : : cast_to < GraphNode > ( node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! gn )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 21:39:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Vector2  new_size  =  p_new_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( graph - > is_using_snap ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Vector2  snap  =  Vector2 ( graph - > get_snap ( ) ,  graph - > get_snap ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Vector2  min_size  =  ( gn - > get_minimum_size ( )  +  ( snap  *  0.5 ) ) . snapped ( snap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										new_size  =  new_size . snapped ( snap ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										new_size . x  =  MAX ( new_size . x ,  min_size . x ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										new_size . y  =  MAX ( new_size . y ,  min_size . y ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_graph  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									graph - > set_block_minimum_size_adjust ( true ) ;  //faster resize
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-02-21 16:41:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > create_action ( TTR ( " Resize Comment " ) ,  UndoRedo : : MERGE_ENDS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 21:39:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_do_method ( vsc . ptr ( ) ,  " set_size " ,  new_size  /  EDSCALE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > add_undo_method ( vsc . ptr ( ) ,  " set_size " ,  vsc - > get_size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-06 21:39:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gn - > set_custom_minimum_size ( new_size ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gn - > set_size ( Size2 ( 1 ,  1 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graph - > set_block_minimum_size_adjust ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_graph  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _menu_option ( int  p_what )  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( p_what )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  EDIT_DELETE_NODES :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_on_nodes_delete ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  EDIT_TOGGLE_BREAKPOINT :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											List < String >  reselect ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( int  i  =  0 ;  i  <  graph - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GraphNode  * gn  =  Object : : cast_to < GraphNode > ( graph - > get_child ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( gn )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( gn - > is_selected ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														int  id  =  String ( gn - > get_name ( ) ) . to_int ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														StringName  func  =  _get_function_of_node ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Ref < VisualScriptNode >  vsn  =  script - > get_node ( func ,  id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if  ( vsn . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															vsn - > set_breakpoint ( ! vsn - > is_breakpoint ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															reselect . push_back ( gn - > get_name ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_update_graph ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( List < String > : : Element  * E  =  reselect . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GraphNode  * gn  =  Object : : cast_to < GraphNode > ( graph - > get_node ( E - > get ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												gn - > set_selected ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-08 01:41:57 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  EDIT_FIND_NODE_TYPE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-01 08:27:22 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_generic_search ( script - > get_instance_base_type ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-13 19:23:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-05 15:10:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  EDIT_COPY_NODES :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_on_nodes_copy ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  EDIT_CUT_NODES :  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-05 15:10:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_on_nodes_copy ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_on_nodes_delete ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-08 01:41:57 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  EDIT_PASTE_NODES :  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-05 15:10:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_on_nodes_paste ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  EDIT_CREATE_FUNCTION :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											StringName  function  =  " " ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Map < int ,  Ref < VisualScriptNode > >  nodes ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Set < int >  selections ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( int  i  =  0 ;  i  <  graph - > get_child_count ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GraphNode  * gn  =  Object : : cast_to < GraphNode > ( graph - > get_child ( i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( gn )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( gn - > is_selected ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														int  id  =  String ( gn - > get_name ( ) ) . to_int ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														StringName  func  =  _get_function_of_node ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Ref < VisualScriptNode >  node  =  script - > get_node ( func ,  id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( Object : : cast_to < VisualScriptFunction > ( * node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															EditorNode : : get_singleton ( ) - > show_warning ( TTR ( " Can't create function with a function node. " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( node . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															if  ( func  ! =  function  & &  function  ! =  StringName ( " " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																EditorNode : : get_singleton ( ) - > show_warning ( TTR ( " Can't create function of nodes from nodes of multiple functions. " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															nodes . insert ( id ,  node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															selections . insert ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															function  =  func ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( nodes . size ( )  = =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return ;  // nothing to be done if there are no valid nodes selected
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Set < VisualScript : : SequenceConnection >  seqmove ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Set < VisualScript : : DataConnection >  datamove ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Set < VisualScript : : SequenceConnection >  seqext ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Set < VisualScript : : DataConnection >  dataext ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  start_node  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Set < int >  end_nodes ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( nodes . size ( )  = =  1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < VisualScriptNode >  nd  =  script - > get_node ( function ,  nodes . front ( ) - > key ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( nd . is_valid ( )  & &  nd - > has_input_sequence_port ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													start_node  =  nodes . front ( ) - > key ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-01 16:10:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													EditorNode : : get_singleton ( ) - > show_warning ( TTR ( " Select at least one node with sequence port. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												List < VisualScript : : SequenceConnection >  seqs ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												script - > get_sequence_connection_list ( function ,  & seqs ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( seqs . size ( )  = =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// in case there are no sequence connections
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// select the top most node cause that's probably how
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// the user wants to connect the nodes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													int  top_nd  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Vector2  top ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													for  ( Map < int ,  Ref < VisualScriptNode > > : : Element  * E  =  nodes . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Ref < VisualScriptNode >  nd  =  script - > get_node ( function ,  E - > key ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( nd . is_valid ( )  & &  nd - > has_input_sequence_port ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															if  ( top_nd  <  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																top_nd  =  E - > key ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																top  =  script - > get_node_position ( function ,  top_nd ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Vector2  pos  =  script - > get_node_position ( function ,  E - > key ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															if  ( top . y  >  pos . y )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																top_nd  =  E - > key ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																top  =  pos ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Ref < VisualScriptNode >  nd  =  script - > get_node ( function ,  top_nd ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( nd . is_valid ( )  & &  nd - > has_input_sequence_port ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														start_node  =  top_nd ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-01 16:10:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														EditorNode : : get_singleton ( ) - > show_warning ( TTR ( " Select at least one node with sequence port. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// pick the node with input sequence
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Set < int >  nodes_from ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Set < int >  nodes_to ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													for  ( List < VisualScript : : SequenceConnection > : : Element  * E  =  seqs . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( nodes . has ( E - > get ( ) . from_node )  & &  nodes . has ( E - > get ( ) . to_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															seqmove . insert ( E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															nodes_from . insert ( E - > get ( ) . from_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														}  else  if  ( nodes . has ( E - > get ( ) . from_node )  & &  ! nodes . has ( E - > get ( ) . to_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															seqext . insert ( E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														}  else  if  ( ! nodes . has ( E - > get ( ) . from_node )  & &  nodes . has ( E - > get ( ) . to_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															if  ( start_node  = =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																seqext . insert ( E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																start_node  =  E - > get ( ) . to_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																EditorNode : : get_singleton ( ) - > show_warning ( TTR ( " Try to only have one sequence input in selection. " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nodes_to . insert ( E - > get ( ) . to_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// to use to add return nodes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													_get_ends ( start_node ,  seqs ,  selections ,  end_nodes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( start_node  = =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														// if we still don't have a start node then
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														// run through the nodes and select the first tree node
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														// ie node without any input sequence but output sequence
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														for  ( Set < int > : : Element  * E  =  nodes_from . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															if  ( ! nodes_to . has ( E - > get ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																start_node  =  E - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( start_node  = =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return ;  // this should not happen, but just in case something goes wrong
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											List < Variant : : Type >  inputs ;  // input types
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											List < Pair < int ,  int > >  input_connections ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												List < VisualScript : : DataConnection >  dats ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												script - > get_data_connection_list ( function ,  & dats ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( List < VisualScript : : DataConnection > : : Element  * E  =  dats . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( nodes . has ( E - > get ( ) . from_node )  & &  nodes . has ( E - > get ( ) . to_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														datamove . insert ( E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  if  ( ! nodes . has ( E - > get ( ) . from_node )  & &  nodes . has ( E - > get ( ) . to_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														// add all these as inputs for the Function
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Ref < VisualScriptNode >  node  =  script - > get_node ( function ,  E - > get ( ) . to_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( node . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															dataext . insert ( E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															PropertyInfo  pi  =  node - > get_input_value_port_info ( E - > get ( ) . to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															inputs . push_back ( pi . type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															input_connections . push_back ( Pair < int ,  int > ( E - > get ( ) . to_node ,  E - > get ( ) . to_port ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  if  ( nodes . has ( E - > get ( ) . from_node )  & &  ! nodes . has ( E - > get ( ) . to_node ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														dataext . insert ( E - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  new_fn  =  _validate_name ( " new_function " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Vector2  pos  =  _get_available_pos ( false ,  script - > get_node_position ( function ,  start_node )  -  Vector2 ( 80 ,  150 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < VisualScriptFunction >  func_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											func_node . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											func_node - > set_name ( new_fn ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > create_action ( TTR ( " Create Function " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " add_function " ,  new_fn ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  fn_id  =  script - > get_available_id ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  new_fn ,  fn_id ,  func_node ,  pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_function " ,  new_fn ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " emit_signal " ,  " edited_script_changed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Move the nodes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( Map < int ,  Ref < VisualScriptNode > > : : Element  * E  =  nodes . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " remove_node " ,  function ,  E - > key ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  new_fn ,  E - > key ( ) ,  E - > get ( ) ,  script - > get_node_position ( function ,  E - > key ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// undo_redo->add_undo_method(script.ptr(), "remove_node", new_fn, E->key()); not needed cause we already remove the function :P
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " add_node " ,  function ,  E - > key ( ) ,  E - > get ( ) ,  script - > get_node_position ( function ,  E - > key ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( Set < VisualScript : : SequenceConnection > : : Element  * E  =  seqmove . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " sequence_connect " ,  new_fn ,  E - > get ( ) . from_node ,  E - > get ( ) . from_output ,  E - > get ( ) . to_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " sequence_connect " ,  function ,  E - > get ( ) . from_node ,  E - > get ( ) . from_output ,  E - > get ( ) . to_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( Set < VisualScript : : DataConnection > : : Element  * E  =  datamove . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " data_connect " ,  new_fn ,  E - > get ( ) . from_node ,  E - > get ( ) . from_port ,  E - > get ( ) . to_node ,  E - > get ( ) . to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_connect " ,  function ,  E - > get ( ) . from_node ,  E - > get ( ) . from_port ,  E - > get ( ) . to_node ,  E - > get ( ) . to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Add undo for external connections as well so that it's easier to revert back and forth
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// these didn't require do methods as it's already handled internally by other do calls
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( Set < VisualScript : : SequenceConnection > : : Element  * E  =  seqext . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " sequence_connect " ,  function ,  E - > get ( ) . from_node ,  E - > get ( ) . from_output ,  E - > get ( ) . to_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( Set < VisualScript : : DataConnection > : : Element  * E  =  dataext . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_connect " ,  function ,  E - > get ( ) . from_node ,  E - > get ( ) . from_port ,  E - > get ( ) . to_node ,  E - > get ( ) . to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// I don't really think we need support for non sequenced functions at this moment
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( script . ptr ( ) ,  " sequence_connect " ,  new_fn ,  fn_id ,  0 ,  start_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// end nodes are mapped to the return nodes with data connections if possible
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  m  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( Set < int > : : Element  * G  =  end_nodes . front ( ) ;  G ;  G  =  G - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < VisualScriptReturn >  ret_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ret_node . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  ret_id  =  fn_id  +  ( m + + ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												selections . insert ( ret_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-29 15:31:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Vector2  posi  =  _get_available_pos ( false ,  script - > get_node_position ( function ,  G - > get ( ) )  +  Vector2 ( 80 ,  - 100 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " add_node " ,  new_fn ,  ret_id ,  ret_node ,  posi ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " remove_node " ,  new_fn ,  ret_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " sequence_connect " ,  new_fn ,  G - > get ( ) ,  0 ,  ret_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// add data outputs from each of the end_nodes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < VisualScriptNode >  vsn  =  script - > get_node ( function ,  G - > get ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( vsn . is_valid ( )  & &  vsn - > get_output_value_port_count ( )  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ret_node - > set_enable_return_value ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// use the zeroth data port cause that's the likely one that is planned to be used
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ret_node - > set_return_type ( vsn - > get_output_value_port_info ( 0 ) . type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_do_method ( script . ptr ( ) ,  " data_connect " ,  new_fn ,  G - > get ( ) ,  0 ,  ret_id ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// * might make the system more intelligent by checking port from info.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  i  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 14:20:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											List < Pair < int ,  int > > : : Element  * F  =  input_connections . front ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( List < Variant : : Type > : : Element  * E  =  inputs . front ( ) ;  E  & &  F ;  E  =  E - > next ( ) ,  F  =  F - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												func_node - > add_argument ( E - > get ( ) ,  " arg_ "  +  String : : num_int64 ( i ) ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " data_connect " ,  new_fn ,  fn_id ,  i ,  F - > get ( ) . first ,  F - > get ( ) . second ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												i + + ;  // increment i
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// make sure all Nodes get marked for selection so that they can be moved together
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											selections . insert ( fn_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( int  k  =  0 ;  k  <  graph - > get_child_count ( ) ;  k + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GraphNode  * gn  =  Object : : cast_to < GraphNode > ( graph - > get_child ( k ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( gn )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													int  id  =  gn - > get_name ( ) . operator  String ( ) . to_int ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													gn - > set_selected ( selections . has ( id ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Ensure Preview Selection is of newly created function node
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( selections . size ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												EditorNode : : get_singleton ( ) - > push_item ( func_node . ptr ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  REFRESH_GRAPH :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_update_graph ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// this is likely going to be very slow and I am not sure if I should keep it
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// but I hope that it will not be a problem considering that we won't be creating functions so frequently
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// and cyclic connections would be a problem but hopefully we won't let them get to this point
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _get_ends ( int  p_node ,  const  List < VisualScript : : SequenceConnection >  & p_seqs ,  const  Set < int >  & p_selected ,  Set < int >  & r_end_nodes )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( const  List < VisualScript : : SequenceConnection > : : Element  * E  =  p_seqs . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  from  =  E - > get ( ) . from_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  to  =  E - > get ( ) . to_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( from  = =  p_node  & &  p_selected . has ( to ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// this is an interior connection move forward to the to node
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_get_ends ( to ,  p_seqs ,  p_selected ,  r_end_nodes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( from  = =  p_node  & &  ! p_selected . has ( to ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											r_end_nodes . insert ( from ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _member_rmb_selected ( const  Vector2  & p_pos )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									TreeItem  * ti  =  members - > get_selected ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( ! ti ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									member_popup - > clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									member_popup - > set_position ( members - > get_global_position ( )  +  p_pos ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									member_popup - > set_size ( Vector2 ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									function_name_edit - > set_position ( members - > get_global_position ( )  +  p_pos ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_name_edit - > set_size ( Vector2 ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									TreeItem  * root  =  members - > get_root ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-08 01:06:02 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < Texture >  del_icon  =  Control : : get_icon ( " Remove " ,  " EditorIcons " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < Texture >  edit_icon  =  Control : : get_icon ( " Edit " ,  " EditorIcons " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ti - > get_parent ( )  = =  root - > get_children ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										member_type  =  MEMBER_FUNCTION ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										member_name  =  ti - > get_text ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										member_popup - > add_icon_shortcut ( edit_icon ,  ED_GET_SHORTCUT ( " visual_script_editor/edit_member " ) ,  MEMBER_EDIT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										member_popup - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-05 14:45:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										member_popup - > add_icon_shortcut ( del_icon ,  ED_GET_SHORTCUT ( " visual_script_editor/delete_selected " ) ,  MEMBER_REMOVE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										member_popup - > popup ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ti - > get_parent ( )  = =  root - > get_children ( ) - > get_next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										member_type  =  MEMBER_VARIABLE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										member_name  =  ti - > get_text ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-05 14:45:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										member_popup - > add_icon_shortcut ( edit_icon ,  ED_GET_SHORTCUT ( " visual_script_editor/edit_member " ) ,  MEMBER_EDIT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										member_popup - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-05 14:45:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										member_popup - > add_icon_shortcut ( del_icon ,  ED_GET_SHORTCUT ( " visual_script_editor/delete_selected " ) ,  MEMBER_REMOVE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										member_popup - > popup ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ti - > get_parent ( )  = =  root - > get_children ( ) - > get_next ( ) - > get_next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										member_type  =  MEMBER_SIGNAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										member_name  =  ti - > get_text ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-05 14:45:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										member_popup - > add_icon_shortcut ( edit_icon ,  ED_GET_SHORTCUT ( " visual_script_editor/edit_member " ) ,  MEMBER_EDIT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										member_popup - > add_separator ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-05 14:45:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										member_popup - > add_icon_shortcut ( del_icon ,  ED_GET_SHORTCUT ( " visual_script_editor/delete_selected " ) ,  MEMBER_REMOVE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										member_popup - > popup ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _member_option ( int  p_option )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( member_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  MEMBER_FUNCTION :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( p_option  = =  MEMBER_REMOVE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												//delete the function
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												String  name  =  member_name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > create_action ( TTR ( " Remove Function " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " remove_function " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " add_function " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												List < int >  nodes ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												script - > get_node_list ( name ,  & nodes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( List < int > : : Element  * E  =  nodes . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-10 15:37:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													undo_redo - > add_undo_method ( script . ptr ( ) ,  " add_node " ,  name ,  E - > get ( ) ,  script - > get_node ( name ,  E - > get ( ) ) ,  script - > get_node_position ( name ,  E - > get ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												List < VisualScript : : SequenceConnection >  seq_connections ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												script - > get_sequence_connection_list ( name ,  & seq_connections ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( List < VisualScript : : SequenceConnection > : : Element  * E  =  seq_connections . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_undo_method ( script . ptr ( ) ,  " sequence_connect " ,  name ,  E - > get ( ) . from_node ,  E - > get ( ) . from_output ,  E - > get ( ) . to_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												List < VisualScript : : DataConnection >  data_connections ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												script - > get_data_connection_list ( name ,  & data_connections ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( List < VisualScript : : DataConnection > : : Element  * E  =  data_connections . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_undo_method ( script . ptr ( ) ,  " data_connect " ,  name ,  E - > get ( ) . from_node ,  E - > get ( ) . from_port ,  E - > get ( ) . to_node ,  E - > get ( ) . to_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( this ,  " _update_graph " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  if  ( p_option  = =  MEMBER_EDIT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												selected  =  members - > get_selected ( ) - > get_text ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												function_name_edit - > popup ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-29 17:25:09 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												function_name_box - > set_text ( selected ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												function_name_box - > select_all ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  MEMBER_VARIABLE :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  name  =  member_name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( p_option  = =  MEMBER_REMOVE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > create_action ( TTR ( " Remove Variable " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " remove_variable " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " add_variable " ,  name ,  script - > get_variable_default_value ( name ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " set_variable_info " ,  name ,  script - > call ( " get_variable_info " ,  name ) ) ;  //return as dict
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  if  ( p_option  = =  MEMBER_EDIT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												variable_editor - > edit ( name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												edit_variable_dialog - > set_title ( TTR ( " Editing Variable: " )  +  "   "  +  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												edit_variable_dialog - > popup_centered_minsize ( Size2 ( 400 ,  200 )  *  EDSCALE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  MEMBER_SIGNAL :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											String  name  =  member_name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( p_option  = =  MEMBER_REMOVE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > create_action ( TTR ( " Remove Signal " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( script . ptr ( ) ,  " remove_custom_signal " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( script . ptr ( ) ,  " add_custom_signal " ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  script - > custom_signal_get_argument_count ( name ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													undo_redo - > add_undo_method ( script . ptr ( ) ,  " custom_signal_add_argument " ,  name ,  script - > custom_signal_get_argument_name ( name ,  i ) ,  script - > custom_signal_get_argument_type ( name ,  i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_do_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > add_undo_method ( this ,  " _update_members " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												undo_redo - > commit_action ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  if  ( p_option  = =  MEMBER_EDIT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												signal_editor - > edit ( name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												edit_signal_dialog - > set_title ( TTR ( " Editing Signal: " )  +  "   "  +  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												edit_signal_dialog - > popup_centered_minsize ( Size2 ( 400 ,  300 )  *  EDSCALE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-04-02 12:41:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  VisualScriptEditor : : add_syntax_highlighter ( SyntaxHighlighter  * p_highlighter )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : set_syntax_highlighter ( SyntaxHighlighter  * p_highlighter )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : _bind_methods ( )  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _member_button " ,  & VisualScriptEditor : : _member_button ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _member_edited " ,  & VisualScriptEditor : : _member_edited ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _member_selected " ,  & VisualScriptEditor : : _member_selected ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _update_members " ,  & VisualScriptEditor : : _update_members ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _members_gui_input " ,  & VisualScriptEditor : : _members_gui_input ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _member_rmb_selected " ,  & VisualScriptEditor : : _member_rmb_selected ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _member_option " ,  & VisualScriptEditor : : _member_option ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _fn_name_box_input " ,  & VisualScriptEditor : : _fn_name_box_input ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _change_base_type " ,  & VisualScriptEditor : : _change_base_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _change_base_type_callback " ,  & VisualScriptEditor : : _change_base_type_callback ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-27 01:30:23 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _toggle_tool_script " ,  & VisualScriptEditor : : _toggle_tool_script ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _node_selected " ,  & VisualScriptEditor : : _node_selected ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _node_moved " ,  & VisualScriptEditor : : _node_moved ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _move_node " ,  & VisualScriptEditor : : _move_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _begin_node_move " ,  & VisualScriptEditor : : _begin_node_move ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _end_node_move " ,  & VisualScriptEditor : : _end_node_move ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _remove_node " ,  & VisualScriptEditor : : _remove_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _update_graph " ,  & VisualScriptEditor : : _update_graph ,  DEFVAL ( - 1 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _node_ports_changed " ,  & VisualScriptEditor : : _node_ports_changed ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _create_function_dialog " ,  & VisualScriptEditor : : _create_function_dialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _create_function " ,  & VisualScriptEditor : : _create_function ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _add_node_dialog " ,  & VisualScriptEditor : : _add_node_dialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _add_func_input " ,  & VisualScriptEditor : : _add_func_input ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _remove_func_input " ,  & VisualScriptEditor : : _remove_func_input ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _deselect_input_names " ,  & VisualScriptEditor : : _deselect_input_names ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _default_value_edited " ,  & VisualScriptEditor : : _default_value_edited ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _default_value_changed " ,  & VisualScriptEditor : : _default_value_changed ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _menu_option " ,  & VisualScriptEditor : : _menu_option ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _graph_ofs_changed " ,  & VisualScriptEditor : : _graph_ofs_changed ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _center_on_node " ,  & VisualScriptEditor : : _center_on_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _comment_node_resized " ,  & VisualScriptEditor : : _comment_node_resized ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _button_resource_previewed " ,  & VisualScriptEditor : : _button_resource_previewed ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _port_action_menu " ,  & VisualScriptEditor : : _port_action_menu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _selected_connect_node " ,  & VisualScriptEditor : : _selected_connect_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-12 07:58:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _selected_new_virtual_method " ,  & VisualScriptEditor : : _selected_new_virtual_method ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _cancel_connect_node " ,  & VisualScriptEditor : : _cancel_connect_node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _create_new_node_from_name " ,  & VisualScriptEditor : : _create_new_node_from_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _expression_text_changed " ,  & VisualScriptEditor : : _expression_text_changed ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _add_input_port " ,  & VisualScriptEditor : : _add_input_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _add_output_port " ,  & VisualScriptEditor : : _add_output_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _remove_input_port " ,  & VisualScriptEditor : : _remove_input_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _remove_output_port " ,  & VisualScriptEditor : : _remove_output_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _change_port_type " ,  & VisualScriptEditor : : _change_port_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _update_node_size " ,  & VisualScriptEditor : : _update_node_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _port_name_focus_out " ,  & VisualScriptEditor : : _port_name_focus_out ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " get_drag_data_fw " ,  & VisualScriptEditor : : get_drag_data_fw ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " can_drop_data_fw " ,  & VisualScriptEditor : : can_drop_data_fw ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " drop_data_fw " ,  & VisualScriptEditor : : drop_data_fw ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _input " ,  & VisualScriptEditor : : _input ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _graph_gui_input " ,  & VisualScriptEditor : : _graph_gui_input ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-05 15:10:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _on_nodes_copy " ,  & VisualScriptEditor : : _on_nodes_copy ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _on_nodes_paste " ,  & VisualScriptEditor : : _on_nodes_paste ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _on_nodes_delete " ,  & VisualScriptEditor : : _on_nodes_delete ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _on_nodes_duplicate " ,  & VisualScriptEditor : : _on_nodes_duplicate ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _hide_timer " ,  & VisualScriptEditor : : _hide_timer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _graph_connected " ,  & VisualScriptEditor : : _graph_connected ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _graph_disconnected " ,  & VisualScriptEditor : : _graph_disconnected ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _graph_connect_to_empty " ,  & VisualScriptEditor : : _graph_connect_to_empty ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _update_graph_connections " ,  & VisualScriptEditor : : _update_graph_connections ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _selected_method " ,  & VisualScriptEditor : : _selected_method ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _draw_color_over_button " ,  & VisualScriptEditor : : _draw_color_over_button ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 08:25:03 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( " _generic_search " ,  & VisualScriptEditor : : _generic_search ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								VisualScriptEditor : : VisualScriptEditor ( )  {  
						 
					
						
							
								
									
										
										
										
											2016-08-31 17:58:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! clipboard )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										clipboard  =  memnew ( Clipboard ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-31 17:58:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_graph  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									saved_pos_dirty  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									saved_position  =  Vector2 ( 0 ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									edit_menu  =  memnew ( MenuButton ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									edit_menu - > set_text ( TTR ( " Edit " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-29 19:26:43 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									edit_menu - > set_switch_on_hover ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									edit_menu - > get_popup ( ) - > add_shortcut ( ED_GET_SHORTCUT ( " visual_script_editor/delete_selected " ) ,  EDIT_DELETE_NODES ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									edit_menu - > get_popup ( ) - > add_shortcut ( ED_GET_SHORTCUT ( " visual_script_editor/toggle_breakpoint " ) ,  EDIT_TOGGLE_BREAKPOINT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-08 01:41:57 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									edit_menu - > get_popup ( ) - > add_shortcut ( ED_GET_SHORTCUT ( " visual_script_editor/find_node_type " ) ,  EDIT_FIND_NODE_TYPE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									edit_menu - > get_popup ( ) - > add_separator ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									edit_menu - > get_popup ( ) - > add_shortcut ( ED_GET_SHORTCUT ( " visual_script_editor/copy_nodes " ) ,  EDIT_COPY_NODES ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									edit_menu - > get_popup ( ) - > add_shortcut ( ED_GET_SHORTCUT ( " visual_script_editor/cut_nodes " ) ,  EDIT_CUT_NODES ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									edit_menu - > get_popup ( ) - > add_shortcut ( ED_GET_SHORTCUT ( " visual_script_editor/paste_nodes " ) ,  EDIT_PASTE_NODES ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									edit_menu - > get_popup ( ) - > add_separator ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									edit_menu - > get_popup ( ) - > add_shortcut ( ED_GET_SHORTCUT ( " visual_script_editor/create_function " ) ,  EDIT_CREATE_FUNCTION ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									edit_menu - > get_popup ( ) - > add_shortcut ( ED_GET_SHORTCUT ( " visual_script_editor/refresh_nodes " ) ,  REFRESH_GRAPH ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									edit_menu - > get_popup ( ) - > connect ( " id_pressed " ,  this ,  " _menu_option " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 17:10:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									members_section  =  memnew ( VBoxContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Add but wait until done setting up this.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ScriptEditor : : get_singleton ( ) - > get_left_list_split ( ) - > call_deferred ( " add_child " ,  members_section ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									members_section - > set_v_size_flags ( SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-27 01:30:23 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									CheckButton  * tool_script_check  =  memnew ( CheckButton ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tool_script_check - > set_text ( TTR ( " Make Tool: " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 17:10:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									members_section - > add_child ( tool_script_check ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-27 01:30:23 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tool_script_check - > connect ( " pressed " ,  this ,  " _toggle_tool_script " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									///       Members        ///
 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									members  =  memnew ( Tree ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 17:10:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									members_section - > add_margin_child ( TTR ( " Members: " ) ,  members ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									members - > set_custom_minimum_size ( Size2 ( 0 ,  50  *  EDSCALE ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									members - > set_hide_root ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									members - > connect ( " button_pressed " ,  this ,  " _member_button " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									members - > connect ( " item_edited " ,  this ,  " _member_edited " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									members - > connect ( " cell_selected " ,  this ,  " _member_selected " ,  varray ( ) ,  CONNECT_DEFERRED ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-05 14:45:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									members - > connect ( " gui_input " ,  this ,  " _members_gui_input " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									members - > connect ( " item_rmb_selected " ,  this ,  " _member_rmb_selected " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									members - > set_allow_rmb_select ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-18 18:19:12 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									members - > set_allow_reselect ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									members - > set_hide_folding ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									members - > set_drag_forwarding ( this ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									member_popup  =  memnew ( PopupMenu ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_child ( member_popup ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									member_popup - > connect ( " id_pressed " ,  this ,  " _member_option " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_name_edit  =  memnew ( PopupDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_name_box  =  memnew ( LineEdit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_name_edit - > add_child ( function_name_box ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_name_edit - > set_h_size_flags ( SIZE_EXPAND ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_name_box - > connect ( " gui_input " ,  this ,  " _fn_name_box_input " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_name_box - > set_expand_to_text_length ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_child ( function_name_edit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									///       Actual Graph          ///
 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graph  =  memnew ( GraphEdit ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_child ( graph ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-10 10:30:26 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graph - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-22 00:12:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graph - > set_anchors_and_margins_preset ( Control : : PRESET_WIDE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graph - > connect ( " node_selected " ,  this ,  " _node_selected " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									graph - > connect ( " _begin_node_move " ,  this ,  " _begin_node_move " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									graph - > connect ( " _end_node_move " ,  this ,  " _end_node_move " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-05 15:10:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graph - > connect ( " copy_nodes_request " ,  this ,  " _on_nodes_copy " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									graph - > connect ( " paste_nodes_request " ,  this ,  " _on_nodes_paste " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graph - > connect ( " delete_nodes_request " ,  this ,  " _on_nodes_delete " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									graph - > connect ( " duplicate_nodes_request " ,  this ,  " _on_nodes_duplicate " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graph - > connect ( " gui_input " ,  this ,  " _graph_gui_input " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									graph - > set_drag_forwarding ( this ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-25 18:17:21 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									float  graph_minimap_opacity  =  EditorSettings : : get_singleton ( ) - > get ( " editors/visual_editors/minimap_opacity " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									graph - > set_minimap_opacity ( graph_minimap_opacity ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graph - > hide ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graph - > connect ( " scroll_offset_changed " ,  this ,  " _graph_ofs_changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 17:10:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/// Add Buttons to Top Bar/Zoom bar.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HBoxContainer  * graph_hbc  =  graph - > get_zoom_hbox ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Label  * base_lbl  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 13:18:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									base_lbl - > set_text ( TTR ( " Change Base Type: " )  +  "   " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graph_hbc - > add_child ( base_lbl ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									base_type_select  =  memnew ( Button ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									base_type_select - > connect ( " pressed " ,  this ,  " _change_base_type " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									graph_hbc - > add_child ( base_type_select ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Button  * add_nds  =  memnew ( Button ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 13:18:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_nds - > set_text ( TTR ( " Add Nodes... " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graph_hbc - > add_child ( add_nds ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_nds - > connect ( " pressed " ,  this ,  " _add_node_dialog " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Button  * fn_btn  =  memnew ( Button ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 13:18:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									fn_btn - > set_text ( TTR ( " Add Function... " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graph_hbc - > add_child ( fn_btn ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fn_btn - > connect ( " pressed " ,  this ,  " _create_function_dialog " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 17:10:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Add Function Dialog.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									VBoxContainer  * function_vb  =  memnew ( VBoxContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_vb - > set_v_size_flags ( SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-17 09:04:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									function_vb - > set_custom_minimum_size ( Size2 ( 450 ,  300 )  *  EDSCALE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HBoxContainer  * func_name_hbox  =  memnew ( HBoxContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_vb - > add_child ( func_name_hbox ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Label  * func_name_label  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_name_label - > set_text ( TTR ( " Name: " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_name_hbox - > add_child ( func_name_label ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_name_box  =  memnew ( LineEdit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_name_box - > set_h_size_flags ( SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_name_box - > set_placeholder ( TTR ( " function_name " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_name_box - > set_text ( " " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_name_box - > connect ( " focus_entered " ,  this ,  " _deselect_input_names " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_name_hbox - > add_child ( func_name_box ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 17:10:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Add minor setting for function if needed, here!
 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_vb - > add_child ( memnew ( HSeparator ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Button  * add_input_button  =  memnew ( Button ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_input_button - > set_h_size_flags ( SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 19:59:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_input_button - > set_text ( TTR ( " Add Input " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_input_button - > connect ( " pressed " ,  this ,  " _add_func_input " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_vb - > add_child ( add_input_button ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 19:59:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									func_input_scroll  =  memnew ( ScrollContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_input_scroll - > set_v_size_flags ( SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_vb - > add_child ( func_input_scroll ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 19:59:53 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									func_input_vbox  =  memnew ( VBoxContainer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_input_vbox - > set_h_size_flags ( SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									func_input_scroll - > add_child ( func_input_vbox ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_create_dialog  =  memnew ( ConfirmationDialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_create_dialog - > set_v_size_flags ( SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_create_dialog - > set_title ( TTR ( " Create Function " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_create_dialog - > add_child ( function_vb ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_create_dialog - > get_ok ( ) - > set_text ( TTR ( " Create " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_create_dialog - > get_ok ( ) - > connect ( " pressed " ,  this ,  " _create_function " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_child ( function_create_dialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									select_func_text  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-25 01:54:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									select_func_text - > set_text ( TTR ( " Select or create a function to edit its graph. " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									select_func_text - > set_align ( Label : : ALIGN_CENTER ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									select_func_text - > set_valign ( Label : : VALIGN_CENTER ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									select_func_text - > set_h_size_flags ( SIZE_EXPAND_FILL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-30 21:30:17 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_child ( select_func_text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									hint_text  =  memnew ( Label ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-07-06 09:16:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									hint_text - > set_anchor_and_margin ( MARGIN_TOP ,  ANCHOR_END ,  - 100 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									hint_text - > set_anchor_and_margin ( MARGIN_BOTTOM ,  ANCHOR_END ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									hint_text - > set_anchor_and_margin ( MARGIN_RIGHT ,  ANCHOR_END ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									hint_text - > set_align ( Label : : ALIGN_CENTER ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									hint_text - > set_valign ( Label : : VALIGN_CENTER ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									graph - > add_child ( hint_text ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									hint_text_timer  =  memnew ( Timer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									hint_text_timer - > set_wait_time ( 4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									hint_text_timer - > connect ( " timeout " ,  this ,  " _hide_timer " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 11:28:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_child ( hint_text_timer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 17:10:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Allowed casts (connections).
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  Variant : : VARIANT_MAX ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										graph - > add_valid_connection_type ( Variant : : NIL ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										graph - > add_valid_connection_type ( i ,  Variant : : NIL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  j  =  0 ;  j  <  Variant : : VARIANT_MAX ;  j + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( Variant : : can_convert ( Variant : : Type ( i ) ,  Variant : : Type ( j ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												graph - > add_valid_connection_type ( i ,  j ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										graph - > add_valid_right_disconnect_type ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									graph - > add_valid_left_disconnect_type ( TYPE_SEQUENCE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									graph - > connect ( " connection_request " ,  this ,  " _graph_connected " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									graph - > connect ( " disconnection_request " ,  this ,  " _graph_disconnected " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									graph - > connect ( " connection_to_empty " ,  this ,  " _graph_connect_to_empty " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									edit_signal_dialog  =  memnew ( AcceptDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									edit_signal_dialog - > get_ok ( ) - > set_text ( TTR ( " Close " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_child ( edit_signal_dialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									signal_editor  =  memnew ( VisualScriptEditorSignalEdit ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-08 02:51:23 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									edit_signal_edit  =  memnew ( EditorInspector ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									edit_signal_dialog - > add_child ( edit_signal_edit ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-10 01:49:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									edit_signal_edit - > edit ( signal_editor ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									edit_variable_dialog  =  memnew ( AcceptDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									edit_variable_dialog - > get_ok ( ) - > set_text ( TTR ( " Close " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									add_child ( edit_variable_dialog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									variable_editor  =  memnew ( VisualScriptEditorVariableEdit ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-08 02:51:23 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									edit_variable_edit  =  memnew ( EditorInspector ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									edit_variable_dialog - > add_child ( edit_variable_edit ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-10 01:49:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									edit_variable_edit - > edit ( variable_editor ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									select_base_type  =  memnew ( CreateDialog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-27 17:10:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									select_base_type - > set_base_type ( " Object " ) ;  // Anything goes.
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									select_base_type - > connect ( " create " ,  this ,  " _change_base_type_callback " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									add_child ( select_base_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									undo_redo  =  EditorNode : : get_singleton ( ) - > get_undo_redo ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									updating_members  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_process_input ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_process_unhandled_input ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default_value_edit  =  memnew ( CustomPropertyEditor ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_child ( default_value_edit ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default_value_edit - > connect ( " variant_changed " ,  this ,  " _default_value_changed " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-03 22:06:39 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									method_select  =  memnew ( VisualScriptPropertySelector ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_child ( method_select ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									method_select - > connect ( " selected " ,  this ,  " _selected_method " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									error_line  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-26 17:34:25 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									new_connect_node_select  =  memnew ( VisualScriptPropertySelector ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_child ( new_connect_node_select ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									new_connect_node_select - > set_resizable ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									new_connect_node_select - > connect ( " selected " ,  this ,  " _selected_connect_node " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									new_connect_node_select - > get_cancel ( ) - > connect ( " pressed " ,  this ,  " _cancel_connect_node " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-03 14:58:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-12 20:34:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									new_virtual_method_select  =  memnew ( VisualScriptPropertySelector ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-12 07:58:18 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									add_child ( new_virtual_method_select ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									new_virtual_method_select - > connect ( " selected " ,  this ,  " _selected_new_virtual_method " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								VisualScriptEditor : : ~ VisualScriptEditor ( )  {  
						 
					
						
							
								
									
										
										
										
											2019-09-27 17:10:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									undo_redo - > clear_history ( ) ;  // Avoid crashes.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									memdelete ( signal_editor ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									memdelete ( variable_editor ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-28 16:52:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ScriptEditorBase  * create_editor ( const  RES  & p_resource )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( Object : : cast_to < VisualScript > ( * p_resource ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  memnew ( VisualScriptEditor ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 16:00:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 16:00:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								VisualScriptEditor : : Clipboard  * VisualScriptEditor : : clipboard  =  nullptr ;  
						 
					
						
							
								
									
										
										
										
											2016-08-31 17:58:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : free_clipboard ( )  {  
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( clipboard )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-31 17:58:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										memdelete ( clipboard ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-05 12:44:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-31 17:58:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  register_editor_callback ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ScriptEditor : : register_create_script_editor_function ( create_editor ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-05 14:45:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT ( " visual_script_editor/delete_selected " ,  TTR ( " Delete Selected " ) ,  KEY_DELETE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT ( " visual_script_editor/toggle_breakpoint " ,  TTR ( " Toggle Breakpoint " ) ,  KEY_F9 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT ( " visual_script_editor/find_node_type " ,  TTR ( " Find Node Type " ) ,  KEY_MASK_CMD  +  KEY_F ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT ( " visual_script_editor/copy_nodes " ,  TTR ( " Copy Nodes " ) ,  KEY_MASK_CMD  +  KEY_C ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT ( " visual_script_editor/cut_nodes " ,  TTR ( " Cut Nodes " ) ,  KEY_MASK_CMD  +  KEY_X ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT ( " visual_script_editor/paste_nodes " ,  TTR ( " Paste Nodes " ) ,  KEY_MASK_CMD  +  KEY_V ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-09-14 00:44:12 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT ( " visual_script_editor/create_function " ,  TTR ( " Make Function " ) ,  KEY_MASK_CMD  +  KEY_G ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ED_SHORTCUT ( " visual_script_editor/refresh_nodes " ,  TTR ( " Refresh Graph " ) ,  KEY_MASK_CMD  +  KEY_R ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-05 14:45:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ED_SHORTCUT ( " visual_script_editor/edit_member " ,  TTR ( " Edit Member " ) ,  KEY_MASK_CMD  +  KEY_E ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : register_editor ( )  {  
						 
					
						
							
								
									
										
										
										
											2019-09-27 17:10:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Too early to register stuff here, request a callback.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-06 19:00:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									EditorNode : : add_plugin_init_callback ( register_editor_callback ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-15 13:57:24 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Ref < VisualScriptNode >  _VisualScriptEditor : : create_node_custom ( const  String  & p_name )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < VisualScriptCustomNode >  node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									node . instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									node - > set_script ( singleton - > custom_nodes [ p_name ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-04 16:00:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								_VisualScriptEditor  * _VisualScriptEditor : : singleton  =  nullptr ;  
						 
					
						
							
								
									
										
										
										
											2017-11-15 13:57:24 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Map < String ,  RefPtr >  _VisualScriptEditor : : custom_nodes ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								_VisualScriptEditor : : _VisualScriptEditor ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									singleton  =  this ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								_VisualScriptEditor : : ~ _VisualScriptEditor ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									custom_nodes . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  _VisualScriptEditor : : add_custom_node ( const  String  & p_name ,  const  String  & p_category ,  const  Ref < Script >  & p_script )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  node_name  =  " custom/ "  +  p_category  +  " / "  +  p_name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									custom_nodes . insert ( node_name ,  p_script . get_ref_ptr ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									VisualScriptLanguage : : singleton - > add_register_func ( node_name ,  & _VisualScriptEditor : : create_node_custom ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									emit_signal ( " custom_nodes_updated " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  _VisualScriptEditor : : remove_custom_node ( const  String  & p_name ,  const  String  & p_category )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  node_name  =  " custom/ "  +  p_category  +  " / "  +  p_name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									custom_nodes . erase ( node_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									VisualScriptLanguage : : singleton - > remove_register_func ( node_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									emit_signal ( " custom_nodes_updated " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  _VisualScriptEditor : : _bind_methods ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " add_custom_node " ,  " name " ,  " category " ,  " script " ) ,  & _VisualScriptEditor : : add_custom_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " remove_custom_node " ,  " name " ,  " category " ) ,  & _VisualScriptEditor : : remove_custom_node ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_SIGNAL ( MethodInfo ( " custom_nodes_updated " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2019-05-08 18:49:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  VisualScriptEditor : : validate ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-08-15 13:24:02 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif