#nullable enable using System.Collections.Generic; using System.Linq; namespace BizHawk.Client.Common { public sealed class FilesystemFilter { public readonly string Description; public readonly IReadOnlyCollection Extensions; public FilesystemFilter(string description, IReadOnlyCollection extensions, bool addArchiveExts = false) { Description = description; Extensions = addArchiveExts ? extensions.Concat(ArchiveExtensions).ToList() : extensions; } /// When is set to for release, this behaves identically to the other ctor. /// On dev builds, are appended to . /// public FilesystemFilter( string description, IReadOnlyCollection extensions, IReadOnlyCollection devBuildExtraExts, bool addArchiveExts = false, bool devBuildAddArchiveExts = false) { Description = description; if (!VersionInfo.DeveloperBuild) { // same as other ctor Extensions = addArchiveExts ? extensions.Concat(ArchiveExtensions).ToList() : extensions; } else { Extensions = addArchiveExts || devBuildAddArchiveExts ? extensions.Concat(devBuildExtraExts).Concat(ArchiveExtensions).ToList() : extensions.Concat(devBuildExtraExts).ToList(); } } /// delegated to /// return value is a valid Filter for Save-/OpenFileDialog public override string ToString() => SerializeEntry(Description, Extensions); public const string AllFilesEntry = "All Files|*"; public static readonly IReadOnlyCollection ArchiveExtensions = new[] { "zip", "rar", "7z", "gz" }; public static readonly FilesystemFilter Archives = new FilesystemFilter("Archives", ArchiveExtensions); public static readonly FilesystemFilter BizHawkMovies = new FilesystemFilter("Movie Files", new[] { MovieService.DefaultExtension }); public static readonly FilesystemFilter EmuHawkSaveStates = new FilesystemFilter("Save States", new[] { "State" }); public static readonly FilesystemFilter LuaScripts = new FilesystemFilter("Lua Scripts", new[] { "lua" }); public static readonly FilesystemFilter Palettes = new FilesystemFilter("Palette Files", new[] { "pal" }); public static readonly FilesystemFilter PNGs = new FilesystemFilter("PNG Files", new[] { "png" }); public static readonly FilesystemFilter TAStudioProjects = new FilesystemFilter("TAS Project Files", new[] { TasMovie.Extension }); public static readonly FilesystemFilter TextFiles = new FilesystemFilter("Text Files", new[] { "txt" }); /// return value is a valid Filter for Save-/OpenFileDialog public static string SerializeEntry(string desc, IEnumerable exts) => string.Format("{0} ({1})|{1}", desc, string.Join(";", exts.Select(ext => $"*.{ext}"))); } }