@@ -4,9 +4,11 @@ extends MarginContainer
44const ASTList = preload ("res://addons/block_code/code_generation/ast_list.gd" )
55const BlockAST = preload ("res://addons/block_code/code_generation/block_ast.gd" )
66const BlockCodePlugin = preload ("res://addons/block_code/block_code_plugin.gd" )
7+ const BlockDefinition = preload ("res://addons/block_code/code_generation/block_definition.gd" )
78const BlockTreeUtil = preload ("res://addons/block_code/ui/block_tree_util.gd" )
89const DragManager = preload ("res://addons/block_code/drag_manager/drag_manager.gd" )
910const ScriptGenerator = preload ("res://addons/block_code/code_generation/script_generator.gd" )
11+ const Types = preload ("res://addons/block_code/types/types.gd" )
1012const Util = preload ("res://addons/block_code/ui/util.gd" )
1113
1214const EXTEND_MARGIN : float = 800
@@ -52,6 +54,8 @@ var zoom: float:
5254 get :
5355 return _window .scale .x
5456
57+ var _modifier_ctrl := false
58+
5559signal reconnect_block (block : Block )
5660signal add_block_code
5761signal open_scene
@@ -75,6 +79,10 @@ func _can_drop_data(at_position: Vector2, data: Variant) -> bool:
7579 if typeof (data ) != TYPE_DICTIONARY :
7680 return false
7781
82+ # Allow dropping property block
83+ if data .get ("type" , "" ) == "obj_property" :
84+ return true
85+
7886 var nodes : Array = data .get ("nodes" , [])
7987 if nodes .size () != 1 :
8088 return false
@@ -92,6 +100,13 @@ func _can_drop_data(at_position: Vector2, data: Variant) -> bool:
92100
93101
94102func _drop_data (at_position : Vector2 , data : Variant ) -> void :
103+ if data ["type" ] == "nodes" :
104+ _drop_node (at_position , data )
105+ elif data ["type" ] == "obj_property" :
106+ _drop_obj_property (at_position , data )
107+
108+
109+ func _drop_node (at_position : Vector2 , data : Variant ) -> void :
95110 var abs_path : NodePath = data .get ("nodes" , []).pop_back ()
96111 if abs_path == null :
97112 return
@@ -108,6 +123,51 @@ func _drop_data(at_position: Vector2, data: Variant) -> void:
108123 reconnect_block .emit (block )
109124
110125
126+ func _drop_obj_property (at_position : Vector2 , data : Variant ) -> void :
127+ var object_name = str (data ["object" ]).get_slice (":" , 0 )
128+ var property_name = data ["property" ]
129+ var property_value = data ["value" ]
130+
131+ # Prepare a Variable block to set / get the property's value according to
132+ # the modifier KEY_CTRL pressing.
133+ var block_definition : BlockDefinition
134+ var property_type = typeof (property_value )
135+ if _modifier_ctrl :
136+ var type_string : String = Types .VARIANT_TYPE_TO_STRING [property_type ]
137+ block_definition = (
138+ BlockDefinition
139+ . new (
140+ & "% s_set_% s" % [object_name , property_name ],
141+ object_name ,
142+ "Set the %s property" % property_name ,
143+ "Variables" ,
144+ Types .BlockType .STATEMENT ,
145+ property_type ,
146+ "set %s to {value: %s} " % [property_name .capitalize ().to_lower (), type_string ],
147+ "%s = {value} " % property_name ,
148+ {"value" : property_value },
149+ )
150+ )
151+ else :
152+ block_definition = (
153+ BlockDefinition
154+ . new (
155+ & "% s_get_% s" % [object_name , property_name ],
156+ object_name ,
157+ "The %s property" % property_name ,
158+ "Variables" ,
159+ Types .BlockType .VALUE ,
160+ property_type ,
161+ "%s " % property_name .capitalize ().to_lower (),
162+ "%s " % property_name ,
163+ )
164+ )
165+
166+ var block = _context .block_script .instantiate_block (block_definition )
167+ add_block (block , at_position )
168+ reconnect_block .emit (block )
169+
170+
111171func add_block (block : Block , position : Vector2 = Vector2 .ZERO ) -> void :
112172 if block is EntryBlock :
113173 block .position = canvas_to_window (position ).snapped (SNAP_GRID )
@@ -373,6 +433,12 @@ func _on_replace_block_code_button_pressed():
373433 replace_block_code .emit ()
374434
375435
436+ func _input (event ):
437+ if event is InputEventKey :
438+ if event .keycode == KEY_CTRL :
439+ _modifier_ctrl = event .pressed
440+
441+
376442func _gui_input (event ):
377443 if event is InputEventKey :
378444 if event .keycode == KEY_SHIFT :
0 commit comments