RetroDECK/tools/configurator/scripts/class_functions.gd
monkeyx-net 77eb009fff On branch feat/godot-configurator
Changes to be committed:
	modified:   tools/configurator/components/bios_check/bios_check.gd
	new file:   tools/configurator/data_list.json
	new file:   tools/configurator/data_list.yml
	modified:   tools/configurator/main.gd
	modified:   tools/configurator/project.godot
	modified:   tools/configurator/res/pixel_ui_theme/RetroDECKTheme.tres
	modified:   tools/configurator/scripts/class_functions.gd
	modified:   tools/configurator/tk_about.gd
2024-08-01 11:47:55 +01:00

163 lines
4.8 KiB
GDScript

class_name ClassFunctions extends Control
# This should be looked at again when GoDot 4.3 ships as has new OS.execute_with_pipe
func array_to_string(arr: Array) -> String:
var text: String
for line in arr:
#text += line + "\n"
text = line.strip_edges() + "\n"
return text
func execute_command(command: String, parameters: Array, console: bool) -> Dictionary:
var result = {}
var output = []
var exit_code = OS.execute(command, parameters, output, console) ## add if exit == 0 etc
result["output"] = array_to_string(output)
result["exit_code"] = exit_code
#print (array_to_string(output))
#print (result["exit_code"])
return result
func run_command_in_thread(command: String, paramaters: Array, _console: bool) -> Dictionary:
var thread = Thread.new()
thread.start(execute_command.bind(command,paramaters,false))
while thread.is_alive():
await get_tree().process_frame
var result = thread.wait_to_finish()
thread = null
return result
func _threaded_command_execution(command: String, parameters: Array, console: bool) -> Dictionary:
var result = execute_command(command, parameters, console)
return result
# Make this generic for command, path and naming
func get_text_file_from_system_path(file_path: String, command: String, etype: String) -> Dictionary:
var output: Array
var data_dict: Dictionary
command += file_path
var exit_code = OS.execute("sh", ["-c", command], output)
if exit_code == 0:
var content = array_to_string(output)
if etype == "emulist":
data_dict = parse_file_list(content)
elif etype == "normal":
data_dict = parse_imported_string(content)
else:
print ("Error in get text function")
return data_dict
else:
print("Error reading file: ", exit_code)
return {}
func parse_imported_string(input_string: String) -> Dictionary:
var _result: Dictionary
var _current_dict_key: String
var lines = input_string.strip_edges().split("\n", false)
#if lines.size() > 0:
# lines = lines.slice(1, lines.size()) # Skip the first line
for line in lines:
_current_dict_key = line
var parts = line.split("=", false)
if parts.size() == 2:
var key = parts[0]
var value_str = parts[1]
_result[key] = {"KEY": key, "Value": value_str}
return _result
func parse_file_list(content: String) -> Dictionary:
var file_dict = {}
var regex = RegEx.new()
regex.compile(r'"([^"]+)"\s*"([^"]+)"')
var matches = regex.search_all(content)
for match in matches:
var name = match.get_string(1)
var description = match.get_string(2)
file_dict[name] = description
return file_dict
func process_url_image(body) -> Texture:
var image = Image.new()
image.load_png_from_buffer(body)
var texture = ImageTexture.create_from_image(image)
return texture
func launch_help(url: String) -> void:
OS.shell_open(url)
func import_csv_data(file_path: String) -> Dictionary:
# check if file exists
var data_dict: Dictionary
var file = FileAccess.open(file_path,FileAccess.READ)
if file:
var csv_lines: PackedStringArray = file.get_as_text().strip_edges().split("\n")
for i in range(1, csv_lines.size()): # Start from 1 to skip the header
var line = csv_lines[i]
var columns = line.split(",")
if columns.size() >= 3:
var id = columns[0]
var url = columns[1]
var description = columns[2]
data_dict[id] = {"URL": url, "Description": description}
file.close()
else:
print ("Could not open file: %s", file_path)
return data_dict
func _import_data_lists(file_path: String) -> void:
var tk_about: Dictionary = import_csv_data(file_path)
for key in tk_about.keys():
var entry = tk_about[key]
print("ID: " + key)
print("URL: " + entry["URL"])
print("Description: " + entry["Description"])
print("---")
func get_about_links_from_file(file_path: String) -> Dictionary:
var about_links_dict = {}
var file = FileAccess.open(file_path, FileAccess.READ)
if file:
var json_string = file.get_as_text()
file.close()
var json = JSON.new()
var parse_result = json.parse(json_string)
print ("RES: %s",parse_result)
if parse_result == OK:
var data = parse_result
print (data)
print("JSON Parse Error: ", json.get_error_message(), " in ", json_string, " at line ", json.get_error_line())
#continue
if parse_result is Dictionary:
if parse_result.has("about_links"):
var about_links = parse_result["about_links"]
about_links_dict = parse_about_links(about_links)
else:
print("Error: 'about_links' key not found in JSON.")
else:
print("Error parsing JSON: %s" % json.error_string)
else:
print("Failed to open file: %s" % file_path)
print (about_links_dict)
return about_links_dict
func parse_about_links(about_links: Array) -> Dictionary:
var about_links_dict = {}
for link in about_links:
about_links_dict[link["id"]] = {
"name": link["name"],
"url": link["url"],
"description": link["description"]
}
return about_links_dict