broken_seals/game/ui/about/Third-Party Licenses.gd

148 lines
4.0 KiB
GDScript

extends VBoxContainer
export(NodePath) var tree_path : NodePath
var tree : Tree
export(NodePath) var rtl_path : NodePath
var rtl : RichTextLabel
var populated : bool = false
var _data : Array = Array()
enum AttibutionIndex {
ATTRIBUTION_INDEX_NAME = 0,
ATTRIBUTION_INDEX_URL = 1,
ATTRIBUTION_INDEX_DESCRIPTION = 2,
ATTRIBUTION_INDEX_LICENSES = 3,
ATTRIBUTION_INDEX_FILES = 4,
ATTRIBUTION_INDEX_MAX = 5,
}
func _enter_tree():
tree = get_node(tree_path) as Tree
rtl = get_node(rtl_path) as RichTextLabel
connect("visibility_changed", self, "on_visibility_changed")
tree.connect("item_selected", self, "on_item_selected")
func on_visibility_changed():
if visible:
populate()
func on_item_selected():
rtl.text = tree.get_selected().get_metadata(0)
func populate():
if populated:
return
populated = true
#root
tree.create_item()
_data.clear()
load_all_xmls("res://")
for entry in _data:
var main : TreeItem = tree.create_item()
main.set_text(0, entry[0][0])
main.set_metadata(0, data_arr_to_string(entry[0]))
for i in range(1, entry.size()):
var curr : TreeItem = tree.create_item(main)
curr.set_text(0, entry[i][0])
curr.set_metadata(0, data_arr_to_string(entry[i]))
func load_all_xmls(path : String) -> void:
var dir = Directory.new()
if dir.open(path) == OK:
dir.list_dir_begin()
var file_name = dir.get_next()
while file_name != "":
if file_name == "." or file_name == "..":
file_name = dir.get_next()
continue
if dir.current_is_dir():
if path == "res://":
load_all_xmls(path + file_name)
else:
load_all_xmls(path + "/" + file_name)
else:
if file_name == "Attributions.xml":
if path == "res://":
load_xml(path + file_name)
else:
load_xml(path + "/" + file_name)
file_name = dir.get_next()
else:
print("An error occurred when trying to access the path: " + path)
func load_xml(path : String) -> void:
var parser : XMLParser = XMLParser.new()
var err = parser.open(path)
if err != OK:
print("Couldn't open file: " + path + " Err: " + err)
return
var attributions : Array = Array()
attributions.resize(1)
var attrib : PoolStringArray = PoolStringArray()
attrib.resize(AttibutionIndex.ATTRIBUTION_INDEX_MAX)
var curr_element : String = ""
while parser.read() == OK:
if parser.get_node_type() == XMLParser.NODE_ELEMENT:
curr_element = parser.get_node_name()
elif parser.get_node_type() == XMLParser.NODE_TEXT:
if curr_element == "Name":
attrib[AttibutionIndex.ATTRIBUTION_INDEX_NAME] = parser.get_node_data()
elif curr_element == "Description":
attrib[AttibutionIndex.ATTRIBUTION_INDEX_DESCRIPTION] = parser.get_node_data()
elif curr_element == "Licenses":
attrib[AttibutionIndex.ATTRIBUTION_INDEX_LICENSES] = parser.get_node_data()
elif curr_element == "URL":
attrib[AttibutionIndex.ATTRIBUTION_INDEX_URL] = parser.get_node_data()
elif curr_element == "Files":
attrib[AttibutionIndex.ATTRIBUTION_INDEX_FILES] = parser.get_node_data()
elif parser.get_node_type() == XMLParser.NODE_ELEMENT_END:
if parser.get_node_name() == "Attribution":
attributions.push_back(attrib)
attrib = PoolStringArray()
attrib.resize(AttibutionIndex.ATTRIBUTION_INDEX_MAX)
elif parser.get_node_name() == "Module":
attributions[0] = attrib
attrib = PoolStringArray()
attrib.resize(AttibutionIndex.ATTRIBUTION_INDEX_MAX)
if attributions[0] == null:
print("Attributions file does not have a Module tag! Path: " + path)
_data.push_back(attributions)
func data_arr_to_string(arr : Array) -> String:
var s : String = ""
s += arr[AttibutionIndex.ATTRIBUTION_INDEX_NAME] + "\n\n"
if arr[AttibutionIndex.ATTRIBUTION_INDEX_URL] != "":
s += "url: " + arr[AttibutionIndex.ATTRIBUTION_INDEX_URL] + "\n\n"
s += arr[AttibutionIndex.ATTRIBUTION_INDEX_DESCRIPTION] + "\n\n"
s += "License(s):\n"
s += arr[AttibutionIndex.ATTRIBUTION_INDEX_LICENSES] + "\n\n"
if arr[AttibutionIndex.ATTRIBUTION_INDEX_FILES] != "":
s += "File(s):\n\n"
s += arr[AttibutionIndex.ATTRIBUTION_INDEX_FILES]
return s