forked from Nekojimi/JackIt
104 lines
4.4 KiB
GDScript
104 lines
4.4 KiB
GDScript
@tool
|
|
## A resource group is a set of resources in the project
|
|
## that you want to access at runtime.
|
|
@icon("resource_group.svg")
|
|
class_name ResourceGroup
|
|
extends Resource
|
|
|
|
const PathVerifier = preload("path_verifier.gd")
|
|
|
|
## The base folder for locating files in this resource group.
|
|
@export_dir var base_folder:String = ""
|
|
## Files that should be included. Can contain ant-style wildcards:
|
|
## ** - matches zero or more characters (including "/")
|
|
## * - matches zero or more characters (excluding "/")
|
|
## ? - matches one character
|
|
@export var includes:Array[String] = []
|
|
|
|
## Files which should be excluded. Is applied after the include filter.
|
|
## Can also contain ant-style wildcards.
|
|
@export var excludes:Array[String] = []
|
|
|
|
## The paths of the project that match this resource group.
|
|
@export_custom(PROPERTY_USAGE_READ_ONLY, "") var paths:Array[String] = []
|
|
|
|
|
|
## Loads all resources in this resource group and returns them.
|
|
func load_all() -> Array[Resource]:
|
|
var result:Array[Resource] = []
|
|
load_all_into(result)
|
|
return result
|
|
|
|
## Loads all resources and stores them into the given array. Allows
|
|
## to load resources into typed arrays for better type safety. If
|
|
## the item is not of the required type, an error will be printed and
|
|
## the item is skipped.
|
|
func load_all_into(destination:Array):
|
|
for path in paths:
|
|
destination.append(load(path))
|
|
|
|
## Gets all paths of resources inside of this resource group that
|
|
## match the given include and exclude criteria
|
|
func get_matching_paths(includes:Array[String], excludes:Array[String]) -> Array[String]:
|
|
var path_verifier = PathVerifier.new(base_folder, includes, excludes)
|
|
return paths.filter(func(it): return path_verifier.matches(it))
|
|
|
|
## Loads all resources in this resource group that match the given
|
|
## include and exclude criteria
|
|
func load_matching(includes:Array[String], excludes:Array[String]) -> Array[Resource]:
|
|
var result:Array[Resource] = []
|
|
load_matching_into(result, includes, excludes)
|
|
return result
|
|
|
|
|
|
## Loads all resources in this resource group that match the given
|
|
## include and exclude criteria and stores them into the given array.
|
|
## Allows to load resources into typed arrays for better type safety. If
|
|
## the item is not of the required type, an error will be printed and
|
|
## the item is skipped.
|
|
func load_matching_into(destination:Array, includes:Array[String], excludes:Array[String]):
|
|
var matching_paths = get_matching_paths(includes, excludes)
|
|
for path in matching_paths:
|
|
destination.append(load(path))
|
|
|
|
|
|
## Loads all resources in this resource group in background. Returns
|
|
## a ResourceGroupBackgroundLoader object which can be used to check the
|
|
## status and collect the results. Will call the on_resource_loaded callable for each
|
|
## loaded resource.
|
|
func load_all_in_background(on_resource_loaded:Callable) -> ResourceGroupBackgroundLoader:
|
|
return ResourceGroupBackgroundLoader.new(paths, on_resource_loaded)
|
|
|
|
## Loads all resources in this resource group that match the given
|
|
## include and exclude criteria in background. ResourceGroupBackgroundLoader object which can be used to check the
|
|
## status and collect the results. Will call the on_resource_loaded callable for each
|
|
## loaded resource.
|
|
func load_matching_in_background(includes:Array[String], excludes:Array[String], on_resource_loaded:Callable) \
|
|
-> ResourceGroupBackgroundLoader:
|
|
return ResourceGroupBackgroundLoader.new(get_matching_paths(includes, excludes), on_resource_loaded)
|
|
|
|
#### CSHARP Specifics ####
|
|
|
|
# Workaround for C# interop not being able to properly convert arrays into Godot land.
|
|
func __csharp_get_matching_paths(includes:Array, excludes:Array) -> Array[String]:
|
|
return get_matching_paths(__to_string_array(includes), __to_string_array(excludes))
|
|
|
|
|
|
# Workaround for C# interop not being able to properly convert arrays into Godot land.
|
|
func __csharp_load_matching(includes:Array, excludes:Array) -> Array[Resource]:
|
|
return load_matching(__to_string_array(includes), __to_string_array(excludes))
|
|
|
|
|
|
# Workaround for C# interop not being able to properly convert arrays into Godot land.
|
|
func __csharp_load_matching_in_background(includes:Array, excludes:Array, on_resource_loaded:Callable) -> ResourceGroupBackgroundLoader:
|
|
return load_matching_in_background(__to_string_array(includes), __to_string_array(excludes), on_resource_loaded)
|
|
|
|
|
|
# Converts an untyped array to a string array.
|
|
func __to_string_array(array:Array) -> Array[String]:
|
|
var result:Array[String] = []
|
|
for item in array:
|
|
result.append(item)
|
|
|
|
return result
|