data drive the import movies dialog filter

This commit is contained in:
adelikat 2019-11-14 18:00:33 -06:00
parent 0235ca21ab
commit 673073e650
17 changed files with 52 additions and 40 deletions

View File

@ -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()

View File

@ -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;

View File

@ -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()

View File

@ -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;

View File

@ -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()

View File

@ -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; }
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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()

View File

@ -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<string, string> 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<Type, string> Importers = Assembly.GetAssembly(typeof(ImportExtensionAttribute))
private static readonly Dictionary<Type, ImportExtensionAttribute> 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()));
}
}

View File

@ -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()

View File

@ -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()

View File

@ -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;

View File

@ -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()

View File

@ -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()

View File

@ -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
};

View File

@ -2077,6 +2077,26 @@ namespace BizHawk.Client.EmuHawk
}
}
public static string ToFilter(string name, IDictionary<string, string> entries)
{
var items = new List<string>
{
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();