diff --git a/BizHawk.Client.Common/movie/import/BkmImport.cs b/BizHawk.Client.Common/movie/import/BkmImport.cs index 7930eb53f9..1d71fe2c0b 100644 --- a/BizHawk.Client.Common/movie/import/BkmImport.cs +++ b/BizHawk.Client.Common/movie/import/BkmImport.cs @@ -3,7 +3,7 @@ namespace BizHawk.Client.Common.movie.import { // ReSharper disable once UnusedMember.Global - [ImportExtension(".bkm")] + [ImportExtension("BizHawk", ".bkm")] internal class BkmImport : MovieImporter { protected override void RunImport() diff --git a/BizHawk.Client.Common/movie/import/FcmImport.cs b/BizHawk.Client.Common/movie/import/FcmImport.cs index 8daa5a23ff..a35aa78fa0 100644 --- a/BizHawk.Client.Common/movie/import/FcmImport.cs +++ b/BizHawk.Client.Common/movie/import/FcmImport.cs @@ -9,7 +9,7 @@ namespace BizHawk.Client.Common.movie.import { // FCM file format: http://code.google.com/p/fceu/wiki/FCM // ReSharper disable once UnusedMember.Global - [ImportExtension(".fcm")] + [ImportExtension("FCEU", ".fcm")] internal class FcmImport : MovieImporter { private IControllerDeck _deck; diff --git a/BizHawk.Client.Common/movie/import/Fm2Import.cs b/BizHawk.Client.Common/movie/import/Fm2Import.cs index 86b798e4df..db5f6bd93a 100644 --- a/BizHawk.Client.Common/movie/import/Fm2Import.cs +++ b/BizHawk.Client.Common/movie/import/Fm2Import.cs @@ -8,7 +8,7 @@ namespace BizHawk.Client.Common { // FM2 file format: http://www.fceux.com/web/FM2.html // ReSharper disable once UnusedMember.Global - [ImportExtension(".fm2")] + [ImportExtension("FCEUX", ".fm2")] internal class Fm2Import : MovieImporter { protected override void RunImport() diff --git a/BizHawk.Client.Common/movie/import/FmvImport.cs b/BizHawk.Client.Common/movie/import/FmvImport.cs index 690a3fbc45..68880aeaaa 100644 --- a/BizHawk.Client.Common/movie/import/FmvImport.cs +++ b/BizHawk.Client.Common/movie/import/FmvImport.cs @@ -5,7 +5,7 @@ namespace BizHawk.Client.Common.movie.import { // FMV file format: http://tasvideos.org/FMV.html // ReSharper disable once UnusedMember.Global - [ImportExtension(".fmv")] + [ImportExtension("Famtasia", ".fmv")] internal class FmvImport : MovieImporter { private IControllerDeck _deck; diff --git a/BizHawk.Client.Common/movie/import/GmvImport.cs b/BizHawk.Client.Common/movie/import/GmvImport.cs index 05894d139d..6d335b503b 100644 --- a/BizHawk.Client.Common/movie/import/GmvImport.cs +++ b/BizHawk.Client.Common/movie/import/GmvImport.cs @@ -5,7 +5,7 @@ namespace BizHawk.Client.Common.movie.import { // GMV file format: http://code.google.com/p/gens-rerecording/wiki/GMV // ReSharper disable once UnusedMember.Global - [ImportExtension(".gmv")] + [ImportExtension("GENS", ".gmv")] internal class GmvImport : MovieImporter { protected override void RunImport() diff --git a/BizHawk.Client.Common/movie/import/IMovieImport.cs b/BizHawk.Client.Common/movie/import/IMovieImport.cs index 9e75b94441..cc25c00139 100644 --- a/BizHawk.Client.Common/movie/import/IMovieImport.cs +++ b/BizHawk.Client.Common/movie/import/IMovieImport.cs @@ -103,11 +103,13 @@ namespace BizHawk.Client.Common [AttributeUsage(AttributeTargets.Class)] public class ImportExtensionAttribute : Attribute { - public ImportExtensionAttribute(string extension) + public ImportExtensionAttribute(string emulator, string extension) { + Emulator = emulator; Extension = extension; } + public string Emulator { get; } public string Extension { get; } } } diff --git a/BizHawk.Client.Common/movie/import/LsmvImport.cs b/BizHawk.Client.Common/movie/import/LsmvImport.cs index 83b7f35bbb..d73d3f579f 100644 --- a/BizHawk.Client.Common/movie/import/LsmvImport.cs +++ b/BizHawk.Client.Common/movie/import/LsmvImport.cs @@ -10,7 +10,7 @@ namespace BizHawk.Client.Common.movie.import { // ReSharper disable once UnusedMember.Global // LSMV file format: http://tasvideos.org/Lsnes/Movieformat.html - [ImportExtension(".lsmv")] + [ImportExtension("LSNES", ".lsmv")] internal class LsmvImport : MovieImporter { private LibsnesControllerDeck _deck; diff --git a/BizHawk.Client.Common/movie/import/Mc2Import.cs b/BizHawk.Client.Common/movie/import/Mc2Import.cs index 5b0e1a644c..4716694b66 100644 --- a/BizHawk.Client.Common/movie/import/Mc2Import.cs +++ b/BizHawk.Client.Common/movie/import/Mc2Import.cs @@ -4,7 +4,7 @@ namespace BizHawk.Client.Common.movie.import { // MC2 file format: http://code.google.com/p/pcejin/wiki/MC2 // ReSharper disable once UnusedMember.Global - [ImportExtension(".mc2")] + [ImportExtension("PCEjin/Mednafen", ".mc2")] internal class Mc2Import : MovieImporter { private PceControllerDeck _deck; diff --git a/BizHawk.Client.Common/movie/import/MmvImport.cs b/BizHawk.Client.Common/movie/import/MmvImport.cs index edc4d06697..fbdc18b82c 100644 --- a/BizHawk.Client.Common/movie/import/MmvImport.cs +++ b/BizHawk.Client.Common/movie/import/MmvImport.cs @@ -6,7 +6,7 @@ namespace BizHawk.Client.Common.movie.import { // ReSharper disable once UnusedMember.Global // MMV file format: http://tasvideos.org/MMV.html - [ImportExtension(".mmv")] + [ImportExtension("Dega", ".mmv")] internal class MmvImport : MovieImporter { protected override void RunImport() diff --git a/BizHawk.Client.Common/movie/import/MovieImport.cs b/BizHawk.Client.Common/movie/import/MovieImport.cs index d0f7a5ae8f..7e5ac4db8a 100644 --- a/BizHawk.Client.Common/movie/import/MovieImport.cs +++ b/BizHawk.Client.Common/movie/import/MovieImport.cs @@ -15,9 +15,17 @@ namespace BizHawk.Client.Common { return Importers .Select(i => i.Value) - .Any(e => string.Equals(extension, e, StringComparison.OrdinalIgnoreCase)); + .Any(e => string.Equals(extension, e.Extension, StringComparison.OrdinalIgnoreCase)); } + public static Dictionary AvailableImporters() + { + return Importers + .OrderBy(i => i.Value.Emulator) + .ToDictionary(tkey => tkey.Value.Emulator, tvalue => tvalue.Value.Extension); + } + + // Attempt to import another type of movie file into a movie object. public static ImportResult ImportFile(string path) { @@ -30,9 +38,9 @@ namespace BizHawk.Client.Common } // Create a new instance of the importer class using the no-argument constructor - IMovieImport importer = importerType + IMovieImport importer = (IMovieImport)importerType .GetConstructor(new Type[] { }) - ?.Invoke(new object[] { }) as IMovieImport; + ?.Invoke(new object[] { }); if (importer == null) { @@ -44,14 +52,14 @@ namespace BizHawk.Client.Common private static Type ImporterForExtension(string ext) { - return Importers.FirstOrDefault(i => string.Equals(i.Value, ext, StringComparison.OrdinalIgnoreCase)).Key; + return Importers.FirstOrDefault(i => string.Equals(i.Value.Extension, ext, StringComparison.OrdinalIgnoreCase)).Key; } - private static readonly Dictionary Importers = Assembly.GetAssembly(typeof(ImportExtensionAttribute)) + private static readonly Dictionary Importers = Assembly.GetAssembly(typeof(ImportExtensionAttribute)) .GetTypes() .Where(t => t.GetCustomAttributes(typeof(ImportExtensionAttribute)) .Any()) .ToDictionary(tkey => tkey, tvalue => ((ImportExtensionAttribute)tvalue.GetCustomAttributes(typeof(ImportExtensionAttribute)) - .First()).Extension); + .First())); } } diff --git a/BizHawk.Client.Common/movie/import/PjmImport.cs b/BizHawk.Client.Common/movie/import/PjmImport.cs index 64c96d422a..b299a65630 100644 --- a/BizHawk.Client.Common/movie/import/PjmImport.cs +++ b/BizHawk.Client.Common/movie/import/PjmImport.cs @@ -4,7 +4,7 @@ using BizHawk.Emulation.Cores.Sony.PSX; namespace BizHawk.Client.Common { - [ImportExtension(".pjm")] + [ImportExtension("PSXjin", ".pjm")] internal class PjmImport : MovieImporter { protected override void RunImport() diff --git a/BizHawk.Client.Common/movie/import/PxmImport.cs b/BizHawk.Client.Common/movie/import/PxmImport.cs index 921750aa28..226a48b60c 100644 --- a/BizHawk.Client.Common/movie/import/PxmImport.cs +++ b/BizHawk.Client.Common/movie/import/PxmImport.cs @@ -9,7 +9,7 @@ namespace BizHawk.Client.Common.Movie.Import // However, the magic number/file signature is slightly different, requiring some // refactoring to avoid PXM-specific code in the PJMImport class. // ReSharper disable once UnusedMember.Global - [ImportExtension(".pxm")] + [ImportExtension("PCSX", ".pxm")] internal class PxmImport : PjmImport { protected override void RunImport() diff --git a/BizHawk.Client.Common/movie/import/SmvImport.cs b/BizHawk.Client.Common/movie/import/SmvImport.cs index 08ff1fd468..734541501f 100644 --- a/BizHawk.Client.Common/movie/import/SmvImport.cs +++ b/BizHawk.Client.Common/movie/import/SmvImport.cs @@ -7,7 +7,7 @@ namespace BizHawk.Client.Common.movie.import { // ReSharper disable once UnusedMember.Global // http://tasvideos.org/EmulatorResources/Snes9x/SMV.html - [ImportExtension(".smv")] + [ImportExtension("Snes9x", ".smv")] internal class SmvImport : MovieImporter { private LibsnesControllerDeck _deck; diff --git a/BizHawk.Client.Common/movie/import/VbmImport.cs b/BizHawk.Client.Common/movie/import/VbmImport.cs index 80eccc135c..76d07a6a8f 100644 --- a/BizHawk.Client.Common/movie/import/VbmImport.cs +++ b/BizHawk.Client.Common/movie/import/VbmImport.cs @@ -7,7 +7,7 @@ namespace BizHawk.Client.Common.movie.import { // VBM file format: http://code.google.com/p/vba-rerecording/wiki/VBM // ReSharper disable once UnusedMember.Global - [ImportExtension(".vbm")] + [ImportExtension("Visual Boy Advance", ".vbm")] internal class VbmImport : MovieImporter { protected override void RunImport() diff --git a/BizHawk.Client.Common/movie/import/YmvImport.cs b/BizHawk.Client.Common/movie/import/YmvImport.cs index 7114d2c387..bf0b42f10a 100644 --- a/BizHawk.Client.Common/movie/import/YmvImport.cs +++ b/BizHawk.Client.Common/movie/import/YmvImport.cs @@ -8,7 +8,7 @@ namespace BizHawk.Client.Common.movie.import { // https://code.google.com/archive/p/yabause-rr/wikis/YMVfileformat.wiki // ReSharper disable once UnusedMember.Global - [ImportExtension(".ymv")] + [ImportExtension("Yabause", ".ymv")] internal class YmvImport : MovieImporter { protected override void RunImport() diff --git a/BizHawk.Client.EmuHawk/MainForm.Events.cs b/BizHawk.Client.EmuHawk/MainForm.Events.cs index 2774472387..58298dab8e 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Events.cs @@ -3,7 +3,7 @@ using System.Drawing; using System.IO; using System.Windows.Forms; using System.Collections.Generic; - +using System.Linq; using BizHawk.Emulation.Common; using BizHawk.Emulation.Common.IEmulatorExtensions; using BizHawk.Emulation.Cores.Calculators; @@ -515,25 +515,7 @@ namespace BizHawk.Client.EmuHawk { InitialDirectory = PathManager.GetRomsPath(Emulator.SystemId), Multiselect = true, - Filter = FormatFilter( - "Movie Files", "*.fm2;*.mc2;*.mcm;*.mmv;*.gmv;*.vbm;*.lsmv;*.fcm;*.fmv;*.vmv;*.nmv;*.smv;*.ymv;*.zmv;*.bkm;*.pjm;*.pxm", - "FCEUX", "*.fm2", - "PCEjin/Mednafen", "*.mc2;*.mcm", - "Dega", "*.mmv", - "Gens", "*.gmv", - "Visual Boy Advance", "*.vbm", - "LSNES", "*.lsmv", - "FCEU", "*.fcm", - "Famtasia", "*.fmv", - "VirtuaNES", "*.vmv", - "Nintendulator", "*.nmv", - "Snes9x", "*.smv", - "Yabause", "*.ymv", - "ZSNES", "*.zmv", - "PSXjin", "*.pjm", - "PCSX", "*.pxm", - "BizHawk Bkm", "*.bkm", - "All Files", "*.*"), + Filter = ToFilter("Movie Files", MovieImport.AvailableImporters()), RestoreDirectory = false }; diff --git a/BizHawk.Client.EmuHawk/MainForm.cs b/BizHawk.Client.EmuHawk/MainForm.cs index 6387defc76..79f0d3eaad 100644 --- a/BizHawk.Client.EmuHawk/MainForm.cs +++ b/BizHawk.Client.EmuHawk/MainForm.cs @@ -2077,6 +2077,26 @@ namespace BizHawk.Client.EmuHawk } } + public static string ToFilter(string name, IDictionary entries) + { + var items = new List + { + name, + string.Join(";", entries.Select(e => $"*{e.Value}")) + }; + + foreach (var kvp in entries) + { + items.Add(kvp.Key); + items.Add($"*{kvp.Value}"); + } + + items.Add("All Files"); + items.Add("*.*"); + + return FormatFilter(items.ToArray()); + } + public static string FormatFilter(params string[] args) { var sb = new StringBuilder();