Skip to content

Commit 0d5bb1a

Browse files
committed
Revamp variable system
Instead of accessing variables by VAR_DICT, use GDScript properties. Add a new "variables" property to block script data resource. Add a menu for creating variable of specific type.
1 parent 50a3125 commit 0d5bb1a

File tree

12 files changed

+224
-38
lines changed

12 files changed

+224
-38
lines changed

addons/block_code/block_code_plugin.gd

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ const DISABLED_CLASSES := [
4242
"TitleBar",
4343
"MainPanel",
4444
"BlockCodePlugin",
45-
"BlockCategoryButton"
45+
"BlockCategoryButton",
46+
"CreateVariableButton",
47+
"VariableCategoryDisplay"
4648
]
4749

4850

addons/block_code/block_script_data/block_script_data.gd

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ extends Resource
33

44
@export var script_inherits: String
55
@export var block_trees: SerializedBlockTreeNodeArray
6+
@export var variables: Array[VariableResource]
67
@export var generated_script: String
78

89

9-
func _init(p_script_inherits: String = "", p_block_trees: SerializedBlockTreeNodeArray = null, p_generated_script: String = ""):
10+
func _init(p_script_inherits: String = "", p_block_trees: SerializedBlockTreeNodeArray = null, p_variables: Array[VariableResource] = [], p_generated_script: String = ""):
1011
script_inherits = p_script_inherits
1112
block_trees = p_block_trees
1213
generated_script = p_generated_script
14+
variables = p_variables

addons/block_code/types/types.gd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const cast_relationships = [
3636
[TYPE_INT, TYPE_STRING, "str(%s)"],
3737
[TYPE_FLOAT, TYPE_STRING, "str(%s)"],
3838
[TYPE_COLOR, TYPE_STRING, "str(%s)"],
39+
[TYPE_VECTOR2, TYPE_STRING, "str(%s)"],
3940
]
4041

4142
# Directed graph, edges are CastGraphEdge

addons/block_code/ui/block_canvas/node_block_canvas/node_block_canvas.gd

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ class_name NodeBlockCanvas
33
extends BlockCanvas
44

55

6-
func generate_script_from_current_window(script_inherits: String = ""):
6+
func generate_script_from_current_window(bsd: BlockScriptData):
77
# TODO: implement multiple windows
88
var current_window := _window
99

@@ -21,9 +21,12 @@ func generate_script_from_current_window(script_inherits: String = ""):
2121

2222
var script: String = ""
2323

24-
script += "extends %s\n\n" % script_inherits
24+
script += "extends %s\n\n" % bsd.script_inherits
2525

26-
script += "var VAR_DICT := {}\n\n"
26+
for variable in bsd.variables:
27+
script += "var %s\n\n" % variable.var_name.to_snake_case()
28+
29+
script += "\n"
2730

2831
var init_func = InstructionTree.TreeNode.new("func _init():")
2932

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class_name VariableResource
2+
extends Resource
3+
4+
@export var var_name: String
5+
@export var var_type: Variant.Type
6+
7+
8+
func _init(p_var_name: String = "", p_var_type: Variant.Type = TYPE_NIL):
9+
var_name = p_var_name
10+
var_type = p_var_type

addons/block_code/ui/main_panel.gd

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ var undo_redo: EditorUndoRedoManager
2626

2727
func _ready():
2828
_picker.block_picked.connect(_drag_manager.copy_picked_block_and_drag)
29+
_picker.variable_created.connect(_create_variable)
2930
_block_canvas.reconnect_block.connect(_drag_manager.connect_block_canvas_signals)
3031
_drag_manager.block_dropped.connect(save_script)
3132
_drag_manager.block_modified.connect(save_script)
@@ -79,7 +80,7 @@ func save_script():
7980
undo_redo.add_undo_property(_current_block_code_node.block_script, "generated_script", _current_block_code_node.block_script.generated_script)
8081

8182
var block_trees := _block_canvas.get_canvas_block_trees()
82-
var generated_script = _block_canvas.generate_script_from_current_window(block_script.script_inherits)
83+
var generated_script = _block_canvas.generate_script_from_current_window(block_script)
8384
block_script.block_trees = block_trees
8485
block_script.generated_script = generated_script
8586

@@ -110,7 +111,7 @@ func _print_generated_script():
110111
if _current_block_code_node == null:
111112
return
112113
var block_script: BlockScriptData = _current_block_code_node.block_script
113-
var script: String = _block_canvas.generate_script_from_current_window(block_script.script_inherits)
114+
var script: String = _block_canvas.generate_script_from_current_window(block_script)
114115
print(script)
115116
print("Debug script! (not saved)")
116117

@@ -125,3 +126,22 @@ func toggle_collapse():
125126

126127
func _on_collapse_button_pressed():
127128
toggle_collapse()
129+
130+
131+
func _create_variable(variable: VariableResource):
132+
if _current_block_code_node == null:
133+
print("No script loaded to add variable to.")
134+
return
135+
136+
var block_script: BlockScriptData = _current_block_code_node.block_script
137+
138+
undo_redo.create_action("Create variable %s in %s's block code script" % [variable.var_name, _current_block_code_node.get_parent().name])
139+
undo_redo.add_undo_property(_current_block_code_node.block_script, "variables", _current_block_code_node.block_script.variables)
140+
141+
var new_variables = block_script.variables.duplicate()
142+
new_variables.append(variable)
143+
144+
undo_redo.add_do_property(_current_block_code_node.block_script, "variables", new_variables)
145+
undo_redo.commit_action()
146+
147+
_picker.reload_variables(new_variables)

addons/block_code/ui/picker/categories/category_factory.gd

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -321,32 +321,6 @@ static func get_general_blocks() -> Array[Block]:
321321

322322
#endregion
323323
#region Variables
324-
325-
b = BLOCKS["statement_block"].instantiate()
326-
b.block_format = "Set String {var: STRING} {value: STRING}"
327-
b.statement = "VAR_DICT[{var}] = {value}"
328-
b.category = "Variables"
329-
block_list.append(b)
330-
331-
b = BLOCKS["parameter_block"].instantiate()
332-
b.block_format = "Get String {var: STRING}"
333-
b.statement = "VAR_DICT[{var}]"
334-
b.category = "Variables"
335-
block_list.append(b)
336-
337-
b = BLOCKS["statement_block"].instantiate()
338-
b.block_format = "Set Int {var: STRING} {value: INT}"
339-
b.statement = "VAR_DICT[{var}] = {value}"
340-
b.category = "Variables"
341-
block_list.append(b)
342-
343-
b = BLOCKS["parameter_block"].instantiate()
344-
b.variant_type = TYPE_INT
345-
b.block_format = "Get Int {var: STRING}"
346-
b.statement = "VAR_DICT[{var}]"
347-
b.category = "Variables"
348-
block_list.append(b)
349-
350324
b = BLOCKS["parameter_block"].instantiate()
351325
b.block_format = "To String {int: INT}"
352326
b.statement = "str({int})"
@@ -506,10 +480,10 @@ static func get_general_blocks() -> Array[Block]:
506480
static func property_to_blocklist(property: Dictionary) -> Array[Block]:
507481
var block_list: Array[Block] = []
508482

509-
var block_type = property.type
483+
var variant_type = property.type
510484

511-
if block_type:
512-
var type_string: String = Types.VARIANT_TYPE_TO_STRING[block_type]
485+
if variant_type:
486+
var type_string: String = Types.VARIANT_TYPE_TO_STRING[variant_type]
513487

514488
var b = BLOCKS["statement_block"].instantiate()
515489
b.block_format = "Set %s to {value: %s}" % [property.name.capitalize(), type_string]
@@ -524,7 +498,7 @@ static func property_to_blocklist(property: Dictionary) -> Array[Block]:
524498
block_list.append(b)
525499

526500
b = BLOCKS["parameter_block"].instantiate()
527-
b.block_type = block_type
501+
b.variant_type = variant_type
528502
b.block_format = "%s" % property.name.capitalize()
529503
b.statement = "%s" % property.name
530504
b.category = property.category
@@ -718,3 +692,29 @@ static func _get_input_blocks() -> Array[Block]:
718692
InputMap.action_add_event(action, event)
719693

720694
return block_list
695+
696+
697+
static func get_variable_blocks(variables: Array[VariableResource]):
698+
var block_list: Array[Block]
699+
700+
for variable in variables:
701+
var capital_name: String = variable.var_name.capitalize()
702+
var camel_name: String = variable.var_name.to_snake_case()
703+
var type_string: String = Types.VARIANT_TYPE_TO_STRING[variable.var_type]
704+
705+
var b = BLOCKS["parameter_block"].instantiate()
706+
b.variant_type = variable.var_type
707+
b.block_format = capital_name
708+
b.statement = camel_name
709+
# HACK: Color the blocks since they are outside of the normal picker system
710+
b.color = BUILTIN_PROPS["Variables"].color
711+
block_list.append(b)
712+
713+
b = BLOCKS["statement_block"].instantiate()
714+
b.block_type = Types.BlockType.EXECUTE
715+
b.block_format = "Set %s to {value: %s}" % [capital_name, type_string]
716+
b.statement = "%s = {value}" % [camel_name]
717+
b.color = BUILTIN_PROPS["Variables"].color
718+
block_list.append(b)
719+
720+
return block_list
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
@tool
2+
class_name CreateVariableButton
3+
extends MarginContainer
4+
5+
signal create_variable(var_name: String, var_type: String)
6+
7+
@onready var _confirmation_dialog := %ConfirmationDialog
8+
@onready var _variable_input := %VariableInput
9+
@onready var _type_option := %TypeOption
10+
11+
const available_types = ["STRING", "BOOL", "INT", "FLOAT", "VECTOR2", "COLOR"]
12+
13+
14+
func _ready():
15+
_type_option.clear()
16+
17+
for type in available_types:
18+
_type_option.add_item(type)
19+
20+
21+
func _on_create_button_pressed():
22+
_confirmation_dialog.visible = true
23+
24+
25+
func _clear():
26+
_variable_input.text = ""
27+
_type_option.select(0)
28+
29+
30+
func _on_confirmation_dialog_confirmed():
31+
if _variable_input.text != "":
32+
create_variable.emit(_variable_input.text, _type_option.get_item_text(_type_option.selected))
33+
_clear()
34+
35+
36+
func _on_confirmation_dialog_canceled():
37+
_clear()
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
[gd_scene load_steps=2 format=3 uid="uid://t0eoc4ekvjr1"]
2+
3+
[ext_resource type="Script" path="res://addons/block_code/ui/picker/categories/variable_category/create_variable_button.gd" id="1_cw6c3"]
4+
5+
[node name="CreateVariableButton" type="MarginContainer"]
6+
size_flags_horizontal = 0
7+
theme_override_constants/margin_bottom = 12
8+
script = ExtResource("1_cw6c3")
9+
10+
[node name="CreateButton" type="Button" parent="."]
11+
layout_mode = 2
12+
text = "Create New Variable"
13+
14+
[node name="ConfirmationDialog" type="ConfirmationDialog" parent="."]
15+
unique_name_in_owner = true
16+
title = "Create New Variable"
17+
initial_position = 1
18+
size = Vector2i(300, 150)
19+
ok_button_text = "Create"
20+
21+
[node name="GridContainer" type="GridContainer" parent="ConfirmationDialog"]
22+
offset_left = 8.0
23+
offset_top = 8.0
24+
offset_right = 292.0
25+
offset_bottom = 101.0
26+
columns = 2
27+
28+
[node name="Label" type="Label" parent="ConfirmationDialog/GridContainer"]
29+
layout_mode = 2
30+
text = "Name "
31+
32+
[node name="VariableInput" type="LineEdit" parent="ConfirmationDialog/GridContainer"]
33+
unique_name_in_owner = true
34+
layout_mode = 2
35+
36+
[node name="Label2" type="Label" parent="ConfirmationDialog/GridContainer"]
37+
layout_mode = 2
38+
text = "Type "
39+
40+
[node name="TypeOption" type="OptionButton" parent="ConfirmationDialog/GridContainer"]
41+
unique_name_in_owner = true
42+
layout_mode = 2
43+
size_flags_horizontal = 3
44+
item_count = 2
45+
selected = 0
46+
popup/item_0/text = "STRING"
47+
popup/item_0/id = 0
48+
popup/item_1/text = "INT"
49+
popup/item_1/id = 1
50+
51+
[connection signal="pressed" from="CreateButton" to="." method="_on_create_button_pressed"]
52+
[connection signal="canceled" from="ConfirmationDialog" to="." method="_on_confirmation_dialog_canceled"]
53+
[connection signal="confirmed" from="ConfirmationDialog" to="." method="_on_confirmation_dialog_confirmed"]
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@tool
2+
class_name VariableCategoryDisplay
3+
extends BlockCategoryDisplay
4+
5+
signal variable_created(variable: VariableResource)
6+
7+
@onready var variable_blocks := %VariableBlocks
8+
9+
10+
func _ready():
11+
super()
12+
13+
14+
func _on_create_variable(var_name, var_type):
15+
variable_created.emit(VariableResource.new(var_name, Types.STRING_TO_VARIANT_TYPE[var_type]))
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
[gd_scene load_steps=4 format=3 uid="uid://byne4g2yvdf3"]
2+
3+
[ext_resource type="PackedScene" uid="uid://duhpwtfo3k0sk" path="res://addons/block_code/ui/picker/categories/block_category_display.tscn" id="1_vermd"]
4+
[ext_resource type="Script" path="res://addons/block_code/ui/picker/categories/variable_category/variable_category_display.gd" id="2_ggvi7"]
5+
[ext_resource type="PackedScene" uid="uid://t0eoc4ekvjr1" path="res://addons/block_code/ui/picker/categories/variable_category/create_variable_button.tscn" id="3_gjvnq"]
6+
7+
[node name="VariableCategoryDisplay" instance=ExtResource("1_vermd")]
8+
script = ExtResource("2_ggvi7")
9+
10+
[node name="CreateVariableButton" parent="VBoxContainer" index="1" instance=ExtResource("3_gjvnq")]
11+
layout_mode = 2
12+
13+
[node name="VariableBlocks" type="VBoxContainer" parent="VBoxContainer" index="2"]
14+
unique_name_in_owner = true
15+
layout_mode = 2
16+
theme_override_constants/separation = 14
17+
18+
[node name="Spacer" type="Control" parent="VBoxContainer" index="3"]
19+
custom_minimum_size = Vector2(0, 30)
20+
layout_mode = 2
21+
22+
[connection signal="create_variable" from="VBoxContainer/CreateVariableButton" to="." method="_on_create_variable"]

addons/block_code/ui/picker/picker.gd

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@ class_name Picker
33
extends MarginContainer
44

55
signal block_picked(block: Block)
6+
signal variable_created(variable: VariableResource)
67

78
@onready var _block_list := %BlockList
89
@onready var _block_scroll := %BlockScroll
910
@onready var _category_list := %CategoryList
1011
@onready var _widget_container := %WidgetContainer
1112

13+
var _variable_category_display: VariableCategoryDisplay = null
14+
1215

1316
func bsd_selected(bsd: BlockScriptData):
1417
if not bsd:
@@ -33,6 +36,7 @@ func bsd_selected(bsd: BlockScriptData):
3336
blocks_to_add.append_array(CategoryFactory.get_inherited_blocks(parent_class))
3437

3538
init_picker(blocks_to_add, categories_to_add)
39+
reload_variables(bsd.variables)
3640

3741

3842
func reset_picker():
@@ -58,7 +62,14 @@ func init_picker(extra_blocks: Array[Block] = [], extra_categories: Array[BlockC
5862

5963
_category_list.add_child(block_category_button)
6064

61-
var block_category_display := preload("res://addons/block_code/ui/picker/categories/block_category_display.tscn").instantiate()
65+
var block_category_display: BlockCategoryDisplay
66+
if category.name != "Variables":
67+
block_category_display = preload("res://addons/block_code/ui/picker/categories/block_category_display.tscn").instantiate()
68+
else:
69+
block_category_display = preload("res://addons/block_code/ui/picker/categories/variable_category/variable_category_display.tscn").instantiate()
70+
block_category_display.variable_created.connect(func(variable): variable_created.emit(variable))
71+
_variable_category_display = block_category_display
72+
6273
block_category_display.category = category
6374

6475
_block_list.add_child(block_category_display)
@@ -83,3 +94,13 @@ func _category_selected(category: BlockCategory):
8394

8495
func set_collapsed(collapsed: bool):
8596
_widget_container.visible = not collapsed
97+
98+
99+
func reload_variables(variables: Array[VariableResource]):
100+
if _variable_category_display:
101+
for c in _variable_category_display.variable_blocks.get_children():
102+
c.queue_free()
103+
104+
for block in CategoryFactory.get_variable_blocks(variables):
105+
_variable_category_display.variable_blocks.add_child(block)
106+
block.drag_started.connect(_block_picked)

0 commit comments

Comments
 (0)