Skip to content

Commit 5cfef5d

Browse files
committed
Fixed string duplication, added init values
* Fixed a bug that was causing the output to be duplicated several times * Added initialized value detection * Added some extra generated text for the class declaration
1 parent 6a1037f commit 5cfef5d

File tree

3 files changed

+125
-128
lines changed

3 files changed

+125
-128
lines changed

scenes/gui.gd

Lines changed: 55 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,23 @@ class_name AppRoot
66
const a_tab:String = " "
77

88
#Class things
9-
const class_declaration:String = "class {class_name_}: public {inherits}{"
9+
const class_declaration:String = "class {class_name}: public {inherits}{\n"
1010
const class_var_get:String = " {var_type} get_{var_name}();\n"
1111
const class_var_set:String = " void set_{var_name}({var_type} new_{var_name}); \n"
1212

13-
#Variable setgets
14-
const var_setget_get:String = "{var_type} {class_name_}::get_{var_name}(){\n return {var_name};\n}\n"
15-
const var_setget_set:String = "void {class_name_}::set_{var_name}({var_type} new_{var_name}){\n {var_name} = new_{var_name};\n}\n"
16-
17-
#Variable bindings
18-
const var_bind_get:String = " ClassDB::bind_method(D_METHOD(\"get_{var_name}\"), &{class_name_}::get_{var_name});\n"
19-
const var_bind_set:String = " ClassDB::bind_method(D_METHOD(\"set_{var_name}\", \"{var_name}\"), &{class_name_}::set_{var_name});\n"
20-
2113
#Functions
2214
const func_declaration:String = " {var_type} {func_name}({func_params});\n"
2315
const func_param:String = "{var_type} {var_name}"
24-
const func_bind_args:String = " ClassDB::bind_method(D_METHOD(\"{function_name}\", \"{func_args}\"), &{class_name_}::{function_name});\n"
25-
const func_bind_no_arg:String = " ClassDB::bind_method(D_METHOD(\"{function_name}\"), &{class_name_}::{function_name});\n"
16+
const func_bind_args:String = " ClassDB::bind_method(D_METHOD(\"{function_name}\", \"{func_args}\"), &{class_name}::{function_name});\n"
17+
const func_bind_no_arg:String = " ClassDB::bind_method(D_METHOD(\"{function_name}\"), &{class_name}::{function_name});\n"
18+
19+
#Variable setgets
20+
const var_setget_get:String = "{var_type} {class_name}::get_{var_name}(){\n return {var_name};\n}\n"
21+
const var_setget_set:String = "void {class_name}::set_{var_name}({var_type} new_{var_name}){\n {var_name} = new_{var_name};\n}\n"
22+
23+
#Variable bindings
24+
const var_bind_get:String = " ClassDB::bind_method(D_METHOD(\"get_{var_name}\"), &{class_name}::get_{var_name});\n"
25+
const var_bind_set:String = " ClassDB::bind_method(D_METHOD(\"set_{var_name}\", \"{var_name}\"), &{class_name}::set_{var_name});\n"
2626

2727
const variant_enum_strings_commmon:Dictionary = {
2828
"bool": "BOOL",
@@ -39,6 +39,7 @@ const variant_enum_strings_4:Dictionary = {
3939
"StringName": "STRING_NAME",
4040
"Vector2i": "VECTOR2I",
4141

42+
"PoolByteArray": "PACKED_BYTE_ARRAY",
4243
"PackedByteArray": "PACKED_BYTE_ARRAY",
4344
"PackedInt32Array": "PACKED_INT32_ARRAY",
4445
"PackedFloat32Array": "PACKED_FLOAT32_ARRAY",
@@ -48,11 +49,10 @@ const variant_enum_strings_3:Dictionary = {
4849
"StringName": "STRING",
4950
"Vector2i": "VECTOR2",
5051

52+
"PoolByteArray": "POOL_BYTE_ARRAY",
5153
"PackedByteArray": "POOL_BYTE_ARRAY",
5254
"PackedInt32Array": "POOL_INT_ARRAY",
5355
"PackedFloat32Array": "POOL_REAL_ARRAY",
54-
55-
5656
}
5757

5858
@onready var cpp_header:CodeEdit = $"VBoxContainer/Main/C++Column/C++Tabs/Header"
@@ -70,43 +70,68 @@ var process_context:Callable
7070
var input_load_context:Callable
7171

7272
func _ready() -> void:
73+
#TODO:Load settings from filesystem
7374
pass
7475

7576
func _on_load_input_pressed() -> void:
77+
clear_data()
7678
if not input_load_context.is_null():
7779
input_load_context.call()
7880

7981
func _on_save_output_pressed() -> void:
80-
var format_dict:Dictionary = {
81-
"class_name": current_class_name.to_snake_case()
82-
}
82+
var format_dict:Dictionary = {"class_name": current_class_name.to_snake_case()}
83+
var file_io:FileAccess
84+
var file_name:String
85+
86+
OS.request_permissions() #POV: Android support is a one-line addition
87+
88+
file_name = "{class_name}.hpp".format(format_dict)
89+
file_io = FileAccess.open(settings.output_directory.path_join(file_name), FileAccess.WRITE)
90+
if FileAccess.get_open_error() == OK and not cpp_header.text.is_empty():
91+
file_io.store_string(cpp_header.text)
92+
file_io.close()
8393

84-
write_to_file("{class_name}.hpp".format(format_dict), cpp_header.text)
85-
write_to_file("{class_name}.cpp".format(format_dict), cpp_code.text)
86-
write_to_file("{class_name}_set_gets.cpp".format(format_dict), cpp_setgets.text)
87-
write_to_file("{class_name}_bindings.cpp".format(format_dict), cpp_binding.text)
94+
file_name = "{class_name}.cpp".format(format_dict)
95+
file_io = FileAccess.open(settings.output_directory.path_join(file_name), FileAccess.WRITE)
96+
if FileAccess.get_open_error() == OK and not cpp_code.text.is_empty():
97+
file_io.store_string(cpp_code.text)
98+
file_io.close()
99+
100+
file_name = "{class_name}_set_gets.cpp".format(format_dict)
101+
file_io = FileAccess.open(settings.output_directory.path_join(file_name), FileAccess.WRITE)
102+
if FileAccess.get_open_error() == OK and not cpp_setgets.text.is_empty():
103+
file_io.store_string(cpp_setgets.text)
104+
file_io.close()
105+
106+
file_name = "{class_name}_bindings.cpp".format(format_dict)
107+
file_io = FileAccess.open(settings.output_directory.path_join(file_name), FileAccess.WRITE)
108+
if FileAccess.get_open_error() == OK and not cpp_binding.text.is_empty():
109+
file_io.store_string(cpp_binding.text)
110+
file_io.close()
88111

89112

90113
func _on_open_output_pressed() -> void:
91114
OS.shell_open(settings.output_directory)
92115

93116
func _on_process_input_pressed() -> void:
117+
clear_data()
94118
if not process_context.is_null():
95119
process_context.call()
96120

97121
func _on_open_settings_pressed() -> void:
98122
pass # Replace with function body.
99123

100-
func clear_data() -> void:
101-
current_class_name = ""
102-
process_context = Callable()
103-
input_load_context = Callable()
104-
105-
func write_to_file(file_name:String, data:String) -> void:
106-
var file:FileAccess = FileAccess.open(settings.output_directory.path_join(file_name), FileAccess.WRITE)
107-
if FileAccess.get_open_error() == OK and not data.is_empty():
108-
file.store_string(data)
109-
file.close()
124+
func clear_data(reset_globals:bool = false) -> void:
125+
cpp_header.text = ""
126+
cpp_code.text = ""
127+
cpp_binding.text = ""
128+
cpp_setgets.text = ""
129+
130+
if reset_globals:
131+
current_class_name = ""
132+
133+
input_load_context = Callable()
134+
process_context = Callable()
110135

111136
func generate_version_specific_var_enums() -> void:
112137
if settings.godot_3_mode:

scripts/templates/var_type.gd

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,5 @@ var hint_string:String
2727
var usage_bitfield:int
2828

2929
func _init(info:Dictionary = {}) -> void:
30-
var_type = info.get("type", 0)
30+
num_increment += 1
31+
var_type = type_string(info.get("type", 0))

scripts/variable_helper.gd

Lines changed: 68 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,13 @@ enum FileType {
1010
SETGET
1111
}
1212

13-
class GenPreFab:
14-
extends Resource
15-
var file_type:FileType
16-
##The file being saved to
17-
var file_name:String
18-
##The name of the variable
19-
var var_name:String
20-
##The type of the variable, eg. "int", "Node3D", etc.
21-
var var_type:String
22-
##The templates to be formatted and written to a file
23-
var text_arr:PackedStringArray
24-
25-
var valuedict: Dictionary = {
26-
"variable": "",
27-
"class": "",
28-
"defvar": "",
29-
"var_enum" : ""
30-
}
31-
var arguments:Dictionary = {
32-
33-
}
34-
3513
@onready var text_box:TextEdit = $values
3614

3715
var root:AppRoot
3816

3917
var default_var:String
4018

41-
var variable_array:Array[GenPreFab] = []
19+
var variable_array:Array[VariableInfo] = []
4220

4321
func _ready() -> void:
4422
root = get_tree().current_scene
@@ -56,87 +34,80 @@ func _on_visibility_changed() -> void:
5634
pass
5735

5836
func generate():
59-
variable_array.clear()
60-
if default_var.is_empty():
61-
default_var = "Variant"
62-
if root.current_class_name.is_empty():
63-
OS.alert("You haven't set a class for your variables!", "No class set")
64-
return
6537
parse_values()
66-
for fabs in variable_array:
38+
39+
root.cpp_header.text += root.class_declaration.format({"class_name": root.current_class_name, "inherits": root.class_inherits})
40+
for fabs:VariableInfo in variable_array:
41+
var value_dict: Dictionary = {
42+
"variable": fabs.var_name,
43+
"class": root.current_class_name,
44+
"inherits": root.class_inherits,
45+
"defvar": fabs.var_type,
46+
"var_enum" : fabs.type_enum_string,
47+
"init_value": fabs.init_value
48+
}
49+
50+
var templates:PackedStringArray
51+
6752
#Bindings
68-
fabs.file_type = FileType.BINDING
69-
fabs.text_arr.append(" ClassDB::bind_method(D_METHOD(\"get_{variable}\"), &{class}::get_{variable});\n")
70-
fabs.text_arr.append(" ClassDB::bind_method(D_METHOD(\"set_{variable}\", \"{variable}\"), &{class}::set_{variable});\n\n")
71-
fabs.text_arr.append(" ADD_PROPERTY(PropertyInfo(Variant::{var_enum}, \"{variable}\"), \"set_{variable}\", \"get_{variable}\");\n\n")
72-
write(fabs)
53+
templates.append(" ClassDB::bind_method(D_METHOD(\"get_{variable}\"), &{class}::get_{variable});\n")
54+
templates.append(" ClassDB::bind_method(D_METHOD(\"set_{variable}\", \"{variable}\"), &{class}::set_{variable});\n\n")
55+
templates.append(" ADD_PROPERTY(PropertyInfo(Variant::{var_enum}, \"{variable}\"), \"set_{variable}\", \"get_{variable}\");\n\n")
56+
for each_template:String in templates:
57+
root.cpp_binding.text += each_template.format(value_dict)
58+
templates.clear()
59+
7360
#set_gets
74-
fabs.text_arr.clear()
75-
fabs.file_type = FileType.SETGET
76-
fabs.text_arr.append("{defvar} {class}::get_{variable}(){\n return {variable};\n}\n\n")
77-
fabs.text_arr.append("void {class}::set_{variable}({defvar} new_{variable}){\n {variable} = new_{variable};\n}\n\n")
78-
write(fabs)
61+
templates.append("{defvar} {class}::get_{variable}(){\n return {variable};\n}\n\n")
62+
templates.append("void {class}::set_{variable}({defvar} new_{variable}){\n {variable} = new_{variable};\n}\n\n")
63+
for each_template:String in templates:
64+
root.cpp_setgets.text += each_template.format(value_dict)
65+
templates.clear()
66+
7967
#function class definition
80-
fabs.text_arr.clear()
81-
fabs.file_type = FileType.HEADER
82-
fabs.text_arr.append(" {defvar} {variable};\n")
83-
fabs.text_arr.append(" {defvar} get_{variable}();\n")
84-
fabs.text_arr.append(" void set_{variable}({defvar} new_{variable}); \n\n")
85-
write(fabs)
86-
87-
88-
68+
if fabs.init_value:
69+
templates.append(" {defvar} {variable} = {init_value};\n")
70+
else:
71+
templates.append(" {defvar} {variable};\n")
72+
templates.append(" {defvar} get_{variable}();\n")
73+
templates.append(" void set_{variable}({defvar} new_{variable}); \n\n")
74+
75+
for each_template:String in templates:
76+
root.cpp_header.text += each_template.format(value_dict)
77+
templates.clear()
78+
root.cpp_header.text += "}\n\n"
8979

9080
func parse_values():
81+
variable_array.clear()
82+
9183
var unspaced_values:String = text_box.text.replacen(" ", "")
9284

93-
#cheap way to detect if any functions are being bound
94-
if unspaced_values.contains("("):
95-
pass
96-
else: #variables only, use old parser
97-
var var_array:PackedStringArray = unspaced_values.split(",", false)
98-
99-
for variables:String in var_array:
100-
var fab:GenPreFab = GenPreFab.new()
101-
var fab_2:VariableInfo = VariableInfo.new()
102-
var split:PackedStringArray = variables.split(":", false)
103-
if split.size() > 1: #Variable is typed, and ":" being present was not a false positive
104-
fab.var_name = split[0]
105-
fab_2.var_name = split[0]
106-
fab.var_type = split[1]
107-
fab_2.var_type = split[1]
108-
else: #Variable is assumed to be untyped; use default var
109-
fab.var_name = variables
110-
fab_2.var_name = variables
111-
fab.var_type = default_var
112-
fab_2.var_type = default_var
113-
variable_array.append(fab)
114-
115-
func write(prefab:GenPreFab):
116-
var code_box:CodeEdit
117-
match prefab.file_type:
118-
FileType.HEADER:
119-
code_box = root.cpp_header
120-
FileType.BINDING:
121-
code_box = root.cpp_binding
122-
FileType.SETGET:
123-
code_box = root.cpp_setgets
124-
_:
125-
push_error("Huh.")
85+
if default_var.is_empty():
86+
default_var = "Variant"
87+
if root.current_class_name.is_empty():
88+
OS.alert("You haven't set a class for your variables!", "No class set")
89+
return
12690

127-
var valuedict: Dictionary = {
128-
"variable": "",
129-
"class": root.current_class_name,
130-
"defvar": default_var,
131-
"var_enum" : root.format_variant_enum(default_var)
132-
}
133-
for entries in variable_array:
134-
if entries.var_type != default_var:
135-
#Also done, just in case, because Dictionaries are weird
136-
valuedict["defvar"] = entries.var_type
137-
valuedict["var_enum"] = root.format_variant_enum(entries.var_type)
91+
var var_array:PackedStringArray = unspaced_values.split(",", false)
92+
93+
for variables:String in var_array:
94+
var var_info:VariableInfo = VariableInfo.new()
95+
96+
#static type detection
97+
var split:PackedStringArray = variables.split(":", false)
98+
if split.size() > 1: #Variable is typed
99+
var_info.var_name = split[0]
100+
101+
if split[1].contains("="): #init value detected
102+
var subsplit:PackedStringArray = split[1].split("=")
103+
var_info.var_type = subsplit[0]
104+
var_info.init_value = subsplit[1]
105+
else:
106+
var_info.var_type = split[1]
107+
else: #Variable is assumed to be untyped; use default var
108+
var_info.var_name = variables
109+
var_info.var_type = default_var
110+
111+
var_info.type_enum_string = root.format_variant_enum(var_info.var_type)
138112

139-
valuedict["class"] = root.current_class_name
140-
valuedict["variable"] = entries.var_name
141-
for string_templates in prefab.text_arr:
142-
code_box.text += string_templates.format(valuedict)
113+
variable_array.append(var_info)

0 commit comments

Comments
 (0)