Skip to content

Commit c13f64d

Browse files
committed
Dynamically add blocks for variables
Using the new block definition. These are the only blocks that are not stored in the catalog. Instead, they are dynamically generated when the BlockScriptSerialization changes. Also: Move constant for the builtin category properties to the constants.gd script. Also: Finally remove the preloaded scene blocks from the category_factory.gd script. The single place where those scenes are now instantiated is the ui/util.gd script. https://phabricator.endlessm.com/T35591
1 parent c33a6bd commit c13f64d

File tree

3 files changed

+154
-147
lines changed

3 files changed

+154
-147
lines changed

addons/block_code/ui/constants.gd

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,119 @@ const OUTLINE_WIDTH = 3.0
1111
const MINIMUM_SNAP_DISTANCE = 80.0
1212

1313
const FOCUS_BORDER_COLOR = Color(225, 242, 0)
14+
15+
## Properties for builtin categories. Order starts at 10 for the first
16+
## category and then are separated by 10 to allow custom categories to
17+
## be easily placed between builtin categories.
18+
const BUILTIN_CATEGORIES_PROPS: Dictionary = {
19+
"Lifecycle":
20+
{
21+
"color": Color("ec3b59"),
22+
"order": 10,
23+
},
24+
"Transform | Position":
25+
{
26+
"color": Color("4b6584"),
27+
"order": 20,
28+
},
29+
"Transform | Rotation":
30+
{
31+
"color": Color("4b6584"),
32+
"order": 30,
33+
},
34+
"Transform | Scale":
35+
{
36+
"color": Color("4b6584"),
37+
"order": 40,
38+
},
39+
"Graphics | Modulate":
40+
{
41+
"color": Color("03aa74"),
42+
"order": 50,
43+
},
44+
"Graphics | Visibility":
45+
{
46+
"color": Color("03aa74"),
47+
"order": 60,
48+
},
49+
"Graphics | Viewport":
50+
{
51+
"color": Color("03aa74"),
52+
"order": 61,
53+
},
54+
"Graphics | Animation":
55+
{
56+
"color": Color("03aa74"),
57+
"order": 62,
58+
},
59+
"Sounds":
60+
{
61+
"color": Color("e30fc0"),
62+
"order": 70,
63+
},
64+
"Physics | Mass":
65+
{
66+
"color": Color("a5b1c2"),
67+
"order": 80,
68+
},
69+
"Physics | Velocity":
70+
{
71+
"color": Color("a5b1c2"),
72+
"order": 90,
73+
},
74+
"Input":
75+
{
76+
"color": Color("d54322"),
77+
"order": 100,
78+
},
79+
"Communication | Methods":
80+
{
81+
"color": Color("4b7bec"),
82+
"order": 110,
83+
},
84+
"Communication | Groups":
85+
{
86+
"color": Color("4b7bec"),
87+
"order": 120,
88+
},
89+
"Info | Score":
90+
{
91+
"color": Color("cf6a87"),
92+
"order": 130,
93+
},
94+
"Loops":
95+
{
96+
"color": Color("20bf6b"),
97+
"order": 140,
98+
},
99+
"Logic | Conditionals":
100+
{
101+
"color": Color("45aaf2"),
102+
"order": 150,
103+
},
104+
"Logic | Comparison":
105+
{
106+
"color": Color("45aaf2"),
107+
"order": 160,
108+
},
109+
"Logic | Boolean":
110+
{
111+
"color": Color("45aaf2"),
112+
"order": 170,
113+
},
114+
"Variables":
115+
{
116+
"color": Color("ff8f08"),
117+
"order": 180,
118+
},
119+
"Math":
120+
{
121+
"color": Color("a55eea"),
122+
"order": 190,
123+
},
124+
"Log":
125+
{
126+
"color": Color("002050"),
127+
"order": 200,
128+
},
129+
}

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

Lines changed: 3 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -4,129 +4,7 @@ extends Object
44
const BlockCategory = preload("res://addons/block_code/ui/picker/categories/block_category.gd")
55
const Types = preload("res://addons/block_code/types/types.gd")
66
const Util = preload("res://addons/block_code/ui/util.gd")
7-
8-
const BLOCKS: Dictionary = {
9-
"control_block": preload("res://addons/block_code/ui/blocks/control_block/control_block.tscn"),
10-
"parameter_block": preload("res://addons/block_code/ui/blocks/parameter_block/parameter_block.tscn"),
11-
"statement_block": preload("res://addons/block_code/ui/blocks/statement_block/statement_block.tscn"),
12-
"entry_block": preload("res://addons/block_code/ui/blocks/entry_block/entry_block.tscn"),
13-
}
14-
15-
## Properties for builtin categories. Order starts at 10 for the first
16-
## category and then are separated by 10 to allow custom categories to
17-
## be easily placed between builtin categories.
18-
const BUILTIN_PROPS: Dictionary = {
19-
"Lifecycle":
20-
{
21-
"color": Color("ec3b59"),
22-
"order": 10,
23-
},
24-
"Transform | Position":
25-
{
26-
"color": Color("4b6584"),
27-
"order": 20,
28-
},
29-
"Transform | Rotation":
30-
{
31-
"color": Color("4b6584"),
32-
"order": 30,
33-
},
34-
"Transform | Scale":
35-
{
36-
"color": Color("4b6584"),
37-
"order": 40,
38-
},
39-
"Graphics | Modulate":
40-
{
41-
"color": Color("03aa74"),
42-
"order": 50,
43-
},
44-
"Graphics | Visibility":
45-
{
46-
"color": Color("03aa74"),
47-
"order": 60,
48-
},
49-
"Graphics | Viewport":
50-
{
51-
"color": Color("03aa74"),
52-
"order": 61,
53-
},
54-
"Graphics | Animation":
55-
{
56-
"color": Color("03aa74"),
57-
"order": 62,
58-
},
59-
"Sounds":
60-
{
61-
"color": Color("e30fc0"),
62-
"order": 70,
63-
},
64-
"Physics | Mass":
65-
{
66-
"color": Color("a5b1c2"),
67-
"order": 80,
68-
},
69-
"Physics | Velocity":
70-
{
71-
"color": Color("a5b1c2"),
72-
"order": 90,
73-
},
74-
"Input":
75-
{
76-
"color": Color("d54322"),
77-
"order": 100,
78-
},
79-
"Communication | Methods":
80-
{
81-
"color": Color("4b7bec"),
82-
"order": 110,
83-
},
84-
"Communication | Groups":
85-
{
86-
"color": Color("4b7bec"),
87-
"order": 120,
88-
},
89-
"Info | Score":
90-
{
91-
"color": Color("cf6a87"),
92-
"order": 130,
93-
},
94-
"Loops":
95-
{
96-
"color": Color("20bf6b"),
97-
"order": 140,
98-
},
99-
"Logic | Conditionals":
100-
{
101-
"color": Color("45aaf2"),
102-
"order": 150,
103-
},
104-
"Logic | Comparison":
105-
{
106-
"color": Color("45aaf2"),
107-
"order": 160,
108-
},
109-
"Logic | Boolean":
110-
{
111-
"color": Color("45aaf2"),
112-
"order": 170,
113-
},
114-
"Variables":
115-
{
116-
"color": Color("ff8f08"),
117-
"order": 180,
118-
},
119-
"Math":
120-
{
121-
"color": Color("a55eea"),
122-
"order": 190,
123-
},
124-
"Log":
125-
{
126-
"color": Color("002050"),
127-
"order": 200,
128-
},
129-
}
7+
const Constants = preload("res://addons/block_code/ui/constants.gd")
1308

1319

13210
## Compare block categories for sorting. Compare by order then name.
@@ -148,7 +26,7 @@ static func get_categories(blocks: Array[Block], extra_categories: Array[BlockCa
14826
if cat == null:
14927
cat = extra_cat_map.get(block.category)
15028
if cat == null:
151-
var props: Dictionary = BUILTIN_PROPS.get(block.category, {})
29+
var props: Dictionary = Constants.BUILTIN_CATEGORIES_PROPS.get(block.category, {})
15230
var color: Color = props.get("color", Color.SLATE_GRAY)
15331
var order: int = props.get("order", 0)
15432
cat = BlockCategory.new(block.category, color, order)
@@ -229,26 +107,4 @@ static func get_inherited_blocks(_class_name: String) -> Array[Block]:
229107

230108

231109
static func get_variable_blocks(variables: Array[VariableResource]):
232-
var block_list: Array[Block]
233-
234-
for variable in variables:
235-
var type_string: String = Types.VARIANT_TYPE_TO_STRING[variable.var_type]
236-
237-
var b = BLOCKS["parameter_block"].instantiate()
238-
b.block_name = "get_var_%s" % variable.var_name
239-
b.variant_type = variable.var_type
240-
b.block_format = variable.var_name
241-
b.statement = variable.var_name
242-
# HACK: Color the blocks since they are outside of the normal picker system
243-
b.color = BUILTIN_PROPS["Variables"].color
244-
block_list.append(b)
245-
246-
b = BLOCKS["statement_block"].instantiate()
247-
b.block_name = "set_var_%s" % variable.var_name
248-
b.block_type = Types.BlockType.STATEMENT
249-
b.block_format = "Set %s to {value: %s}" % [variable.var_name, type_string]
250-
b.statement = "%s = {value}" % [variable.var_name]
251-
b.color = BUILTIN_PROPS["Variables"].color
252-
block_list.append(b)
253-
254-
return block_list
110+
return Util.instantiate_variable_blocks(variables)

addons/block_code/ui/util.gd

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ extends Object
33
const BlockDefinition = preload("res://addons/block_code/code_generation/block_definition.gd")
44
const BlocksCatalog = preload("res://addons/block_code/code_generation/blocks_catalog.gd")
55
const Types = preload("res://addons/block_code/types/types.gd")
6+
const Constants = preload("res://addons/block_code/ui/constants.gd")
67

78
const SCENE_PER_TYPE = {
89
Types.BlockType.ENTRY: preload("res://addons/block_code/ui/blocks/entry_block/entry_block.tscn"),
@@ -65,6 +66,40 @@ static func instantiate_blocks_for_class(_class_name: String) -> Array[Block]:
6566
return blocks
6667

6768

69+
static func get_variable_block_definitions(variables: Array[VariableResource]) -> Array[BlockDefinition]:
70+
var block_definitions: Array[BlockDefinition] = []
71+
for variable: VariableResource in variables:
72+
var type_string: String = Types.VARIANT_TYPE_TO_STRING[variable.var_type]
73+
74+
var b = BlockDefinition.new()
75+
b.name = "get_var_%s" % variable.var_name
76+
b.type = Types.BlockType.VALUE
77+
b.variant_type = variable.var_type
78+
b.display_template = variable.var_name
79+
b.code_template = variable.var_name
80+
block_definitions.append(b)
81+
82+
b = BlockDefinition.new()
83+
b.name = "set_var_%s" % variable.var_name
84+
b.type = Types.BlockType.STATEMENT
85+
b.display_template = "Set %s to {value: %s}" % [variable.var_name, type_string]
86+
b.code_template = "%s = {value}" % [variable.var_name]
87+
block_definitions.append(b)
88+
89+
return block_definitions
90+
91+
92+
static func instantiate_variable_blocks(variables: Array[VariableResource]) -> Array[Block]:
93+
var blocks: Array[Block] = []
94+
for block_definition in get_variable_block_definitions(variables):
95+
var b = instantiate_block(block_definition)
96+
# HACK: Color the blocks since they are outside of the normal picker system
97+
b.color = Constants.BUILTIN_CATEGORIES_PROPS["Variables"].color
98+
blocks.append(b)
99+
100+
return blocks
101+
102+
68103
## Polyfill of Node.is_part_of_edited_scene(), available to GDScript in Godot 4.3+.
69104
static func node_is_part_of_edited_scene(node: Node) -> bool:
70105
if not Engine.is_editor_hint():

0 commit comments

Comments
 (0)