Skip to content

Commit a9059a8

Browse files
authored
Merge pull request #336 from joaquin30/collapse-expand-advanced-settings
Added collapse/expand blocks for "advanced" settings
2 parents 5a86a37 + 7dcd95a commit a9059a8

File tree

9 files changed

+177
-27
lines changed

9 files changed

+177
-27
lines changed

addons/block_code/blocks/sounds/play_sound.tres

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ description = "Play the audio stream with volume and pitch"
1010
category = "Sounds"
1111
type = 2
1212
variant_type = 0
13-
display_template = "play the sound {name: STRING} with volume {db: FLOAT} dB and pitch scale {pitch: FLOAT}"
13+
display_template = "play the sound {name: STRING} | with volume {db: FLOAT} dB and pitch scale {pitch: FLOAT}"
1414
code_template = "var __sound_node = get_node({name})
1515
__sound_node.volume_db = {db}
1616
__sound_node.pitch_scale = {pitch}

addons/block_code/code_generation/block_definition.gd

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -96,19 +96,31 @@ func get_output_parameters() -> Dictionary:
9696

9797
static func parse_display_template(template_string: String):
9898
var items: Array[Dictionary]
99-
for regex_match in _display_template_regex.search_all(template_string):
100-
if regex_match.names.has("label"):
101-
var label_string := regex_match.get_string("label")
102-
items.append({"label": label_string})
103-
elif regex_match.names.has("in_parameter"):
104-
var parameter_string := regex_match.get_string("in_parameter")
105-
items.append({"in_parameter": _parse_parameter_format(parameter_string)})
106-
elif regex_match.names.has("out_parameter"):
107-
var parameter_string := regex_match.get_string("out_parameter")
108-
items.append({"out_parameter": _parse_parameter_format(parameter_string)})
109-
elif regex_match.names.has("const_parameter"):
110-
var parameter_string := regex_match.get_string("const_parameter")
111-
items.append({"const_parameter": _parse_parameter_format(parameter_string)})
99+
# Parse the template string.
100+
var parse_template_string = func(template_string: String, hidden: bool):
101+
for regex_match in _display_template_regex.search_all(template_string):
102+
if regex_match.names.has("label"):
103+
var label_string := regex_match.get_string("label")
104+
items.append({"label": label_string, "hidden": hidden})
105+
elif regex_match.names.has("in_parameter"):
106+
var parameter_string := regex_match.get_string("in_parameter")
107+
items.append({"in_parameter": _parse_parameter_format(parameter_string), "hidden": hidden})
108+
elif regex_match.names.has("out_parameter"):
109+
var parameter_string := regex_match.get_string("out_parameter")
110+
items.append({"out_parameter": _parse_parameter_format(parameter_string), "hidden": hidden})
111+
elif regex_match.names.has("const_parameter"):
112+
var parameter_string := regex_match.get_string("const_parameter")
113+
items.append({"const_parameter": _parse_parameter_format(parameter_string), "hidden": hidden})
114+
# This splits in two the template string in the first "|" character
115+
# to separate normal and hidden parameters.
116+
var sep: int = template_string.find("|")
117+
if sep == -1:
118+
parse_template_string.call(template_string, false)
119+
else:
120+
var template_string_normal := template_string.substr(0, sep).trim_suffix(" ")
121+
var template_string_advanced := template_string.substr(sep + 1)
122+
parse_template_string.call(template_string_normal, false)
123+
parse_template_string.call(template_string_advanced, true)
112124
return items
113125

114126

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
@tool
2+
class_name CollapsableSettings
3+
extends HBoxContainer
4+
5+
@onready var _expand_button: Button = %ExpandSettingsButton
6+
@onready var _collapse_button: Button = %CollapseSettingsButton
7+
var _collapsed := false
8+
9+
10+
func _ready() -> void:
11+
_collapse()
12+
move_child(_expand_button, 0)
13+
move_child(_collapse_button, -1)
14+
_expand_button.connect("button_up", _expand)
15+
_collapse_button.connect("button_up", _collapse)
16+
17+
18+
func _expand() -> void:
19+
if not _collapsed:
20+
return
21+
for child in get_children(true):
22+
child.visible = true
23+
_expand_button.visible = false
24+
_collapse_button.visible = true
25+
_collapsed = false
26+
27+
28+
func _collapse() -> void:
29+
if _collapsed:
30+
return
31+
for child in get_children(true):
32+
child.visible = false
33+
_expand_button.visible = true
34+
_collapsed = true
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
[gd_scene load_steps=4 format=3 uid="uid://1xfpd777g8pf"]
2+
3+
[ext_resource type="Script" path="res://addons/block_code/ui/blocks/utilities/template_editor/collapsable_settings.gd" id="1_f0ssn"]
4+
[ext_resource type="Texture2D" uid="uid://br7yvjjtbuups" path="res://addons/block_code/ui/blocks/utilities/template_editor/plus.png" id="2_8s057"]
5+
[ext_resource type="Texture2D" uid="uid://di3ona3fudjkx" path="res://addons/block_code/ui/blocks/utilities/template_editor/minus.png" id="3_6qcv3"]
6+
7+
[node name="CollapsableSettings" type="HBoxContainer"]
8+
offset_right = 36.0
9+
offset_bottom = 31.0
10+
script = ExtResource("1_f0ssn")
11+
12+
[node name="ExpandSettingsButton" type="Button" parent="."]
13+
unique_name_in_owner = true
14+
layout_mode = 2
15+
icon = ExtResource("2_8s057")
16+
flat = true
17+
icon_alignment = 1
18+
19+
[node name="CollapseSettingsButton" type="Button" parent="."]
20+
unique_name_in_owner = true
21+
custom_minimum_size = Vector2(20, 20)
22+
layout_mode = 2
23+
icon = ExtResource("3_6qcv3")
24+
flat = true
25+
icon_alignment = 1
Loading
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
[remap]
2+
3+
importer="texture"
4+
type="CompressedTexture2D"
5+
uid="uid://di3ona3fudjkx"
6+
path="res://.godot/imported/minus.png-7cbe293178ea19d9e5fbc8ba50c3a01b.ctex"
7+
metadata={
8+
"vram_texture": false
9+
}
10+
11+
[deps]
12+
13+
source_file="res://addons/block_code/ui/blocks/utilities/template_editor/minus.png"
14+
dest_files=["res://.godot/imported/minus.png-7cbe293178ea19d9e5fbc8ba50c3a01b.ctex"]
15+
16+
[params]
17+
18+
compress/mode=0
19+
compress/high_quality=false
20+
compress/lossy_quality=0.7
21+
compress/hdr_compression=1
22+
compress/normal_map=0
23+
compress/channel_pack=0
24+
mipmaps/generate=false
25+
mipmaps/limit=-1
26+
roughness/mode=0
27+
roughness/src_normal=""
28+
process/fix_alpha_border=true
29+
process/premult_alpha=false
30+
process/normal_map_invert_y=false
31+
process/hdr_as_srgb=false
32+
process/hdr_clamp_exposure=false
33+
process/size_limit=0
34+
detect_3d/compress_to=1
Loading
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
[remap]
2+
3+
importer="texture"
4+
type="CompressedTexture2D"
5+
uid="uid://br7yvjjtbuups"
6+
path="res://.godot/imported/plus.png-415014510d01c9db50069dbfc9e6ab6f.ctex"
7+
metadata={
8+
"vram_texture": false
9+
}
10+
11+
[deps]
12+
13+
source_file="res://addons/block_code/ui/blocks/utilities/template_editor/plus.png"
14+
dest_files=["res://.godot/imported/plus.png-415014510d01c9db50069dbfc9e6ab6f.ctex"]
15+
16+
[params]
17+
18+
compress/mode=0
19+
compress/high_quality=false
20+
compress/lossy_quality=0.7
21+
compress/hdr_compression=1
22+
compress/normal_map=0
23+
compress/channel_pack=0
24+
mipmaps/generate=false
25+
mipmaps/limit=-1
26+
roughness/mode=0
27+
roughness/src_normal=""
28+
process/fix_alpha_border=true
29+
process/premult_alpha=false
30+
process/normal_map_invert_y=false
31+
process/hdr_as_srgb=false
32+
process/hdr_clamp_exposure=false
33+
process/size_limit=0
34+
detect_3d/compress_to=1

addons/block_code/ui/blocks/utilities/template_editor/template_editor.gd

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const ParameterInput = preload("res://addons/block_code/ui/blocks/utilities/para
1212
const ParameterInputScene = preload("res://addons/block_code/ui/blocks/utilities/parameter_input/parameter_input.tscn")
1313
const ParameterOutput = preload("res://addons/block_code/ui/blocks/utilities/parameter_output/parameter_output.gd")
1414
const ParameterOutputScene = preload("res://addons/block_code/ui/blocks/utilities/parameter_output/parameter_output.tscn")
15+
const CollapsableSettingsScene = preload("res://addons/block_code/ui/blocks/utilities/template_editor/collapsable_settings.tscn")
1516

1617
## A string describing a block's display format. For example:
1718
## [br]
@@ -86,27 +87,37 @@ func _update_from_format_string():
8687
_container.remove_child(child)
8788
child.queue_free()
8889

89-
var match_id = 0
90+
var match_id: int = 0
91+
var is_collapsable := false
92+
var collapsable: CollapsableSettings = CollapsableSettingsScene.instantiate()
9093
for item in BlockDefinition.parse_display_template(format_string):
94+
var hidden: bool = item.get("hidden", false)
95+
var container: Container = collapsable if hidden else _container
96+
if hidden:
97+
is_collapsable = true
9198
if item.has("label"):
92-
_append_label(item.get("label"))
99+
_append_label(container, item.get("label"))
93100
elif item.has("in_parameter"):
94-
_append_input_parameter(item.get("in_parameter"), match_id)
101+
_append_input_parameter(container, item.get("in_parameter"), match_id)
95102
elif item.has("out_parameter"):
96-
_append_output_parameter(item.get("out_parameter"), match_id)
103+
_append_output_parameter(container, item.get("out_parameter"), match_id)
97104
elif item.has("const_parameter"):
98-
_append_const_parameter(item.get("const_parameter"), match_id)
105+
_append_const_parameter(container, item.get("const_parameter"), match_id)
99106
match_id += 1
107+
if is_collapsable:
108+
_container.add_child(collapsable)
109+
else:
110+
collapsable.queue_free()
100111

101112

102-
func _append_label(label_format: String):
113+
func _append_label(container: Container, label_format: String):
103114
var label = Label.new()
104115
label.add_theme_color_override("font_color", Color.WHITE)
105116
label.text = label_format.strip_edges()
106-
_container.add_child(label)
117+
container.add_child(label)
107118

108119

109-
func _append_input_parameter(parameter: Dictionary, id: int) -> ParameterInput:
120+
func _append_input_parameter(container: Container, parameter: Dictionary, id: int) -> ParameterInput:
110121
var default_value = parameter_defaults.get(parameter["name"])
111122

112123
var parameter_input: ParameterInput = ParameterInputScene.instantiate()
@@ -125,26 +136,26 @@ func _append_input_parameter(parameter: Dictionary, id: int) -> ParameterInput:
125136

126137
parameter_input.modified.connect(func(): modified.emit())
127138

128-
_container.add_child(parameter_input)
139+
container.add_child(parameter_input)
129140
_parameter_inputs_by_name[parameter["name"]] = parameter_input
130141

131142
return parameter_input
132143

133144

134-
func _append_output_parameter(parameter: Dictionary, id: int):
145+
func _append_output_parameter(container: Container, parameter: Dictionary, id: int):
135146
var parameter_output: ParameterOutput
136147

137148
parameter_output = ParameterOutputScene.instantiate()
138149
parameter_output.name = "ParameterOutput%d" % id
139150
parameter_output.block = parent_block
140151
parameter_output.parameter_name = parameter["name"]
141-
_container.add_child(parameter_output)
152+
container.add_child(parameter_output)
142153

143154

144-
func _append_const_parameter(parameter: Dictionary, id: int):
155+
func _append_const_parameter(container: Container, parameter: Dictionary, id: int):
145156
# const_parameter is a kind of in_parameter with default value, but never
146157
# changes value.
147-
var parameter_const := _append_input_parameter(parameter, id)
158+
var parameter_const := _append_input_parameter(container, parameter, id)
148159
parameter_const.visible = false
149160

150161

0 commit comments

Comments
 (0)