using System.Diagnostics.CodeAnalysis; namespace Voile.Resources { /// /// Loads resources from various sources and prepares them to be used for Voile. /// /// public abstract class ResourceLoader where T : Resource { /// /// File extensions that are supported by this loader. /// public abstract IEnumerable SupportedExtensions { get; } /// /// Loads a resource to 's resource list. /// /// File system path to the resource to load. /// A of the loaded resource that can be later retrieved with . public Guid Load(string path) { var resource = LoadResource(path); var guid = Guid.NewGuid(); var loadedResources = ResourceManager.LoadedResources; var oldResourceGuid = loadedResources.FirstOrDefault(loadedResource => loadedResource.Value.Path == path).Key; if (loadedResources.ContainsKey(oldResourceGuid)) { ResourceManager.ReplaceResource(oldResourceGuid, resource); return oldResourceGuid; } ResourceManager.AddResource(guid, resource); return guid; } /// /// Reloads resources loaded by this resource loader. /// public void Reload() { foreach (var loadedResource in ResourceManager.LoadedResources) { if (loadedResource.Value is not T) continue; Load(loadedResource.Value.Path); } } /// /// Unloads a resource. /// /// GUID of a resource to unload. /// True if unloading was successful, otherwise false. public bool TryUnload(Guid resourceGuid) { if (!ResourceManager.LoadedResources.ContainsKey(resourceGuid)) { return false; } var resource = ResourceManager.LoadedResources[resourceGuid]; ResourceManager.RemoveResource(resourceGuid); if (resource is IDisposable disposable) { disposable.Dispose(); } return true; } /// /// Load steps specific to this resource loader. /// /// File system path to the resource to load. /// Loaded resource. protected abstract T LoadResource(string path); } }